diff --git a/.gitignore b/.gitignore
index 5fa4a04a62..4589c9455a 100755
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@
*.rej
*.swp
*.tar.bz2
+*.code-workspace
*~
# Specific paths and/or names
@@ -108,3 +109,4 @@ my_autobuild.xml
compile_commands.json
# ignore tracy for now
indra/tracy
+firestorm.code-workspace
diff --git a/BuildParams b/BuildParams
old mode 100755
new mode 100644
diff --git a/autobuild.xml b/autobuild.xml
index ff46f38a09..79ca1cb0f8 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -994,11 +994,11 @@
archive
name
darwin
@@ -1008,11 +1008,11 @@
archive
name
linux64
@@ -1022,11 +1022,11 @@
archive
name
windows
@@ -1036,18 +1036,18 @@
archive
name
windows64
version
- 2.01.09
+ 2.02.01
fontconfig
version
- 202102021657.555615
+ 202104010215.557744
llphysicsextensions_source
diff --git a/build.sh b/build.sh
index b790f655a9..8d49e5a137 100755
--- a/build.sh
+++ b/build.sh
@@ -129,11 +129,6 @@ pre_build()
then # show that we're doing this, just not the contents
echo source "$bugsplat_sh"
source "$bugsplat_sh"
- # important: we test this and use its value in [grand-]child processes
- if [ -n "${BUGSPLAT_DB:-}" ]
- then echo export BUGSPLAT_DB
- export BUGSPLAT_DB
- fi
fi
set -x
@@ -426,6 +421,15 @@ then
fi
fi
+# Some of the uploads takes a long time to finish in the codeticket backend,
+# causing the next codeticket upload attempt to fail.
+# Inserting this after each potentially large upload may prevent those errors.
+# JJ is making changes to Codeticket that we hope will eliminate this failure, then this can be removed
+wait_for_codeticket()
+{
+ sleep $(( 60 * 6 ))
+}
+
# check status and upload results to S3
if $succeeded
then
@@ -442,6 +446,7 @@ then
# Upload base package.
python_cmd "$helpers/codeticket.py" addoutput Installer "$package" \
|| fatal "Upload of installer failed"
+ wait_for_codeticket
# Upload additional packages.
for package_id in $additional_packages
@@ -451,6 +456,7 @@ then
then
python_cmd "$helpers/codeticket.py" addoutput "Installer $package_id" "$package" \
|| fatal "Upload of installer $package_id failed"
+ wait_for_codeticket
else
record_failure "Failed to find additional package for '$package_id'."
fi
@@ -464,6 +470,7 @@ then
# Upload crash reporter file
python_cmd "$helpers/codeticket.py" addoutput "Symbolfile" "$VIEWER_SYMBOL_FILE" \
|| fatal "Upload of symbolfile failed"
+ wait_for_codeticket
fi
# Upload the llphysicsextensions_tpv package, if one was produced
@@ -471,6 +478,9 @@ then
if [ -r "$build_dir/llphysicsextensions_package" ]
then
llphysicsextensions_package=$(cat $build_dir/llphysicsextensions_package)
+ # This next upload is a frequent failure; see if giving the last one some time helps
+ # JJ is making changes to Codeticket that we hope will eliminate this failure soon
+ sleep 300
python_cmd "$helpers/codeticket.py" addoutput "Physics Extensions Package" "$llphysicsextensions_package" --private \
|| fatal "Upload of physics extensions package failed"
fi
@@ -483,6 +493,7 @@ then
begin_section "Upload Extension $extension"
. $extension
[ $? -eq 0 ] || fatal "Upload of extension $extension failed"
+ wait_for_codeticket
end_section "Upload Extension $extension"
done
fi
@@ -492,7 +503,6 @@ then
record_event "skipping upload of installer"
fi
-
else
record_event "skipping upload of installer due to failed build"
fi
diff --git a/doc/contributions.txt b/doc/contributions.txt
index b86f7fb7b9..883534394c 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -229,6 +229,7 @@ Ansariel Hiller
SL-13364
SL-13858
SL-13697
+ SL-13395
SL-3136
Aralara Rajal
Arare Chantilly
@@ -268,9 +269,10 @@ Benjamin Bigdipper
Beq Janus
BUG-227094
SL-10288
+ SL-11300
SL-13583
SL-14766
- SL-11300
+ SL-14927
Beth Walcher
Bezilon Kasei
Biancaluce Robbiani
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index bab6ad5770..c1a312e818 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -13,6 +13,7 @@ project(${ROOT_PROJECT_NAME})
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(Variables)
+include(bugsplat)
include(BuildVersion)
set(LEGACY_STDIO_LIBS)
@@ -108,7 +109,10 @@ endif (WINDOWS AND EXISTS ${LIBS_CLOSED_DIR}copy_win_scripts)
add_custom_target(viewer)
+if (NOT USE_BUGSPLAT)
add_subdirectory(${LIBS_OPEN_PREFIX}llcrashlogger)
+endif (NOT USE_BUGSPLAT)
+
add_subdirectory(${LIBS_OPEN_PREFIX}llplugin)
add_subdirectory(${LIBS_OPEN_PREFIX}llui)
add_subdirectory(${LIBS_OPEN_PREFIX}viewer_components)
@@ -124,31 +128,18 @@ add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins)
endif (ENABLE_MEDIA_PLUGINS)
if (LINUX)
- add_subdirectory(${VIEWER_PREFIX}linux_crash_logger)
if (INSTALL_PROPRIETARY)
include(LLAppearanceUtility)
add_subdirectory(${LLAPPEARANCEUTILITY_SRC_DIR} ${LLAPPEARANCEUTILITY_BIN_DIR})
endif (INSTALL_PROPRIETARY)
- # Huh? Where'd that target come from?
- #add_dependencies(viewer linux-crash-logger-strip-target)
- add_dependencies(viewer linux-crash-logger)
-elseif (DARWIN)
- add_subdirectory(${VIEWER_PREFIX}mac_crash_logger)
- add_dependencies(viewer mac-crash-logger)
-elseif (WINDOWS)
- add_subdirectory(${VIEWER_PREFIX}win_crash_logger)
- # cmake EXISTS requires an absolute path, see indra/cmake/Variables.cmake
- if (EXISTS ${VIEWER_DIR}win_setup)
- add_subdirectory(${VIEWER_DIR}win_setup)
- endif (EXISTS ${VIEWER_DIR}win_setup)
- # add_dependencies(viewer windows-setup windows-crash-logger)
- add_dependencies(viewer windows-crash-logger)
endif (LINUX)
-add_subdirectory(${VIEWER_PREFIX}newview)
-add_dependencies(viewer firestorm-bin)
-
-add_subdirectory(${VIEWER_PREFIX}doxygen EXCLUDE_FROM_ALL)
+if (WINDOWS)
+ # cmake EXISTS requires an absolute path, see indra/cmake/Variables.cmake
+ if (EXISTS ${VIEWER_DIR}win_setup)
+ add_subdirectory(${VIEWER_DIR}win_setup)
+ endif (EXISTS ${VIEWER_DIR}win_setup)
+endif (WINDOWS)
# sets the 'startup project' for debugging from visual studio.
set_property(
@@ -156,6 +147,33 @@ set_property(
PROPERTY VS_STARTUP_PROJECT firestorm-bin
)
+if (USE_BUGSPLAT)
+ if (BUGSPLAT_DB)
+ message(STATUS "Building with BugSplat; database '${BUGSPLAT_DB}'")
+ else (BUGSPLAT_DB)
+ message(WARNING "Building with BugSplat, but no database name set (BUGSPLAT_DB)")
+ endif (BUGSPLAT_DB)
+else (USE_BUGSPLAT)
+ message(STATUS "Not building with BugSplat")
+ if (LINUX)
+ add_subdirectory(${VIEWER_PREFIX}linux_crash_logger)
+ # Huh? Where'd that target come from?
+ #add_dependencies(viewer linux-crash-logger-strip-target)
+ elseif (DARWIN)
+ add_subdirectory(${VIEWER_PREFIX}mac_crash_logger)
+ add_dependencies(viewer mac-crash-logger)
+ elseif (WINDOWS)
+ add_subdirectory(${VIEWER_PREFIX}win_crash_logger)
+ # add_dependencies(viewer windows-setup windows-crash-logger)
+ add_dependencies(viewer windows-crash-logger)
+ endif (LINUX)
+endif (USE_BUGSPLAT)
+
+add_subdirectory(${VIEWER_PREFIX}newview)
+add_dependencies(viewer firestorm-bin)
+
+add_subdirectory(${VIEWER_PREFIX}doxygen EXCLUDE_FROM_ALL)
+
if (LL_TESTS)
# Define after the custom targets are created so
# individual apps can add themselves as dependencies
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index e587c493ad..386c503734 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -72,7 +72,7 @@ if(WINDOWS)
# Filenames are different for 32/64 bit BugSplat file and we don't
# have any control over them so need to branch.
- if (BUGSPLAT_DB)
+ if (USE_BUGSPLAT)
if(ADDRESS_SIZE EQUAL 32)
set(release_files ${release_files} BugSplat.dll)
set(release_files ${release_files} BugSplatRc.dll)
@@ -82,7 +82,7 @@ if(WINDOWS)
set(release_files ${release_files} BugSplatRc64.dll)
set(release_files ${release_files} BsSndRpt64.exe)
endif(ADDRESS_SIZE EQUAL 32)
- endif (BUGSPLAT_DB)
+ endif (USE_BUGSPLAT)
set(release_files ${release_files} growl++.dll growl.dll )
if (FMODSTUDIO)
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index 5ee465e08a..71e38bfd87 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -6,6 +6,7 @@ include(LLTestCommand)
#include(GoogleMock)
#
+include(bugsplat)
include(Tut)
#*****************************************************************************
@@ -92,6 +93,12 @@ MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)
IF(LL_TEST_VERBOSE)
MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}")
ENDIF(LL_TEST_VERBOSE)
+
+ if (USE_BUGSPLAT)
+ SET_PROPERTY(SOURCE ${${name}_test_SOURCE_FILES}
+ APPEND PROPERTY COMPILE_DEFINITIONS "${BUGSPLAT_DEFINE}")
+ endif (USE_BUGSPLAT)
+
# Headers
GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES)
SET(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES})
@@ -229,6 +236,11 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}")
endif(USESYSTEMLIBS)
+ if (USE_BUGSPLAT)
+ SET_PROPERTY(SOURCE ${source_files}
+ APPEND PROPERTY COMPILE_DEFINITIONS "${BUGSPLAT_DEFINE}")
+ endif (USE_BUGSPLAT)
+
# The following was copied to llcorehttp/CMakeLists.txt's texture_load target.
# Any changes made here should be replicated there.
if (WINDOWS)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 9fee605021..abab96ce24 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -34,7 +34,6 @@ set(LL_TESTS OFF CACHE BOOL "Build and run unit and integration tests (disable f
set(INCREMENTAL_LINK OFF CACHE BOOL "Use incremental linking on win32 builds (enable for faster links on some machines)")
set(ENABLE_MEDIA_PLUGINS ON CACHE BOOL "Turn off building media plugins if they are imported by third-party library mechanism")
set(VIEWER_SYMBOL_FILE "" CACHE STRING "Name of tarball into which to place symbol files")
-set(BUGSPLAT_DB "" CACHE STRING "BugSplat database name, if BugSplat crash reporting is desired")
if(LIBS_CLOSED_DIR)
file(TO_CMAKE_PATH "${LIBS_CLOSED_DIR}" LIBS_CLOSED_DIR)
diff --git a/indra/cmake/bugsplat.cmake b/indra/cmake/bugsplat.cmake
index 0c84bac88a..f709f35403 100644
--- a/indra/cmake/bugsplat.cmake
+++ b/indra/cmake/bugsplat.cmake
@@ -1,27 +1,38 @@
-# BugSplat is engaged by setting BUGSPLAT_DB to the target BugSplat database
-# name.
-if (BUGSPLAT_DB)
- if (USESYSTEMLIBS)
- message(STATUS "Looking for system BugSplat")
- set(BUGSPLAT_FIND_QUIETLY ON)
- set(BUGSPLAT_FIND_REQUIRED ON)
- include(FindBUGSPLAT)
- else (USESYSTEMLIBS)
- message(STATUS "Engaging autobuild BugSplat")
- include(Prebuilt)
- use_prebuilt_binary(bugsplat)
- if (WINDOWS)
- set(BUGSPLAT_LIBRARIES
- ${ARCH_PREBUILT_DIRS_RELEASE}/bugsplat.lib
- )
- elseif (DARWIN)
- find_library(BUGSPLAT_LIBRARIES BugsplatMac
- PATHS "${ARCH_PREBUILT_DIRS_RELEASE}")
- message(FATAL_ERROR "Bugsplat for OSX not fully implemented, please adapt llappdelegate-objc.mm to honor options of sending user name and settings.xml.")
- else (WINDOWS)
- message(FATAL_ERROR "Bugsplat for Linux not implemented.")
+if (INSTALL_PROPRIETARY)
+ # Note that viewer_manifest.py makes decision based on BUGSPLAT_DB and not USE_BUGSPLAT
+ if (BUGSPLAT_DB)
+ set(USE_BUGSPLAT ON CACHE BOOL "Use the BugSplat crash reporting system")
+ else (BUGSPLAT_DB)
+ set(USE_BUGSPLAT OFF CACHE BOOL "Use the BugSplat crash reporting system")
+ endif (BUGSPLAT_DB)
+else (INSTALL_PROPRIETARY)
+ set(USE_BUGSPLAT OFF CACHE BOOL "Use the BugSplat crash reporting system")
+endif (INSTALL_PROPRIETARY)
+
+if (USE_BUGSPLAT)
+ if (NOT USESYSTEMLIBS)
+ include(Prebuilt)
+ use_prebuilt_binary(bugsplat)
+ if (WINDOWS)
+ set(BUGSPLAT_LIBRARIES
+ ${ARCH_PREBUILT_DIRS_RELEASE}/bugsplat.lib
+ )
+ elseif (DARWIN)
+ find_library(BUGSPLAT_LIBRARIES BugsplatMac REQUIRED
+ NO_DEFAULT_PATH PATHS "${ARCH_PREBUILT_DIRS_RELEASE}")
+ message("Bugsplat for OSX not fully implemented, please adapt llappdelegate-objc.mm to honor options of sending user name and settings.xml.")
+ else (WINDOWS)
+ message(FATAL_ERROR "BugSplat is not supported; add -DUSE_BUGSPLAT=OFF")
+ endif (WINDOWS)
+ else (NOT USESYSTEMLIBS)
+ set(BUGSPLAT_FIND_QUIETLY ON)
+ set(BUGSPLAT_FIND_REQUIRED ON)
+ include(FindBUGSPLAT)
+ endif (NOT USESYSTEMLIBS)
+
+ set(BUGSPLAT_DB "" CACHE STRING "BugSplat crash database name")
- endif (WINDOWS)
set(BUGSPLAT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/bugsplat)
- endif (USESYSTEMLIBS)
-endif (BUGSPLAT_DB)
+ set(BUGSPLAT_DEFINE "LL_BUGSPLAT")
+endif (USE_BUGSPLAT)
+
diff --git a/indra/linux_crash_logger/README.txt b/indra/linux_crash_logger/README.txt
new file mode 100644
index 0000000000..6932a8d9c3
--- /dev/null
+++ b/indra/linux_crash_logger/README.txt
@@ -0,0 +1,3 @@
+This component is no longer used in Linden Lab builds.
+Change requests to support continued use by open source
+builds are welcome.
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index a5bab99771..9664617fa4 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -4,6 +4,7 @@ project(llcommon)
include(00-Common)
include(LLCommon)
+include(bugsplat)
include(Linking)
include(Boost)
include(LLSharedLibs)
@@ -291,10 +292,10 @@ list(APPEND llcommon_HEADER_FILES "tea.h" )
set_source_files_properties(${llcommon_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
-if (BUGSPLAT_DB)
- set_source_files_properties(llapp.cpp
- PROPERTIES COMPILE_DEFINITIONS "LL_BUGSPLAT")
-endif (BUGSPLAT_DB)
+if (USE_BUGSPLAT)
+ set_source_files_properties(${llcommon_SOURCE_FILES}
+ PROPERTIES COMPILE_DEFINITIONS "${BUGSPLAT_DEFINE}")
+endif (USE_BUGSPLAT)
list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES})
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index f2c55c321f..1999b4916f 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -531,7 +531,12 @@ void LLApp::setupErrorHandling(bool second_instance)
#endif // LL_LINUX
#endif // ! LL_WINDOWS
+
+#ifdef LL_BUGSPLAT
+ // do not start our own error thread
+#else // ! LL_BUGSPLAT
startErrorThread();
+#endif
}
void LLApp::startErrorThread()
@@ -811,7 +816,9 @@ void setup_signals()
act.sa_flags = SA_SIGINFO;
// Synchronous signals
+# ifndef LL_BUGSPLAT
sigaction(SIGABRT, &act, NULL);
+# endif
sigaction(SIGALRM, &act, NULL);
sigaction(SIGBUS, &act, NULL);
sigaction(SIGFPE, &act, NULL);
@@ -848,7 +855,9 @@ void clear_signals()
act.sa_flags = SA_SIGINFO;
// Synchronous signals
+# ifndef LL_BUGSPLAT
sigaction(SIGABRT, &act, NULL);
+# endif
sigaction(SIGALRM, &act, NULL);
sigaction(SIGBUS, &act, NULL);
sigaction(SIGFPE, &act, NULL);
@@ -901,6 +910,7 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *)
return;
case SIGABRT:
+ // Note that this handler is not set for SIGABRT when using Bugsplat
// Abort just results in termination of the app, no funky error handling.
if (LLApp::sLogInSignal)
{
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index 245c73e3a2..5fa91b8bf5 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -259,6 +259,10 @@ public:
*/
LLRunner& getRunner() { return mRunner; }
+#ifdef LL_WINDOWS
+ virtual void reportCrashToBugsplat(void* pExcepInfo /*EXCEPTION_POINTERS*/) { }
+#endif
+
public:
typedef std::map string_map;
string_map mOptionMap; // Contains all command-line options and arguments in a map
diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index 655763dce9..3a7ab0901e 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -56,6 +56,10 @@
#include "stringize.h"
#include "llexception.h"
+#if LL_WINDOWS
+#include
+#endif
+
// static
LLCoros::CoroData& LLCoros::get_CoroData(const std::string& caller)
{
@@ -248,29 +252,58 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl
#if LL_WINDOWS
-void LLCoros::winlevel(const callable_t& callable)
+static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
+
+U32 cpp_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop, const std::string& name)
+{
+ // C++ exceptions were logged in toplevelTryWrapper, but not SEH
+ // log SEH exceptions here, to make sure it gets into bugsplat's
+ // report and because __try won't allow std::string operations
+ if (code != STATUS_MSC_EXCEPTION)
+ {
+ LL_WARNS() << "SEH crash in " << name << ", code: " << code << LL_ENDL;
+ }
+ // Handle bugsplat here, since GetExceptionInformation() can only be
+ // called from within filter for __except(filter), not from __except's {}
+ // Bugsplat should get all exceptions, C++ and SEH
+ LLApp::instance()->reportCrashToBugsplat(exception_infop);
+
+ // Only convert non C++ exceptions.
+ if (code == STATUS_MSC_EXCEPTION)
+ {
+ // C++ exception, go on
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ else
+ {
+ // handle it
+ return EXCEPTION_EXECUTE_HANDLER;
+ }
+}
+
+void LLCoros::winlevel(const std::string& name, const callable_t& callable)
{
__try
{
- callable();
+ toplevelTryWrapper(name, callable);
}
- __except (msc_exception_filter(GetExceptionCode(), GetExceptionInformation()))
+ __except (cpp_exception_filter(GetExceptionCode(), GetExceptionInformation(), name))
{
- // convert to C++ styled exception
+ // convert to C++ styled exception for handlers other than bugsplat
// Note: it might be better to use _se_set_translator
// if you want exception to inherit full callstack
- char integer_string[32];
- sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());
+ //
+ // in case of bugsplat this will get to exceptionTerminateHandler and
+ // looks like fiber will terminate application after that
+ char integer_string[512];
+ sprintf(integer_string, "SEH crash in %s, code: %lu\n", name.c_str(), GetExceptionCode());
throw std::exception(integer_string);
}
}
#endif
-// Top-level wrapper around caller's coroutine callable.
-// Normally we like to pass strings and such by const reference -- but in this
-// case, we WANT to copy both the name and the callable to our local stack!
-void LLCoros::toplevel(std::string name, callable_t callable)
+void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& callable)
{
// keep the CoroData on this top-level function's stack frame
CoroData corodata(name);
@@ -280,18 +313,12 @@ void LLCoros::toplevel(std::string name, callable_t callable)
// run the code the caller actually wants in the coroutine
try
{
-// Disable for more meaningful callstacks
-//#if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD
-// winlevel(callable);
-//#else
callable();
-//#endif
-// Disable for more meaningful callstacks
}
catch (const Stop& exc)
{
LL_INFOS("LLCoros") << "coroutine " << name << " terminating because "
- << exc.what() << LL_ENDL;
+ << exc.what() << LL_ENDL;
}
catch (const LLContinueError&)
{
@@ -304,10 +331,25 @@ void LLCoros::toplevel(std::string name, callable_t callable)
{
// Any OTHER kind of uncaught exception will cause the viewer to
// crash, hopefully informatively.
- CRASH_ON_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name));
+ LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name));
+ // to not modify callstack
+ throw;
}
}
+// Top-level wrapper around caller's coroutine callable.
+// Normally we like to pass strings and such by const reference -- but in this
+// case, we WANT to copy both the name and the callable to our local stack!
+void LLCoros::toplevel(std::string name, callable_t callable)
+{
+#if LL_WINDOWS
+ // Can not use __try in functions that require unwinding, so use one more wrapper
+ winlevel(name, callable);
+#else
+ toplevelTryWrapper(name, callable);
+#endif
+}
+
//static
void LLCoros::checkStop()
{
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index 38c2356c99..6c0bec3ef9 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -290,11 +290,12 @@ public:
private:
std::string generateDistinctName(const std::string& prefix) const;
+#if LL_WINDOWS
+ void winlevel(const std::string& name, const callable_t& callable);
+#endif
+ void toplevelTryWrapper(const std::string& name, const callable_t& callable);
void toplevel(std::string name, callable_t callable);
struct CoroData;
-#if LL_WINDOWS
- static void winlevel(const callable_t& callable);
-#endif
static CoroData& get_CoroData(const std::string& caller);
S32 mStackSize;
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 9c1b650107..2741209706 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -488,8 +488,6 @@ namespace
protected:
Globals();
public:
- std::ostringstream messageStream;
- bool messageStreamInUse;
std::string mFatalMessage;
void addCallSite(LLError::CallSite&);
@@ -499,12 +497,7 @@ namespace
CallSiteVector callSites;
};
- Globals::Globals()
- : messageStream(),
- messageStreamInUse(false),
- callSites()
- {
- }
+ Globals::Globals() {}
Globals* Globals::getInstance()
{
@@ -595,7 +588,7 @@ namespace LLError
mFileLevelMap(),
mTagLevelMap(),
mUniqueLogMessages(),
- mCrashFunction(NULL),
+ mCrashFunction([](const std::string&){}),
mTimeFunction(NULL),
mRecorders(),
mShouldLogCallCounter(0)
@@ -780,7 +773,6 @@ namespace
LLError::setDefaultLevel(LLError::LEVEL_INFO);
LLError::setAlwaysFlush(true);
LLError::setEnabledLogTypesMask(0xFFFFFFFF);
- LLError::setFatalFunction(LLError::crashAndLoop);
LLError::setTimeFunction(LLError::utcTime);
// log_to_stderr is only false in the unit and integration tests to keep builds quieter
@@ -1419,57 +1411,7 @@ namespace LLError
}
- std::ostringstream* Log::out()
- {
- LLMutexTrylock lock(getMutex(),5);
-
- if (lock.isLocked())
- {
- Globals* g = Globals::getInstance();
-
- if (!g->messageStreamInUse)
- {
- g->messageStreamInUse = true;
- return &g->messageStream;
- }
- }
-
- return new std::ostringstream;
- }
-
- void Log::flush(std::ostringstream* out, char* message)
- {
- LLMutexTrylock lock(getMutex(),5);
- if (!lock.isLocked())
- {
- return;
- }
-
- if(strlen(out->str().c_str()) < 128)
- {
- strcpy(message, out->str().c_str());
- }
- else
- {
- strncpy(message, out->str().c_str(), 127);
- message[127] = '\0' ;
- }
-
- Globals* g = Globals::getInstance();
- if (out == &g->messageStream)
- {
- g->messageStream.clear();
- g->messageStream.str("");
- g->messageStreamInUse = false;
- }
- else
- {
- delete out;
- }
- return ;
- }
-
- void Log::flush(std::ostringstream* out, const CallSite& site)
+ void Log::flush(const std::ostringstream& out, const CallSite& site)
{
LLMutexTrylock lock(getMutex(),5);
if (!lock.isLocked())
@@ -1480,21 +1422,11 @@ namespace LLError
Globals* g = Globals::getInstance();
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
- std::string message = out->str();
- if (out == &g->messageStream)
- {
- g->messageStream.clear();
- g->messageStream.str("");
- g->messageStreamInUse = false;
- }
- else
- {
- delete out;
- }
+ std::string message = out.str();
if (site.mPrintOnce)
{
- std::ostringstream message_stream;
+ std::ostringstream message_stream;
std::map::iterator messageIter = s->mUniqueLogMessages.find(message);
if (messageIter != s->mUniqueLogMessages.end())
@@ -1515,8 +1447,8 @@ namespace LLError
message_stream << "ONCE: ";
s->mUniqueLogMessages[message] = 1;
}
- message_stream << message;
- message = message_stream.str();
+ message_stream << message;
+ message = message_stream.str();
}
writeToRecorders(site, message);
@@ -1524,10 +1456,7 @@ namespace LLError
if (site.mLevel == LEVEL_ERROR)
{
g->mFatalMessage = message;
- if (s->mCrashFunction)
- {
- s->mCrashFunction(message);
- }
+ s->mCrashFunction(message);
}
}
}
@@ -1591,29 +1520,6 @@ namespace LLError
return s->mShouldLogCallCounter;
}
-#if LL_WINDOWS
- // VC80 was optimizing the error away.
- #pragma optimize("", off)
-#endif
- void crashAndLoop(const std::string& message)
- {
- // Now, we go kaboom!
- int* make_me_crash = NULL;
-
- *make_me_crash = 0;
-
- while(true)
- {
- // Loop forever, in case the crash didn't work?
- }
-
- // this is an attempt to let Coverity and other semantic scanners know that this function won't be returning ever.
- exit(EXIT_FAILURE);
- }
-#if LL_WINDOWS
- #pragma optimize("", on)
-#endif
-
std::string utcTime()
{
time_t now = time(NULL);
@@ -1630,33 +1536,7 @@ namespace LLError
namespace LLError
{
- char** LLCallStacks::sBuffer = NULL ;
- S32 LLCallStacks::sIndex = 0 ;
-
- //static
- void LLCallStacks::allocateStackBuffer()
- {
- if(sBuffer == NULL)
- {
- sBuffer = new char*[512] ;
- sBuffer[0] = new char[512 * 128] ;
- for(S32 i = 1 ; i < 512 ; i++)
- {
- sBuffer[i] = sBuffer[i-1] + 128 ;
- }
- sIndex = 0 ;
- }
- }
-
- void LLCallStacks::freeStackBuffer()
- {
- if(sBuffer != NULL)
- {
- delete [] sBuffer[0] ;
- delete [] sBuffer ;
- sBuffer = NULL ;
- }
- }
+ LLCallStacks::StringVector LLCallStacks::sBuffer ;
//static
void LLCallStacks::push(const char* function, const int line)
@@ -1667,33 +1547,24 @@ namespace LLError
return;
}
- if(sBuffer == NULL)
- {
- allocateStackBuffer();
- }
-
- if(sIndex > 511)
+ if(sBuffer.size() > 511)
{
clear() ;
}
- strcpy(sBuffer[sIndex], function) ;
- sprintf(sBuffer[sIndex] + strlen(function), " line: %d ", line) ;
- sIndex++ ;
-
- return ;
+ std::ostringstream out;
+ insert(out, function, line);
+ sBuffer.push_back(out.str());
}
//static
- std::ostringstream* LLCallStacks::insert(const char* function, const int line)
+ void LLCallStacks::insert(std::ostream& out, const char* function, const int line)
{
- std::ostringstream* _out = LLError::Log::out();
- *_out << function << " line " << line << " " ;
- return _out ;
+ out << function << " line " << line << " " ;
}
//static
- void LLCallStacks::end(std::ostringstream* _out)
+ void LLCallStacks::end(const std::ostringstream& out)
{
LLMutexTrylock lock(getMutex(), 5);
if (!lock.isLocked())
@@ -1701,17 +1572,12 @@ namespace LLError
return;
}
- if(sBuffer == NULL)
- {
- allocateStackBuffer();
- }
-
- if(sIndex > 511)
+ if(sBuffer.size() > 511)
{
clear() ;
}
- LLError::Log::flush(_out, sBuffer[sIndex++]) ;
+ sBuffer.push_back(out.str());
}
//static
@@ -1723,33 +1589,30 @@ namespace LLError
return;
}
- if(sIndex > 0)
+ if(! sBuffer.empty())
{
LL_INFOS() << " ************* PRINT OUT LL CALL STACKS ************* " << LL_ENDL;
- while(sIndex > 0)
+ for (StringVector::const_reverse_iterator ri(sBuffer.rbegin()), re(sBuffer.rend());
+ ri != re; ++ri)
{
- sIndex-- ;
- LL_INFOS() << sBuffer[sIndex] << LL_ENDL;
+ LL_INFOS() << (*ri) << LL_ENDL;
}
LL_INFOS() << " *************** END OF LL CALL STACKS *************** " << LL_ENDL;
}
- if(sBuffer != NULL)
- {
- freeStackBuffer();
- }
+ cleanup();
}
//static
void LLCallStacks::clear()
{
- sIndex = 0 ;
+ sBuffer.clear();
}
//static
void LLCallStacks::cleanup()
{
- freeStackBuffer();
+ clear();
}
std::ostream& operator<<(std::ostream& out, const LLStacktrace&)
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 2ab4a2df07..3a58c029b0 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -29,7 +29,9 @@
#define LL_LLERROR_H
#include
+#include
#include
+#include
#include "stdtypes.h"
@@ -204,9 +206,7 @@ namespace LLError
{
public:
static bool shouldLog(CallSite&);
- static std::ostringstream* out();
- static void flush(std::ostringstream* out, char* message);
- static void flush(std::ostringstream*, const CallSite&);
+ static void flush(const std::ostringstream&, const CallSite&);
static std::string demangle(const char* mangled);
/// classname()
template
@@ -287,18 +287,15 @@ namespace LLError
class LL_COMMON_API LLCallStacks
{
private:
- static char** sBuffer ;
- static S32 sIndex ;
-
- static void allocateStackBuffer();
- static void freeStackBuffer();
+ typedef std::vector StringVector;
+ static StringVector sBuffer ;
public:
static void push(const char* function, const int line) ;
- static std::ostringstream* insert(const char* function, const int line) ;
+ static void insert(std::ostream& out, const char* function, const int line) ;
static void print() ;
static void clear() ;
- static void end(std::ostringstream* _out) ;
+ static void end(const std::ostringstream& out) ;
static void cleanup();
};
@@ -312,10 +309,11 @@ namespace LLError
//this is cheaper than llcallstacks if no need to output other variables to call stacks.
#define LL_PUSH_CALLSTACKS() LLError::LLCallStacks::push(__FUNCTION__, __LINE__)
-#define llcallstacks \
- { \
- std::ostringstream* _out = LLError::LLCallStacks::insert(__FUNCTION__, __LINE__) ; \
- (*_out)
+#define llcallstacks \
+ { \
+ std::ostringstream _out; \
+ LLError::LLCallStacks::insert(_out, __FUNCTION__, __LINE__) ; \
+ _out
#define llcallstacksendl \
LLError::End(); \
@@ -361,11 +359,11 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
static LLError::CallSite _site(lllog_site_args_(level, once, tags)); \
lllog_test_()
-#define lllog_test_() \
- if (LL_UNLIKELY(_site.shouldLog())) \
- { \
- std::ostringstream* _out = LLError::Log::out(); \
- (*_out)
+#define lllog_test_() \
+ if (LL_UNLIKELY(_site.shouldLog())) \
+ { \
+ std::ostringstream _out; \
+ _out
#define lllog_site_args_(level, once, tags) \
level, __FILE__, __LINE__, typeid(_LL_CLASS_TO_LOG), \
@@ -384,15 +382,27 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
// LL_CONT << " for " << t << " seconds" << LL_ENDL;
//
//Such computation is done iff the message will be logged.
-#define LL_CONT (*_out)
+#define LL_CONT _out
#define LL_NEWLINE '\n'
-#define LL_ENDL \
- LLError::End(); \
- LLError::Log::flush(_out, _site); \
- } \
- } while(0)
+// Use this only in LL_ERRS or in a place that LL_ERRS may not be used
+#define LLERROR_CRASH \
+{ \
+ int* make_me_crash = NULL;\
+ *make_me_crash = 0; \
+ exit(*make_me_crash); \
+}
+
+#define LL_ENDL \
+ LLError::End(); \
+ LLError::Log::flush(_out, _site); \
+ if (_site.mLevel == LLError::LEVEL_ERROR) \
+ { \
+ LLERROR_CRASH \
+ } \
+ } \
+ } while(0)
// NEW Macros for debugging, allow the passing of a string tag
diff --git a/indra/llcommon/llerrorcontrol.h b/indra/llcommon/llerrorcontrol.h
index 25786d5457..e87bb7bf35 100644
--- a/indra/llcommon/llerrorcontrol.h
+++ b/indra/llcommon/llerrorcontrol.h
@@ -94,14 +94,16 @@ namespace LLError
*/
typedef boost::function FatalFunction;
- LL_COMMON_API void crashAndLoop(const std::string& message);
- // Default fatal function: access null pointer and loops forever
LL_COMMON_API void setFatalFunction(const FatalFunction&);
- // The fatal function will be called when an message of LEVEL_ERROR
+ // The fatal function will be called after an message of LEVEL_ERROR
// is logged. Note: supressing a LEVEL_ERROR message from being logged
// (by, for example, setting a class level to LEVEL_NONE), will keep
- // the that message from causing the fatal funciton to be invoked.
+ // that message from causing the fatal function to be invoked.
+ // The passed FatalFunction will be the LAST log function called
+ // before LL_ERRS crashes its caller. A FatalFunction can throw an
+ // exception, or call exit(), to bypass the crash. It MUST disrupt the
+ // flow of control because no caller expects LL_ERRS to return.
LL_COMMON_API FatalFunction getFatalFunction();
// Retrieve the previously-set FatalFunction
@@ -147,14 +149,14 @@ namespace LLError
virtual void recordMessage(LLError::ELevel, const std::string& message) = 0;
// use the level for better display, not for filtering
- virtual bool enabled() { return true; }
+ virtual bool enabled() { return true; }
bool wantsTime();
bool wantsTags();
bool wantsLevel();
bool wantsLocation();
bool wantsFunctionName();
- bool wantsMultiline();
+ bool wantsMultiline();
void showTime(bool show);
void showTags(bool show);
@@ -165,15 +167,35 @@ namespace LLError
protected:
bool mWantsTime;
- bool mWantsTags;
- bool mWantsLevel;
- bool mWantsLocation;
- bool mWantsFunctionName;
- bool mWantsMultiline;
+ bool mWantsTags;
+ bool mWantsLevel;
+ bool mWantsLocation;
+ bool mWantsFunctionName;
+ bool mWantsMultiline;
};
typedef boost::shared_ptr RecorderPtr;
+ /**
+ * Instantiate GenericRecorder with a callable(level, message) to get
+ * control on every log message without having to code an explicit
+ * Recorder subclass.
+ */
+ template
+ class GenericRecorder: public Recorder
+ {
+ public:
+ GenericRecorder(const CALLABLE& callable):
+ mCallable(callable)
+ {}
+ void recordMessage(LLError::ELevel level, const std::string& message) override
+ {
+ mCallable(level, message);
+ }
+ private:
+ CALLABLE mCallable;
+ };
+
/**
* @NOTE: addRecorder() and removeRecorder() uses the boost::shared_ptr to allow for shared ownership
* while still ensuring that the allocated memory is eventually freed
@@ -181,6 +203,19 @@ namespace LLError
LL_COMMON_API void addRecorder(RecorderPtr);
LL_COMMON_API void removeRecorder(RecorderPtr);
// each error message is passed to each recorder via recordMessage()
+ /**
+ * Call addGenericRecorder() with a callable(level, message) to get
+ * control on every log message without having to code an explicit
+ * Recorder subclass. Save the returned RecorderPtr if you later want to
+ * call removeRecorder().
+ */
+ template
+ RecorderPtr addGenericRecorder(const CALLABLE& callable)
+ {
+ RecorderPtr ptr{ new GenericRecorder(callable) };
+ addRecorder(ptr);
+ return ptr;
+ }
LL_COMMON_API void logToFile(const std::string& filename);
LL_COMMON_API void logToStderr();
diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp
index cf8f8cc6a5..e8ea0ab398 100644
--- a/indra/llcommon/llleap.cpp
+++ b/indra/llcommon/llleap.cpp
@@ -59,7 +59,6 @@ public:
// pump name -- so it should NOT need tweaking for uniqueness.
mReplyPump(LLUUID::generateNewID().asString()),
mExpect(0),
- mPrevFatalFunction(LLError::getFatalFunction()),
// Instantiate a distinct LLLeapListener for this plugin. (Every
// plugin will want its own collection of managed listeners, etc.)
// Pass it a callback to our connect() method, so it can send events
@@ -146,7 +145,9 @@ public:
.listen("LLLeap", boost::bind(&LLLeapImpl::rstderr, this, _1));
// For our lifespan, intercept any LL_ERRS so we can notify plugin
- LLError::setFatalFunction(boost::bind(&LLLeapImpl::fatalFunction, this, _1));
+ mRecorder = LLError::addGenericRecorder(
+ [this](LLError::ELevel level, const std::string& message)
+ { onError(level, message); });
// Send child a preliminary event reporting our own reply-pump name --
// which would otherwise be pretty tricky to guess!
@@ -162,8 +163,7 @@ public:
virtual ~LLLeapImpl()
{
LL_DEBUGS("LLLeap") << "destroying LLLeap(\"" << mDesc << "\")" << LL_ENDL;
- // Restore original FatalFunction
- LLError::setFatalFunction(mPrevFatalFunction);
+ LLError::removeRecorder(mRecorder);
}
// Listener for failed launch attempt
@@ -377,28 +377,28 @@ public:
return false;
}
- void fatalFunction(const std::string& error)
+ void onError(LLError::ELevel level, const std::string& error)
{
- // Notify plugin
- LLSD event;
- event["type"] = "error";
- event["error"] = error;
- mReplyPump.post(event);
-
- // All the above really accomplished was to buffer the serialized
- // event in our WritePipe. Have to pump mainloop a couple times to
- // really write it out there... but time out in case we can't write.
- LLProcess::WritePipe& childin(mChild->getWritePipe(LLProcess::STDIN));
- LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
- LLSD nop;
- F64 until = (LLTimer::getElapsedSeconds() + 2).value();
- while (childin.size() && LLTimer::getElapsedSeconds() < until)
+ if (level == LLError::LEVEL_ERROR)
{
- mainloop.post(nop);
- }
+ // Notify plugin
+ LLSD event;
+ event["type"] = "error";
+ event["error"] = error;
+ mReplyPump.post(event);
- // forward the call to the previous FatalFunction
- mPrevFatalFunction(error);
+ // All the above really accomplished was to buffer the serialized
+ // event in our WritePipe. Have to pump mainloop a couple times to
+ // really write it out there... but time out in case we can't write.
+ LLProcess::WritePipe& childin(mChild->getWritePipe(LLProcess::STDIN));
+ LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
+ LLSD nop;
+ F64 until = (LLTimer::getElapsedSeconds() + 2).value();
+ while (childin.size() && LLTimer::getElapsedSeconds() < until)
+ {
+ mainloop.post(nop);
+ }
+ }
}
private:
@@ -421,7 +421,7 @@ private:
mStdinConnection, mStdoutConnection, mStdoutDataConnection, mStderrConnection;
boost::scoped_ptr mBlocker;
LLProcess::ReadPipe::size_type mExpect;
- LLError::FatalFunction mPrevFatalFunction;
+ LLError::RecorderPtr mRecorder;
boost::scoped_ptr mListener;
};
diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp
index ad933154c2..6b1986d0e9 100644
--- a/indra/llcommon/llsingleton.cpp
+++ b/indra/llcommon/llsingleton.cpp
@@ -38,11 +38,6 @@
#include
#include
-namespace {
-void log(LLError::ELevel level,
- const char* p1, const char* p2, const char* p3, const char* p4);
-} // anonymous namespace
-
// Our master list of all LLSingletons is itself an LLSingleton. We used to
// store it in a function-local static, but that could get destroyed before
// the last of the LLSingletons -- and ~LLSingletonBase() definitely wants to
@@ -218,8 +213,8 @@ void LLSingletonBase::pop_initializing()
if (list.empty())
{
- logerrs("Underflow in stack of currently-initializing LLSingletons at ",
- classname(this).c_str(), "::getInstance()");
+ logerrs({"Underflow in stack of currently-initializing LLSingletons at ",
+ classname(this), "::getInstance()"});
}
// Now we know list.back() exists: capture it
@@ -240,9 +235,9 @@ void LLSingletonBase::pop_initializing()
// Now validate the newly-popped LLSingleton.
if (back != this)
{
- logerrs("Push/pop mismatch in stack of currently-initializing LLSingletons: ",
- classname(this).c_str(), "::getInstance() trying to pop ",
- classname(back).c_str());
+ logerrs({"Push/pop mismatch in stack of currently-initializing LLSingletons: ",
+ classname(this), "::getInstance() trying to pop ",
+ classname(back)});
}
// log AFTER popping so logging singletons don't cry circularity
@@ -331,15 +326,15 @@ void LLSingletonBase::capture_dependency()
//
// Example: LLNotifications singleton initializes default channels.
// Channels register themselves with singleton once done.
- logdebugs("LLSingleton circularity: ", out.str().c_str(),
- classname(this).c_str(), "");
+ logdebugs({"LLSingleton circularity: ", out.str(),
+ classname(this)});
}
else
{
// Actual circularity with other singleton (or single singleton is used extensively).
// Dependency can be unclear.
- logwarns("LLSingleton circularity: ", out.str().c_str(),
- classname(this).c_str(), "");
+ logwarns({"LLSingleton circularity: ", out.str(),
+ classname(this)});
}
}
else
@@ -352,8 +347,8 @@ void LLSingletonBase::capture_dependency()
if (current->mDepends.insert(this).second)
{
// only log the FIRST time we hit this dependency!
- logdebugs(classname(current).c_str(),
- " depends on ", classname(this).c_str());
+ logdebugs({classname(current),
+ " depends on ", classname(this)});
}
}
}
@@ -401,7 +396,7 @@ LLSingletonBase::vec_t LLSingletonBase::dep_sort()
void LLSingletonBase::cleanup_()
{
- logdebugs("calling ", classname(this).c_str(), "::cleanupSingleton()");
+ logdebugs({"calling ", classname(this), "::cleanupSingleton()"});
try
{
cleanupSingleton();
@@ -427,23 +422,23 @@ void LLSingletonBase::deleteAll()
if (! sp->mDeleteSingleton)
{
// This Should Not Happen... but carry on.
- logwarns(name.c_str(), "::mDeleteSingleton not initialized!");
+ logwarns({name, "::mDeleteSingleton not initialized!"});
}
else
{
// properly initialized: call it.
- logdebugs("calling ", name.c_str(), "::deleteSingleton()");
+ logdebugs({"calling ", name, "::deleteSingleton()"});
// From this point on, DO NOT DEREFERENCE sp!
sp->mDeleteSingleton();
}
}
catch (const std::exception& e)
{
- logwarns("Exception in ", name.c_str(), "::deleteSingleton(): ", e.what());
+ logwarns({"Exception in ", name, "::deleteSingleton(): ", e.what()});
}
catch (...)
{
- logwarns("Unknown exception in ", name.c_str(), "::deleteSingleton()");
+ logwarns({"Unknown exception in ", name, "::deleteSingleton()"});
}
}
}
@@ -451,49 +446,40 @@ void LLSingletonBase::deleteAll()
/*---------------------------- Logging helpers -----------------------------*/
namespace {
-void log(LLError::ELevel level,
- const char* p1, const char* p2, const char* p3, const char* p4)
+std::ostream& operator<<(std::ostream& out, const LLSingletonBase::string_params& args)
{
- LL_VLOGS(level, "LLSingleton") << p1 << p2 << p3 << p4 << LL_ENDL;
+ // However many args there are in args, stream each of them to 'out'.
+ for (auto arg : args)
+ {
+ out << arg;
+ }
+ return out;
}
} // anonymous namespace
//static
-void LLSingletonBase::logwarns(const char* p1, const char* p2, const char* p3, const char* p4)
+void LLSingletonBase::logwarns(const string_params& args)
{
- log(LLError::LEVEL_WARN, p1, p2, p3, p4);
+ LL_WARNS("LLSingleton") << args << LL_ENDL;
}
//static
-void LLSingletonBase::loginfos(const char* p1, const char* p2, const char* p3, const char* p4)
+void LLSingletonBase::loginfos(const string_params& args)
{
- log(LLError::LEVEL_INFO, p1, p2, p3, p4);
+ LL_INFOS("LLSingleton") << args << LL_ENDL;
}
//static
-void LLSingletonBase::logdebugs(const char* p1, const char* p2, const char* p3, const char* p4)
+void LLSingletonBase::logdebugs(const string_params& args)
{
- log(LLError::LEVEL_DEBUG, p1, p2, p3, p4);
+ LL_DEBUGS("LLSingleton") << args << LL_ENDL;
}
//static
-void LLSingletonBase::logerrs(const char* p1, const char* p2, const char* p3, const char* p4)
+void LLSingletonBase::logerrs(const string_params& args)
{
- log(LLError::LEVEL_ERROR, p1, p2, p3, p4);
- // The other important side effect of LL_ERRS() is
- // https://www.youtube.com/watch?v=OMG7paGJqhQ (emphasis on OMG)
- std::ostringstream out;
- out << p1 << p2 << p3 << p4;
- auto crash = LLError::getFatalFunction();
- if (crash)
- {
- crash(out.str());
- }
- else
- {
- LLError::crashAndLoop(out.str());
- }
+ LL_ERRS("LLSingleton") << args << LL_ENDL;
}
std::string LLSingletonBase::demangle(const char* mangled)
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index 6f4f9bea17..a286fcbff6 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -27,9 +27,10 @@
#include
#include
+#include
#include
-#include
#include
+#include
#include "mutex.h"
#include "lockstatic.h"
#include "llthread.h" // on_main_thread()
@@ -111,14 +112,13 @@ protected:
void capture_dependency();
// delegate logging calls to llsingleton.cpp
- static void logerrs(const char* p1, const char* p2="",
- const char* p3="", const char* p4="");
- static void logwarns(const char* p1, const char* p2="",
- const char* p3="", const char* p4="");
- static void loginfos(const char* p1, const char* p2="",
- const char* p3="", const char* p4="");
- static void logdebugs(const char* p1, const char* p2="",
- const char* p3="", const char* p4="");
+public:
+ typedef std::initializer_list string_params;
+protected:
+ static void logerrs (const string_params&);
+ static void logwarns (const string_params&);
+ static void loginfos (const string_params&);
+ static void logdebugs(const string_params&);
static std::string demangle(const char* mangled);
// these classname() declarations restate template functions declared in
// llerror.h because we avoid #including that here
@@ -368,8 +368,8 @@ private:
// init stack to its previous size BEFORE logging so log-machinery
// LLSingletons don't record a dependency on DERIVED_TYPE!
LLSingleton_manage_master().reset_initializing(prev_size);
- logwarns("Error constructing ", classname().c_str(),
- ": ", err.what());
+ logwarns({"Error constructing ", classname(),
+ ": ", err.what()});
// There isn't a separate EInitState value meaning "we attempted
// to construct this LLSingleton subclass but could not," so use
// DELETED. That seems slightly more appropriate than UNINITIALIZED.
@@ -397,8 +397,8 @@ private:
// BEFORE logging, so log-machinery LLSingletons don't record a
// dependency on DERIVED_TYPE!
pop_initializing(lk->mInstance);
- logwarns("Error in ", classname().c_str(),
- "::initSingleton(): ", err.what());
+ logwarns({"Error in ", classname(),
+ "::initSingleton(): ", err.what()});
// Get rid of the instance entirely. This call depends on our
// recursive_mutex. We could have a deleteSingleton(LockStatic&)
// overload and pass lk, but we don't strictly need it.
@@ -547,9 +547,9 @@ public:
case CONSTRUCTING:
// here if DERIVED_TYPE's constructor (directly or indirectly)
// calls DERIVED_TYPE::getInstance()
- logerrs("Tried to access singleton ",
- classname().c_str(),
- " from singleton constructor!");
+ logerrs({"Tried to access singleton ",
+ classname(),
+ " from singleton constructor!"});
return nullptr;
case INITIALIZING:
@@ -564,9 +564,9 @@ public:
case DELETED:
// called after deleteSingleton()
- logwarns("Trying to access deleted singleton ",
- classname().c_str(),
- " -- creating new instance");
+ logwarns({"Trying to access deleted singleton ",
+ classname(),
+ " -- creating new instance"});
// fall through
case UNINITIALIZED:
case QUEUED:
@@ -593,8 +593,8 @@ public:
} // unlock 'lk'
// Per the comment block above, dispatch to the main thread.
- loginfos(classname().c_str(),
- "::getInstance() dispatching to main thread");
+ loginfos({classname(),
+ "::getInstance() dispatching to main thread"});
auto instance = LLMainThreadTask::dispatch(
[](){
// VERY IMPORTANT to call getInstance() on the main thread,
@@ -604,16 +604,16 @@ public:
// the main thread processes them, only the FIRST such request
// actually constructs the instance -- every subsequent one
// simply returns the existing instance.
- loginfos(classname().c_str(),
- "::getInstance() on main thread");
+ loginfos({classname(),
+ "::getInstance() on main thread"});
return getInstance();
});
// record the dependency chain tracked on THIS thread, not the main
// thread (consider a getInstance() overload with a tag param that
// suppresses dep tracking when dispatched to the main thread)
capture_dependency(instance);
- loginfos(classname().c_str(),
- "::getInstance() returning on requesting thread");
+ loginfos({classname(),
+ "::getInstance() returning on requesting thread"});
return instance;
}
@@ -682,16 +682,16 @@ private:
// For organizational purposes this function shouldn't be called twice
if (lk->mInitState != super::UNINITIALIZED)
{
- super::logerrs("Tried to initialize singleton ",
- super::template classname().c_str(),
- " twice!");
+ super::logerrs({"Tried to initialize singleton ",
+ super::template classname(),
+ " twice!"});
return nullptr;
}
else if (on_main_thread())
{
// on the main thread, simply construct instance while holding lock
- super::logdebugs(super::template classname().c_str(),
- "::initParamSingleton()");
+ super::logdebugs({super::template classname(),
+ "::initParamSingleton()"});
super::constructSingleton(lk, std::forward(args)...);
return lk->mInstance;
}
@@ -703,8 +703,8 @@ private:
lk->mInitState = super::QUEUED;
// very important to unlock here so main thread can actually process
lk.unlock();
- super::loginfos(super::template classname().c_str(),
- "::initParamSingleton() dispatching to main thread");
+ super::loginfos({super::template classname(),
+ "::initParamSingleton() dispatching to main thread"});
// Normally it would be the height of folly to reference-bind
// 'args' into a lambda to be executed on some other thread! By
// the time that thread executed the lambda, the references would
@@ -715,12 +715,12 @@ private:
// references.
auto instance = LLMainThreadTask::dispatch(
[&](){
- super::loginfos(super::template classname().c_str(),
- "::initParamSingleton() on main thread");
+ super::loginfos({super::template classname(),
+ "::initParamSingleton() on main thread"});
return initParamSingleton_(std::forward(args)...);
});
- super::loginfos(super::template classname().c_str(),
- "::initParamSingleton() returning on requesting thread");
+ super::loginfos({super::template classname(),
+ "::initParamSingleton() returning on requesting thread"});
return instance;
}
}
@@ -748,14 +748,14 @@ public:
{
case super::UNINITIALIZED:
case super::QUEUED:
- super::logerrs("Uninitialized param singleton ",
- super::template classname().c_str());
+ super::logerrs({"Uninitialized param singleton ",
+ super::template classname()});
break;
case super::CONSTRUCTING:
- super::logerrs("Tried to access param singleton ",
- super::template classname().c_str(),
- " from singleton constructor!");
+ super::logerrs({"Tried to access param singleton ",
+ super::template classname(),
+ " from singleton constructor!"});
break;
case super::INITIALIZING:
@@ -767,8 +767,8 @@ public:
return lk->mInstance;
case super::DELETED:
- super::logerrs("Trying to access deleted param singleton ",
- super::template classname().c_str());
+ super::logerrs({"Trying to access deleted param singleton ",
+ super::template classname()});
break;
}
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index a56c3f7a51..8c5ff50a56 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -358,8 +358,9 @@ void LLThread::setQuitting()
{
mStatus = QUITTING;
}
+ // It's only safe to remove mRunCondition if all locked threads were notified
+ mRunCondition->broadcast();
mDataLock->unlock();
- wake();
}
// static
diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp
index be6edd8b7c..d23b45f177 100644
--- a/indra/llcommon/lluri.cpp
+++ b/indra/llcommon/lluri.cpp
@@ -280,7 +280,7 @@ std::string LLURI::escapePathAndData(const std::string &str)
std::string fragment;
size_t fragment_pos = str.find('#');
- if (fragment_pos != std::string::npos)
+ if ((fragment_pos != std::string::npos) && (fragment_pos > delim_pos))
{
query = str.substr(path_size, fragment_pos - path_size);
fragment = str.substr(fragment_pos);
diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp
index 8e1f4c14ac..148c18aabe 100644
--- a/indra/llcommon/tests/llerror_test.cpp
+++ b/indra/llcommon/tests/llerror_test.cpp
@@ -26,6 +26,7 @@
*/
#include
+#include
#include "linden_common.h"
@@ -69,21 +70,41 @@ namespace
namespace
{
- static bool fatalWasCalled;
- void fatalCall(const std::string&) { fatalWasCalled = true; }
+ static bool fatalWasCalled = false;
+ struct FatalWasCalled: public std::runtime_error
+ {
+ FatalWasCalled(const std::string& what): std::runtime_error(what) {}
+ };
+ void fatalCall(const std::string& msg) { throw FatalWasCalled(msg); }
}
+// Because we use LLError::setFatalFunction(fatalCall), any LL_ERRS call we
+// issue will throw FatalWasCalled. But we want the test program to continue.
+// So instead of writing:
+// LL_ERRS("tag") << "some message" << LL_ENDL;
+// write:
+// CATCH(LL_ERRS("tag"), "some message");
+#define CATCH(logcall, expr) \
+ try \
+ { \
+ logcall << expr << LL_ENDL; \
+ } \
+ catch (const FatalWasCalled&) \
+ { \
+ fatalWasCalled = true; \
+ }
+
namespace tut
{
class TestRecorder : public LLError::Recorder
{
public:
TestRecorder()
- {
- showTime(false);
- }
+ {
+ showTime(false);
+ }
virtual ~TestRecorder()
- {}
+ {}
virtual void recordMessage(LLError::ELevel level,
const std::string& message)
@@ -252,7 +273,7 @@ namespace
LL_DEBUGS("WriteTag","AnotherTag") << "one" << LL_ENDL;
LL_INFOS("WriteTag") << "two" << LL_ENDL;
LL_WARNS("WriteTag") << "three" << LL_ENDL;
- LL_ERRS("WriteTag") << "four" << LL_ENDL;
+ CATCH(LL_ERRS("WriteTag"), "four");
}
};
@@ -380,7 +401,7 @@ namespace
std::string errorReturningLocation()
{
- LL_ERRS() << "die" << LL_ENDL; int this_line = __LINE__;
+ int this_line = __LINE__; CATCH(LL_ERRS(), "die");
return locationString(this_line);
}
}
@@ -701,7 +722,7 @@ public:
static void doDebug() { LL_DEBUGS() << "add dice" << LL_ENDL; }
static void doInfo() { LL_INFOS() << "any idea" << LL_ENDL; }
static void doWarn() { LL_WARNS() << "aim west" << LL_ENDL; }
- static void doError() { LL_ERRS() << "ate eels" << LL_ENDL; }
+ static void doError() { CATCH(LL_ERRS(), "ate eels"); }
static void doAll() { doDebug(); doInfo(); doWarn(); doError(); }
};
@@ -712,7 +733,7 @@ public:
static void doDebug() { LL_DEBUGS() << "bed down" << LL_ENDL; }
static void doInfo() { LL_INFOS() << "buy iron" << LL_ENDL; }
static void doWarn() { LL_WARNS() << "bad word" << LL_ENDL; }
- static void doError() { LL_ERRS() << "big easy" << LL_ENDL; }
+ static void doError() { CATCH(LL_ERRS(), "big easy"); }
static void doAll() { doDebug(); doInfo(); doWarn(); doError(); }
};
@@ -874,13 +895,10 @@ namespace tut
namespace
{
std::string writeTagWithSpaceReturningLocation()
- {
- LL_DEBUGS("Write Tag") << "not allowed" << LL_ENDL; int this_line = __LINE__;
-
- std::ostringstream location;
- location << LLError::abbreviateFile(__FILE__).c_str() << "(" << this_line << ")";
- return location.str();
- }
+ {
+ int this_line = __LINE__; CATCH(LL_DEBUGS("Write Tag"), "not allowed");
+ return locationString(this_line);
+ }
};
namespace tut
@@ -894,9 +912,9 @@ namespace tut
std::string location = writeTagWithSpaceReturningLocation();
std::string expected = "Space is not allowed in a log tag at " + location;
- ensure_message_field_equals(0, LEVEL_FIELD, "ERROR");
- ensure_message_field_equals(0, MSG_FIELD, expected);
- ensure("fatal callback called", fatalWasCalled);
+ ensure_message_field_equals(0, LEVEL_FIELD, "ERROR");
+ ensure_message_field_equals(0, MSG_FIELD, expected);
+ ensure("fatal callback called", fatalWasCalled);
}
}
diff --git a/indra/llcommon/tests/wrapllerrs.h b/indra/llcommon/tests/wrapllerrs.h
index b07d5afbd8..3779fb41bc 100644
--- a/indra/llcommon/tests/wrapllerrs.h
+++ b/indra/llcommon/tests/wrapllerrs.h
@@ -44,10 +44,6 @@
#include
#include
-// statically reference the function in test.cpp... it's short, we could
-// replicate, but better to reuse
-extern void wouldHaveCrashed(const std::string& message);
-
struct WrapLLErrs
{
WrapLLErrs():
@@ -59,7 +55,8 @@ struct WrapLLErrs
mPriorFatal(LLError::getFatalFunction())
{
// Make LL_ERRS call our own operator() method
- LLError::setFatalFunction(boost::bind(&WrapLLErrs::operator(), this, _1));
+ LLError::setFatalFunction(
+ [this](const std::string& message){ (*this)(message); });
}
~WrapLLErrs()
@@ -199,11 +196,13 @@ public:
// with that output. If it turns out that saveAndResetSettings() has
// some bad effect, give up and just let the DEBUG level log messages
// display.
- : boost::noncopyable(),
+ : boost::noncopyable(),
+ mFatalFunction(LLError::getFatalFunction()),
mOldSettings(LLError::saveAndResetSettings()),
- mRecorder(new CaptureLogRecorder())
+ mRecorder(new CaptureLogRecorder())
{
- LLError::setFatalFunction(wouldHaveCrashed);
+ // reinstate the FatalFunction we just reset
+ LLError::setFatalFunction(mFatalFunction);
LLError::setDefaultLevel(level);
LLError::addRecorder(mRecorder);
}
@@ -219,17 +218,18 @@ public:
/// for the sought string.
std::string messageWith(const std::string& search, bool required=true)
{
- return boost::dynamic_pointer_cast(mRecorder)->messageWith(search, required);
+ return boost::dynamic_pointer_cast(mRecorder)->messageWith(search, required);
}
std::ostream& streamto(std::ostream& out) const
{
- return boost::dynamic_pointer_cast(mRecorder)->streamto(out);
+ return boost::dynamic_pointer_cast(mRecorder)->streamto(out);
}
private:
+ LLError::FatalFunction mFatalFunction;
LLError::SettingsStoragePtr mOldSettings;
- LLError::RecorderPtr mRecorder;
+ LLError::RecorderPtr mRecorder;
};
#endif /* ! defined(LL_WRAPLLERRS_H) */
diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt
index 33d66fad53..2f27c127cd 100644
--- a/indra/llcorehttp/CMakeLists.txt
+++ b/indra/llcorehttp/CMakeLists.txt
@@ -17,6 +17,7 @@ include(LLAddBuildTest)
include(LLMessage)
include(LLCommon)
include(Tut)
+include(bugsplat)
include_directories (${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/indra/llcorehttp/_httpreplyqueue.cpp b/indra/llcorehttp/_httpreplyqueue.cpp
index 2b138f3ad5..229bfdbe07 100644
--- a/indra/llcorehttp/_httpreplyqueue.cpp
+++ b/indra/llcorehttp/_httpreplyqueue.cpp
@@ -56,7 +56,6 @@ void HttpReplyQueue::addOp(const HttpReplyQueue::opPtr_t &op)
mQueue.push_back(op);
}
- mQueueCV.notify_all();
}
diff --git a/indra/llcorehttp/_httpreplyqueue.h b/indra/llcorehttp/_httpreplyqueue.h
index 928ee10a83..33e205c1c9 100644
--- a/indra/llcorehttp/_httpreplyqueue.h
+++ b/indra/llcorehttp/_httpreplyqueue.h
@@ -98,7 +98,6 @@ protected:
OpContainer mQueue;
LLCoreInt::HttpMutex mQueueMutex;
- LLCoreInt::HttpConditionVariable mQueueCV;
}; // end class HttpReplyQueue
diff --git a/indra/llcorehttp/_httprequestqueue.cpp b/indra/llcorehttp/_httprequestqueue.cpp
index c6f4ad789f..ad72bdcce6 100644
--- a/indra/llcorehttp/_httprequestqueue.cpp
+++ b/indra/llcorehttp/_httprequestqueue.cpp
@@ -142,13 +142,19 @@ void HttpRequestQueue::wakeAll()
}
-void HttpRequestQueue::stopQueue()
+bool HttpRequestQueue::stopQueue()
{
{
HttpScopedLock lock(mQueueMutex);
- mQueueStopped = true;
- wakeAll();
+ if (!mQueueStopped)
+ {
+ mQueueStopped = true;
+ wakeAll();
+ return true;
+ }
+ wakeAll();
+ return false;
}
}
diff --git a/indra/llcorehttp/_httprequestqueue.h b/indra/llcorehttp/_httprequestqueue.h
index 3c3d134b07..f0296f30e3 100644
--- a/indra/llcorehttp/_httprequestqueue.h
+++ b/indra/llcorehttp/_httprequestqueue.h
@@ -124,7 +124,7 @@ public:
/// them on their way.
///
/// Threading: callable by any thread.
- void stopQueue();
+ bool stopQueue();
protected:
static HttpRequestQueue * sInstance;
diff --git a/indra/llcorehttp/_httpservice.cpp b/indra/llcorehttp/_httpservice.cpp
index 34268d94f6..56f52f1b09 100644
--- a/indra/llcorehttp/_httpservice.cpp
+++ b/indra/llcorehttp/_httpservice.cpp
@@ -87,7 +87,11 @@ HttpService::~HttpService()
// is a bit tricky.
if (mRequestQueue)
{
- mRequestQueue->stopQueue();
+ if (mRequestQueue->stopQueue())
+ {
+ // Give mRequestQueue a chance to finish
+ ms_sleep(10);
+ }
}
if (mThread)
diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp
index fa0b5a00c2..e62f44ab38 100644
--- a/indra/llcorehttp/httpoptions.cpp
+++ b/indra/llcorehttp/httpoptions.cpp
@@ -32,6 +32,7 @@
namespace LLCore
{
+ bool HttpOptions::sDefaultVerifyPeer = false;
HttpOptions::HttpOptions() :
mWantHeaders(false),
@@ -43,7 +44,7 @@ HttpOptions::HttpOptions() :
mMaxRetryBackoff(HTTP_RETRY_BACKOFF_MAX_DEFAULT),
mUseRetryAfter(HTTP_USE_RETRY_AFTER_DEFAULT),
mFollowRedirects(true),
- mVerifyPeer(false),
+ mVerifyPeer(sDefaultVerifyPeer),
mVerifyHost(false),
mDNSCacheTimeout(-1L),
mNoBody(false),
@@ -123,7 +124,15 @@ void HttpOptions::setHeadersOnly(bool nobody)
{
mNoBody = nobody;
if (mNoBody)
+ {
setWantHeaders(true);
+ setSSLVerifyPeer(false);
+ }
+}
+
+void HttpOptions::setDefaultSSLVerifyPeer(bool verify)
+{
+ sDefaultVerifyPeer = verify;
}
// GetIfModified request
diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h
index 59435328f3..ef12edf316 100644
--- a/indra/llcorehttp/httpoptions.h
+++ b/indra/llcorehttp/httpoptions.h
@@ -143,7 +143,7 @@ public:
/// Instructs the LLCore::HTTPRequest to verify that the exchanged security
/// certificate is authentic.
- /// Default: false
+ /// Default: sDefaultVerifyPeer
void setSSLVerifyPeer(bool verify);
bool getSSLVerifyPeer() const
{
@@ -178,6 +178,13 @@ public:
return mNoBody;
}
+ /// Sets default behavior for verifying that the name in the
+ /// security certificate matches the name of the host contacted.
+ /// Defaults false if not set, but should be set according to
+ /// viewer's initialization options and command argunments, see
+ /// NoVerifySSLCert
+ static void setDefaultSSLVerifyPeer(bool verify);
+
// GetIfModified request
void setLastModified(long last_modified);
long getLastModified() const
@@ -200,6 +207,9 @@ protected:
bool mVerifyHost;
int mDNSCacheTimeout;
bool mNoBody;
+
+ static bool sDefaultVerifyPeer;
+
long mLastModified; // GetIfModified request
}; // end class HttpOptions
diff --git a/indra/llcrashlogger/README.txt b/indra/llcrashlogger/README.txt
new file mode 100644
index 0000000000..6932a8d9c3
--- /dev/null
+++ b/indra/llcrashlogger/README.txt
@@ -0,0 +1,3 @@
+This component is no longer used in Linden Lab builds.
+Change requests to support continued use by open source
+builds are welcome.
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index e77e0e2f6f..9d3ad8b3b9 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -520,6 +520,7 @@ bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg
LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
httpOpts->setTimeout(timeout);
+ httpOpts->setSSLVerifyPeer(false);
for(int i = 0; i < retries; ++i)
{
diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp
index 6e77de2735..aa4e07a583 100644
--- a/indra/llfilesystem/lldiskcache.cpp
+++ b/indra/llfilesystem/lldiskcache.cpp
@@ -62,6 +62,11 @@ LLDiskCache::LLDiskCache(const std::string cache_dir,
LLFile::mkdir(dirname);
}
//
+ // add static assets into the new cache after clear.
+ // Only missing entries are copied on init, skiplist is setup
+ // For everything we populate FS specific assets to allow future updates
+ prepopulateCacheWithStatic();
+ //
}
void LLDiskCache::purge()
@@ -117,6 +122,11 @@ void LLDiskCache::purge()
LL_INFOS() << "Purging cache to a maximum of " << mMaxSizeBytes << " bytes" << LL_ENDL;
+ // Extra accounting to track the retention of static assets
+ int keep{0};
+ int del{0};
+ int skip{0};
+ //
uintmax_t file_size_total = 0;
for (file_info_t& entry : file_info)
{
@@ -126,17 +136,34 @@ void LLDiskCache::purge()
if (file_size_total > mMaxSizeBytes)
{
action = "DELETE:";
- // Do not crash if we cannot delete the file for some reason
- //boost::filesystem::remove(entry.second.second);
- boost::filesystem::remove(entry.second.second, ec);
- if (ec.failed())
+ // Make sure static assets are not eliminated
+ auto uuid_as_string = gDirUtilp->getBaseFileName(entry.second.second,true);
+ uuid_as_string = uuid_as_string.substr(mCacheFilenamePrefix.size() + 1, 36);// skip "sl_cache_" and trailing "_N"
+ // LL_INFOS() << "checking UUID=" <
+ // Do not crash if we cannot delete the file for some reason
+ //boost::filesystem::remove(entry.second.second);
+ boost::filesystem::remove(entry.second.second, ec);
+ if (ec.failed())
+ {
+ LL_WARNS() << "Failed to delete cache file " << entry.second.second << ": " << ec.message() << LL_ENDL;
+ }
}
//
}
else
{
+ keep++; // Extra accounting to track the retention of static assets
action = " KEEP:";
}
@@ -160,6 +187,7 @@ void LLDiskCache::purge()
auto execute_time = std::chrono::duration_cast(end_time - start_time).count();
LL_INFOS() << "Total dir size after purge is " << dirFileSize(mCacheDir) << LL_ENDL;
LL_INFOS() << "Cache purge took " << execute_time << " ms to execute for " << file_info.size() << " files" << LL_ENDL;
+ LL_INFOS() << "Deleted: " << del << " Skipped: " << skip << " Kept: " << keep << LL_ENDL; // Extra accounting to track the retention of static assets
}
}
@@ -321,8 +349,57 @@ const std::string LLDiskCache::getCacheInfo()
return cache_info.str();
}
+// Copy static items into cache and add to the skip list that prevents their purging
+// Note that there is no de-duplication nor other validation of the list.
+void LLDiskCache::prepopulateCacheWithStatic()
+{
+ mSkipList.clear();
+
+ std::vector from_folders;
+ from_folders.emplace_back(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "fs_static_assets"));
+#ifdef OPENSIM
+ from_folders.emplace_back(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "static_assets"));
+#endif
+
+ for (const auto& from_folder : from_folders)
+ {
+ if (gDirUtilp->fileExists(from_folder))
+ {
+ auto assets_to_copy = gDirUtilp->getFilesInDir(from_folder);
+ for (auto from_asset_file : assets_to_copy)
+ {
+ from_asset_file = from_folder + gDirUtilp->getDirDelimiter() + from_asset_file;
+ // we store static assets as UUID.asset_type the asset_type is not used in the current simple cache format
+ auto uuid_as_string{ gDirUtilp->getBaseFileName(from_asset_file, true) };
+ auto to_asset_file = metaDataToFilepath(uuid_as_string, LLAssetType::AT_UNKNOWN, std::string());
+ if (!gDirUtilp->fileExists(to_asset_file))
+ {
+ if (mEnableCacheDebugInfo)
+ {
+ LL_INFOS("LLDiskCache") << "Copying static asset " << from_asset_file << " to cache from " << from_folder << LL_ENDL;
+ }
+ if (!LLFile::copy(from_asset_file, to_asset_file))
+ {
+ LL_WARNS("LLDiskCache") << "Failed to copy " << from_asset_file << " to " << to_asset_file << LL_ENDL;
+ }
+ }
+ if (std::find(mSkipList.begin(), mSkipList.end(), uuid_as_string) == mSkipList.end())
+ {
+ if (mEnableCacheDebugInfo)
+ {
+ LL_INFOS("LLDiskCache") << "Adding " << uuid_as_string << " to skip list" << LL_ENDL;
+ }
+ mSkipList.emplace_back(uuid_as_string);
+ }
+ }
+ }
+ }
+}
+//
+
void LLDiskCache::clearCache()
{
+ LL_INFOS() << "clearing cache " << mCacheDir << LL_ENDL;
/**
* See notes on performance in dirFileSize(..) - there may be
* a quicker way to do this by operating on the parent dir vs
@@ -356,7 +433,10 @@ void LLDiskCache::clearCache()
}
}
}
+ // add static assets into the new cache after clear
+ prepopulateCacheWithStatic();
}
+ LL_INFOS() << "Cleared cache " << mCacheDir << LL_ENDL;
}
uintmax_t LLDiskCache::dirFileSize(const std::string dir)
diff --git a/indra/llfilesystem/lldiskcache.h b/indra/llfilesystem/lldiskcache.h
index 42a02a68e4..1164b428e0 100644
--- a/indra/llfilesystem/lldiskcache.h
+++ b/indra/llfilesystem/lldiskcache.h
@@ -131,6 +131,11 @@ class LLDiskCache :
*/
void purge();
+ //
+ // copy from distribution into cache to replace static content
+ void prepopulateCacheWithStatic();
+ //
+
/**
* Clear the cache by removing all the files in the specified cache
* directory individually. Only the files that contain a prefix defined
@@ -191,6 +196,8 @@ class LLDiskCache :
* various parts of the code
*/
bool mEnableCacheDebugInfo;
+
+ std::vector mSkipList; // Vector of "static" untouchable assets that should never be purged
};
// Regular disk cache cleanup
diff --git a/indra/llfilesystem/llfilesystem.cpp b/indra/llfilesystem/llfilesystem.cpp
index 8e1d4f12b6..a64070eb9d 100644
--- a/indra/llfilesystem/llfilesystem.cpp
+++ b/indra/llfilesystem/llfilesystem.cpp
@@ -81,10 +81,7 @@ bool LLFileSystem::getExists(const LLUUID& file_id, const LLAssetType::EType fil
}
// static
-// Fix log spam
-//bool LLFileSystem::removeFile(const LLUUID& file_id, const LLAssetType::EType file_type)
bool LLFileSystem::removeFile(const LLUUID& file_id, const LLAssetType::EType file_type, int suppress_error /*= 0*/)
-//
{
FSZoneC(tracy::Color::Gold); // measure cache performance
std::string id_str;
@@ -92,10 +89,7 @@ bool LLFileSystem::removeFile(const LLUUID& file_id, const LLAssetType::EType fi
const std::string extra_info = "";
const std::string filename = LLDiskCache::getInstance()->metaDataToFilepath(id_str, file_type, extra_info);
- // Fix log spam
- //LLFile::remove(filename.c_str());
LLFile::remove(filename.c_str(), suppress_error);
- //
return true;
}
@@ -115,10 +109,7 @@ bool LLFileSystem::renameFile(const LLUUID& old_file_id, const LLAssetType::ETyp
const std::string new_filename = LLDiskCache::getInstance()->metaDataToFilepath(new_id_str, new_file_type, extra_info);
// Rename needs the new file to not exist.
- // Fix log spam
- //LLFileSystem::removeFile(new_file_id, new_file_type);
LLFileSystem::removeFile(new_file_id, new_file_type, ENOENT);
- //
if (LLFile::rename(old_filename, new_filename) != 0)
{
diff --git a/indra/llfilesystem/llfilesystem.h b/indra/llfilesystem/llfilesystem.h
index 41c39e1f63..d934a408c2 100644
--- a/indra/llfilesystem/llfilesystem.h
+++ b/indra/llfilesystem/llfilesystem.h
@@ -54,10 +54,7 @@ class LLFileSystem
BOOL remove();
static bool getExists(const LLUUID& file_id, const LLAssetType::EType file_type);
- // Fix log spam
- //static bool removeFile(const LLUUID& file_id, const LLAssetType::EType file_type);
static bool removeFile(const LLUUID& file_id, const LLAssetType::EType file_type, int suppress_error = 0);
- //
static bool renameFile(const LLUUID& old_file_id, const LLAssetType::EType old_file_type,
const LLUUID& new_file_id, const LLAssetType::EType new_file_type);
static S32 getFileSize(const LLUUID& file_id, const LLAssetType::EType file_type);
diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt
index dc8e9f7c2f..8883317751 100644
--- a/indra/llimage/CMakeLists.txt
+++ b/indra/llimage/CMakeLists.txt
@@ -11,6 +11,7 @@ include(LLKDU)
include(LLImageJ2COJ)
include(ZLIB)
include(LLAddBuildTest)
+include(bugsplat)
include(Tut)
include_directories(
diff --git a/indra/llinventory/lllandmark.cpp b/indra/llinventory/lllandmark.cpp
index b427aeaf55..1a7629edfa 100644
--- a/indra/llinventory/lllandmark.cpp
+++ b/indra/llinventory/lllandmark.cpp
@@ -103,60 +103,104 @@ LLVector3 LLLandmark::getRegionPos() const
// static
-LLLandmark* LLLandmark::constructFromString(const char *buffer)
+LLLandmark* LLLandmark::constructFromString(const char *buffer, const S32 buffer_size)
{
- const char* cur = buffer;
S32 chars_read = 0;
+ S32 chars_read_total = 0;
S32 count = 0;
U32 version = 0;
+ bool bad_block = false;
+ LLLandmark* result = NULL;
+
// read version
- count = sscanf( cur, "Landmark version %u\n%n", &version, &chars_read );
- if(count != 1)
- {
- goto error;
- }
+ count = sscanf( buffer, "Landmark version %u\n%n", &version, &chars_read );
+ chars_read_total += chars_read;
- if(version == 1)
- {
- LLVector3d pos;
- cur += chars_read;
- // read position
- count = sscanf( cur, "position %lf %lf %lf\n%n", pos.mdV+VX, pos.mdV+VY, pos.mdV+VZ, &chars_read );
- if( count != 3 )
- {
- goto error;
- }
- cur += chars_read;
- // LL_INFOS() << "Landmark read: " << pos << LL_ENDL;
-
- return new LLLandmark(pos);
- }
- else if(version == 2)
- {
- // *NOTE: Changing the buffer size will require changing the
- // scanf call below.
- char region_id_str[MAX_STRING]; /* Flawfinder: ignore */
- LLVector3 pos;
- cur += chars_read;
- count = sscanf( /* Flawfinder: ignore */
- cur,
- "region_id %254s\n%n",
- region_id_str, &chars_read);
- if(count != 1) goto error;
- cur += chars_read;
- count = sscanf(cur, "local_pos %f %f %f\n%n", pos.mV+VX, pos.mV+VY, pos.mV+VZ, &chars_read);
- if(count != 3) goto error;
- cur += chars_read;
- LLLandmark* lm = new LLLandmark;
- lm->mRegionID.set(region_id_str);
- lm->mRegionPos = pos;
- return lm;
- }
+ if (count != 1
+ || chars_read_total >= buffer_size)
+ {
+ bad_block = true;
+ }
- error:
- LL_INFOS() << "Bad Landmark Asset: bad _DATA_ block." << LL_ENDL;
- return NULL;
+ if (!bad_block)
+ {
+ switch (version)
+ {
+ case 1:
+ {
+ LLVector3d pos;
+ // read position
+ count = sscanf(buffer + chars_read_total, "position %lf %lf %lf\n%n", pos.mdV + VX, pos.mdV + VY, pos.mdV + VZ, &chars_read);
+ if (count != 3)
+ {
+ bad_block = true;
+ }
+ else
+ {
+ LL_DEBUGS("Landmark") << "Landmark read: " << pos << LL_ENDL;
+ result = new LLLandmark(pos);
+ }
+ break;
+ }
+ case 2:
+ {
+ // *NOTE: Changing the buffer size will require changing the
+ // scanf call below.
+ char region_id_str[MAX_STRING];
+ LLVector3 pos;
+ LLUUID region_id;
+ count = sscanf( buffer + chars_read_total,
+ "region_id %254s\n%n",
+ region_id_str,
+ &chars_read);
+ chars_read_total += chars_read;
+
+ if (count != 1
+ || chars_read_total >= buffer_size
+ || !LLUUID::validate(region_id_str))
+ {
+ bad_block = true;
+ }
+
+ if (!bad_block)
+ {
+ region_id.set(region_id_str);
+ if (region_id.isNull())
+ {
+ bad_block = true;
+ }
+ }
+
+ if (!bad_block)
+ {
+ count = sscanf(buffer + chars_read_total, "local_pos %f %f %f\n%n", pos.mV + VX, pos.mV + VY, pos.mV + VZ, &chars_read);
+ if (count != 3)
+ {
+ bad_block = true;
+ }
+ else
+ {
+ result = new LLLandmark;
+ result->mRegionID = region_id;
+ result->mRegionPos = pos;
+ }
+ }
+ break;
+ }
+ default:
+ {
+ LL_INFOS("Landmark") << "Encountered Unknown landmark version " << version << LL_ENDL;
+ break;
+ }
+ }
+ }
+
+ if (bad_block)
+ {
+ LL_INFOS("Landmark") << "Bad Landmark Asset: bad _DATA_ block." << LL_ENDL;
+ }
+ return result;
}
@@ -176,7 +220,7 @@ void LLLandmark::requestRegionHandle(
if(region_id.isNull())
{
// don't bother with checking - it's 0.
- LL_DEBUGS() << "requestRegionHandle: null" << LL_ENDL;
+ LL_DEBUGS("Landmark") << "requestRegionHandle: null" << LL_ENDL;
if(callback)
{
const U64 U64_ZERO = 0;
@@ -187,7 +231,7 @@ void LLLandmark::requestRegionHandle(
{
if(region_id == mLocalRegion.first)
{
- LL_DEBUGS() << "requestRegionHandle: local" << LL_ENDL;
+ LL_DEBUGS("Landmark") << "requestRegionHandle: local" << LL_ENDL;
if(callback)
{
callback(region_id, mLocalRegion.second);
@@ -198,13 +242,13 @@ void LLLandmark::requestRegionHandle(
region_map_t::iterator it = mRegions.find(region_id);
if(it == mRegions.end())
{
- LL_DEBUGS() << "requestRegionHandle: upstream" << LL_ENDL;
+ LL_DEBUGS("Landmark") << "requestRegionHandle: upstream" << LL_ENDL;
if(callback)
{
region_callback_map_t::value_type vt(region_id, callback);
sRegionCallbackMap.insert(vt);
}
- LL_DEBUGS() << "Landmark requesting information about: "
+ LL_DEBUGS("Landmark") << "Landmark requesting information about: "
<< region_id << LL_ENDL;
msg->newMessage("RegionHandleRequest");
msg->nextBlock("RequestBlock");
@@ -214,7 +258,7 @@ void LLLandmark::requestRegionHandle(
else if(callback)
{
// we have the answer locally - just call the callack.
- LL_DEBUGS() << "requestRegionHandle: ready" << LL_ENDL;
+ LL_DEBUGS("Landmark") << "requestRegionHandle: ready" << LL_ENDL;
callback(region_id, (*it).second.mRegionHandle);
}
}
diff --git a/indra/llinventory/lllandmark.h b/indra/llinventory/lllandmark.h
index 92923ea6fb..be34113a90 100644
--- a/indra/llinventory/lllandmark.h
+++ b/indra/llinventory/lllandmark.h
@@ -60,7 +60,7 @@ public:
// constructs a new LLLandmark from a string
// return NULL if there's an error
- static LLLandmark* constructFromString(const char *buffer);
+ static LLLandmark* constructFromString(const char *buffer, const S32 buffer_size);
// register callbacks that this class handles
static void registerCallbacks(LLMessageSystem* msg);
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index 232b7fcc0d..644bb19672 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -4,6 +4,7 @@ project(llmath)
include(00-Common)
include(LLCommon)
+include(bugsplat)
include(Boost)
include_directories(
diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index fff73ba3aa..eebcbc903a 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -138,13 +138,24 @@ LLCoprocedureManager::~LLCoprocedureManager()
close();
}
-LLCoprocedureManager::poolPtr_t LLCoprocedureManager::initializePool(const std::string &poolName)
+void LLCoprocedureManager::initializePool(const std::string &poolName)
{
+ poolMap_t::iterator it = mPoolMap.find(poolName);
+
+ if (it != mPoolMap.end())
+ {
+ // Pools are not supposed to be initialized twice
+ // Todo: ideally restrict init to STATE_FIRST
+ LL_WARNS("CoProcMgr") << "Pool is already present " << poolName << LL_ENDL;
+ return;
+ }
+
// Attempt to look up a pool size in the configuration. If found use that
std::string keyName = "PoolSize" + poolName;
int size = 0;
LL_ERRS_IF(poolName.empty(), "CoprocedureManager") << "Poolname must not be empty" << LL_ENDL;
+ LL_INFOS("CoprocedureManager") << "Initializing pool " << poolName << LL_ENDL;
if (mPropertyQueryFn)
{
@@ -171,8 +182,6 @@ LLCoprocedureManager::poolPtr_t LLCoprocedureManager::initializePool(const std::
bool inserted = mPoolMap.emplace(poolName, pool).second;
LL_ERRS_IF(!inserted, "CoprocedureManager") << "Unable to add pool named \"" << poolName << "\" to map. FATAL!" << LL_ENDL;
-
- return pool;
}
//-------------------------------------------------------------------------
@@ -182,22 +191,28 @@ LLUUID LLCoprocedureManager::enqueueCoprocedure(const std::string &pool, const s
// not exist, create it.
poolMap_t::iterator it = mPoolMap.find(pool);
- poolPtr_t targetPool = (it != mPoolMap.end()) ? it->second : initializePool(pool);
+ if (it == mPoolMap.end())
+ {
+ // initializing pools in enqueueCoprocedure is not thread safe,
+ // at the moment pools need to be initialized manually
+ LL_ERRS() << "Uninitialized pool " << pool << LL_ENDL;
+ }
+ poolPtr_t targetPool = it->second;
return targetPool->enqueueCoprocedure(name, proc);
}
void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpdate_t updatefn)
{
// functions to discover and store the pool sizes
+ // Might be a better idea to make an initializePool(name, size) to init everything externally
mPropertyQueryFn = queryfn;
mPropertyDefineFn = updatefn;
- // workaround until we get mutex into initializePool
- initializePool("AssetStorage");
initializePool("Upload");
- initializePool("AIS");
- initializePool("ExpCache"); // FIRE-30731: ExpCache coroutine pool crash
+ initializePool("AIS"); // it might be better to have some kind of on-demand initialization for AIS
+ // "ExpCache" pool gets initialized in LLExperienceCache
+ // asset storage pool gets initialized in LLViewerAssetStorage
}
//-------------------------------------------------------------------------
diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h
index d5557c129f..2d460826ff 100644
--- a/indra/llmessage/llcoproceduremanager.h
+++ b/indra/llmessage/llcoproceduremanager.h
@@ -79,6 +79,8 @@ public:
void close();
void close(const std::string &pool);
+
+ void initializePool(const std::string &poolName);
private:
@@ -87,8 +89,6 @@ private:
poolMap_t mPoolMap;
- poolPtr_t initializePool(const std::string &poolName);
-
SettingQuery_t mPropertyQueryFn;
SettingUpdate_t mPropertyDefineFn;
diff --git a/indra/llmessage/llexperiencecache.cpp b/indra/llmessage/llexperiencecache.cpp
index 05da0c57f2..225993c4af 100644
--- a/indra/llmessage/llexperiencecache.cpp
+++ b/indra/llmessage/llexperiencecache.cpp
@@ -114,6 +114,8 @@ void LLExperienceCache::initSingleton()
cache_stream >> (*this);
}
+ LLCoprocedureManager::instance().initializePool("ExpCache");
+
LLCoros::instance().launch("LLExperienceCache::idleCoro",
boost::bind(&LLExperienceCache::idleCoro, this));
diff --git a/indra/llmessage/tests/llcoproceduremanager_test.cpp b/indra/llmessage/tests/llcoproceduremanager_test.cpp
index 9db13a37b5..6424117ef3 100644
--- a/indra/llmessage/tests/llcoproceduremanager_test.cpp
+++ b/indra/llmessage/tests/llcoproceduremanager_test.cpp
@@ -91,6 +91,7 @@ namespace tut
{
Sync sync;
int foo = 0;
+ LLCoprocedureManager::instance().initializePool("PoolName");
LLUUID queueId = LLCoprocedureManager::instance().enqueueCoprocedure("PoolName", "ProcName",
[&foo, &sync] (LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t & ptr, const LLUUID & id) {
sync.bump();
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 8241152b6e..84368ee29e 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -50,6 +50,7 @@ U32 LLRender::sUIVerts = 0;
U32 LLTexUnit::sWhiteTexture = 0;
bool LLRender::sGLCoreProfile = false;
bool LLRender::sNsightDebugSupport = false;
+LLVector2 LLRender::sUIGLScaleFactor = LLVector2(1.f, 1.f);
static const U32 LL_NUM_TEXTURE_LAYERS = 32;
static const U32 LL_NUM_LIGHT_UNITS = 8;
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 8499563838..4f3786ef9b 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -480,6 +480,7 @@ public:
static U32 sUIVerts;
static bool sGLCoreProfile;
static bool sNsightDebugSupport;
+ static LLVector2 sUIGLScaleFactor;
private:
friend class LLLightState;
diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp
index c9e205723e..92d90899c5 100644
--- a/indra/llrender/llrender2dutils.cpp
+++ b/indra/llrender/llrender2dutils.cpp
@@ -106,11 +106,10 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixe
top += LLFontGL::sCurOrigin.mY;
gGL.loadUIIdentity();
- LLRender2D *r2d_inst = LLRender2D::getInstance();
- gl_rect_2d(llfloor((F32)left * r2d_inst->mGLScaleFactor.mV[VX]) - pixel_offset,
- llfloor((F32)top * r2d_inst->mGLScaleFactor.mV[VY]) + pixel_offset,
- llfloor((F32)right * r2d_inst->mGLScaleFactor.mV[VX]) + pixel_offset,
- llfloor((F32)bottom * r2d_inst->mGLScaleFactor.mV[VY]) - pixel_offset,
+ gl_rect_2d(llfloor((F32)left * LLRender::sUIGLScaleFactor.mV[VX]) - pixel_offset,
+ llfloor((F32)top * LLRender::sUIGLScaleFactor.mV[VY]) + pixel_offset,
+ llfloor((F32)right * LLRender::sUIGLScaleFactor.mV[VX]) + pixel_offset,
+ llfloor((F32)bottom * LLRender::sUIGLScaleFactor.mV[VY]) - pixel_offset,
filled);
gGL.popUIMatrix();
}
@@ -2017,7 +2016,6 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv
LLRender2D::LLRender2D(LLImageProviderInterface* image_provider)
{
- mGLScaleFactor = LLVector2(1.f, 1.f);
mImageProvider = image_provider;
if(mImageProvider)
{
@@ -2034,7 +2032,7 @@ LLRender2D::~LLRender2D()
}
}
-
+// static
void LLRender2D::translate(F32 x, F32 y, F32 z)
{
gGL.translateUI(x,y,z);
@@ -2043,12 +2041,14 @@ void LLRender2D::translate(F32 x, F32 y, F32 z)
LLFontGL::sCurDepth += z;
}
+// static
void LLRender2D::pushMatrix()
{
gGL.pushUIMatrix();
LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth));
}
+// static
void LLRender2D::popMatrix()
{
gGL.popUIMatrix();
@@ -2057,6 +2057,7 @@ void LLRender2D::popMatrix()
LLFontGL::sOriginStack.pop_back();
}
+// static
void LLRender2D::loadIdentity()
{
gGL.loadUIIdentity();
@@ -2065,17 +2066,13 @@ void LLRender2D::loadIdentity()
LLFontGL::sCurDepth = 0.f;
}
-void LLRender2D::setScaleFactor(const LLVector2 &scale_factor)
-{
- mGLScaleFactor = scale_factor;
-}
-
+// static
void LLRender2D::setLineWidth(F32 width)
{
// Line width OGL core profile fix by Rye Mutt
//gGL.flush();
- //glLineWidth(width * lerp(mGLScaleFactor.mV[VX], mGLScaleFactor.mV[VY], 0.5f));
- gGL.setLineWidth(width * lerp(mGLScaleFactor.mV[VX], mGLScaleFactor.mV[VY], 0.5f));
+ //glLineWidth(width * lerp(LLRender::sUIGLScaleFactor.mV[VX], LLRender::sUIGLScaleFactor.mV[VY], 0.5f));
+ gGL.setLineWidth(width * lerp(LLRender::sUIGLScaleFactor.mV[VX], LLRender::sUIGLScaleFactor.mV[VY], 0.5f));
}
LLPointer LLRender2D::getUIImageByID(const LLUUID& image_id, S32 priority)
diff --git a/indra/llrender/llrender2dutils.h b/indra/llrender/llrender2dutils.h
index 8c01784071..206e68f084 100644
--- a/indra/llrender/llrender2dutils.h
+++ b/indra/llrender/llrender2dutils.h
@@ -128,19 +128,16 @@ class LLRender2D : public LLParamSingleton
LOG_CLASS(LLRender2D);
~LLRender2D();
public:
- void pushMatrix();
- void popMatrix();
- void loadIdentity();
- void translate(F32 x, F32 y, F32 z = 0.0f);
+ static void pushMatrix();
+ static void popMatrix();
+ static void loadIdentity();
+ static void translate(F32 x, F32 y, F32 z = 0.0f);
- void setLineWidth(F32 width);
- void setScaleFactor(const LLVector2& scale_factor);
+ static void setLineWidth(F32 width);
LLPointer getUIImageByID(const LLUUID& image_id, S32 priority = 0);
LLPointer getUIImage(const std::string& name, S32 priority = 0);
- LLVector2 mGLScaleFactor;
-
protected:
// since LLRender2D has no control of image provider's lifecycle
// we need a way to tell LLRender2D that provider died and
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 098621b543..04485c6262 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -1006,7 +1006,7 @@ void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child)
LLRect screen_rect;
localRectToScreen(child->getRect(),&screen_rect);
- if ( root_rect.overlaps(screen_rect) && LLUI::getInstance()->mDirtyRect.overlaps(screen_rect))
+ if ( root_rect.overlaps(screen_rect) && sDirtyRect.overlaps(screen_rect))
{
gGL.matrixMode(LLRender::MM_MODELVIEW);
LLUI::pushMatrix();
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index e8c5260d51..fff916fc7e 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -219,7 +219,9 @@ void LLConsole::draw()
// Different draw options
//LLUIImagePtr imagep = LLUI::getUIImage("transparent");
- //F32 console_opacity = llclamp(LLUI::getInstance()->mSettingGroups["config"]->getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
+ //static LLCachedControl console_bg_opacity(*LLUI::getInstance()->mSettingGroups["config"], "ConsoleBackgroundOpacity", 0.7f);
+ //F32 console_opacity = llclamp(console_bg_opacity(), 0.f, 1.f);
+
//LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
//color.mV[VALPHA] *= console_opacity;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 508c974415..2615114d0c 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -417,13 +417,15 @@ void LLFloater::layoutDragHandle()
// static
void LLFloater::updateActiveFloaterTransparency()
{
- sActiveControlTransparency = LLUI::getInstance()->mSettingGroups["config"]->getF32("ActiveFloaterTransparency");
+ static LLCachedControl active_transparency(*LLUI::getInstance()->mSettingGroups["config"], "ActiveFloaterTransparency", 1.f);
+ sActiveControlTransparency = active_transparency;
}
// static
void LLFloater::updateInactiveFloaterTransparency()
{
- sInactiveControlTransparency = LLUI::getInstance()->mSettingGroups["config"]->getF32("InactiveFloaterTransparency");
+ static LLCachedControl inactive_transparency(*LLUI::getInstance()->mSettingGroups["config"], "InactiveFloaterTransparency", 0.95f);
+ sInactiveControlTransparency = inactive_transparency;
}
void LLFloater::addResizeCtrls()
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 4812de1109..de77a2c98c 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -346,9 +346,9 @@ static LLTrace::BlockTimerStatHandle FTM_FILTER("Filter Folder View");
void LLFolderView::filter( LLFolderViewFilter& filter )
{
LL_RECORD_BLOCK_TIME(FTM_FILTER);
- static LLCachedControl filter_visible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible", 10);
- static LLCachedControl filter_hidden(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameUnvisible", 1);
- filter.resetTime(llclamp(mParentPanel.get()->getVisible() ? filter_visible() : filter_hidden(), 1, 100));
+ static LLCachedControl time_visible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible", 10);
+ static LLCachedControl time_invisible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameUnvisible", 1);
+ filter.resetTime(llclamp((mParentPanel.get()->getVisible() ? time_visible() : time_invisible()), 1, 100));
// Note: we filter the model, not the view
getViewModelItem()->filter(filter);
@@ -685,11 +685,8 @@ void LLFolderView::draw()
closeAutoOpenedFolders();
}
- // Performance improvement
- //if (mSearchTimer.getElapsedTimeF32() > LLUI::getInstance()->mSettingGroups["config"]->getF32("TypeAheadTimeout") || !mSearchString.size())
- static LLCachedControl typeAheadTimeout(*LLUI::getInstance()->mSettingGroups["config"], "TypeAheadTimeout");
- if (mSearchTimer.getElapsedTimeF32() > typeAheadTimeout || !mSearchString.size())
- //
+ static LLCachedControl type_ahead_timeout(*LLUI::getInstance()->mSettingGroups["config"], "TypeAheadTimeout", 1.5f);
+ if (mSearchTimer.getElapsedTimeF32() > type_ahead_timeout || !mSearchString.size())
{
mSearchString.clear();
}
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index ac47494655..64d702a612 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -1053,9 +1053,10 @@ void LLFolderViewItem::draw()
//
if (filter_string_length > 0)
{
- F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mViewModelItem->getFilterStringOffset());
+ S32 filter_offset = mViewModelItem->getFilterStringOffset();
+ F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, filter_offset + filter_string_length) - font->getWidthF32(combined_string, filter_offset, filter_string_length);
F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
- font->renderUTF8( combined_string, mViewModelItem->getFilterStringOffset(), match_string_left, yy,
+ font->renderUTF8( combined_string, filter_offset, match_string_left, yy,
sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
filter_string_length, S32_MAX, &right_x, FALSE );
}
@@ -1722,7 +1723,7 @@ void LLFolderViewFolder::destroyView()
// extractItem() removes the specified item from the folder, but
// doesn't delete it.
-void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
+void LLFolderViewFolder::extractItem( LLFolderViewItem* item, bool deparent_model )
{
if (item->isSelected())
getRoot()->clearSelection();
@@ -1745,7 +1746,11 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
mItems.erase(it);
}
//item has been removed, need to update filter
- getViewModelItem()->removeChild(item->getViewModelItem());
+ if (deparent_model)
+ {
+ // in some cases model does not belong to parent view, is shared between views
+ getViewModelItem()->removeChild(item->getViewModelItem());
+ }
//because an item is going away regardless of filter status, force rearrange
requestArrange();
removeChild(item);
diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h
index 7baf88a629..72bb926163 100644
--- a/indra/llui/llfolderviewitem.h
+++ b/indra/llui/llfolderviewitem.h
@@ -402,7 +402,7 @@ public:
// extractItem() removes the specified item from the folder, but
// doesn't delete it.
- virtual void extractItem( LLFolderViewItem* item );
+ virtual void extractItem( LLFolderViewItem* item, bool deparent_model = true);
// This function is called by a child that needs to be resorted.
void resort(LLFolderViewItem* item);
diff --git a/indra/llui/llfolderviewmodel.cpp b/indra/llui/llfolderviewmodel.cpp
index ea106b5fae..93122503d1 100644
--- a/indra/llui/llfolderviewmodel.cpp
+++ b/indra/llui/llfolderviewmodel.cpp
@@ -48,9 +48,9 @@ std::string LLFolderViewModelCommon::getStatusText()
void LLFolderViewModelCommon::filter()
{
- static LLCachedControl filter_visible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible", 10);
- getFilter().resetTime(llclamp(filter_visible(), 1, 100));
- mFolderView->getViewModelItem()->filter(getFilter());
+ static LLCachedControl max_time(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible", 10);
+ getFilter().resetTime(llclamp(max_time(), 1, 100));
+ mFolderView->getViewModelItem()->filter(getFilter());
}
bool LLFolderViewModelItemCommon::hasFilterStringMatch()
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index e914bbdae2..73df98870b 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3378,7 +3378,11 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y, S3
CURSOR_WIDTH + MOUSE_CURSOR_PADDING * 2,
CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2);
menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect );
- if (menu->getRect().mTop > menu_region_rect.mTop)
+ // FIRE-31065: Make sure menu is shown on the screen properly
+ //if (menu->getRect().mTop > menu_region_rect.mTop)
+ if (menu->getRect().mTop > menu_region_rect.mTop ||
+ menu->getRect().mBottom < menu_region_rect.mBottom)
+ //
{
// not enough space: align with top, ignore exclusion
menu->translateIntoRect( menu_region_rect );
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index acfe4a0cba..f89064d59a 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -136,6 +136,7 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)
}
}
+ mRoundedSquareImgp = LLUI::getUIImage("Rounded_Square");
if (p.thumb_image.isProvided())
{
mThumbImagep = LLUI::getUIImage(p.thumb_image());
@@ -666,8 +667,6 @@ void LLMultiSlider::draw()
F32 opacity = getEnabled() ? 1.f : 0.3f;
// Track
- LLUIImagePtr thumb_imagep = LLUI::getUIImage("Rounded_Square");
-
static LLUICachedControl multi_track_height_width ("UIMultiTrackHeight", 0);
S32 height_offset = 0;
S32 width_offset = 0;
@@ -685,7 +684,7 @@ void LLMultiSlider::draw()
if(mDrawTrack)
{
track_rect.stretch(-1);
- thumb_imagep->draw(track_rect, mTrackColor.get() % opacity);
+ mRoundedSquareImgp->draw(track_rect, mTrackColor.get() % opacity);
}
// if we're supposed to use a drawn triangle
@@ -704,7 +703,7 @@ void LLMultiSlider::draw()
mTriangleColor.get() % opacity, TRUE);
}
}
- else if (!thumb_imagep && !mThumbImagep)
+ else if (!mRoundedSquareImgp && !mThumbImagep)
{
// draw all the thumbs
curSldrIt = mThumbRects.end();
@@ -757,7 +756,7 @@ void LLMultiSlider::draw()
}
else
{
- thumb_imagep->drawSolid(mDragStartThumbRect, mThumbCenterColor.get() % 0.3f);
+ mRoundedSquareImgp->drawSolid(mDragStartThumbRect, mThumbCenterColor.get() % 0.3f);
}
}
@@ -772,7 +771,7 @@ void LLMultiSlider::draw()
}
else
{
- thumb_imagep->drawBorder(mThumbRects[mCurSlider], gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth());
+ mRoundedSquareImgp->drawBorder(mThumbRects[mCurSlider], gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth());
}
}
}
@@ -784,7 +783,7 @@ void LLMultiSlider::draw()
}
else
{
- thumb_imagep->drawBorder(mThumbRects[mHoverSlider], gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth());
+ mRoundedSquareImgp->drawBorder(mThumbRects[mHoverSlider], gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth());
}
}
@@ -822,11 +821,11 @@ void LLMultiSlider::draw()
}
else if (capture == this)
{
- thumb_imagep->drawSolid(mIt->second, curThumbColor);
+ mRoundedSquareImgp->drawSolid(mIt->second, curThumbColor);
}
else
{
- thumb_imagep->drawSolid(mIt->second, curThumbColor % opacity);
+ mRoundedSquareImgp->drawSolid(mIt->second, curThumbColor % opacity);
}
}
@@ -846,11 +845,11 @@ void LLMultiSlider::draw()
}
else if (capture == this)
{
- thumb_imagep->drawSolid(curSldrIt->second, mThumbCenterSelectedColor.get());
+ mRoundedSquareImgp->drawSolid(curSldrIt->second, mThumbCenterSelectedColor.get());
}
else
{
- thumb_imagep->drawSolid(curSldrIt->second, mThumbCenterSelectedColor.get() % opacity);
+ mRoundedSquareImgp->drawSolid(curSldrIt->second, mThumbCenterSelectedColor.get() % opacity);
}
}
if(hoverSldrIt != mThumbRects.end())
@@ -861,7 +860,7 @@ void LLMultiSlider::draw()
}
else
{
- thumb_imagep->drawSolid(hoverSldrIt->second, mThumbCenterSelectedColor.get());
+ mRoundedSquareImgp->drawSolid(hoverSldrIt->second, mThumbCenterSelectedColor.get());
}
}
}
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index 99a78d6e09..3cb4b760b0 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -150,6 +150,7 @@ protected:
LLUIColor mDisabledThumbColor;
LLUIColor mTriangleColor;
LLUIImagePtr mThumbImagep; //blimps on the slider, for now no 'disabled' support
+ LLUIImagePtr mRoundedSquareImgp; //blimps on the slider, for now no 'disabled' support
const EOrientation mOrientation;
diff --git a/indra/llui/llnotificationptr.h b/indra/llui/llnotificationptr.h
index acc047527f..580f353c7d 100644
--- a/indra/llui/llnotificationptr.h
+++ b/indra/llui/llnotificationptr.h
@@ -27,9 +27,8 @@
// Many classes just store a single LLNotificationPtr
// and llnotifications.h is very large, so define this ligher header.
-#include
class LLNotification;
-typedef boost::shared_ptr LLNotificationPtr;
+typedef std::shared_ptr LLNotificationPtr;
#endif
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 08bddd9536..8ec04d2bd5 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -85,7 +85,6 @@
#include
#include
-#include
#include
#include
#include
@@ -307,7 +306,7 @@ typedef boost::shared_ptr LLNotificationVisibility
*/
class LLNotification :
boost::noncopyable,
- public boost::enable_shared_from_this
+ public std::enable_shared_from_this
{
LOG_CLASS(LLNotification);
friend class LLNotifications;
@@ -763,7 +762,10 @@ public:
: mFilter(filter),
mItems()
{}
- virtual ~LLNotificationChannelBase() {}
+ virtual ~LLNotificationChannelBase()
+ {
+ mItems.clear();
+ }
// you can also connect to a Channel, so you can be notified of
// changes to this channel
LLBoundListener connectChanged(const LLEventListener& slot)
@@ -893,6 +895,7 @@ class LLNotifications :
{
LLSINGLETON(LLNotifications);
LOG_CLASS(LLNotifications);
+ virtual ~LLNotifications() {}
public:
@@ -1093,7 +1096,11 @@ public:
LLPersistentNotificationChannel()
: LLNotificationChannel("Persistent", "Visible", ¬ificationFilter)
{}
- virtual ~LLPersistentNotificationChannel() {}
+
+ virtual ~LLPersistentNotificationChannel()
+ {
+ mHistory.clear();
+ }
typedef std::vector history_list_t;
history_list_t::iterator beginHistory() { sortHistory(); return mHistory.begin(); }
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 3c94022ac4..ee5873885b 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -1336,7 +1336,7 @@ BOOL LLToolBarButton::handleHover(S32 x, S32 y, MASK mask)
BOOL handled = FALSE;
S32 mouse_distance_squared = (x - mMouseDownX) * (x - mMouseDownX) + (y - mMouseDownY) * (y - mMouseDownY);
- S32 drag_threshold = LLUI::getInstance()->mSettingGroups["config"]->getS32("DragAndDropDistanceThreshold");
+ static LLCachedControl drag_threshold(*LLUI::getInstance()->mSettingGroups["config"], "DragAndDropDistanceThreshold", 3);
if (mouse_distance_squared > drag_threshold * drag_threshold
&& hasMouseCapture() &&
mStartDragItemCallback && mHandleDragItemCallback)
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 146068b4db..92f7251220 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -358,8 +358,8 @@ void LLToolTip::draw()
if (mFadeTimer.getStarted())
{
- F32 tool_tip_fade_time = LLUI::getInstance()->mSettingGroups["config"]->getF32("ToolTipFadeTime");
- alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, tool_tip_fade_time, 1.f, 0.f);
+ static LLCachedControl tool_tip_fade_time(*LLUI::getInstance()->mSettingGroups["config"], "ToolTipFadeTime", 0.2f);
+ alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, tool_tip_fade_time(), 1.f, 0.f);
if (alpha == 0.f)
{
// finished fading out, so hide ourselves
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 6ec59bafaa..493060886c 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -178,7 +178,6 @@ mAudioCallback(audio_callback),
mDeferredAudioCallback(deferred_audio_callback),
mWindow(NULL), // set later in startup
mRootView(NULL),
-mDirty(FALSE),
mHelpImpl(NULL)
{
LLRender2D::initParamSingleton(image_provider);
@@ -230,19 +229,6 @@ void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& rem
mClearPopupsFunc = clear_popups;
}
-void LLUI::dirtyRect(LLRect rect)
-{
- if (!mDirty)
- {
- mDirtyRect = rect;
- mDirty = TRUE;
- }
- else
- {
- mDirtyRect.unionWith(rect);
- }
-}
-
void LLUI::setMousePositionScreen(S32 x, S32 y)
{
#if defined(LL_DARWIN)
@@ -577,6 +563,18 @@ const LLView* LLUI::resolvePath(const LLView* context, const std::string& path)
return context;
}
+//static
+LLVector2& LLUI::getScaleFactor()
+{
+ return LLRender::sUIGLScaleFactor;
+}
+
+//static
+void LLUI::setScaleFactor(const LLVector2& scale_factor)
+{
+ LLRender::sUIGLScaleFactor = scale_factor;
+}
+
// LLLocalClipRect and LLScreenClipRect moved to lllocalcliprect.h/cpp
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index c6ed2a97c1..4d1fd936d8 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -250,10 +250,6 @@ public:
void setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t&, const clear_popups_t& );
- LLRect mDirtyRect;
- BOOL mDirty;
- void dirtyRect(LLRect rect);
-
// Return the ISO639 language name ("en", "ko", etc.) for the viewer UI.
// http://www.loc.gov/standards/iso639-2/php/code_list.php
// FIRE-16709: Bypass FSEnabledLanguages for llGetAgentLanguage
@@ -321,14 +317,14 @@ public:
void positionViewNearMouse(LLView* view, S32 spawn_x = S32_MAX, S32 spawn_y = S32_MAX);
// LLRender2D wrappers
- static void pushMatrix() { LLRender2D::getInstance()->pushMatrix(); }
- static void popMatrix() { LLRender2D::getInstance()->popMatrix(); }
- static void loadIdentity() { LLRender2D::getInstance()->loadIdentity(); }
- static void translate(F32 x, F32 y, F32 z = 0.0f) { LLRender2D::getInstance()->translate(x, y, z); }
+ static void pushMatrix() { LLRender2D::pushMatrix(); }
+ static void popMatrix() { LLRender2D::popMatrix(); }
+ static void loadIdentity() { LLRender2D::loadIdentity(); }
+ static void translate(F32 x, F32 y, F32 z = 0.0f) { LLRender2D::translate(x, y, z); }
- static LLVector2& getScaleFactor() { return LLRender2D::getInstance()->mGLScaleFactor; }
- static void setScaleFactor(const LLVector2& scale_factor) { LLRender2D::getInstance()->setScaleFactor(scale_factor); }
- static void setLineWidth(F32 width) { LLRender2D::getInstance()->setLineWidth(width); }
+ static LLVector2& getScaleFactor();
+ static void setScaleFactor(const LLVector2& scale_factor);
+ static void setLineWidth(F32 width) { LLRender2D::setLineWidth(width); }
static LLPointer getUIImageByID(const LLUUID& image_id, S32 priority = 0)
{ return LLRender2D::getInstance()->getUIImageByID(image_id, priority); }
static LLPointer getUIImage(const std::string& name, S32 priority = 0)
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 0d8f3be6d4..03e37ff69f 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -179,7 +179,7 @@ void LLUrlEntryBase::callObservers(const std::string &id,
bool LLUrlEntryBase::isLinkDisabled() const
{
// this allows us to have a global setting to turn off text hyperlink highlighting/action
- bool globally_disabled = LLUI::getInstance()->mSettingGroups["config"]->getBOOL("DisableTextHyperlinkActions");
+ static LLCachedControl globally_disabled(*LLUI::getInstance()->mSettingGroups["config"], "DisableTextHyperlinkActions", false);
return globally_disabled;
}
@@ -529,7 +529,9 @@ LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL()
"|"
"(https://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(:\\d{1,5})?)"
"|"
- "(https://([-\\w\\.]*\\.)?secondlifegrid\\.net(:\\d{1,5})?))"
+ "(https://([-\\w\\.]*\\.)?secondlifegrid\\.net(:\\d{1,5})?)"
+ "|"
+ "(https?://([-\\w\\.]*\\.)?secondlife\\.io(:\\d{1,5})?))"
"\\/\\S*",
boost::regex::perl|boost::regex::icase);
@@ -1275,7 +1277,7 @@ std::string LLUrlEntryPlace::getLocation(const std::string &url) const
//
LLUrlEntryRegion::LLUrlEntryRegion()
{
- mPattern = boost::regex("secondlife:///app/region/[^/\\s]+(/\\d+)?(/\\d+)?(/\\d+)?/?",
+ mPattern = boost::regex("secondlife:///app/region/[A-Za-z0-9()_%]+(/\\d+)?(/\\d+)?(/\\d+)?/?",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_slurl.xml";
mTooltip = LLTrans::getString("TooltipSLURL");
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 654f5d63dd..7aea1e7a9e 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -65,6 +65,8 @@ static const S32 LINE_HEIGHT = 15;
S32 LLView::sDepth = 0;
bool LLView::sDebugRects = false;
+bool LLView::sIsRectDirty = false;
+LLRect LLView::sDirtyRect;
bool LLView::sDebugRectsShowNames = true;
bool LLView::sDebugKeys = false;
bool LLView::sDebugMouseHandling = false;
@@ -941,14 +943,16 @@ BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
std::string tooltip = getToolTip();
if (!tooltip.empty())
{
+ static LLCachedControl tooltip_fast_delay(*LLUI::getInstance()->mSettingGroups["config"], "ToolTipFastDelay", 0.1f);
+ static LLCachedControl tooltip_delay(*LLUI::getInstance()->mSettingGroups["config"], "ToolTipDelay", 0.7f);
+ static LLCachedControl allow_ui_tooltips(*LLUI::getInstance()->mSettingGroups["config"], "BasicUITooltips", true);
// allow "scrubbing" over ui by showing next tooltip immediately
// if previous one was still visible
F32 timeout = LLToolTipMgr::instance().toolTipVisible()
- ? LLUI::getInstance()->mSettingGroups["config"]->getF32( "ToolTipFastDelay" )
- : LLUI::getInstance()->mSettingGroups["config"]->getF32( "ToolTipDelay" );
+ ? tooltip_fast_delay
+ : tooltip_delay;
// Even if we don't show tooltips, consume the event, nothing below should show tooltip
- bool allow_ui_tooltips = LLUI::getInstance()->mSettingGroups["config"]->getBOOL("BasicUITooltips");
if (allow_ui_tooltips)
{
LLToolTipMgr::instance().show(LLToolTip::Params()
@@ -1245,7 +1249,7 @@ void LLView::drawChildren()
if (viewp->getVisible() && viewp->getRect().isValid())
{
LLRect screen_rect = viewp->calcScreenRect();
- if ( rootp->getLocalRect().overlaps(screen_rect) && LLUI::getInstance()->mDirtyRect.overlaps(screen_rect))
+ if ( rootp->getLocalRect().overlaps(screen_rect) && sDirtyRect.overlaps(screen_rect))
{
LLUI::pushMatrix();
{
@@ -1287,7 +1291,15 @@ void LLView::dirtyRect()
parent = parent->getParent();
}
- LLUI::getInstance()->dirtyRect(cur->calcScreenRect());
+ if (!sIsRectDirty)
+ {
+ sDirtyRect = cur->calcScreenRect();
+ sIsRectDirty = true;
+ }
+ else
+ {
+ sDirtyRect.unionWith(cur->calcScreenRect());
+ }
}
//Draw a box for debugging.
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index ae24ca5c0b..a0e948a8fd 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -671,6 +671,9 @@ public:
// Draw debug rectangles around widgets to help with alignment and spacing
static bool sDebugRects;
+ static bool sIsRectDirty;
+ static LLRect sDirtyRect;
+
// Draw widget names and sizes when drawing debug rectangles, turning this
// off is useful to make the rectangles themselves easier to see.
static bool sDebugRectsShowNames;
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index 4a4fdb72e3..1a474cca90 100644
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -739,11 +739,6 @@ namespace tut
"XXX secondlife:///app/region/Burning%20Life%20(Hyper)/27/210/30 XXX",
"secondlife:///app/region/Burning%20Life%20(Hyper)/27/210/30");
- // DEV-35459: SLURLs and teleport Links not parsed properly
- testRegex("Region with quote", url,
- "XXX secondlife:///app/region/A'ksha%20Oasis/41/166/701 XXX",
- "secondlife:///app/region/A%27ksha%20Oasis/41/166/701");
-
// Rendering tests.
testLabel("Render /app/region/Ahern/50/50/50/", url,
"secondlife:///app/region/Ahern/50/50/50/",
diff --git a/indra/mac_crash_logger/README.txt b/indra/mac_crash_logger/README.txt
new file mode 100644
index 0000000000..6932a8d9c3
--- /dev/null
+++ b/indra/mac_crash_logger/README.txt
@@ -0,0 +1,3 @@
+This component is no longer used in Linden Lab builds.
+Change requests to support continued use by open source
+builds are welcome.
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 1c4aaed83f..4dbf2bcd42 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -8,9 +8,7 @@ include(00-Common)
include(Linking)
include(Boost)
-if (BUGSPLAT_DB)
- include(bugsplat)
-endif (BUGSPLAT_DB)
+include(bugsplat)
include(BuildPackagesInfo)
include(BuildVersion)
include(CMakeCopyIfDifferent)
@@ -110,18 +108,18 @@ include_directories(
${CMAKE_CURRENT_BINARY_DIR}
)
-if (BUGSPLAT_DB)
- include_directories(
- ${BUGSPLAT_INCLUDE_DIR}
- )
-endif (BUGSPLAT_DB)
-
include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
${LLXML_SYSTEM_INCLUDE_DIRS}
${LLPHYSICSEXTENSIONS_INCLUDE_DIRS}
)
+if (USE_BUGSPLAT)
+ include_directories(AFTER
+ ${BUGSPLAT_INCLUDE_DIR}
+ )
+endif (USE_BUGSPLAT)
+
set(viewer_SOURCE_FILES
#
alfloaterregiontracker.cpp
@@ -1744,11 +1742,11 @@ if (DARWIN)
${COREAUDIO_LIBRARY}
)
- if (BUGSPLAT_DB)
+ if (USE_BUGSPLAT)
list(APPEND viewer_LIBRARIES
${BUGSPLAT_LIBRARIES}
)
- endif (BUGSPLAT_DB)
+ endif (USE_BUGSPLAT)
# Add resource files to the project.
set(viewer_RESOURCE_FILES
@@ -2196,10 +2194,10 @@ if (SDL_FOUND)
)
endif (SDL_FOUND)
-if (BUGSPLAT_DB)
+if (USE_BUGSPLAT)
set_property(TARGET ${VIEWER_BINARY_NAME}
- PROPERTY COMPILE_DEFINITIONS "LL_BUGSPLAT")
-endif (BUGSPLAT_DB)
+ PROPERTY COMPILE_DEFINITIONS "${BUGSPLAT_DEFINE}")
+endif (USE_BUGSPLAT)
# add package files
file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST
@@ -2285,9 +2283,12 @@ if (WINDOWS)
media_plugin_cef
media_plugin_libvlc
#media_plugin_example # Don't package example plugin
- windows-crash-logger
)
+ if (NOT USE_BUGSPLAT)
+ LIST(APPEND COPY_INPUT_DEPENDENCIES windows-crash-logger)
+ endif (NOT USE_BUGSPLAT)
+
# Only copy OpenJPEG dll if needed
if (NOT USE_KDU)
list(APPEND COPY_INPUT_DEPENDENCIES
@@ -2361,10 +2362,11 @@ if (WINDOWS)
add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
- add_dependencies(${VIEWER_BINARY_NAME}
- SLPlugin
- windows-crash-logger
- )
+ add_dependencies(${VIEWER_BINARY_NAME} SLPlugin)
+
+ if (NOT USE_BUGSPLAT)
+ add_dependencies(${VIEWER_BINARY_NAME} windows-crash-logger)
+ endif (NOT USE_BUGSPLAT)
# sets the 'working directory' for debugging from visual studio.
# Condition for version can be moved to requirements once build agents will be updated (see TOOL-3865)
@@ -2527,11 +2529,11 @@ target_link_libraries(${VIEWER_BINARY_NAME}
target_link_libraries(${VIEWER_BINARY_NAME} ${DISCORD_LIBRARY} )
-if (BUGSPLAT_DB)
+if (USE_BUGSPLAT)
target_link_libraries(${VIEWER_BINARY_NAME}
${BUGSPLAT_LIBRARIES}
)
-endif (BUGSPLAT_DB)
+endif (USE_BUGSPLAT)
if (WINDOWS)
target_link_libraries(${VIEWER_BINARY_NAME}
@@ -2553,7 +2555,6 @@ if (LINUX)
if (NOT ENABLE_MEDIA_PLUGINS)
set(COPY_INPUT_DEPENDENCIES
${VIEWER_BINARY_NAME}
- linux-crash-logger
SLPlugin
media_plugin_cef
#media_plugin_gstreamer010
@@ -2571,6 +2572,10 @@ else (NOT ENABLE_MEDIA_PLUGINS)
)
endif (NOT ENABLE_MEDIA_PLUGINS)
+ if (NOT USE_BUGSPLAT)
+ LIST(APPEND COPY_INPUT_DEPENDENCIES linux-crash-logger)
+ endif (NOT USE_BUGSPLAT)
+
add_custom_command(
OUTPUT ${product}.tar.bz2
COMMAND ${PYTHON_EXECUTABLE}
@@ -2719,8 +2724,11 @@ if (DARWIN)
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
- add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef mac-crash-logger)
- add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger)
+ add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef)
+
+ if (NOT USE_BUGSPLAT)
+ add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger)
+ endif (NOT USE_BUGSPLAT)
if (ENABLE_SIGNING)
set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}")
@@ -2764,7 +2772,7 @@ endif (INSTALL)
# Note that the conventional VIEWER_SYMBOL_FILE is set by ../../build.sh
if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE)
- if (NOT BUGSPLAT_DB)
+ if (NOT USE_BUGSPLAT)
# Breakpad symbol-file generation
set(SYMBOL_SEARCH_DIRS "")
if (WINDOWS)
@@ -2781,7 +2789,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}")
-## set(VIEWER_EXE_GLOBS "'${product}' SLPlugin mac-crash-logger")
+## set(VIEWER_EXE_GLOBS "'${product}' SLPlugin")
set(VIEWER_EXE_GLOBS "'${product}' mac-crash-logger")
set(VIEWER_LIB_GLOB "*.dylib")
endif (DARWIN)
@@ -2820,7 +2828,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE
add_dependencies(generate_symbols "${VIEWER_COPY_MANIFEST}")
endif (WINDOWS OR LINUX)
- else (NOT BUGSPLAT_DB)
+ else (NOT USE_BUGSPLAT)
# BugSplat symbol-file generation
if (WINDOWS)
# Just pack up a tarball containing only the .pdb file for the
@@ -2904,9 +2912,9 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE
if (LINUX)
# TBD
endif (LINUX)
- endif (NOT BUGSPLAT_DB)
+ endif (NOT USE_BUGSPLAT)
- # for both BUGSPLAT_DB and Breakpad
+ # for both Bugsplat and Breakpad
add_dependencies(llpackage generate_symbols)
endif ()
@@ -3048,6 +3056,10 @@ if (LL_TESTS)
${BOOST_CONTEXT_LIBRARY}
)
+ LL_ADD_INTEGRATION_TEST(cppfeatures
+ ""
+ "${test_libs}"
+ )
LL_ADD_INTEGRATION_TEST(llsechandler_basic
llsechandler_basic.cpp
"${test_libs}"
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 22beed373e..a15225fad6 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.4.21
+6.4.22
diff --git a/indra/newview/app_settings/fs_static_assets/0b4ee516-5dfd-ef4b-4ab6-300bb44cb045.animatn b/indra/newview/app_settings/fs_static_assets/0b4ee516-5dfd-ef4b-4ab6-300bb44cb045.animatn
new file mode 100644
index 0000000000..a44fbd473e
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/0b4ee516-5dfd-ef4b-4ab6-300bb44cb045.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/2029d88f-4efc-d72d-18d1-274caf9e9bc0.animatn b/indra/newview/app_settings/fs_static_assets/2029d88f-4efc-d72d-18d1-274caf9e9bc0.animatn
new file mode 100644
index 0000000000..efc989bd9f
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/2029d88f-4efc-d72d-18d1-274caf9e9bc0.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/23f3163c-183b-dac0-0cdd-7811bcc3b5f1.animatn b/indra/newview/app_settings/fs_static_assets/23f3163c-183b-dac0-0cdd-7811bcc3b5f1.animatn
new file mode 100644
index 0000000000..6f360d099f
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/23f3163c-183b-dac0-0cdd-7811bcc3b5f1.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/2cfeed25-04f9-caff-f3d2-776cddea5771.animatn b/indra/newview/app_settings/fs_static_assets/2cfeed25-04f9-caff-f3d2-776cddea5771.animatn
new file mode 100644
index 0000000000..f52efc44b6
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/2cfeed25-04f9-caff-f3d2-776cddea5771.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/3481ccd5-cc6c-65ca-c466-dc9df1bf3944.animatn b/indra/newview/app_settings/fs_static_assets/3481ccd5-cc6c-65ca-c466-dc9df1bf3944.animatn
new file mode 100644
index 0000000000..386ce2bb64
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/3481ccd5-cc6c-65ca-c466-dc9df1bf3944.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/6e83f685-2f53-278f-6758-b529327cce09.animatn b/indra/newview/app_settings/fs_static_assets/6e83f685-2f53-278f-6758-b529327cce09.animatn
new file mode 100644
index 0000000000..48ff263e53
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/6e83f685-2f53-278f-6758-b529327cce09.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/b23c52ef-0b15-11f2-852d-8fbd33417847.animatn b/indra/newview/app_settings/fs_static_assets/b23c52ef-0b15-11f2-852d-8fbd33417847.animatn
new file mode 100644
index 0000000000..5c96c6822a
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/b23c52ef-0b15-11f2-852d-8fbd33417847.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/b2f312aa-2c1e-27b8-50fe-a0fa4ff3df4e.animatn b/indra/newview/app_settings/fs_static_assets/b2f312aa-2c1e-27b8-50fe-a0fa4ff3df4e.animatn
new file mode 100644
index 0000000000..c0ff832512
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/b2f312aa-2c1e-27b8-50fe-a0fa4ff3df4e.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/c17677b8-9fb2-8d6e-bbbe-219edce64ef4.animatn b/indra/newview/app_settings/fs_static_assets/c17677b8-9fb2-8d6e-bbbe-219edce64ef4.animatn
new file mode 100644
index 0000000000..838a90ed86
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/c17677b8-9fb2-8d6e-bbbe-219edce64ef4.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/cff5559e-c915-0b5e-d587-f789b5cc299a.animatn b/indra/newview/app_settings/fs_static_assets/cff5559e-c915-0b5e-d587-f789b5cc299a.animatn
new file mode 100644
index 0000000000..e1a896372b
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/cff5559e-c915-0b5e-d587-f789b5cc299a.animatn differ
diff --git a/indra/newview/app_settings/fs_static_assets/e14fee5f-3735-a236-2e26-94f92f366d81.animatn b/indra/newview/app_settings/fs_static_assets/e14fee5f-3735-a236-2e26-94f92f366d81.animatn
new file mode 100644
index 0000000000..031007addb
Binary files /dev/null and b/indra/newview/app_settings/fs_static_assets/e14fee5f-3735-a236-2e26-94f92f366d81.animatn differ
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index fadf7f8884..30733a2f4f 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -17944,19 +17944,6 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
1
-
VivoxAutoPostCrashDumps
Comment
@@ -18093,8 +18080,7 @@ Change of this parameter will affect the layout of buttons in notification toast
VivoxVadSensitivity
Comment
-
- A dimensionless value between 0 and 100, indicating the 'sensitivity of the VAD'. Increasing this value corresponds to decreasing the sensitivity of the VAD and 0 is turned off altogether
+ A dimensionless value between 0 and 100, indicating the 'sensitivity of the VAD'. Increasing this value corresponds to decreasing the sensitivity of the VAD and 0 is turned off altogether
Persist
1
Type
diff --git a/indra/newview/app_settings/static_assets/00b48fa0-ac43-fadf-d061-6b726a24a90a.gesture b/indra/newview/app_settings/static_assets/00b48fa0-ac43-fadf-d061-6b726a24a90a.gesture
new file mode 100644
index 0000000000..52188744f2
Binary files /dev/null and b/indra/newview/app_settings/static_assets/00b48fa0-ac43-fadf-d061-6b726a24a90a.gesture differ
diff --git a/indra/newview/app_settings/static_assets/0247dbfa-f37e-64ab-d09f-2678884c7f4a.gesture b/indra/newview/app_settings/static_assets/0247dbfa-f37e-64ab-d09f-2678884c7f4a.gesture
new file mode 100644
index 0000000000..38f8a9a86c
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0247dbfa-f37e-64ab-d09f-2678884c7f4a.gesture differ
diff --git a/indra/newview/app_settings/static_assets/02862ac0-a61d-94c2-5d11-5f5d319b1256.clothing b/indra/newview/app_settings/static_assets/02862ac0-a61d-94c2-5d11-5f5d319b1256.clothing
new file mode 100644
index 0000000000..d38b5a665a
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/02862ac0-a61d-94c2-5d11-5f5d319b1256.clothing
@@ -0,0 +1,28 @@
+LLWearable version 22
+RASL SOCKS BROWN
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 7
+parameters 4
+617 1
+818 1
+819 1
+820 1
+textures 1
+12 301a3097-2858-7614-829d-c5859741246f
diff --git a/indra/newview/app_settings/static_assets/02c4eae7-b6a3-b4b0-44b0-b7b29d7f913f.clothing b/indra/newview/app_settings/static_assets/02c4eae7-b6a3-b4b0-44b0-b7b29d7f913f.clothing
new file mode 100644
index 0000000000..56dc179222
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/02c4eae7-b6a3-b4b0-44b0-b7b29d7f913f.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F SHOP SHOES FOOTSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 6
+parameters 10
+198 1
+503 .17
+508 -1
+513 0
+514 .37
+616 .1
+654 .08
+812 1
+813 1
+817 1
+textures 1
+7 3ab7e2fa-9572-ef36-1a30-d855dbea4f92
diff --git a/indra/newview/app_settings/static_assets/032ac149-dacd-e88a-5397-b9996b58f278.gesture b/indra/newview/app_settings/static_assets/032ac149-dacd-e88a-5397-b9996b58f278.gesture
new file mode 100644
index 0000000000..35a5eaf56d
Binary files /dev/null and b/indra/newview/app_settings/static_assets/032ac149-dacd-e88a-5397-b9996b58f278.gesture differ
diff --git a/indra/newview/app_settings/static_assets/038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53.animatn b/indra/newview/app_settings/static_assets/038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53.animatn
new file mode 100644
index 0000000000..7e742caf27
Binary files /dev/null and b/indra/newview/app_settings/static_assets/038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53.animatn differ
diff --git a/indra/newview/app_settings/static_assets/0401dc30-0fdd-1fc3-3e51-c683fe117184.gesture b/indra/newview/app_settings/static_assets/0401dc30-0fdd-1fc3-3e51-c683fe117184.gesture
new file mode 100644
index 0000000000..743188b6a4
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0401dc30-0fdd-1fc3-3e51-c683fe117184.gesture differ
diff --git a/indra/newview/app_settings/static_assets/04608b19-1668-399c-5790-b7df8d9dc9cf.gesture b/indra/newview/app_settings/static_assets/04608b19-1668-399c-5790-b7df8d9dc9cf.gesture
new file mode 100644
index 0000000000..8a5329d456
Binary files /dev/null and b/indra/newview/app_settings/static_assets/04608b19-1668-399c-5790-b7df8d9dc9cf.gesture differ
diff --git a/indra/newview/app_settings/static_assets/05ddbff8-aaa9-92a1-2b74-8fe77a29b445.animatn b/indra/newview/app_settings/static_assets/05ddbff8-aaa9-92a1-2b74-8fe77a29b445.animatn
new file mode 100644
index 0000000000..ef5d535656
Binary files /dev/null and b/indra/newview/app_settings/static_assets/05ddbff8-aaa9-92a1-2b74-8fe77a29b445.animatn differ
diff --git a/indra/newview/app_settings/static_assets/07d61cde-bc5b-f95f-f747-2e57eab4ef12.clothing b/indra/newview/app_settings/static_assets/07d61cde-bc5b-f95f-f747-2e57eab4ef12.clothing
new file mode 100644
index 0000000000..10c8ad516b
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/07d61cde-bc5b-f95f-f747-2e57eab4ef12.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL F LEARN LEGGINGS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 6f5d29ce-548f-fdd0-b8e1-1f90a123b76e
diff --git a/indra/newview/app_settings/static_assets/0813d01a-d3d3-32a4-48a3-26b6e1e01e39.gesture b/indra/newview/app_settings/static_assets/0813d01a-d3d3-32a4-48a3-26b6e1e01e39.gesture
new file mode 100644
index 0000000000..8d0cfc8dc0
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0813d01a-d3d3-32a4-48a3-26b6e1e01e39.gesture differ
diff --git a/indra/newview/app_settings/static_assets/0836b67f-7f7b-f37b-c00a-460dc1521f5a.animatn b/indra/newview/app_settings/static_assets/0836b67f-7f7b-f37b-c00a-460dc1521f5a.animatn
new file mode 100644
index 0000000000..eaa64a58c5
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0836b67f-7f7b-f37b-c00a-460dc1521f5a.animatn differ
diff --git a/indra/newview/app_settings/static_assets/08464f78-3a8e-2944-cba5-0c94aff3af29.animatn b/indra/newview/app_settings/static_assets/08464f78-3a8e-2944-cba5-0c94aff3af29.animatn
new file mode 100644
index 0000000000..fdf5fc53a0
Binary files /dev/null and b/indra/newview/app_settings/static_assets/08464f78-3a8e-2944-cba5-0c94aff3af29.animatn differ
diff --git a/indra/newview/app_settings/static_assets/0a3336cf-3ad1-012a-91c2-5b5620aaaef3.gesture b/indra/newview/app_settings/static_assets/0a3336cf-3ad1-012a-91c2-5b5620aaaef3.gesture
new file mode 100644
index 0000000000..b7e1dfba90
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0a3336cf-3ad1-012a-91c2-5b5620aaaef3.gesture differ
diff --git a/indra/newview/app_settings/static_assets/0a9fb970-8b44-9114-d3a9-bf69cfe804d6.animatn b/indra/newview/app_settings/static_assets/0a9fb970-8b44-9114-d3a9-bf69cfe804d6.animatn
new file mode 100644
index 0000000000..cf8bcf42ef
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0a9fb970-8b44-9114-d3a9-bf69cfe804d6.animatn differ
diff --git a/indra/newview/app_settings/static_assets/0b29c4fd-9c3c-3047-fcb4-addd3e42a289.clothing b/indra/newview/app_settings/static_assets/0b29c4fd-9c3c-3047-fcb4-addd3e42a289.clothing
new file mode 100644
index 0000000000..b89fabd12d
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/0b29c4fd-9c3c-3047-fcb4-addd3e42a289.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M EXPLORE TANK UP (WHITE)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 5ab7802c-a722-8cf0-66c6-6160efe4a130
diff --git a/indra/newview/app_settings/static_assets/0c5f60ae-1a54-1ee8-398d-7ed278552132.bodypart b/indra/newview/app_settings/static_assets/0c5f60ae-1a54-1ee8-398d-7ed278552132.bodypart
new file mode 100644
index 0000000000..58e0881824
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/0c5f60ae-1a54-1ee8-398d-7ed278552132.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL M CREATE SHAPE (MIKO)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .21
+2 -.21
+4 .26
+5 -.07
+6 .13
+7 -.04
+8 -.2
+10 .25
+11 .1
+12 .07
+13 .03
+14 .67
+15 -.2
+17 .14
+18 .5
+19 -.4
+20 -.04
+21 .26
+22 .02
+23 -.06
+24 -.1
+25 .53
+27 .43
+33 1.14
+34 -.02
+35 0
+36 -.9
+37 -.62
+38 .02
+80 1
+105 .5
+155 -.24
+157 .02
+185 -.6
+193 .65
+196 -1.07
+505 .61
+506 0
+507 0
+515 -1
+517 -.13
+518 -.19
+629 .43
+637 .03
+646 -.06
+647 .03
+649 .5
+650 .65
+652 .45
+653 .05
+656 0
+659 .62
+662 .5
+663 0
+664 0
+665 .08
+675 -.14
+676 -.4
+678 .41
+682 .59
+683 -.12
+684 0
+685 .19
+690 .41
+692 .36
+693 .2
+753 .65
+756 -.62
+758 -.54
+759 .45
+760 .11
+764 .44
+765 .29
+769 .47
+773 .43
+795 .23
+796 .21
+799 .52
+841 0
+842 -.24
+879 .08
+880 -.9
+textures 0
diff --git a/indra/newview/app_settings/static_assets/0ce71257-7a07-257f-f023-fd68575a3a4e.gesture b/indra/newview/app_settings/static_assets/0ce71257-7a07-257f-f023-fd68575a3a4e.gesture
new file mode 100644
index 0000000000..8712d24674
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0ce71257-7a07-257f-f023-fd68575a3a4e.gesture differ
diff --git a/indra/newview/app_settings/static_assets/0eb702e2-cc5a-9a88-56a5-661a55c0676a.animatn b/indra/newview/app_settings/static_assets/0eb702e2-cc5a-9a88-56a5-661a55c0676a.animatn
new file mode 100644
index 0000000000..96f40f1a87
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0eb702e2-cc5a-9a88-56a5-661a55c0676a.animatn differ
diff --git a/indra/newview/app_settings/static_assets/0eeb5ef7-10dd-4e4a-11a5-d053011fcdf2.gesture b/indra/newview/app_settings/static_assets/0eeb5ef7-10dd-4e4a-11a5-d053011fcdf2.gesture
new file mode 100644
index 0000000000..514c7c3aba
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0eeb5ef7-10dd-4e4a-11a5-d053011fcdf2.gesture differ
diff --git a/indra/newview/app_settings/static_assets/0f86e355-dd31-a61c-fdb0-3a96b9aad05f.animatn b/indra/newview/app_settings/static_assets/0f86e355-dd31-a61c-fdb0-3a96b9aad05f.animatn
new file mode 100644
index 0000000000..05961c1872
Binary files /dev/null and b/indra/newview/app_settings/static_assets/0f86e355-dd31-a61c-fdb0-3a96b9aad05f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/11000694-3f41-adc2-606b-eee1d66f3724.animatn b/indra/newview/app_settings/static_assets/11000694-3f41-adc2-606b-eee1d66f3724.animatn
new file mode 100644
index 0000000000..9489d963f9
Binary files /dev/null and b/indra/newview/app_settings/static_assets/11000694-3f41-adc2-606b-eee1d66f3724.animatn differ
diff --git a/indra/newview/app_settings/static_assets/1232da7c-3d5b-a11b-cbee-d574aedc2e59.bodypart b/indra/newview/app_settings/static_assets/1232da7c-3d5b-a11b-cbee-d574aedc2e59.bodypart
new file mode 100644
index 0000000000..2077eb4494
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/1232da7c-3d5b-a11b-cbee-d574aedc2e59.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL M SHOP SHAPE (REMY)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .21
+2 -.27
+4 .29
+5 .22
+6 -.07
+7 -.14
+8 -.2
+10 1.2
+11 .5
+12 .46
+13 .28
+14 .56
+15 -.22
+17 -.05
+18 1.02
+19 -.45
+20 -.2
+21 .23
+22 .55
+23 -.12
+24 -.24
+25 -.11
+27 .43
+33 .93
+34 -.26
+35 .17
+36 -.68
+37 -.14
+38 -.12
+80 1
+105 .5
+155 -.53
+157 .03
+185 -.68
+193 .6
+196 -.95
+505 .31
+506 -.28
+507 0
+515 -1
+517 -.17
+518 -.08
+629 .37
+637 .06
+646 -.06
+647 -.11
+649 .5
+650 -.55
+652 .43
+653 .5
+656 0
+659 .55
+662 .5
+663 0
+664 0
+665 0
+675 -.08
+676 -.1
+678 .41
+682 .58
+683 -.11
+684 0
+685 .08
+690 .44
+692 .08
+693 .2
+753 .9
+756 -.78
+758 -.42
+759 .17
+760 .3
+764 .54
+765 .32
+769 .46
+773 .45
+795 .3
+796 .28
+799 .53
+841 0
+842 -.1
+879 .1
+880 -.95
+textures 0
diff --git a/indra/newview/app_settings/static_assets/13b0d1c4-eb3c-9b89-2f13-9c0a714aab9f.clothing b/indra/newview/app_settings/static_assets/13b0d1c4-eb3c-9b89-2f13-9c0a714aab9f.clothing
new file mode 100644
index 0000000000..8edf121335
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/13b0d1c4-eb3c-9b89-2f13-9c0a714aab9f.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL M SHOP SWEATER DOWN
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 106c9f6c-dc86-85ef-84b8-767fc0caf7c4
diff --git a/indra/newview/app_settings/static_assets/149739c0-f677-4b4c-1587-e44be72dd7ef.bodypart b/indra/newview/app_settings/static_assets/149739c0-f677-4b4c-1587-e44be72dd7ef.bodypart
new file mode 100644
index 0000000000..07db7550df
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/149739c0-f677-4b4c-1587-e44be72dd7ef.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+New Eyes
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 07e1d75e-9312-ed2c-3c20-2d8a7e9109f0
diff --git a/indra/newview/app_settings/static_assets/15468e00-3400-bb66-cecc-646d7c14458e.animatn b/indra/newview/app_settings/static_assets/15468e00-3400-bb66-cecc-646d7c14458e.animatn
new file mode 100644
index 0000000000..232b2b86f0
Binary files /dev/null and b/indra/newview/app_settings/static_assets/15468e00-3400-bb66-cecc-646d7c14458e.animatn differ
diff --git a/indra/newview/app_settings/static_assets/159afee8-b7bf-c8fb-9c63-98276a1d6b28.gesture b/indra/newview/app_settings/static_assets/159afee8-b7bf-c8fb-9c63-98276a1d6b28.gesture
new file mode 100644
index 0000000000..347aa6ad65
Binary files /dev/null and b/indra/newview/app_settings/static_assets/159afee8-b7bf-c8fb-9c63-98276a1d6b28.gesture differ
diff --git a/indra/newview/app_settings/static_assets/15dd911d-be82-2856-26db-27659b142875.animatn b/indra/newview/app_settings/static_assets/15dd911d-be82-2856-26db-27659b142875.animatn
new file mode 100644
index 0000000000..6a71abbbdd
Binary files /dev/null and b/indra/newview/app_settings/static_assets/15dd911d-be82-2856-26db-27659b142875.animatn differ
diff --git a/indra/newview/app_settings/static_assets/16803a9f-5140-e042-4d7b-d28ba247c325.animatn b/indra/newview/app_settings/static_assets/16803a9f-5140-e042-4d7b-d28ba247c325.animatn
new file mode 100644
index 0000000000..4da6d2828f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/16803a9f-5140-e042-4d7b-d28ba247c325.animatn differ
diff --git a/indra/newview/app_settings/static_assets/16ef95d1-2fe3-d4a3-509d-f03bb2d327ca.clothing b/indra/newview/app_settings/static_assets/16ef95d1-2fe3-d4a3-509d-f03bb2d327ca.clothing
new file mode 100644
index 0000000000..426d21e6b2
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/16ef95d1-2fe3-d4a3-509d-f03bb2d327ca.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M LOVE SHIRT UP (BLUE)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 9275f067-eff5-4a59-f98c-cd8a366e5426
diff --git a/indra/newview/app_settings/static_assets/17a387e1-28c7-e24b-4bfc-527b2d377a1b.clothing b/indra/newview/app_settings/static_assets/17a387e1-28c7-e24b-4bfc-527b2d377a1b.clothing
new file mode 100644
index 0000000000..121aea9ab7
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/17a387e1-28c7-e24b-4bfc-527b2d377a1b.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+Male Designer Pants Shirt (Green)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 0008e000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 1
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 7f2a3b5f-a5ef-d7a0-af6c-7f2cfc889fe1
+14 70ccbf04-adeb-d6b6-df7f-d9db89d53408
diff --git a/indra/newview/app_settings/static_assets/17c024cc-eef2-f6a0-3527-9869876d7752.animatn b/indra/newview/app_settings/static_assets/17c024cc-eef2-f6a0-3527-9869876d7752.animatn
new file mode 100644
index 0000000000..a7a4e132e3
Binary files /dev/null and b/indra/newview/app_settings/static_assets/17c024cc-eef2-f6a0-3527-9869876d7752.animatn differ
diff --git a/indra/newview/app_settings/static_assets/18b3a4b5-b463-bd48-e4b6-71eaac76c515.animatn b/indra/newview/app_settings/static_assets/18b3a4b5-b463-bd48-e4b6-71eaac76c515.animatn
new file mode 100644
index 0000000000..c0382423eb
Binary files /dev/null and b/indra/newview/app_settings/static_assets/18b3a4b5-b463-bd48-e4b6-71eaac76c515.animatn differ
diff --git a/indra/newview/app_settings/static_assets/1910ffbd-096c-5eb7-19f5-8c99ab6a748c.gesture b/indra/newview/app_settings/static_assets/1910ffbd-096c-5eb7-19f5-8c99ab6a748c.gesture
new file mode 100644
index 0000000000..eb6117afb8
Binary files /dev/null and b/indra/newview/app_settings/static_assets/1910ffbd-096c-5eb7-19f5-8c99ab6a748c.gesture differ
diff --git a/indra/newview/app_settings/static_assets/19999406-3a3a-d58c-a2ac-d72e555dcf51.animatn b/indra/newview/app_settings/static_assets/19999406-3a3a-d58c-a2ac-d72e555dcf51.animatn
new file mode 100644
index 0000000000..1f176d7fda
Binary files /dev/null and b/indra/newview/app_settings/static_assets/19999406-3a3a-d58c-a2ac-d72e555dcf51.animatn differ
diff --git a/indra/newview/app_settings/static_assets/1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e.animatn b/indra/newview/app_settings/static_assets/1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e.animatn
new file mode 100644
index 0000000000..78fa39729a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e.animatn differ
diff --git a/indra/newview/app_settings/static_assets/1a5fe8ac-a804-8a5d-7cbd-56bd83184568.animatn b/indra/newview/app_settings/static_assets/1a5fe8ac-a804-8a5d-7cbd-56bd83184568.animatn
new file mode 100644
index 0000000000..3312789020
Binary files /dev/null and b/indra/newview/app_settings/static_assets/1a5fe8ac-a804-8a5d-7cbd-56bd83184568.animatn differ
diff --git a/indra/newview/app_settings/static_assets/1ab1b236-cd08-21e6-0cbc-0d923fc6eca2.animatn b/indra/newview/app_settings/static_assets/1ab1b236-cd08-21e6-0cbc-0d923fc6eca2.animatn
new file mode 100644
index 0000000000..9eb2468ef0
Binary files /dev/null and b/indra/newview/app_settings/static_assets/1ab1b236-cd08-21e6-0cbc-0d923fc6eca2.animatn differ
diff --git a/indra/newview/app_settings/static_assets/1ac2c678-3ab4-410b-2aad-30a7dc9c4504.gesture b/indra/newview/app_settings/static_assets/1ac2c678-3ab4-410b-2aad-30a7dc9c4504.gesture
new file mode 100644
index 0000000000..4db5269027
Binary files /dev/null and b/indra/newview/app_settings/static_assets/1ac2c678-3ab4-410b-2aad-30a7dc9c4504.gesture differ
diff --git a/indra/newview/app_settings/static_assets/1b677754-5a07-641a-e989-34dcd985af1b.clothing b/indra/newview/app_settings/static_assets/1b677754-5a07-641a-e989-34dcd985af1b.clothing
new file mode 100644
index 0000000000..0cfef0032c
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/1b677754-5a07-641a-e989-34dcd985af1b.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL F LOVE DRESS DOWN
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 36589cd6-c6e0-f17e-9be5-8f08d3708bd7
diff --git a/indra/newview/app_settings/static_assets/1c7600d6-661f-b87b-efe2-d7421eb93c86.animatn b/indra/newview/app_settings/static_assets/1c7600d6-661f-b87b-efe2-d7421eb93c86.animatn
new file mode 100644
index 0000000000..06a14fca82
Binary files /dev/null and b/indra/newview/app_settings/static_assets/1c7600d6-661f-b87b-efe2-d7421eb93c86.animatn differ
diff --git a/indra/newview/app_settings/static_assets/1cb562b0-ba21-2202-efb3-30f82cdf9595.animatn b/indra/newview/app_settings/static_assets/1cb562b0-ba21-2202-efb3-30f82cdf9595.animatn
new file mode 100644
index 0000000000..89e70a8c29
Binary files /dev/null and b/indra/newview/app_settings/static_assets/1cb562b0-ba21-2202-efb3-30f82cdf9595.animatn differ
diff --git a/indra/newview/app_settings/static_assets/1f5466aa-2b68-e370-6bb5-a335e859afeb.gesture b/indra/newview/app_settings/static_assets/1f5466aa-2b68-e370-6bb5-a335e859afeb.gesture
new file mode 100644
index 0000000000..3b167eb949
Binary files /dev/null and b/indra/newview/app_settings/static_assets/1f5466aa-2b68-e370-6bb5-a335e859afeb.gesture differ
diff --git a/indra/newview/app_settings/static_assets/201f3fdf-cb1f-dbec-201f-7333e328ae7c.animatn b/indra/newview/app_settings/static_assets/201f3fdf-cb1f-dbec-201f-7333e328ae7c.animatn
new file mode 100644
index 0000000000..d2dfc12cd4
Binary files /dev/null and b/indra/newview/app_settings/static_assets/201f3fdf-cb1f-dbec-201f-7333e328ae7c.animatn differ
diff --git a/indra/newview/app_settings/static_assets/205ae4a8-42c6-1c5c-b142-672864fafe8a.bodypart b/indra/newview/app_settings/static_assets/205ae4a8-42c6-1c5c-b142-672864fafe8a.bodypart
new file mode 100644
index 0000000000..843e7c53a9
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/205ae4a8-42c6-1c5c-b142-672864fafe8a.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL F EXPLORE SKIN (SOFIA)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 0008e000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 0
+110 0
+111 .5
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 f634e17f-3164-1dfe-508b-0e02547cebe4
+5 a6c6fd50-7d98-7afb-a7aa-348481f24c8a
+6 193bacad-5558-5e52-f3aa-3192a568e9a1
diff --git a/indra/newview/app_settings/static_assets/20f063ea-8306-2562-0b07-5c853b37b31e.animatn b/indra/newview/app_settings/static_assets/20f063ea-8306-2562-0b07-5c853b37b31e.animatn
new file mode 100644
index 0000000000..b14549416e
Binary files /dev/null and b/indra/newview/app_settings/static_assets/20f063ea-8306-2562-0b07-5c853b37b31e.animatn differ
diff --git a/indra/newview/app_settings/static_assets/2305bd75-1ca9-b03b-1faa-b176b8a8c49e.animatn b/indra/newview/app_settings/static_assets/2305bd75-1ca9-b03b-1faa-b176b8a8c49e.animatn
new file mode 100644
index 0000000000..73a5768e2b
Binary files /dev/null and b/indra/newview/app_settings/static_assets/2305bd75-1ca9-b03b-1faa-b176b8a8c49e.animatn differ
diff --git a/indra/newview/app_settings/static_assets/230ff836-fe1e-ab33-80c6-ef029c658136.gesture b/indra/newview/app_settings/static_assets/230ff836-fe1e-ab33-80c6-ef029c658136.gesture
new file mode 100644
index 0000000000..078d16ee86
Binary files /dev/null and b/indra/newview/app_settings/static_assets/230ff836-fe1e-ab33-80c6-ef029c658136.gesture differ
diff --git a/indra/newview/app_settings/static_assets/2408fe9e-df1d-1d7d-f4ff-1384fa7b350f.animatn b/indra/newview/app_settings/static_assets/2408fe9e-df1d-1d7d-f4ff-1384fa7b350f.animatn
new file mode 100644
index 0000000000..e47287c802
Binary files /dev/null and b/indra/newview/app_settings/static_assets/2408fe9e-df1d-1d7d-f4ff-1384fa7b350f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/245f3c54-f1c0-bf2e-811f-46d8eeb386e7.animatn b/indra/newview/app_settings/static_assets/245f3c54-f1c0-bf2e-811f-46d8eeb386e7.animatn
new file mode 100644
index 0000000000..019bce405f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/245f3c54-f1c0-bf2e-811f-46d8eeb386e7.animatn differ
diff --git a/indra/newview/app_settings/static_assets/25252e5b-394b-fdab-76ee-28980cd62f81.gesture b/indra/newview/app_settings/static_assets/25252e5b-394b-fdab-76ee-28980cd62f81.gesture
new file mode 100644
index 0000000000..cdb18147df
Binary files /dev/null and b/indra/newview/app_settings/static_assets/25252e5b-394b-fdab-76ee-28980cd62f81.gesture differ
diff --git a/indra/newview/app_settings/static_assets/252acecb-a169-eff2-4601-b06bbeb91e84.gesture b/indra/newview/app_settings/static_assets/252acecb-a169-eff2-4601-b06bbeb91e84.gesture
new file mode 100644
index 0000000000..d4406daf79
Binary files /dev/null and b/indra/newview/app_settings/static_assets/252acecb-a169-eff2-4601-b06bbeb91e84.gesture differ
diff --git a/indra/newview/app_settings/static_assets/26a762c3-7164-0bbf-a7d6-ea097a6d0314.bodypart b/indra/newview/app_settings/static_assets/26a762c3-7164-0bbf-a7d6-ea097a6d0314.bodypart
new file mode 100644
index 0000000000..5485883f01
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/26a762c3-7164-0bbf-a7d6-ea097a6d0314.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL F PLAY SHAPE (CLARA)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .11
+2 -.31
+4 -.11
+5 -.08
+6 -.05
+7 .02
+8 -.42
+10 .84
+11 .24
+12 -.02
+13 0
+14 .61
+15 -.28
+17 .13
+18 .42
+19 -.35
+20 -.12
+21 .07
+22 .15
+23 -.34
+24 .11
+25 .1
+27 -.4
+33 .45
+34 0
+35 -.1
+36 -.94
+37 -.98
+38 -.18
+80 0
+105 .37
+155 -.46
+157 0
+185 -.72
+193 .56
+196 -.38
+505 .51
+506 -.68
+507 .04
+515 -1
+517 -.13
+518 .24
+629 .47
+637 .06
+646 -.15
+647 -.05
+649 .3
+650 -.8
+652 .35
+653 .23
+656 0
+659 .63
+662 .5
+663 0
+664 0
+665 .08
+675 -.19
+676 -.43
+678 .5
+682 .55
+683 -.17
+684 .18
+685 0
+690 .36
+692 .24
+693 .18
+753 .62
+756 -.42
+758 .06
+759 .17
+760 .85
+764 .28
+765 .2
+769 .2
+773 .51
+795 .24
+796 .11
+799 .55
+841 0
+842 .14
+879 0
+880 -.4
+textures 0
diff --git a/indra/newview/app_settings/static_assets/26cc2407-84b5-6887-4564-85a9b0cfb01f.gesture b/indra/newview/app_settings/static_assets/26cc2407-84b5-6887-4564-85a9b0cfb01f.gesture
new file mode 100644
index 0000000000..123d418499
Binary files /dev/null and b/indra/newview/app_settings/static_assets/26cc2407-84b5-6887-4564-85a9b0cfb01f.gesture differ
diff --git a/indra/newview/app_settings/static_assets/282d67ef-942e-27f4-9c7b-818f59967743.clothing b/indra/newview/app_settings/static_assets/282d67ef-942e-27f4-9c7b-818f59967743.clothing
new file mode 100644
index 0000000000..444ee2853d
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/282d67ef-942e-27f4-9c7b-818f59967743.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL M LOVE SHIRT DOWN (BLUE)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 1c8aa686-d913-3c2d-9c73-947cfae18da7
diff --git a/indra/newview/app_settings/static_assets/29a56cc8-3fcf-c575-02c7-14a303b12e17.clothing b/indra/newview/app_settings/static_assets/29a56cc8-3fcf-c575-02c7-14a303b12e17.clothing
new file mode 100644
index 0000000000..f44730c489
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/29a56cc8-3fcf-c575-02c7-14a303b12e17.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL F SHOP JEANS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 a77d7374-e4be-d4e3-9010-423a976d5da8
diff --git a/indra/newview/app_settings/static_assets/29f11d26-7d80-4b53-a97c-fce85d94e392.gesture b/indra/newview/app_settings/static_assets/29f11d26-7d80-4b53-a97c-fce85d94e392.gesture
new file mode 100644
index 0000000000..6bd154bc4a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/29f11d26-7d80-4b53-a97c-fce85d94e392.gesture differ
diff --git a/indra/newview/app_settings/static_assets/2b211c3e-d7c9-9e0e-0d96-e9357699bb25.clothing b/indra/newview/app_settings/static_assets/2b211c3e-d7c9-9e0e-0d96-e9357699bb25.clothing
new file mode 100644
index 0000000000..5d8ec3acaa
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/2b211c3e-d7c9-9e0e-0d96-e9357699bb25.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL F CREATE SHIRT DOWN (BLUE)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 2f739543-d501-94a0-a039-0885a6d80034
diff --git a/indra/newview/app_settings/static_assets/2b5a38b2-5e00-3a97-a495-4c826bc443e6.animatn b/indra/newview/app_settings/static_assets/2b5a38b2-5e00-3a97-a495-4c826bc443e6.animatn
new file mode 100644
index 0000000000..b7f50ade77
Binary files /dev/null and b/indra/newview/app_settings/static_assets/2b5a38b2-5e00-3a97-a495-4c826bc443e6.animatn differ
diff --git a/indra/newview/app_settings/static_assets/2ca8ddae-23ef-0132-d243-7ae953582dd0.clothing b/indra/newview/app_settings/static_assets/2ca8ddae-23ef-0132-d243-7ae953582dd0.clothing
new file mode 100644
index 0000000000..09ac14893b
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/2ca8ddae-23ef-0132-d243-7ae953582dd0.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M LEARN TOP
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 1
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 31ab25af-9af8-ef43-a952-d5619ca7169f
+14 fba230b7-219d-7129-f145-672d574bab34
diff --git a/indra/newview/app_settings/static_assets/2d03fd78-92fc-ca52-aabb-a4904e1339d1.gesture b/indra/newview/app_settings/static_assets/2d03fd78-92fc-ca52-aabb-a4904e1339d1.gesture
new file mode 100644
index 0000000000..289c19cb21
Binary files /dev/null and b/indra/newview/app_settings/static_assets/2d03fd78-92fc-ca52-aabb-a4904e1339d1.gesture differ
diff --git a/indra/newview/app_settings/static_assets/2d408f13-f437-e00e-8f6d-b0857580b034.bodypart b/indra/newview/app_settings/static_assets/2d408f13-f437-e00e-8f6d-b0857580b034.bodypart
new file mode 100644
index 0000000000..c53a9f514f
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/2d408f13-f437-e00e-8f6d-b0857580b034.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL M CREATE SKIN (BILLY)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 .04
+110 0
+111 .4
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 86c0cfbe-365f-0f74-5cd8-88e90a6e7f5c
+5 5ecc9bd1-9231-5a1a-61fd-3902e17f9da7
+6 43db1553-7a52-ffd9-814c-fae075a89732
diff --git a/indra/newview/app_settings/static_assets/2d6daa51-3192-6794-8e2e-a15f8338ec30.animatn b/indra/newview/app_settings/static_assets/2d6daa51-3192-6794-8e2e-a15f8338ec30.animatn
new file mode 100644
index 0000000000..7aad799749
Binary files /dev/null and b/indra/newview/app_settings/static_assets/2d6daa51-3192-6794-8e2e-a15f8338ec30.animatn differ
diff --git a/indra/newview/app_settings/static_assets/30047778-10ea-1af7-6881-4db7a3a5a114.animatn b/indra/newview/app_settings/static_assets/30047778-10ea-1af7-6881-4db7a3a5a114.animatn
new file mode 100644
index 0000000000..b6bb0df598
Binary files /dev/null and b/indra/newview/app_settings/static_assets/30047778-10ea-1af7-6881-4db7a3a5a114.animatn differ
diff --git a/indra/newview/app_settings/static_assets/30c1bdb4-1f99-3ee9-2a2e-098e4a3ceda6.clothing b/indra/newview/app_settings/static_assets/30c1bdb4-1f99-3ee9-2a2e-098e4a3ceda6.clothing
new file mode 100644
index 0000000000..9d65799aaf
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/30c1bdb4-1f99-3ee9-2a2e-098e4a3ceda6.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M SHOP JACKET
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 1
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 0f1edbd7-9e24-50f4-e43e-33c79a3fcdd3
+14 7d950588-19a5-3b45-b273-9e54a878333d
diff --git a/indra/newview/app_settings/static_assets/313b9881-4302-73c0-c7d0-0e7a36b6c224.animatn b/indra/newview/app_settings/static_assets/313b9881-4302-73c0-c7d0-0e7a36b6c224.animatn
new file mode 100644
index 0000000000..1f9f8391a2
Binary files /dev/null and b/indra/newview/app_settings/static_assets/313b9881-4302-73c0-c7d0-0e7a36b6c224.animatn differ
diff --git a/indra/newview/app_settings/static_assets/3147d815-6338-b932-f011-16b56d9ac18b.animatn b/indra/newview/app_settings/static_assets/3147d815-6338-b932-f011-16b56d9ac18b.animatn
new file mode 100644
index 0000000000..7fe3d2ddd6
Binary files /dev/null and b/indra/newview/app_settings/static_assets/3147d815-6338-b932-f011-16b56d9ac18b.animatn differ
diff --git a/indra/newview/app_settings/static_assets/315c3a41-a5f3-0ba4-27da-f893f769e69b.animatn b/indra/newview/app_settings/static_assets/315c3a41-a5f3-0ba4-27da-f893f769e69b.animatn
new file mode 100644
index 0000000000..52a60b3eba
Binary files /dev/null and b/indra/newview/app_settings/static_assets/315c3a41-a5f3-0ba4-27da-f893f769e69b.animatn differ
diff --git a/indra/newview/app_settings/static_assets/33339176-7ddc-9397-94a4-bf3403cbc8f5.animatn b/indra/newview/app_settings/static_assets/33339176-7ddc-9397-94a4-bf3403cbc8f5.animatn
new file mode 100644
index 0000000000..fb1834eb5f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/33339176-7ddc-9397-94a4-bf3403cbc8f5.animatn differ
diff --git a/indra/newview/app_settings/static_assets/347df5d8-c73b-009d-f19d-df78aea8ec22.bodypart b/indra/newview/app_settings/static_assets/347df5d8-c73b-009d-f19d-df78aea8ec22.bodypart
new file mode 100644
index 0000000000..04e6fdc4cf
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/347df5d8-c73b-009d-f19d-df78aea8ec22.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL M LOVE SKIN (Jon)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 0
+110 0
+111 .75
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 4ed0ebf9-f806-0af7-1ba8-3afba81c3e7c
+5 c3f2fcd9-416c-138a-9f45-326b062f9f1b
+6 9714d5e1-1c71-f92e-a695-71198839f5de
diff --git a/indra/newview/app_settings/static_assets/349a3801-54f9-bf2c-3bd0-1ac89772af01.animatn b/indra/newview/app_settings/static_assets/349a3801-54f9-bf2c-3bd0-1ac89772af01.animatn
new file mode 100644
index 0000000000..41ef5cdeaa
Binary files /dev/null and b/indra/newview/app_settings/static_assets/349a3801-54f9-bf2c-3bd0-1ac89772af01.animatn differ
diff --git a/indra/newview/app_settings/static_assets/35db4f7e-28c2-6679-cea9-3ee108f7fc7f.animatn b/indra/newview/app_settings/static_assets/35db4f7e-28c2-6679-cea9-3ee108f7fc7f.animatn
new file mode 100644
index 0000000000..1de30618c1
Binary files /dev/null and b/indra/newview/app_settings/static_assets/35db4f7e-28c2-6679-cea9-3ee108f7fc7f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/36f81a92-f076-5893-dc4b-7c3795e487cf.animatn b/indra/newview/app_settings/static_assets/36f81a92-f076-5893-dc4b-7c3795e487cf.animatn
new file mode 100644
index 0000000000..eb319331e1
Binary files /dev/null and b/indra/newview/app_settings/static_assets/36f81a92-f076-5893-dc4b-7c3795e487cf.animatn differ
diff --git a/indra/newview/app_settings/static_assets/370f3a20-6ca6-9971-848c-9a01bc42ae3c.animatn b/indra/newview/app_settings/static_assets/370f3a20-6ca6-9971-848c-9a01bc42ae3c.animatn
new file mode 100644
index 0000000000..728d33b714
Binary files /dev/null and b/indra/newview/app_settings/static_assets/370f3a20-6ca6-9971-848c-9a01bc42ae3c.animatn differ
diff --git a/indra/newview/app_settings/static_assets/37ea8e97-1d16-b28d-8a48-7c88b39321cb.clothing b/indra/newview/app_settings/static_assets/37ea8e97-1d16-b28d-8a48-7c88b39321cb.clothing
new file mode 100644
index 0000000000..2bfaf1e3c0
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/37ea8e97-1d16-b28d-8a48-7c88b39321cb.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F PLAY BOLERO JACKET
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 1
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 23f0e8f7-f852-c836-5f13-cfd643a8fb24
+14 85b13d86-3e95-8d4b-a03b-c9c737631194
diff --git a/indra/newview/app_settings/static_assets/3d6da7ba-e4a3-e08c-b52e-98a40cb4dc33.bodypart b/indra/newview/app_settings/static_assets/3d6da7ba-e4a3-e08c-b52e-98a40cb4dc33.bodypart
new file mode 100644
index 0000000000..187f7f050f
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/3d6da7ba-e4a3-e08c-b52e-98a40cb4dc33.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL F SHOP SKIN (Suzy)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 .04
+110 0
+111 .4
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 ca158569-54b2-997e-e08a-84e1671f6203
+5 2f1251f3-3967-1044-4211-c6d311b57760
+6 178a21aa-85f2-8b57-9c7a-2d85ebc9f31e
diff --git a/indra/newview/app_settings/static_assets/3d8a32a0-3c25-ddcc-f807-e50f796e1dde.gesture b/indra/newview/app_settings/static_assets/3d8a32a0-3c25-ddcc-f807-e50f796e1dde.gesture
new file mode 100644
index 0000000000..b31632c9e9
Binary files /dev/null and b/indra/newview/app_settings/static_assets/3d8a32a0-3c25-ddcc-f807-e50f796e1dde.gesture differ
diff --git a/indra/newview/app_settings/static_assets/3d94bad0-c55b-7dcc-8763-033c59405d33.animatn b/indra/newview/app_settings/static_assets/3d94bad0-c55b-7dcc-8763-033c59405d33.animatn
new file mode 100644
index 0000000000..ed5bdfdf5e
Binary files /dev/null and b/indra/newview/app_settings/static_assets/3d94bad0-c55b-7dcc-8763-033c59405d33.animatn differ
diff --git a/indra/newview/app_settings/static_assets/3da1d753-028a-5446-24f3-9c9b856d9422.animatn b/indra/newview/app_settings/static_assets/3da1d753-028a-5446-24f3-9c9b856d9422.animatn
new file mode 100644
index 0000000000..7f52de0585
Binary files /dev/null and b/indra/newview/app_settings/static_assets/3da1d753-028a-5446-24f3-9c9b856d9422.animatn differ
diff --git a/indra/newview/app_settings/static_assets/3f1cf9b6-f52c-46cd-bcf7-ffb7c8c25aea.gesture b/indra/newview/app_settings/static_assets/3f1cf9b6-f52c-46cd-bcf7-ffb7c8c25aea.gesture
new file mode 100644
index 0000000000..ad795ceb80
Binary files /dev/null and b/indra/newview/app_settings/static_assets/3f1cf9b6-f52c-46cd-bcf7-ffb7c8c25aea.gesture differ
diff --git a/indra/newview/app_settings/static_assets/3f258e00-f5ac-68b2-bfb0-0c3c0fa3e614.gesture b/indra/newview/app_settings/static_assets/3f258e00-f5ac-68b2-bfb0-0c3c0fa3e614.gesture
new file mode 100644
index 0000000000..0e02ee3a27
Binary files /dev/null and b/indra/newview/app_settings/static_assets/3f258e00-f5ac-68b2-bfb0-0c3c0fa3e614.gesture differ
diff --git a/indra/newview/app_settings/static_assets/3fc36cff-74b6-a980-3e4c-8f93a1dae205.clothing b/indra/newview/app_settings/static_assets/3fc36cff-74b6-a980-3e4c-8f93a1dae205.clothing
new file mode 100644
index 0000000000..fa5dae9bca
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/3fc36cff-74b6-a980-3e4c-8f93a1dae205.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL ANNA BOOTS FOOTSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 6
+parameters 10
+198 1
+503 0
+508 -1
+513 0
+514 .21
+616 .1
+654 0
+812 1
+813 1
+817 1
+textures 1
+7 85b13d86-3e95-8d4b-a03b-c9c737631194
diff --git a/indra/newview/app_settings/static_assets/40b92916-8055-2562-008f-58924bd0e03c.gesture b/indra/newview/app_settings/static_assets/40b92916-8055-2562-008f-58924bd0e03c.gesture
new file mode 100644
index 0000000000..63b18c8c50
Binary files /dev/null and b/indra/newview/app_settings/static_assets/40b92916-8055-2562-008f-58924bd0e03c.gesture differ
diff --git a/indra/newview/app_settings/static_assets/41426836-7437-7e89-025d-0aa4d10f1d69.animatn b/indra/newview/app_settings/static_assets/41426836-7437-7e89-025d-0aa4d10f1d69.animatn
new file mode 100644
index 0000000000..aead27694e
Binary files /dev/null and b/indra/newview/app_settings/static_assets/41426836-7437-7e89-025d-0aa4d10f1d69.animatn differ
diff --git a/indra/newview/app_settings/static_assets/42b46214-4b44-79ae-deb8-0df61424ff4b.animatn b/indra/newview/app_settings/static_assets/42b46214-4b44-79ae-deb8-0df61424ff4b.animatn
new file mode 100644
index 0000000000..90e909d8ed
Binary files /dev/null and b/indra/newview/app_settings/static_assets/42b46214-4b44-79ae-deb8-0df61424ff4b.animatn differ
diff --git a/indra/newview/app_settings/static_assets/42dd95d5-0bc6-6392-f650-777304946c0f.animatn b/indra/newview/app_settings/static_assets/42dd95d5-0bc6-6392-f650-777304946c0f.animatn
new file mode 100644
index 0000000000..81d00858f5
Binary files /dev/null and b/indra/newview/app_settings/static_assets/42dd95d5-0bc6-6392-f650-777304946c0f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/42ecd00b-9947-a97c-400a-bbc9174c7aeb.animatn b/indra/newview/app_settings/static_assets/42ecd00b-9947-a97c-400a-bbc9174c7aeb.animatn
new file mode 100644
index 0000000000..39d3f0b41c
Binary files /dev/null and b/indra/newview/app_settings/static_assets/42ecd00b-9947-a97c-400a-bbc9174c7aeb.animatn differ
diff --git a/indra/newview/app_settings/static_assets/43417d10-a2f7-7727-6fd4-dd7f04ad7a13.gesture b/indra/newview/app_settings/static_assets/43417d10-a2f7-7727-6fd4-dd7f04ad7a13.gesture
new file mode 100644
index 0000000000..8364c7e5ee
Binary files /dev/null and b/indra/newview/app_settings/static_assets/43417d10-a2f7-7727-6fd4-dd7f04ad7a13.gesture differ
diff --git a/indra/newview/app_settings/static_assets/44a87e64-2d78-14b7-1cde-ac0f5031621f.gesture b/indra/newview/app_settings/static_assets/44a87e64-2d78-14b7-1cde-ac0f5031621f.gesture
new file mode 100644
index 0000000000..06a9afa456
Binary files /dev/null and b/indra/newview/app_settings/static_assets/44a87e64-2d78-14b7-1cde-ac0f5031621f.gesture differ
diff --git a/indra/newview/app_settings/static_assets/46bb4359-de38-4ed8-6a22-f1f52fe8f506.animatn b/indra/newview/app_settings/static_assets/46bb4359-de38-4ed8-6a22-f1f52fe8f506.animatn
new file mode 100644
index 0000000000..a85f1ea884
Binary files /dev/null and b/indra/newview/app_settings/static_assets/46bb4359-de38-4ed8-6a22-f1f52fe8f506.animatn differ
diff --git a/indra/newview/app_settings/static_assets/47f5f6fb-22e5-ae44-f871-73aaaf4a6022.animatn b/indra/newview/app_settings/static_assets/47f5f6fb-22e5-ae44-f871-73aaaf4a6022.animatn
new file mode 100644
index 0000000000..4348735620
Binary files /dev/null and b/indra/newview/app_settings/static_assets/47f5f6fb-22e5-ae44-f871-73aaaf4a6022.animatn differ
diff --git a/indra/newview/app_settings/static_assets/49aea43b-5ac3-8a44-b595-96100af0beda.animatn b/indra/newview/app_settings/static_assets/49aea43b-5ac3-8a44-b595-96100af0beda.animatn
new file mode 100644
index 0000000000..9d378ae472
Binary files /dev/null and b/indra/newview/app_settings/static_assets/49aea43b-5ac3-8a44-b595-96100af0beda.animatn differ
diff --git a/indra/newview/app_settings/static_assets/4ae8016b-31b9-03bb-c401-b1ea941db41d.animatn b/indra/newview/app_settings/static_assets/4ae8016b-31b9-03bb-c401-b1ea941db41d.animatn
new file mode 100644
index 0000000000..a2fcc32cfd
Binary files /dev/null and b/indra/newview/app_settings/static_assets/4ae8016b-31b9-03bb-c401-b1ea941db41d.animatn differ
diff --git a/indra/newview/app_settings/static_assets/4bd69a1d-1114-a0b4-625f-84e0a5237155.animatn b/indra/newview/app_settings/static_assets/4bd69a1d-1114-a0b4-625f-84e0a5237155.animatn
new file mode 100644
index 0000000000..2eedbda6b7
Binary files /dev/null and b/indra/newview/app_settings/static_assets/4bd69a1d-1114-a0b4-625f-84e0a5237155.animatn differ
diff --git a/indra/newview/app_settings/static_assets/4c450f9e-07c0-2f5a-bc89-57de56db8ba1.gesture b/indra/newview/app_settings/static_assets/4c450f9e-07c0-2f5a-bc89-57de56db8ba1.gesture
new file mode 100644
index 0000000000..69e35f111a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/4c450f9e-07c0-2f5a-bc89-57de56db8ba1.gesture differ
diff --git a/indra/newview/app_settings/static_assets/4f23cc4a-712e-aabc-afcf-3cab4c1164ea.gesture b/indra/newview/app_settings/static_assets/4f23cc4a-712e-aabc-afcf-3cab4c1164ea.gesture
new file mode 100644
index 0000000000..9d7e59fa5c
Binary files /dev/null and b/indra/newview/app_settings/static_assets/4f23cc4a-712e-aabc-afcf-3cab4c1164ea.gesture differ
diff --git a/indra/newview/app_settings/static_assets/510cdb99-1764-a0ef-a7e7-beb70e8dc4a4.clothing b/indra/newview/app_settings/static_assets/510cdb99-1764-a0ef-a7e7-beb70e8dc4a4.clothing
new file mode 100644
index 0000000000..f4b6eb599a
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/510cdb99-1764-a0ef-a7e7-beb70e8dc4a4.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL F PLAY BODICE TOP DOWN
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 60b3592a-2499-20ce-e88b-db35fdba13ea
diff --git a/indra/newview/app_settings/static_assets/514af488-9051-044a-b3fc-d4dbf76377c6.animatn b/indra/newview/app_settings/static_assets/514af488-9051-044a-b3fc-d4dbf76377c6.animatn
new file mode 100644
index 0000000000..2609059435
Binary files /dev/null and b/indra/newview/app_settings/static_assets/514af488-9051-044a-b3fc-d4dbf76377c6.animatn differ
diff --git a/indra/newview/app_settings/static_assets/51f3b303-a783-f0bd-9e98-9c094be13653.bodypart b/indra/newview/app_settings/static_assets/51f3b303-a783-f0bd-9e98-9c094be13653.bodypart
new file mode 100644
index 0000000000..5b6ad1d1ce
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/51f3b303-a783-f0bd-9e98-9c094be13653.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL M LEARN EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 .76
+31 .62
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -1.18
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/522d4d1d-0f75-c3e7-af30-990e5f394438.gesture b/indra/newview/app_settings/static_assets/522d4d1d-0f75-c3e7-af30-990e5f394438.gesture
new file mode 100644
index 0000000000..e9bab5d5a5
Binary files /dev/null and b/indra/newview/app_settings/static_assets/522d4d1d-0f75-c3e7-af30-990e5f394438.gesture differ
diff --git a/indra/newview/app_settings/static_assets/52d9684f-2dcf-c252-2360-186b4236d07e.gesture b/indra/newview/app_settings/static_assets/52d9684f-2dcf-c252-2360-186b4236d07e.gesture
new file mode 100644
index 0000000000..f964630f2d
Binary files /dev/null and b/indra/newview/app_settings/static_assets/52d9684f-2dcf-c252-2360-186b4236d07e.gesture differ
diff --git a/indra/newview/app_settings/static_assets/5480a924-8b06-9551-2af7-bf59452870e5.gesture b/indra/newview/app_settings/static_assets/5480a924-8b06-9551-2af7-bf59452870e5.gesture
new file mode 100644
index 0000000000..b4c2dfedf0
Binary files /dev/null and b/indra/newview/app_settings/static_assets/5480a924-8b06-9551-2af7-bf59452870e5.gesture differ
diff --git a/indra/newview/app_settings/static_assets/55c19b40-5303-d6ab-f003-5a2d926f4738.bodypart b/indra/newview/app_settings/static_assets/55c19b40-5303-d6ab-f003-5a2d926f4738.bodypart
new file mode 100644
index 0000000000..e312715137
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/55c19b40-5303-d6ab-f003-5a2d926f4738.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL M EXPLORE EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 1.18
+31 .42
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.16
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/56e0ba0d-4a9f-7f27-6117-32f2ebbf6135.animatn b/indra/newview/app_settings/static_assets/56e0ba0d-4a9f-7f27-6117-32f2ebbf6135.animatn
new file mode 100644
index 0000000000..31b74675d1
Binary files /dev/null and b/indra/newview/app_settings/static_assets/56e0ba0d-4a9f-7f27-6117-32f2ebbf6135.animatn differ
diff --git a/indra/newview/app_settings/static_assets/5725fae1-0087-ec20-a4a0-eaa82d5c121b.bodypart b/indra/newview/app_settings/static_assets/5725fae1-0087-ec20-a4a0-eaa82d5c121b.bodypart
new file mode 100644
index 0000000000..61fde63bae
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/5725fae1-0087-ec20-a4a0-eaa82d5c121b.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL - Eyes - Amber Brown
+
+ permissions 0
+ {
+ base_mask 00082000
+ owner_mask 00082000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 f8230eaa-0afb-8eee-9891-030cfdfa6640
diff --git a/indra/newview/app_settings/static_assets/5747a48e-073e-c331-f6f3-7c2149613d3e.animatn b/indra/newview/app_settings/static_assets/5747a48e-073e-c331-f6f3-7c2149613d3e.animatn
new file mode 100644
index 0000000000..bd25f7755f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/5747a48e-073e-c331-f6f3-7c2149613d3e.animatn differ
diff --git a/indra/newview/app_settings/static_assets/57abaae6-1d17-7b1b-5f98-6d11a6411276.animatn b/indra/newview/app_settings/static_assets/57abaae6-1d17-7b1b-5f98-6d11a6411276.animatn
new file mode 100644
index 0000000000..5dac9c0738
Binary files /dev/null and b/indra/newview/app_settings/static_assets/57abaae6-1d17-7b1b-5f98-6d11a6411276.animatn differ
diff --git a/indra/newview/app_settings/static_assets/57cbd4f1-c53e-020f-f455-5ad2a5bab98d.bodypart b/indra/newview/app_settings/static_assets/57cbd4f1-c53e-020f-f455-5ad2a5bab98d.bodypart
new file mode 100644
index 0000000000..fd0a90ed1f
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/57cbd4f1-c53e-020f-f455-5ad2a5bab98d.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL F LEARN SHAPE (ANNA)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 0
+2 -.47
+4 -.06
+5 .15
+6 -.05
+7 .2
+8 -.26
+10 .17
+11 .24
+12 -.08
+13 .21
+14 .55
+15 -.28
+17 -.08
+18 .7
+19 -.3
+20 -.06
+21 -.05
+22 0
+23 -.4
+24 .25
+25 -.32
+27 -.47
+33 .58
+34 .07
+35 -.1
+36 -1.1
+37 -1.16
+38 -.16
+80 0
+105 .47
+155 -.42
+157 .04
+185 -.6
+193 .54
+196 -1.07
+505 .31
+506 -.44
+507 0
+515 -1
+517 -.08
+518 .24
+629 .44
+637 .06
+646 -.01
+647 -.09
+649 .34
+650 -.15
+652 .34
+653 .38
+656 0
+659 .59
+662 .5
+663 0
+664 0
+665 .08
+675 -.19
+676 -.37
+678 .5
+682 .52
+683 -.2
+684 .18
+685 0
+690 .37
+692 .2
+693 .22
+753 .51
+756 -.38
+758 .06
+759 -.05
+760 .72
+764 .35
+765 -.08
+769 .45
+773 .53
+795 .21
+796 .01
+799 .55
+841 .02
+842 .16
+879 0
+880 -.85
+textures 0
diff --git a/indra/newview/app_settings/static_assets/590b2eac-a9fc-1e22-7874-782e3ded97d2.bodypart b/indra/newview/app_settings/static_assets/590b2eac-a9fc-1e22-7874-782e3ded97d2.bodypart
new file mode 100644
index 0000000000..d0fb089ba0
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/590b2eac-a9fc-1e22-7874-782e3ded97d2.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL F CREATE SHAPE (POPPY)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .02
+2 -.44
+4 -.06
+5 -.02
+6 -.05
+7 .02
+8 -.42
+10 .3
+11 .24
+12 -.23
+13 0
+14 .46
+15 -.28
+17 .25
+18 -.38
+19 -.45
+20 -.14
+21 -.02
+22 0
+23 -.46
+24 .22
+25 .19
+27 -.47
+33 .58
+34 .07
+35 -.1
+36 -1
+37 -1.04
+38 -.24
+80 0
+105 .53
+155 -.44
+157 0
+185 -.62
+193 .46
+196 -1.13
+505 .35
+506 -.68
+507 -.24
+515 -1
+517 -.05
+518 .24
+629 .5
+637 .06
+646 -.08
+647 -.17
+649 .32
+650 0
+652 .37
+653 .35
+656 0
+659 .57
+662 .5
+663 0
+664 0
+665 .08
+675 -.17
+676 -.49
+678 .5
+682 .53
+683 -.17
+684 .04
+685 0
+690 .39
+692 .3
+693 .2
+753 .55
+756 -.38
+758 .06
+759 .17
+760 .85
+764 .32
+765 -.08
+769 .45
+773 .53
+795 .2
+796 .08
+799 .5
+841 -.02
+842 .06
+879 0
+880 -.85
+textures 0
diff --git a/indra/newview/app_settings/static_assets/59332ea5-2a75-9ede-9ab7-f0ae70bbffcc.clothing b/indra/newview/app_settings/static_assets/59332ea5-2a75-9ede-9ab7-f0ae70bbffcc.clothing
new file mode 100644
index 0000000000..b7c0342844
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/59332ea5-2a75-9ede-9ab7-f0ae70bbffcc.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL MSHOE 5 FOOTSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 6
+parameters 10
+198 0
+503 0
+508 .02
+513 .29
+514 .27
+616 .1
+654 0
+812 1
+813 1
+817 1
+textures 1
+7 85b13d86-3e95-8d4b-a03b-c9c737631194
diff --git a/indra/newview/app_settings/static_assets/5a68100b-e6ba-5170-649c-80beddc67035.gesture b/indra/newview/app_settings/static_assets/5a68100b-e6ba-5170-649c-80beddc67035.gesture
new file mode 100644
index 0000000000..548369d81d
Binary files /dev/null and b/indra/newview/app_settings/static_assets/5a68100b-e6ba-5170-649c-80beddc67035.gesture differ
diff --git a/indra/newview/app_settings/static_assets/5a977ed9-7f72-44e9-4c4c-6e913df8ae74.animatn b/indra/newview/app_settings/static_assets/5a977ed9-7f72-44e9-4c4c-6e913df8ae74.animatn
new file mode 100644
index 0000000000..700f4e2969
Binary files /dev/null and b/indra/newview/app_settings/static_assets/5a977ed9-7f72-44e9-4c4c-6e913df8ae74.animatn differ
diff --git a/indra/newview/app_settings/static_assets/5af7de1f-e517-ae9a-13d8-4760c1ab4cc3.bodypart b/indra/newview/app_settings/static_assets/5af7de1f-e517-ae9a-13d8-4760c1ab4cc3.bodypart
new file mode 100644
index 0000000000..46833ce4b5
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/5af7de1f-e517-ae9a-13d8-4760c1ab4cc3.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+New Eyes
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 d7bef979-ed48-e7ce-079a-b19a3c5a144a
diff --git a/indra/newview/app_settings/static_assets/5bac881c-fff8-b19a-49eb-ba253eb5af04.bodypart b/indra/newview/app_settings/static_assets/5bac881c-fff8-b19a-49eb-ba253eb5af04.bodypart
new file mode 100644
index 0000000000..ed4033a1f6
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/5bac881c-fff8-b19a-49eb-ba253eb5af04.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL F EXPLORE EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 .9
+31 .34
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 .14
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/5c682a95-6da4-a463-0bf6-0f5b7be129d1.animatn b/indra/newview/app_settings/static_assets/5c682a95-6da4-a463-0bf6-0f5b7be129d1.animatn
new file mode 100644
index 0000000000..a7da5e8591
Binary files /dev/null and b/indra/newview/app_settings/static_assets/5c682a95-6da4-a463-0bf6-0f5b7be129d1.animatn differ
diff --git a/indra/newview/app_settings/static_assets/5dde08b6-59ec-5ca3-92a0-b9d7f532a768.bodypart b/indra/newview/app_settings/static_assets/5dde08b6-59ec-5ca3-92a0-b9d7f532a768.bodypart
new file mode 100644
index 0000000000..10f197a1d3
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/5dde08b6-59ec-5ca3-92a0-b9d7f532a768.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL M PLAY EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 .69
+31 .4
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.4
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/5ea3991f-c293-392e-6860-91dfa01278a3.animatn b/indra/newview/app_settings/static_assets/5ea3991f-c293-392e-6860-91dfa01278a3.animatn
new file mode 100644
index 0000000000..f2e65858a4
Binary files /dev/null and b/indra/newview/app_settings/static_assets/5ea3991f-c293-392e-6860-91dfa01278a3.animatn differ
diff --git a/indra/newview/app_settings/static_assets/6061a81b-e6bf-5909-b86a-268e5c6b28c3.clothing b/indra/newview/app_settings/static_assets/6061a81b-e6bf-5909-b86a-268e5c6b28c3.clothing
new file mode 100644
index 0000000000..cc6a8e1dac
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/6061a81b-e6bf-5909-b86a-268e5c6b28c3.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL F EXPLORE JEANS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 0bcd9123-fb74-5d95-e9e2-d0e4f8677405
diff --git a/indra/newview/app_settings/static_assets/6212ffdd-d447-a92f-18f3-8cb94a799d83.gesture b/indra/newview/app_settings/static_assets/6212ffdd-d447-a92f-18f3-8cb94a799d83.gesture
new file mode 100644
index 0000000000..b94ccdbfec
Binary files /dev/null and b/indra/newview/app_settings/static_assets/6212ffdd-d447-a92f-18f3-8cb94a799d83.gesture differ
diff --git a/indra/newview/app_settings/static_assets/62c5de58-cb33-5743-3d07-9e4cd4352864.animatn b/indra/newview/app_settings/static_assets/62c5de58-cb33-5743-3d07-9e4cd4352864.animatn
new file mode 100644
index 0000000000..1e83b0de36
Binary files /dev/null and b/indra/newview/app_settings/static_assets/62c5de58-cb33-5743-3d07-9e4cd4352864.animatn differ
diff --git a/indra/newview/app_settings/static_assets/631feb23-6f72-ae9c-dd5e-51510bbe235b.clothing b/indra/newview/app_settings/static_assets/631feb23-6f72-ae9c-dd5e-51510bbe235b.clothing
new file mode 100644
index 0000000000..92e6564525
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/631feb23-6f72-ae9c-dd5e-51510bbe235b.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL F EXPLORE TANK DOWN
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 bc23416d-7993-17bf-d5e0-bcfae808be73
diff --git a/indra/newview/app_settings/static_assets/633b2da6-a46f-8de8-5fe6-1256fd48d991.bodypart b/indra/newview/app_settings/static_assets/633b2da6-a46f-8de8-5fe6-1256fd48d991.bodypart
new file mode 100644
index 0000000000..b129dfc609
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/633b2da6-a46f-8de8-5fe6-1256fd48d991.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+Male Designer Skin
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 0008e000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 0
+110 0
+111 .5
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 ddcc80fe-8da3-0eb7-cad6-ae35f76c99ab
+5 f4e585de-8cc8-fecd-6eba-b3ec663161a1
+6 8bd9935f-97dd-bed2-1a46-df194013d737
diff --git a/indra/newview/app_settings/static_assets/63af4bbd-7dba-fb00-01f6-bc2126ece403.gesture b/indra/newview/app_settings/static_assets/63af4bbd-7dba-fb00-01f6-bc2126ece403.gesture
new file mode 100644
index 0000000000..0c958c6ca2
Binary files /dev/null and b/indra/newview/app_settings/static_assets/63af4bbd-7dba-fb00-01f6-bc2126ece403.gesture differ
diff --git a/indra/newview/app_settings/static_assets/666307d9-a860-572d-6fd4-c3ab8865c094.animatn b/indra/newview/app_settings/static_assets/666307d9-a860-572d-6fd4-c3ab8865c094.animatn
new file mode 100644
index 0000000000..c8d940b886
Binary files /dev/null and b/indra/newview/app_settings/static_assets/666307d9-a860-572d-6fd4-c3ab8865c094.animatn differ
diff --git a/indra/newview/app_settings/static_assets/66d174a6-66dc-cfe4-5b51-48b3be18d099.clothing b/indra/newview/app_settings/static_assets/66d174a6-66dc-cfe4-5b51-48b3be18d099.clothing
new file mode 100644
index 0000000000..d8679b7cd7
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/66d174a6-66dc-cfe4-5b51-48b3be18d099.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F PLAY BODICE TOP UP
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 618cc16f-fcfa-12a3-1896-be4e87ca09a0
diff --git a/indra/newview/app_settings/static_assets/66ecd9bd-22e1-2633-f41e-ad1a38205662.gesture b/indra/newview/app_settings/static_assets/66ecd9bd-22e1-2633-f41e-ad1a38205662.gesture
new file mode 100644
index 0000000000..38b70758b7
Binary files /dev/null and b/indra/newview/app_settings/static_assets/66ecd9bd-22e1-2633-f41e-ad1a38205662.gesture differ
diff --git a/indra/newview/app_settings/static_assets/6802d553-49da-0778-9f85-1599a2266526.animatn b/indra/newview/app_settings/static_assets/6802d553-49da-0778-9f85-1599a2266526.animatn
new file mode 100644
index 0000000000..ecf9138483
Binary files /dev/null and b/indra/newview/app_settings/static_assets/6802d553-49da-0778-9f85-1599a2266526.animatn differ
diff --git a/indra/newview/app_settings/static_assets/6883a61a-b27b-5914-a61e-dda118a9ee2c.animatn b/indra/newview/app_settings/static_assets/6883a61a-b27b-5914-a61e-dda118a9ee2c.animatn
new file mode 100644
index 0000000000..3c18b3db3f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/6883a61a-b27b-5914-a61e-dda118a9ee2c.animatn differ
diff --git a/indra/newview/app_settings/static_assets/68efa755-f0dd-8da2-38e9-bc9ea6b4ddd6.gesture b/indra/newview/app_settings/static_assets/68efa755-f0dd-8da2-38e9-bc9ea6b4ddd6.gesture
new file mode 100644
index 0000000000..1af6225189
Binary files /dev/null and b/indra/newview/app_settings/static_assets/68efa755-f0dd-8da2-38e9-bc9ea6b4ddd6.gesture differ
diff --git a/indra/newview/app_settings/static_assets/693f12af-3bd9-8dcd-0395-32a967cc812d.bodypart b/indra/newview/app_settings/static_assets/693f12af-3bd9-8dcd-0395-32a967cc812d.bodypart
new file mode 100644
index 0000000000..7e72d3e941
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/693f12af-3bd9-8dcd-0395-32a967cc812d.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL M EXPLORE SKIN (LOUIS)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 0
+110 0
+111 .75
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 186d9ce8-d1bd-b0d9-4c1e-e2d0faf4d6ca
+5 959fdef8-ca08-4059-5468-0431a14b11fe
+6 a2200068-757a-6b58-6693-02129927627e
diff --git a/indra/newview/app_settings/static_assets/697ed804-815c-f195-597c-dce51b86713b.bodypart b/indra/newview/app_settings/static_assets/697ed804-815c-f195-597c-dce51b86713b.bodypart
new file mode 100644
index 0000000000..a8f1d47c94
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/697ed804-815c-f195-597c-dce51b86713b.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL - Eyes - Spring Green
+
+ permissions 0
+ {
+ base_mask 00082000
+ owner_mask 00082000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 c0871f57-c220-1a17-941a-bc953763f317
diff --git a/indra/newview/app_settings/static_assets/69a2052e-1777-df94-49bd-8675ca576d87.clothing b/indra/newview/app_settings/static_assets/69a2052e-1777-df94-49bd-8675ca576d87.clothing
new file mode 100644
index 0000000000..18943d93fa
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/69a2052e-1777-df94-49bd-8675ca576d87.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M PLAY JACKET
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 1
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 9cc05d27-0088-dfea-2cd7-1573812decdf
+14 f13c2b07-21d3-e913-e848-4aad3b8044f9
diff --git a/indra/newview/app_settings/static_assets/6af61452-5a3b-7fd3-4604-dc397aa9184b.bodypart b/indra/newview/app_settings/static_assets/6af61452-5a3b-7fd3-4604-dc397aa9184b.bodypart
new file mode 100644
index 0000000000..2f0f5b3692
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/6af61452-5a3b-7fd3-4604-dc397aa9184b.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL M LOVE SHAPE (JON)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .16
+2 -.21
+4 .17
+5 .44
+6 .02
+7 -.24
+8 -.14
+10 .88
+11 .4
+12 -.08
+13 .68
+14 .63
+15 -.22
+17 .22
+18 .66
+19 -.43
+20 -.26
+21 .31
+22 .57
+23 -.44
+24 -.14
+25 -.02
+27 .05
+33 1.14
+34 -.26
+35 -.07
+36 -.52
+37 -.14
+38 -.1
+80 1
+105 .5
+155 -.22
+157 .02
+185 -.76
+193 .73
+196 -.98
+505 .49
+506 -.12
+507 0
+515 -1
+517 -.25
+518 -.08
+629 .37
+637 .05
+646 .1
+647 -.02
+649 .5
+650 .05
+652 .46
+653 .38
+656 0
+659 .54
+662 .5
+663 0
+664 0
+665 .08
+675 -.12
+676 -.22
+678 .46
+682 .57
+683 -.05
+684 0
+685 .08
+690 .46
+692 .18
+693 .2
+753 1
+756 -.78
+758 -.42
+759 .75
+760 .24
+764 .23
+765 .15
+769 .45
+773 .45
+795 .26
+796 .28
+799 .52
+841 .02
+842 0
+879 .17
+880 -.8
+textures 0
diff --git a/indra/newview/app_settings/static_assets/6b61c8e8-4747-0d75-12d7-e49ff207a4ca.animatn b/indra/newview/app_settings/static_assets/6b61c8e8-4747-0d75-12d7-e49ff207a4ca.animatn
new file mode 100644
index 0000000000..d7218f8884
Binary files /dev/null and b/indra/newview/app_settings/static_assets/6b61c8e8-4747-0d75-12d7-e49ff207a4ca.animatn differ
diff --git a/indra/newview/app_settings/static_assets/6bd01860-4ebd-127a-bb3d-d1427e8e0c42.animatn b/indra/newview/app_settings/static_assets/6bd01860-4ebd-127a-bb3d-d1427e8e0c42.animatn
new file mode 100644
index 0000000000..80dc724546
Binary files /dev/null and b/indra/newview/app_settings/static_assets/6bd01860-4ebd-127a-bb3d-d1427e8e0c42.animatn differ
diff --git a/indra/newview/app_settings/static_assets/6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0.animatn b/indra/newview/app_settings/static_assets/6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0.animatn
new file mode 100644
index 0000000000..1daa254f9d
Binary files /dev/null and b/indra/newview/app_settings/static_assets/6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0.animatn differ
diff --git a/indra/newview/app_settings/static_assets/709ea28e-1573-c023-8bf8-520c8bc637fa.animatn b/indra/newview/app_settings/static_assets/709ea28e-1573-c023-8bf8-520c8bc637fa.animatn
new file mode 100644
index 0000000000..d38b3c0a74
Binary files /dev/null and b/indra/newview/app_settings/static_assets/709ea28e-1573-c023-8bf8-520c8bc637fa.animatn differ
diff --git a/indra/newview/app_settings/static_assets/70ea714f-3a97-d742-1b01-590a8fcd1db5.animatn b/indra/newview/app_settings/static_assets/70ea714f-3a97-d742-1b01-590a8fcd1db5.animatn
new file mode 100644
index 0000000000..0eb2008999
Binary files /dev/null and b/indra/newview/app_settings/static_assets/70ea714f-3a97-d742-1b01-590a8fcd1db5.animatn differ
diff --git a/indra/newview/app_settings/static_assets/72560c27-e48b-a6a5-10e3-d21dfb4bd4fb.clothing b/indra/newview/app_settings/static_assets/72560c27-e48b-a6a5-10e3-d21dfb4bd4fb.clothing
new file mode 100644
index 0000000000..6755842945
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/72560c27-e48b-a6a5-10e3-d21dfb4bd4fb.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL M PLAY TROUSERS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 2aa30286-f800-8444-61ff-44d42a6a0511
diff --git a/indra/newview/app_settings/static_assets/7693f268-06c7-ea71-fa21-2b30d6533f8f.animatn b/indra/newview/app_settings/static_assets/7693f268-06c7-ea71-fa21-2b30d6533f8f.animatn
new file mode 100644
index 0000000000..c08bd38ab1
Binary files /dev/null and b/indra/newview/app_settings/static_assets/7693f268-06c7-ea71-fa21-2b30d6533f8f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/76d30ee1-c369-12ec-8dbc-9cf2f51120ff.gesture b/indra/newview/app_settings/static_assets/76d30ee1-c369-12ec-8dbc-9cf2f51120ff.gesture
new file mode 100644
index 0000000000..bab2b2b242
Binary files /dev/null and b/indra/newview/app_settings/static_assets/76d30ee1-c369-12ec-8dbc-9cf2f51120ff.gesture differ
diff --git a/indra/newview/app_settings/static_assets/76f7ced2-4f91-31c8-ff7d-e76b19abfa40.gesture b/indra/newview/app_settings/static_assets/76f7ced2-4f91-31c8-ff7d-e76b19abfa40.gesture
new file mode 100644
index 0000000000..4bb19bcced
Binary files /dev/null and b/indra/newview/app_settings/static_assets/76f7ced2-4f91-31c8-ff7d-e76b19abfa40.gesture differ
diff --git a/indra/newview/app_settings/static_assets/7700f429-88f0-7e57-7714-33c73ad1a4eb.clothing b/indra/newview/app_settings/static_assets/7700f429-88f0-7e57-7714-33c73ad1a4eb.clothing
new file mode 100644
index 0000000000..0305abbb39
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/7700f429-88f0-7e57-7714-33c73ad1a4eb.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL M LOVE PANTS (BUFF)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 fbd237f4-1607-b3d4-f7a4-0a16d0eedc7b
diff --git a/indra/newview/app_settings/static_assets/7705007b-f459-0b49-e8f3-dd4eff6f82c2.bodypart b/indra/newview/app_settings/static_assets/7705007b-f459-0b49-e8f3-dd4eff6f82c2.bodypart
new file mode 100644
index 0000000000..2da36db083
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/7705007b-f459-0b49-e8f3-dd4eff6f82c2.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL M SHOP SKIN (REMY)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 .02
+110 0
+111 .6
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 32140dec-f6a3-1262-3c60-85bae6a814f5
+5 76d19560-0882-6f0a-5c31-f3f825c3bd2a
+6 198e53e7-cac5-849b-50bc-61b8b61efab2
diff --git a/indra/newview/app_settings/static_assets/790d7d90-eba9-d269-2d38-5cd2e36e7b93.clothing b/indra/newview/app_settings/static_assets/790d7d90-eba9-d269-2d38-5cd2e36e7b93.clothing
new file mode 100644
index 0000000000..8e60fbbaee
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/790d7d90-eba9-d269-2d38-5cd2e36e7b93.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M SHOPPER SHOES FOOTSHAPER (WEAR)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 6
+parameters 10
+198 0
+503 0
+508 -1
+513 0
+514 0
+616 .1
+654 0
+812 1
+813 1
+817 1
+textures 1
+7 85b13d86-3e95-8d4b-a03b-c9c737631194
diff --git a/indra/newview/app_settings/static_assets/792c8d21-c931-31be-0319-1779a0f8caf4.bodypart b/indra/newview/app_settings/static_assets/792c8d21-c931-31be-0319-1779a0f8caf4.bodypart
new file mode 100644
index 0000000000..b6079bd443
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/792c8d21-c931-31be-0319-1779a0f8caf4.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL - Eyes - Baby Blue
+
+ permissions 0
+ {
+ base_mask 00082000
+ owner_mask 00082000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 5b3917e5-98d9-d830-4704-1ddba558a63f
diff --git a/indra/newview/app_settings/static_assets/7a17b059-12b2-41b1-570a-186368b6aa6f.animatn b/indra/newview/app_settings/static_assets/7a17b059-12b2-41b1-570a-186368b6aa6f.animatn
new file mode 100644
index 0000000000..0846f1d496
Binary files /dev/null and b/indra/newview/app_settings/static_assets/7a17b059-12b2-41b1-570a-186368b6aa6f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/7a4e87fe-de39-6fcb-6223-024b00893244.animatn b/indra/newview/app_settings/static_assets/7a4e87fe-de39-6fcb-6223-024b00893244.animatn
new file mode 100644
index 0000000000..609ab5456f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/7a4e87fe-de39-6fcb-6223-024b00893244.animatn differ
diff --git a/indra/newview/app_settings/static_assets/7db00ccd-f380-f3ee-439d-61968ec69c8a.animatn b/indra/newview/app_settings/static_assets/7db00ccd-f380-f3ee-439d-61968ec69c8a.animatn
new file mode 100644
index 0000000000..18f7414824
Binary files /dev/null and b/indra/newview/app_settings/static_assets/7db00ccd-f380-f3ee-439d-61968ec69c8a.animatn differ
diff --git a/indra/newview/app_settings/static_assets/7fa32e57-0b88-d0f5-37b5-65ddf513e341.clothing b/indra/newview/app_settings/static_assets/7fa32e57-0b88-d0f5-37b5-65ddf513e341.clothing
new file mode 100644
index 0000000000..03e044bf48
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/7fa32e57-0b88-d0f5-37b5-65ddf513e341.clothing
@@ -0,0 +1,28 @@
+LLWearable version 22
+RASL SOCKS BLUE
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 7
+parameters 4
+617 1
+818 1
+819 1
+820 1
+textures 1
+12 0f2bfcbd-7853-6386-bffe-90cf9cf54a04
diff --git a/indra/newview/app_settings/static_assets/80700431-74ec-a008-14f8-77575e73693f.animatn b/indra/newview/app_settings/static_assets/80700431-74ec-a008-14f8-77575e73693f.animatn
new file mode 100644
index 0000000000..0d36c25a15
Binary files /dev/null and b/indra/newview/app_settings/static_assets/80700431-74ec-a008-14f8-77575e73693f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/81287180-509d-477c-b10d-d68e403d5bcb.clothing b/indra/newview/app_settings/static_assets/81287180-509d-477c-b10d-d68e403d5bcb.clothing
new file mode 100644
index 0000000000..b6f17db2ff
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/81287180-509d-477c-b10d-d68e403d5bcb.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F LOVE DRESS TOP
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 9be6ec18-3214-8b9f-b18c-3ec47b6a6e89
diff --git a/indra/newview/app_settings/static_assets/815c3d49-d7fa-0214-3053-8eb9e63fda4c.gesture b/indra/newview/app_settings/static_assets/815c3d49-d7fa-0214-3053-8eb9e63fda4c.gesture
new file mode 100644
index 0000000000..19788395a6
Binary files /dev/null and b/indra/newview/app_settings/static_assets/815c3d49-d7fa-0214-3053-8eb9e63fda4c.gesture differ
diff --git a/indra/newview/app_settings/static_assets/8175bd9f-ac1a-39e6-7cc6-93ab762f49bc.clothing b/indra/newview/app_settings/static_assets/8175bd9f-ac1a-39e6-7cc6-93ab762f49bc.clothing
new file mode 100644
index 0000000000..188ae78603
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/8175bd9f-ac1a-39e6-7cc6-93ab762f49bc.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL M PLAY SHIRT DOWN
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 ae40787c-0181-d962-9b90-c24b5f7900d0
diff --git a/indra/newview/app_settings/static_assets/82e99230-c906-1403-4d9c-3889dd98daba.animatn b/indra/newview/app_settings/static_assets/82e99230-c906-1403-4d9c-3889dd98daba.animatn
new file mode 100644
index 0000000000..a2a652071b
Binary files /dev/null and b/indra/newview/app_settings/static_assets/82e99230-c906-1403-4d9c-3889dd98daba.animatn differ
diff --git a/indra/newview/app_settings/static_assets/83bf1baf-6fdc-9906-9ab7-3113a3728136.bodypart b/indra/newview/app_settings/static_assets/83bf1baf-6fdc-9906-9ab7-3113a3728136.bodypart
new file mode 100644
index 0000000000..8b109b0708
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/83bf1baf-6fdc-9906-9ab7-3113a3728136.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL F PLAY SKIN (Clara)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 .04
+110 0
+111 .4
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 c6b218b1-4069-af37-7d2f-7a105d04c6a3
+5 c8247b60-0b8e-4ba0-fd7d-4f9c78f4bc02
+6 efd439e2-4a0e-4dc9-1182-9d3daf27696c
diff --git a/indra/newview/app_settings/static_assets/83ff59fe-2346-f236-9009-4e3608af64c1.animatn b/indra/newview/app_settings/static_assets/83ff59fe-2346-f236-9009-4e3608af64c1.animatn
new file mode 100644
index 0000000000..043d4499f6
Binary files /dev/null and b/indra/newview/app_settings/static_assets/83ff59fe-2346-f236-9009-4e3608af64c1.animatn differ
diff --git a/indra/newview/app_settings/static_assets/85428680-6bf9-3e64-b489-6f81087c24bd.animatn b/indra/newview/app_settings/static_assets/85428680-6bf9-3e64-b489-6f81087c24bd.animatn
new file mode 100644
index 0000000000..aef2a5a1d6
Binary files /dev/null and b/indra/newview/app_settings/static_assets/85428680-6bf9-3e64-b489-6f81087c24bd.animatn differ
diff --git a/indra/newview/app_settings/static_assets/85995026-eade-5d78-d364-94a64512cb66.animatn b/indra/newview/app_settings/static_assets/85995026-eade-5d78-d364-94a64512cb66.animatn
new file mode 100644
index 0000000000..00365219af
Binary files /dev/null and b/indra/newview/app_settings/static_assets/85995026-eade-5d78-d364-94a64512cb66.animatn differ
diff --git a/indra/newview/app_settings/static_assets/865c5fe0-aafb-671a-8ad5-778beb24b6f8.gesture b/indra/newview/app_settings/static_assets/865c5fe0-aafb-671a-8ad5-778beb24b6f8.gesture
new file mode 100644
index 0000000000..07d55776a0
Binary files /dev/null and b/indra/newview/app_settings/static_assets/865c5fe0-aafb-671a-8ad5-778beb24b6f8.gesture differ
diff --git a/indra/newview/app_settings/static_assets/869ecdad-a44b-671e-3266-56aef2e3ac2e.animatn b/indra/newview/app_settings/static_assets/869ecdad-a44b-671e-3266-56aef2e3ac2e.animatn
new file mode 100644
index 0000000000..e713a97844
Binary files /dev/null and b/indra/newview/app_settings/static_assets/869ecdad-a44b-671e-3266-56aef2e3ac2e.animatn differ
diff --git a/indra/newview/app_settings/static_assets/8868cfa3-5b82-97ab-dc38-ded906f7fd90.gesture b/indra/newview/app_settings/static_assets/8868cfa3-5b82-97ab-dc38-ded906f7fd90.gesture
new file mode 100644
index 0000000000..25ec1d7c7c
Binary files /dev/null and b/indra/newview/app_settings/static_assets/8868cfa3-5b82-97ab-dc38-ded906f7fd90.gesture differ
diff --git a/indra/newview/app_settings/static_assets/8ac9b0b4-9409-383a-1339-5373895f5368.bodypart b/indra/newview/app_settings/static_assets/8ac9b0b4-9409-383a-1339-5373895f5368.bodypart
new file mode 100644
index 0000000000..39303b4707
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/8ac9b0b4-9409-383a-1339-5373895f5368.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL F SHOP SHAPE (SUZY)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .44
+2 -.21
+4 .1
+5 .01
+6 .06
+7 .02
+8 -.44
+10 .08
+11 -.1
+12 .46
+13 .08
+14 .47
+15 -.2
+17 -.26
+18 1.14
+19 -.38
+20 -.1
+21 .07
+22 0
+23 -.42
+24 .08
+25 .33
+27 -.2
+33 .5
+34 -.02
+35 -.04
+36 -1
+37 -.56
+38 -.14
+80 0
+105 .4
+155 -.48
+157 .03
+185 -.12
+193 .63
+196 -.86
+505 .37
+506 -.12
+507 -.31
+515 -1
+517 .01
+518 .17
+629 .58
+637 .05
+646 .08
+647 -.25
+649 .3
+650 .5
+652 .4
+653 .56
+656 0
+659 .7
+662 .5
+663 0
+664 0
+665 -.28
+675 -.18
+676 -.19
+678 .5
+682 .52
+683 -.18
+684 .08
+685 0
+690 .39
+692 .1
+693 -.12
+753 .48
+756 -.3
+758 -.48
+759 .43
+760 .91
+764 .21
+765 -.3
+769 .63
+773 .38
+795 .19
+796 0
+799 .52
+841 .04
+842 -.4
+879 0
+880 -.77
+textures 0
diff --git a/indra/newview/app_settings/static_assets/8b102617-bcba-037b-86c1-b76219f90c88.animatn b/indra/newview/app_settings/static_assets/8b102617-bcba-037b-86c1-b76219f90c88.animatn
new file mode 100644
index 0000000000..acf5967f4d
Binary files /dev/null and b/indra/newview/app_settings/static_assets/8b102617-bcba-037b-86c1-b76219f90c88.animatn differ
diff --git a/indra/newview/app_settings/static_assets/8b753e16-bd7d-2bb3-7765-671b7b31e77c.gesture b/indra/newview/app_settings/static_assets/8b753e16-bd7d-2bb3-7765-671b7b31e77c.gesture
new file mode 100644
index 0000000000..ca1a9c1e3f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/8b753e16-bd7d-2bb3-7765-671b7b31e77c.gesture differ
diff --git a/indra/newview/app_settings/static_assets/8ccf1744-1509-7537-0fb5-1d33d2eefaf8.bodypart b/indra/newview/app_settings/static_assets/8ccf1744-1509-7537-0fb5-1d33d2eefaf8.bodypart
new file mode 100644
index 0000000000..f33c2368c3
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/8ccf1744-1509-7537-0fb5-1d33d2eefaf8.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL - Eyes - Med Brown
+
+ permissions 0
+ {
+ base_mask 0008c000
+ owner_mask 0008c000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 0008c000
+ creator_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 6744cd4d-ce43-feb5-e37f-72aef2730250
diff --git a/indra/newview/app_settings/static_assets/8dbc8a59-18ec-c9c0-8edf-ddcb8a749e5f.gesture b/indra/newview/app_settings/static_assets/8dbc8a59-18ec-c9c0-8edf-ddcb8a749e5f.gesture
new file mode 100644
index 0000000000..8712d24674
Binary files /dev/null and b/indra/newview/app_settings/static_assets/8dbc8a59-18ec-c9c0-8edf-ddcb8a749e5f.gesture differ
diff --git a/indra/newview/app_settings/static_assets/8ea9f72c-6e64-e6bf-34ed-2713f84db063.clothing b/indra/newview/app_settings/static_assets/8ea9f72c-6e64-e6bf-34ed-2713f84db063.clothing
new file mode 100644
index 0000000000..dad4b77363
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/8ea9f72c-6e64-e6bf-34ed-2713f84db063.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL F CREATE CAPRI PANTS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 .99
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 c529d836-cd39-a25c-40fc-c097e32390ed
diff --git a/indra/newview/app_settings/static_assets/90bdcd26-2c6b-44a7-aab2-18c5a04f3fc3.gesture b/indra/newview/app_settings/static_assets/90bdcd26-2c6b-44a7-aab2-18c5a04f3fc3.gesture
new file mode 100644
index 0000000000..5140f0791a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/90bdcd26-2c6b-44a7-aab2-18c5a04f3fc3.gesture differ
diff --git a/indra/newview/app_settings/static_assets/90e38814-7029-18a2-70ea-346ca73569aa.bodypart b/indra/newview/app_settings/static_assets/90e38814-7029-18a2-70ea-346ca73569aa.bodypart
new file mode 100644
index 0000000000..87c79dd107
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/90e38814-7029-18a2-70ea-346ca73569aa.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL M LOVE EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 1.11
+31 .28
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -1.18
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/92624d3e-1068-f1aa-a5ec-8244585193ed.animatn b/indra/newview/app_settings/static_assets/92624d3e-1068-f1aa-a5ec-8244585193ed.animatn
new file mode 100644
index 0000000000..fe6d26be2f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/92624d3e-1068-f1aa-a5ec-8244585193ed.animatn differ
diff --git a/indra/newview/app_settings/static_assets/928cae18-e31d-76fd-9cc9-2f55160ff818.animatn b/indra/newview/app_settings/static_assets/928cae18-e31d-76fd-9cc9-2f55160ff818.animatn
new file mode 100644
index 0000000000..f49ea1f4f9
Binary files /dev/null and b/indra/newview/app_settings/static_assets/928cae18-e31d-76fd-9cc9-2f55160ff818.animatn differ
diff --git a/indra/newview/app_settings/static_assets/944890c6-1960-b1a7-f50a-c05651720d7e.bodypart b/indra/newview/app_settings/static_assets/944890c6-1960-b1a7-f50a-c05651720d7e.bodypart
new file mode 100644
index 0000000000..4b50839c1c
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/944890c6-1960-b1a7-f50a-c05651720d7e.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL F LEARN EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 .41
+31 .62
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.22
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/94669140-c63b-8805-5561-62f5e24206ea.bodypart b/indra/newview/app_settings/static_assets/94669140-c63b-8805-5561-62f5e24206ea.bodypart
new file mode 100644
index 0000000000..7bd970ec36
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/94669140-c63b-8805-5561-62f5e24206ea.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL F CREATE EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 .2
+31 .2
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.52
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/951469f4-c7b2-c818-9dee-ad7eea8c30b7.animatn b/indra/newview/app_settings/static_assets/951469f4-c7b2-c818-9dee-ad7eea8c30b7.animatn
new file mode 100644
index 0000000000..44226ce7a0
Binary files /dev/null and b/indra/newview/app_settings/static_assets/951469f4-c7b2-c818-9dee-ad7eea8c30b7.animatn differ
diff --git a/indra/newview/app_settings/static_assets/9583adac-bc9b-a021-ab8f-26018db46ab5.gesture b/indra/newview/app_settings/static_assets/9583adac-bc9b-a021-ab8f-26018db46ab5.gesture
new file mode 100644
index 0000000000..32144092b9
Binary files /dev/null and b/indra/newview/app_settings/static_assets/9583adac-bc9b-a021-ab8f-26018db46ab5.gesture differ
diff --git a/indra/newview/app_settings/static_assets/97c5742d-1d74-9408-2bae-9738a9e9d084.gesture b/indra/newview/app_settings/static_assets/97c5742d-1d74-9408-2bae-9738a9e9d084.gesture
new file mode 100644
index 0000000000..c63df50438
Binary files /dev/null and b/indra/newview/app_settings/static_assets/97c5742d-1d74-9408-2bae-9738a9e9d084.gesture differ
diff --git a/indra/newview/app_settings/static_assets/9b0c1c4e-8ac7-7969-1494-28c874c4f668.animatn b/indra/newview/app_settings/static_assets/9b0c1c4e-8ac7-7969-1494-28c874c4f668.animatn
new file mode 100644
index 0000000000..61af2498b8
Binary files /dev/null and b/indra/newview/app_settings/static_assets/9b0c1c4e-8ac7-7969-1494-28c874c4f668.animatn differ
diff --git a/indra/newview/app_settings/static_assets/9b29cd61-c45b-5689-ded2-91756b8d76a9.animatn b/indra/newview/app_settings/static_assets/9b29cd61-c45b-5689-ded2-91756b8d76a9.animatn
new file mode 100644
index 0000000000..26d3760f04
Binary files /dev/null and b/indra/newview/app_settings/static_assets/9b29cd61-c45b-5689-ded2-91756b8d76a9.animatn differ
diff --git a/indra/newview/app_settings/static_assets/9b37423a-caf6-3bb6-f4e8-60a11ccee1af.bodypart b/indra/newview/app_settings/static_assets/9b37423a-caf6-3bb6-f4e8-60a11ccee1af.bodypart
new file mode 100644
index 0000000000..b69a46aec8
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/9b37423a-caf6-3bb6-f4e8-60a11ccee1af.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL M PLAY SHAPE (HEATH)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 -.16
+2 -.14
+4 .35
+5 .1
+6 -.04
+7 -.2
+8 -.28
+10 .52
+11 0
+12 .46
+13 .34
+14 .55
+15 -.24
+17 -.2
+18 .9
+19 -.25
+20 -.26
+21 .11
+22 .57
+23 -.5
+24 -.1
+25 .07
+27 -.27
+33 1.23
+34 -.26
+35 -.07
+36 -.52
+37 -.32
+38 -.14
+80 1
+105 .5
+155 -.13
+157 .02
+185 -.66
+193 .46
+196 -.77
+505 .5
+506 -.2
+507 0
+515 -1
+517 -.25
+518 -.08
+629 .37
+637 .05
+646 .17
+647 .07
+649 .5
+650 -.27
+652 .48
+653 .29
+656 0
+659 .55
+662 .5
+663 0
+664 0
+665 .08
+675 -.12
+676 -.4
+678 .43
+682 .57
+683 -.11
+684 0
+685 0
+690 .46
+692 .2
+693 .16
+753 1.08
+756 -.68
+758 -.42
+759 .32
+760 .78
+764 .45
+765 -.3
+769 .47
+773 .49
+795 .23
+796 .42
+799 .46
+841 .02
+842 .12
+879 .22
+880 -.75
+textures 0
diff --git a/indra/newview/app_settings/static_assets/9ba1c942-08be-e43a-fb29-16ad440efc50.animatn b/indra/newview/app_settings/static_assets/9ba1c942-08be-e43a-fb29-16ad440efc50.animatn
new file mode 100644
index 0000000000..752a2af75e
Binary files /dev/null and b/indra/newview/app_settings/static_assets/9ba1c942-08be-e43a-fb29-16ad440efc50.animatn differ
diff --git a/indra/newview/app_settings/static_assets/9cde58a2-05ba-5c21-5c90-b76079185990.clothing b/indra/newview/app_settings/static_assets/9cde58a2-05ba-5c21-5c90-b76079185990.clothing
new file mode 100644
index 0000000000..70fd59b07d
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/9cde58a2-05ba-5c21-5c90-b76079185990.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+Male Designer Tank Down
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 0008e000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 6b52d34e-bade-dcc4-5442-c186b5ecc5f1
diff --git a/indra/newview/app_settings/static_assets/9e439264-0a7b-9190-d128-995092499c28.gesture b/indra/newview/app_settings/static_assets/9e439264-0a7b-9190-d128-995092499c28.gesture
new file mode 100644
index 0000000000..f9db489999
Binary files /dev/null and b/indra/newview/app_settings/static_assets/9e439264-0a7b-9190-d128-995092499c28.gesture differ
diff --git a/indra/newview/app_settings/static_assets/9f496bd2-589a-709f-16cc-69bf7df1d36c.animatn b/indra/newview/app_settings/static_assets/9f496bd2-589a-709f-16cc-69bf7df1d36c.animatn
new file mode 100644
index 0000000000..9934140148
Binary files /dev/null and b/indra/newview/app_settings/static_assets/9f496bd2-589a-709f-16cc-69bf7df1d36c.animatn differ
diff --git a/indra/newview/app_settings/static_assets/a00917ca-047d-a3ea-d246-63265f904a6e.bodypart b/indra/newview/app_settings/static_assets/a00917ca-047d-a3ea-d246-63265f904a6e.bodypart
new file mode 100644
index 0000000000..32b4842722
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/a00917ca-047d-a3ea-d246-63265f904a6e.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL M LEARN SHAPE (BILLY)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .55
+2 .02
+4 -.05
+5 -.01
+6 .09
+7 -.21
+8 .04
+10 .48
+11 .3
+12 -.08
+13 .06
+14 .19
+15 -.14
+17 -.09
+18 .5
+19 -.65
+20 -.1
+21 .08
+22 .57
+23 -.28
+24 -.28
+25 .33
+27 -.22
+33 1.1
+34 -.08
+35 0
+36 -.58
+37 0
+38 .08
+80 1
+105 .5
+155 -.28
+157 .05
+185 -.5
+193 .45
+196 -1.07
+505 .54
+506 0
+507 0
+515 -1
+517 -.2
+518 -.08
+629 .37
+637 .14
+646 .08
+647 -.22
+649 .5
+650 -.27
+652 .49
+653 .11
+656 0
+659 .54
+662 .5
+663 0
+664 0
+665 0
+675 -.1
+676 -.31
+678 .48
+682 .63
+683 -.08
+684 0
+685 .22
+690 .48
+692 0
+693 .12
+753 .76
+756 -.68
+758 -.6
+759 .5
+760 .82
+764 .78
+765 .54
+769 .5
+773 .45
+795 .26
+796 0
+799 .5
+841 -.02
+842 0
+879 .08
+880 -.7
+textures 0
diff --git a/indra/newview/app_settings/static_assets/a166cdc3-ea15-0c01-ca5b-d3fed6e3ca75.gesture b/indra/newview/app_settings/static_assets/a166cdc3-ea15-0c01-ca5b-d3fed6e3ca75.gesture
new file mode 100644
index 0000000000..30dbec56e8
Binary files /dev/null and b/indra/newview/app_settings/static_assets/a166cdc3-ea15-0c01-ca5b-d3fed6e3ca75.gesture differ
diff --git a/indra/newview/app_settings/static_assets/a41965be-10f2-1625-df3b-2fe35716998b.gesture b/indra/newview/app_settings/static_assets/a41965be-10f2-1625-df3b-2fe35716998b.gesture
new file mode 100644
index 0000000000..c57bf21607
Binary files /dev/null and b/indra/newview/app_settings/static_assets/a41965be-10f2-1625-df3b-2fe35716998b.gesture differ
diff --git a/indra/newview/app_settings/static_assets/a53d49ad-d705-dd1b-318e-4d1cf3c04a11.gesture b/indra/newview/app_settings/static_assets/a53d49ad-d705-dd1b-318e-4d1cf3c04a11.gesture
new file mode 100644
index 0000000000..f23a6a4e41
Binary files /dev/null and b/indra/newview/app_settings/static_assets/a53d49ad-d705-dd1b-318e-4d1cf3c04a11.gesture differ
diff --git a/indra/newview/app_settings/static_assets/a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6.animatn b/indra/newview/app_settings/static_assets/a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6.animatn
new file mode 100644
index 0000000000..2aa7fa801a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6.animatn differ
diff --git a/indra/newview/app_settings/static_assets/a6a09cb1-0845-5ec0-051e-16bb79b30ddf.gesture b/indra/newview/app_settings/static_assets/a6a09cb1-0845-5ec0-051e-16bb79b30ddf.gesture
new file mode 100644
index 0000000000..611df452a7
Binary files /dev/null and b/indra/newview/app_settings/static_assets/a6a09cb1-0845-5ec0-051e-16bb79b30ddf.gesture differ
diff --git a/indra/newview/app_settings/static_assets/a8dee56f-2eae-9e7a-05a2-6fb92b97e21e.animatn b/indra/newview/app_settings/static_assets/a8dee56f-2eae-9e7a-05a2-6fb92b97e21e.animatn
new file mode 100644
index 0000000000..fd70f4bbe7
Binary files /dev/null and b/indra/newview/app_settings/static_assets/a8dee56f-2eae-9e7a-05a2-6fb92b97e21e.animatn differ
diff --git a/indra/newview/app_settings/static_assets/a8dee7f6-a796-12a0-91bd-abf2fff300cc.clothing b/indra/newview/app_settings/static_assets/a8dee7f6-a796-12a0-91bd-abf2fff300cc.clothing
new file mode 100644
index 0000000000..8db5c61b15
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/a8dee7f6-a796-12a0-91bd-abf2fff300cc.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F LEARN SWEATER (RED)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 1
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 5c657bbe-1a1d-30e4-e5b3-27b1a4656ea8
+14 c78e709f-a23e-928a-b1cf-3ab8446c1e2b
diff --git a/indra/newview/app_settings/static_assets/a94ef3a0-7119-67b6-67e0-d93d5b08a544.gesture b/indra/newview/app_settings/static_assets/a94ef3a0-7119-67b6-67e0-d93d5b08a544.gesture
new file mode 100644
index 0000000000..66e3de573f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/a94ef3a0-7119-67b6-67e0-d93d5b08a544.gesture differ
diff --git a/indra/newview/app_settings/static_assets/aa134404-7dac-7aca-2cba-435f9db875ca.animatn b/indra/newview/app_settings/static_assets/aa134404-7dac-7aca-2cba-435f9db875ca.animatn
new file mode 100644
index 0000000000..f67371b87a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/aa134404-7dac-7aca-2cba-435f9db875ca.animatn differ
diff --git a/indra/newview/app_settings/static_assets/aa9d6d53-2647-f731-97eb-e07a47febb57.bodypart b/indra/newview/app_settings/static_assets/aa9d6d53-2647-f731-97eb-e07a47febb57.bodypart
new file mode 100644
index 0000000000..a2ba070675
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/aa9d6d53-2647-f731-97eb-e07a47febb57.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL M CREATE EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 .97
+31 .28
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.52
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/abe169ff-ee4d-0e22-aa03-19b8116fdd7a.clothing b/indra/newview/app_settings/static_assets/abe169ff-ee4d-0e22-aa03-19b8116fdd7a.clothing
new file mode 100644
index 0000000000..a45bd8390f
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/abe169ff-ee4d-0e22-aa03-19b8116fdd7a.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F EXPLORE TANK UP
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 8059c9dd-b620-71bc-262b-1f2df45c7ad0
diff --git a/indra/newview/app_settings/static_assets/aca78492-0487-03ec-4eb5-5c8e76c837e1.gesture b/indra/newview/app_settings/static_assets/aca78492-0487-03ec-4eb5-5c8e76c837e1.gesture
new file mode 100644
index 0000000000..c350917a98
Binary files /dev/null and b/indra/newview/app_settings/static_assets/aca78492-0487-03ec-4eb5-5c8e76c837e1.gesture differ
diff --git a/indra/newview/app_settings/static_assets/ad22cda1-00c1-21cc-2f35-9ea5b8636f9e.gesture b/indra/newview/app_settings/static_assets/ad22cda1-00c1-21cc-2f35-9ea5b8636f9e.gesture
new file mode 100644
index 0000000000..be5fc6258f
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ad22cda1-00c1-21cc-2f35-9ea5b8636f9e.gesture differ
diff --git a/indra/newview/app_settings/static_assets/ad4e858f-08a7-e67a-4d55-b0fc18b2518b.clothing b/indra/newview/app_settings/static_assets/ad4e858f-08a7-e67a-4d55-b0fc18b2518b.clothing
new file mode 100644
index 0000000000..07710607d6
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/ad4e858f-08a7-e67a-4d55-b0fc18b2518b.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+Male Designer Pants (Green)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 0008e000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 f0a74d98-6efb-c7d6-707c-bceb6140de12
diff --git a/indra/newview/app_settings/static_assets/ad88e068-dc0a-6ef2-5a97-929ad01d883b.gesture b/indra/newview/app_settings/static_assets/ad88e068-dc0a-6ef2-5a97-929ad01d883b.gesture
new file mode 100644
index 0000000000..0a7bfab170
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ad88e068-dc0a-6ef2-5a97-929ad01d883b.gesture differ
diff --git a/indra/newview/app_settings/static_assets/aec4610c-757f-bc4e-c092-c6e9caf18daf.animatn b/indra/newview/app_settings/static_assets/aec4610c-757f-bc4e-c092-c6e9caf18daf.animatn
new file mode 100644
index 0000000000..c7c69ef0e1
Binary files /dev/null and b/indra/newview/app_settings/static_assets/aec4610c-757f-bc4e-c092-c6e9caf18daf.animatn differ
diff --git a/indra/newview/app_settings/static_assets/af2b8320-e579-2c41-b717-969759aeb3ca.gesture b/indra/newview/app_settings/static_assets/af2b8320-e579-2c41-b717-969759aeb3ca.gesture
new file mode 100644
index 0000000000..17b233adb6
Binary files /dev/null and b/indra/newview/app_settings/static_assets/af2b8320-e579-2c41-b717-969759aeb3ca.gesture differ
diff --git a/indra/newview/app_settings/static_assets/afb80807-4214-7f3c-55b8-00858f56d37a.gesture b/indra/newview/app_settings/static_assets/afb80807-4214-7f3c-55b8-00858f56d37a.gesture
new file mode 100644
index 0000000000..921e03751d
Binary files /dev/null and b/indra/newview/app_settings/static_assets/afb80807-4214-7f3c-55b8-00858f56d37a.gesture differ
diff --git a/indra/newview/app_settings/static_assets/afd64d9d-572d-b4f1-69bc-a79f70768177.gesture b/indra/newview/app_settings/static_assets/afd64d9d-572d-b4f1-69bc-a79f70768177.gesture
new file mode 100644
index 0000000000..2658e86a19
Binary files /dev/null and b/indra/newview/app_settings/static_assets/afd64d9d-572d-b4f1-69bc-a79f70768177.gesture differ
diff --git a/indra/newview/app_settings/static_assets/b0dc417c-1f11-af36-2e80-7e7489fa7cdc.animatn b/indra/newview/app_settings/static_assets/b0dc417c-1f11-af36-2e80-7e7489fa7cdc.animatn
new file mode 100644
index 0000000000..6f797ba1ff
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b0dc417c-1f11-af36-2e80-7e7489fa7cdc.animatn differ
diff --git a/indra/newview/app_settings/static_assets/b1709c8d-ecd3-54a1-4f28-d55ac0840782.animatn b/indra/newview/app_settings/static_assets/b1709c8d-ecd3-54a1-4f28-d55ac0840782.animatn
new file mode 100644
index 0000000000..de12bcd2a5
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b1709c8d-ecd3-54a1-4f28-d55ac0840782.animatn differ
diff --git a/indra/newview/app_settings/static_assets/b1dc34e2-c8fb-3885-3a7e-10be1d5589dd.clothing b/indra/newview/app_settings/static_assets/b1dc34e2-c8fb-3885-3a7e-10be1d5589dd.clothing
new file mode 100644
index 0000000000..0cfb75ca7b
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/b1dc34e2-c8fb-3885-3a7e-10be1d5589dd.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+Male Designer Tank Up
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 0008e000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 428dd646-734b-f43f-3550-f248bd9dfa10
diff --git a/indra/newview/app_settings/static_assets/b1ed7982-c68e-a982-7561-52a88a5298c0.animatn b/indra/newview/app_settings/static_assets/b1ed7982-c68e-a982-7561-52a88a5298c0.animatn
new file mode 100644
index 0000000000..4852846250
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b1ed7982-c68e-a982-7561-52a88a5298c0.animatn differ
diff --git a/indra/newview/app_settings/static_assets/b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9.animatn b/indra/newview/app_settings/static_assets/b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9.animatn
new file mode 100644
index 0000000000..2f2ea3b6b7
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9.animatn differ
diff --git a/indra/newview/app_settings/static_assets/b57c996d-cb06-43c8-749d-e9ce361f172e.gesture b/indra/newview/app_settings/static_assets/b57c996d-cb06-43c8-749d-e9ce361f172e.gesture
new file mode 100644
index 0000000000..90ad3c4a9c
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b57c996d-cb06-43c8-749d-e9ce361f172e.gesture differ
diff --git a/indra/newview/app_settings/static_assets/b5b4a67d-0aee-30d2-72cd-77b333e932ef.animatn b/indra/newview/app_settings/static_assets/b5b4a67d-0aee-30d2-72cd-77b333e932ef.animatn
new file mode 100644
index 0000000000..a826b52b22
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b5b4a67d-0aee-30d2-72cd-77b333e932ef.animatn differ
diff --git a/indra/newview/app_settings/static_assets/b5ea617e-47cf-612b-2d99-8c6f6dcac218.gesture b/indra/newview/app_settings/static_assets/b5ea617e-47cf-612b-2d99-8c6f6dcac218.gesture
new file mode 100644
index 0000000000..b31632c9e9
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b5ea617e-47cf-612b-2d99-8c6f6dcac218.gesture differ
diff --git a/indra/newview/app_settings/static_assets/b606cdd6-4c22-6cc0-4614-560e6b9beeba.clothing b/indra/newview/app_settings/static_assets/b606cdd6-4c22-6cc0-4614-560e6b9beeba.clothing
new file mode 100644
index 0000000000..99d59fb544
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/b606cdd6-4c22-6cc0-4614-560e6b9beeba.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL M LEARN JEANS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 dac82639-53da-a87b-0f30-9187b0aef7cc
diff --git a/indra/newview/app_settings/static_assets/b68a3d7c-de9e-fc87-eec8-543d787e5b0d.animatn b/indra/newview/app_settings/static_assets/b68a3d7c-de9e-fc87-eec8-543d787e5b0d.animatn
new file mode 100644
index 0000000000..891f63373a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b68a3d7c-de9e-fc87-eec8-543d787e5b0d.animatn differ
diff --git a/indra/newview/app_settings/static_assets/b6e66a0e-f8db-0d4b-9259-7e9b20562b73.bodypart b/indra/newview/app_settings/static_assets/b6e66a0e-f8db-0d4b-9259-7e9b20562b73.bodypart
new file mode 100644
index 0000000000..602648df79
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/b6e66a0e-f8db-0d4b-9259-7e9b20562b73.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL - Eyes - Hazel Brown
+
+ permissions 0
+ {
+ base_mask 00082000
+ owner_mask 00082000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 3818dcc3-95c3-f20f-a6d6-626f39a1cef0
diff --git a/indra/newview/app_settings/static_assets/b6f560d1-e2ad-24df-344c-2943c47a6775.gesture b/indra/newview/app_settings/static_assets/b6f560d1-e2ad-24df-344c-2943c47a6775.gesture
new file mode 100644
index 0000000000..5157c2b05d
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b6f560d1-e2ad-24df-344c-2943c47a6775.gesture differ
diff --git a/indra/newview/app_settings/static_assets/b8c8b2a3-9008-1771-3bfc-90924955ab2d.animatn b/indra/newview/app_settings/static_assets/b8c8b2a3-9008-1771-3bfc-90924955ab2d.animatn
new file mode 100644
index 0000000000..a1f6676f2e
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b8c8b2a3-9008-1771-3bfc-90924955ab2d.animatn differ
diff --git a/indra/newview/app_settings/static_assets/b8de1c20-7eba-2101-f2e3-9ed132838dcc.bodypart b/indra/newview/app_settings/static_assets/b8de1c20-7eba-2101-f2e3-9ed132838dcc.bodypart
new file mode 100644
index 0000000000..6e79fc0992
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/b8de1c20-7eba-2101-f2e3-9ed132838dcc.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL F SHOP EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 1.22
+31 .22
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.1
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/b906c4ba-703b-1940-32a3-0c7f7d791510.animatn b/indra/newview/app_settings/static_assets/b906c4ba-703b-1940-32a3-0c7f7d791510.animatn
new file mode 100644
index 0000000000..403a9e9afe
Binary files /dev/null and b/indra/newview/app_settings/static_assets/b906c4ba-703b-1940-32a3-0c7f7d791510.animatn differ
diff --git a/indra/newview/app_settings/static_assets/ba38eeb2-d35f-0a07-0c04-0eb42fcc6010.gesture b/indra/newview/app_settings/static_assets/ba38eeb2-d35f-0a07-0c04-0eb42fcc6010.gesture
new file mode 100644
index 0000000000..243be64fe5
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ba38eeb2-d35f-0a07-0c04-0eb42fcc6010.gesture differ
diff --git a/indra/newview/app_settings/static_assets/bacd48be-6733-7842-dd1f-8802e920f3ba.bodypart b/indra/newview/app_settings/static_assets/bacd48be-6733-7842-dd1f-8802e920f3ba.bodypart
new file mode 100644
index 0000000000..7c017277e5
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/bacd48be-6733-7842-dd1f-8802e920f3ba.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL - Eyes - Spring Green
+
+ permissions 0
+ {
+ base_mask 00082000
+ owner_mask 00082000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 865e5c74-5e50-1036-58d2-1af9e2a50388
diff --git a/indra/newview/app_settings/static_assets/bc2ff144-9a36-fdd0-316d-d86f5c9a43ac.gesture b/indra/newview/app_settings/static_assets/bc2ff144-9a36-fdd0-316d-d86f5c9a43ac.gesture
new file mode 100644
index 0000000000..4d547e3e75
Binary files /dev/null and b/indra/newview/app_settings/static_assets/bc2ff144-9a36-fdd0-316d-d86f5c9a43ac.gesture differ
diff --git a/indra/newview/app_settings/static_assets/bd07ffa9-426c-69da-d27a-e54e4ebbc73c.bodypart b/indra/newview/app_settings/static_assets/bd07ffa9-426c-69da-d27a-e54e4ebbc73c.bodypart
new file mode 100644
index 0000000000..cc255aff0b
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/bd07ffa9-426c-69da-d27a-e54e4ebbc73c.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL - Skin - Anna
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 0
+110 0
+111 .5
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 173d7efa-899c-9a0d-64e4-3477fd4320e7
+5 37b87678-b628-7e53-0643-c2e1f763b578
+6 5f270355-3528-3c42-1e3c-d6ccb28646c5
diff --git a/indra/newview/app_settings/static_assets/be969774-2a2b-0534-daee-f69357ff4adf.clothing b/indra/newview/app_settings/static_assets/be969774-2a2b-0534-daee-f69357ff4adf.clothing
new file mode 100644
index 0000000000..07ce5cfec3
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/be969774-2a2b-0534-daee-f69357ff4adf.clothing
@@ -0,0 +1,28 @@
+LLWearable version 22
+RASL SOCKS BLACK
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 7
+parameters 4
+617 1
+818 1
+819 1
+820 1
+textures 1
+12 0f0046b0-1c69-5192-1fca-37d0e6667484
diff --git a/indra/newview/app_settings/static_assets/c0c4030f-c02b-49de-24ba-2331f43fe41c.animatn b/indra/newview/app_settings/static_assets/c0c4030f-c02b-49de-24ba-2331f43fe41c.animatn
new file mode 100644
index 0000000000..831d273ce4
Binary files /dev/null and b/indra/newview/app_settings/static_assets/c0c4030f-c02b-49de-24ba-2331f43fe41c.animatn differ
diff --git a/indra/newview/app_settings/static_assets/c1a68df8-3a01-4f17-0bab-10eb7df9c22a.clothing b/indra/newview/app_settings/static_assets/c1a68df8-3a01-4f17-0bab-10eb7df9c22a.clothing
new file mode 100644
index 0000000000..bf27527241
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/c1a68df8-3a01-4f17-0bab-10eb7df9c22a.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL-FSHOE1-FOOTSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 6
+parameters 10
+198 .19
+503 0
+508 0
+513 .4
+514 .5
+616 .1
+654 .78
+812 1
+813 1
+817 1
+textures 1
+7 85b13d86-3e95-8d4b-a03b-c9c737631194
diff --git a/indra/newview/app_settings/static_assets/c1bc7f36-3ba0-d844-f93c-93be945d644f.animatn b/indra/newview/app_settings/static_assets/c1bc7f36-3ba0-d844-f93c-93be945d644f.animatn
new file mode 100644
index 0000000000..04c4a28e2a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/c1bc7f36-3ba0-d844-f93c-93be945d644f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/c272cb94-0081-49bb-d45e-aeda288b3c06.clothing b/indra/newview/app_settings/static_assets/c272cb94-0081-49bb-d45e-aeda288b3c06.clothing
new file mode 100644
index 0000000000..4e32db73e0
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/c272cb94-0081-49bb-d45e-aeda288b3c06.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M EXPLORE UNDER JACKET LEATHER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 .66
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 f0f6812f-33c5-21ec-87da-f92e1aa02b09
+14 85b13d86-3e95-8d4b-a03b-c9c737631194
diff --git a/indra/newview/app_settings/static_assets/c437fefd-6025-fd89-e65c-aec2732f3007.clothing b/indra/newview/app_settings/static_assets/c437fefd-6025-fd89-e65c-aec2732f3007.clothing
new file mode 100644
index 0000000000..ba72109a56
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/c437fefd-6025-fd89-e65c-aec2732f3007.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL M SHOP JEANS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 9a1b1afd-b282-e667-5d87-8f90cfaf566b
diff --git a/indra/newview/app_settings/static_assets/c4ca6188-9127-4f31-0158-23c4e2f93304.animatn b/indra/newview/app_settings/static_assets/c4ca6188-9127-4f31-0158-23c4e2f93304.animatn
new file mode 100644
index 0000000000..f49d119c93
Binary files /dev/null and b/indra/newview/app_settings/static_assets/c4ca6188-9127-4f31-0158-23c4e2f93304.animatn differ
diff --git a/indra/newview/app_settings/static_assets/c4d1b050-1784-feb4-474f-ec3b1f1a29cb.clothing b/indra/newview/app_settings/static_assets/c4d1b050-1784-feb4-474f-ec3b1f1a29cb.clothing
new file mode 100644
index 0000000000..160e4e29d6
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/c4d1b050-1784-feb4-474f-ec3b1f1a29cb.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M PLAY SHIRT UP
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 8759051a-93db-7a9f-2f98-fe4a932a27fb
diff --git a/indra/newview/app_settings/static_assets/c521ad1f-06f0-8711-f313-5737a38f0d78.clothing b/indra/newview/app_settings/static_assets/c521ad1f-06f0-8711-f313-5737a38f0d78.clothing
new file mode 100644
index 0000000000..1c1e623821
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/c521ad1f-06f0-8711-f313-5737a38f0d78.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL F PLAY TROUSERS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 18ffd31d-7386-8959-a761-b90242957e0c
diff --git a/indra/newview/app_settings/static_assets/c541c47f-e0c0-058b-ad1a-d6ae3a4584d9.animatn b/indra/newview/app_settings/static_assets/c541c47f-e0c0-058b-ad1a-d6ae3a4584d9.animatn
new file mode 100644
index 0000000000..b0ff77b617
Binary files /dev/null and b/indra/newview/app_settings/static_assets/c541c47f-e0c0-058b-ad1a-d6ae3a4584d9.animatn differ
diff --git a/indra/newview/app_settings/static_assets/c5d0cab3-4a69-2f35-71ee-6dba0ce0c85c.bodypart b/indra/newview/app_settings/static_assets/c5d0cab3-4a69-2f35-71ee-6dba0ce0c85c.bodypart
new file mode 100644
index 0000000000..1bda2ff2f9
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/c5d0cab3-4a69-2f35-71ee-6dba0ce0c85c.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL F LOVE SHAPE (GENA)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 -.07
+2 -.4
+4 -.13
+5 .03
+6 -.05
+7 .02
+8 -.42
+10 .25
+11 .24
+12 -.26
+13 .15
+14 .55
+15 -.28
+17 .32
+18 .42
+19 -.5
+20 .02
+21 .13
+22 0
+23 -.46
+24 -.31
+25 .1
+27 -.05
+33 .5
+34 -.04
+35 -.1
+36 -1
+37 -.74
+38 -.28
+80 0
+105 .51
+155 -.39
+157 0
+185 -.66
+193 .5
+196 -1.04
+505 .39
+506 -.68
+507 -.45
+515 -1
+517 .07
+518 .24
+629 .5
+637 .06
+646 -.01
+647 -.14
+649 .33
+650 -.2
+652 .39
+653 .56
+656 0
+659 .53
+662 .5
+663 0
+664 0
+665 .16
+675 -.17
+676 -.13
+678 .5
+682 .51
+683 -.18
+684 -.03
+685 0
+690 .39
+692 .2
+693 .24
+753 .55
+756 -.4
+758 .09
+759 .1
+760 .69
+764 .61
+765 -.08
+769 .45
+773 .53
+795 .24
+796 0
+799 .53
+841 -.02
+842 -.08
+879 0
+880 -.62
+textures 0
diff --git a/indra/newview/app_settings/static_assets/c63ac707-6325-14c8-d681-54b81d0dff77.gesture b/indra/newview/app_settings/static_assets/c63ac707-6325-14c8-d681-54b81d0dff77.gesture
new file mode 100644
index 0000000000..01c55a2cd8
Binary files /dev/null and b/indra/newview/app_settings/static_assets/c63ac707-6325-14c8-d681-54b81d0dff77.gesture differ
diff --git a/indra/newview/app_settings/static_assets/c8d70bed-535b-3d97-5d17-6136a209fbe6.bodypart b/indra/newview/app_settings/static_assets/c8d70bed-535b-3d97-5d17-6136a209fbe6.bodypart
new file mode 100644
index 0000000000..05794814f1
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/c8d70bed-535b-3d97-5d17-6136a209fbe6.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+New Eyes
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 bf7932bc-28cb-4fbf-e810-9145c37ea177
diff --git a/indra/newview/app_settings/static_assets/c8e42d32-7310-6906-c903-cab5d4a34656.animatn b/indra/newview/app_settings/static_assets/c8e42d32-7310-6906-c903-cab5d4a34656.animatn
new file mode 100644
index 0000000000..8e7e5be75d
Binary files /dev/null and b/indra/newview/app_settings/static_assets/c8e42d32-7310-6906-c903-cab5d4a34656.animatn differ
diff --git a/indra/newview/app_settings/static_assets/ca5b3f14-3194-7a2b-c894-aa699b718d1f.animatn b/indra/newview/app_settings/static_assets/ca5b3f14-3194-7a2b-c894-aa699b718d1f.animatn
new file mode 100644
index 0000000000..b67d552ac2
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ca5b3f14-3194-7a2b-c894-aa699b718d1f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/cd28b69b-9c95-bb78-3f94-8d605ff1bb12.animatn b/indra/newview/app_settings/static_assets/cd28b69b-9c95-bb78-3f94-8d605ff1bb12.animatn
new file mode 100644
index 0000000000..8c172a811c
Binary files /dev/null and b/indra/newview/app_settings/static_assets/cd28b69b-9c95-bb78-3f94-8d605ff1bb12.animatn differ
diff --git a/indra/newview/app_settings/static_assets/cd55f18e-c1bf-70a5-5b53-a114fdc44930.bodypart b/indra/newview/app_settings/static_assets/cd55f18e-c1bf-70a5-5b53-a114fdc44930.bodypart
new file mode 100644
index 0000000000..4f5f6596ff
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/cd55f18e-c1bf-70a5-5b53-a114fdc44930.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL M SHOP EYEBROW SHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 .62
+31 .38
+112 0
+113 .5
+114 .49
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.82
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/cd7668a6-7011-d7e2-ead8-fc69eff1a104.animatn b/indra/newview/app_settings/static_assets/cd7668a6-7011-d7e2-ead8-fc69eff1a104.animatn
new file mode 100644
index 0000000000..7e2c8f0ccd
Binary files /dev/null and b/indra/newview/app_settings/static_assets/cd7668a6-7011-d7e2-ead8-fc69eff1a104.animatn differ
diff --git a/indra/newview/app_settings/static_assets/ce58f877-251f-b025-9227-4be3456faf58.bodypart b/indra/newview/app_settings/static_assets/ce58f877-251f-b025-9227-4be3456faf58.bodypart
new file mode 100644
index 0000000000..50623d380a
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/ce58f877-251f-b025-9227-4be3456faf58.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL - Eyes - Med Blue
+
+ permissions 0
+ {
+ base_mask 00082000
+ owner_mask 00082000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 6531cb8f-dd4c-4171-091e-bd5789254ab7
diff --git a/indra/newview/app_settings/static_assets/cf03c095-647e-bd96-4ce2-63202cd5a171.clothing b/indra/newview/app_settings/static_assets/cf03c095-647e-bd96-4ce2-63202cd5a171.clothing
new file mode 100644
index 0000000000..ca6747e342
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/cf03c095-647e-bd96-4ce2-63202cd5a171.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M SHOP SWEATER UP
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 bd947b09-6c73-62c5-9c2f-8c4980df7c82
diff --git a/indra/newview/app_settings/static_assets/d08d1a27-9410-dbd7-cc4f-ae1a8837b49d.bodypart b/indra/newview/app_settings/static_assets/d08d1a27-9410-dbd7-cc4f-ae1a8837b49d.bodypart
new file mode 100644
index 0000000000..50d212e76c
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/d08d1a27-9410-dbd7-cc4f-ae1a8837b49d.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL F LOVE EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 1.18
+31 .42
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.94
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/d1b530a9-b4c8-aeaf-9300-9b9d30c715d1.clothing b/indra/newview/app_settings/static_assets/d1b530a9-b4c8-aeaf-9300-9b9d30c715d1.clothing
new file mode 100644
index 0000000000..ac3a700c50
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/d1b530a9-b4c8-aeaf-9300-9b9d30c715d1.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F CREATE SHIRT UP (BLUE)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 1
+800 1
+801 1
+802 1
+803 1
+804 1
+805 1
+828 0
+840 0
+868 0
+textures 1
+1 3607ade8-59a0-f44b-413a-018d50505a25
diff --git a/indra/newview/app_settings/static_assets/d26fbcbc-1985-92ef-0cf0-7148b7ed0c08.gesture b/indra/newview/app_settings/static_assets/d26fbcbc-1985-92ef-0cf0-7148b7ed0c08.gesture
new file mode 100644
index 0000000000..7912966d1b
Binary files /dev/null and b/indra/newview/app_settings/static_assets/d26fbcbc-1985-92ef-0cf0-7148b7ed0c08.gesture differ
diff --git a/indra/newview/app_settings/static_assets/d2f2ee58-8ad1-06c9-d8d3-3827ba31567a.animatn b/indra/newview/app_settings/static_assets/d2f2ee58-8ad1-06c9-d8d3-3827ba31567a.animatn
new file mode 100644
index 0000000000..89718e372e
Binary files /dev/null and b/indra/newview/app_settings/static_assets/d2f2ee58-8ad1-06c9-d8d3-3827ba31567a.animatn differ
diff --git a/indra/newview/app_settings/static_assets/d40491cc-3629-a090-d11f-ee947d9125a8.bodypart b/indra/newview/app_settings/static_assets/d40491cc-3629-a090-d11f-ee947d9125a8.bodypart
new file mode 100644
index 0000000000..add7c05788
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/d40491cc-3629-a090-d11f-ee947d9125a8.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+RASL F PLAY EYEBROWSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 1.18
+31 .5
+112 0
+113 0
+114 0
+115 0
+119 0
+130 0
+131 0
+132 0
+133 0
+134 0
+135 0
+136 0
+137 .5
+140 0
+141 0
+142 0
+143 -4
+166 0
+167 0
+168 0
+169 0
+177 0
+181 -1
+182 -1
+183 -1
+184 0
+192 0
+674 -1
+750 0
+752 .5
+754 .5
+755 0
+757 -.4
+762 0
+763 0
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/indra/newview/app_settings/static_assets/d53b27ad-73b9-8ea4-0896-7890b57dd8ed.clothing b/indra/newview/app_settings/static_assets/d53b27ad-73b9-8ea4-0896-7890b57dd8ed.clothing
new file mode 100644
index 0000000000..8e0a79ce72
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/d53b27ad-73b9-8ea4-0896-7890b57dd8ed.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL M EXPLORE TANK DOWN (WHITE)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 87eb957f-4152-8e94-df39-644e5d94f7b5
diff --git a/indra/newview/app_settings/static_assets/d60c41d2-7c24-7074-d3fa-6101cea22a51.animatn b/indra/newview/app_settings/static_assets/d60c41d2-7c24-7074-d3fa-6101cea22a51.animatn
new file mode 100644
index 0000000000..6626797614
Binary files /dev/null and b/indra/newview/app_settings/static_assets/d60c41d2-7c24-7074-d3fa-6101cea22a51.animatn differ
diff --git a/indra/newview/app_settings/static_assets/d6c00693-90e0-cbbd-cd3d-3a6ccd510f14.clothing b/indra/newview/app_settings/static_assets/d6c00693-90e0-cbbd-cd3d-3a6ccd510f14.clothing
new file mode 100644
index 0000000000..6b0616c6b4
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/d6c00693-90e0-cbbd-cd3d-3a6ccd510f14.clothing
@@ -0,0 +1,29 @@
+LLWearable version 22
+RASL M EXPLORE JEANS
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 11
+parameters 5
+619 1
+624 1
+824 1
+825 1
+826 1
+textures 1
+17 7a97cedf-bf46-819c-ca67-d333efd8891d
diff --git a/indra/newview/app_settings/static_assets/d83fa0e5-97ed-7eb2-e798-7bd006215cb4.animatn b/indra/newview/app_settings/static_assets/d83fa0e5-97ed-7eb2-e798-7bd006215cb4.animatn
new file mode 100644
index 0000000000..778a01a412
Binary files /dev/null and b/indra/newview/app_settings/static_assets/d83fa0e5-97ed-7eb2-e798-7bd006215cb4.animatn differ
diff --git a/indra/newview/app_settings/static_assets/d918a0d8-7291-ce83-762f-3f68dcc7402d.gesture b/indra/newview/app_settings/static_assets/d918a0d8-7291-ce83-762f-3f68dcc7402d.gesture
new file mode 100644
index 0000000000..0d1f775f6a
Binary files /dev/null and b/indra/newview/app_settings/static_assets/d918a0d8-7291-ce83-762f-3f68dcc7402d.gesture differ
diff --git a/indra/newview/app_settings/static_assets/d973aaf2-ff8d-3b05-8c81-48305210b3bf.clothing b/indra/newview/app_settings/static_assets/d973aaf2-ff8d-3b05-8c81-48305210b3bf.clothing
new file mode 100644
index 0000000000..78eeffe6e6
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/d973aaf2-ff8d-3b05-8c81-48305210b3bf.clothing
@@ -0,0 +1,33 @@
+LLWearable version 22
+RASL F LEARN SKIRT (TARTEN)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 5
+parameters 9
+625 0
+638 0
+806 1
+807 1
+808 1
+814 1
+815 .99
+816 .05
+869 0
+textures 1
+2 e95c407d-f87c-6498-25b4-b885084eb2ba
diff --git a/indra/newview/app_settings/static_assets/db84829b-462c-ee83-1e27-9bbee66bd624.animatn b/indra/newview/app_settings/static_assets/db84829b-462c-ee83-1e27-9bbee66bd624.animatn
new file mode 100644
index 0000000000..637a58c9bc
Binary files /dev/null and b/indra/newview/app_settings/static_assets/db84829b-462c-ee83-1e27-9bbee66bd624.animatn differ
diff --git a/indra/newview/app_settings/static_assets/dbd054f1-132b-cc22-e46a-bad83c230c91.gesture b/indra/newview/app_settings/static_assets/dbd054f1-132b-cc22-e46a-bad83c230c91.gesture
new file mode 100644
index 0000000000..321ee082a7
Binary files /dev/null and b/indra/newview/app_settings/static_assets/dbd054f1-132b-cc22-e46a-bad83c230c91.gesture differ
diff --git a/indra/newview/app_settings/static_assets/ddcd68c1-0cb9-4b32-a475-f2b9b96ec8d5.clothing b/indra/newview/app_settings/static_assets/ddcd68c1-0cb9-4b32-a475-f2b9b96ec8d5.clothing
new file mode 100644
index 0000000000..470e3f53a9
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/ddcd68c1-0cb9-4b32-a475-f2b9b96ec8d5.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL M EXPLORE UNDER JACKET LEATHER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 .66
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 c9280333-0ae0-3d41-3549-b3c7d28fa6a4
+14 85b13d86-3e95-8d4b-a03b-c9c737631194
diff --git a/indra/newview/app_settings/static_assets/df074f93-968a-2588-8ef5-7db3b21dff6d.bodypart b/indra/newview/app_settings/static_assets/df074f93-968a-2588-8ef5-7db3b21dff6d.bodypart
new file mode 100644
index 0000000000..2701f7709e
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/df074f93-968a-2588-8ef5-7db3b21dff6d.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL EYES MUTED GREEN
+
+ permissions 0
+ {
+ base_mask 00082000
+ owner_mask 00082000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 .61
+99 0
+textures 1
+3 e88d1151-f2ab-6bd3-110d-6c827ccbd4a6
diff --git a/indra/newview/app_settings/static_assets/e04d450d-fdb5-0432-fd68-818aaf5935f8.animatn b/indra/newview/app_settings/static_assets/e04d450d-fdb5-0432-fd68-818aaf5935f8.animatn
new file mode 100644
index 0000000000..866aaf38aa
Binary files /dev/null and b/indra/newview/app_settings/static_assets/e04d450d-fdb5-0432-fd68-818aaf5935f8.animatn differ
diff --git a/indra/newview/app_settings/static_assets/e2efe57f-70e8-35e5-b92c-280e3e9c6e1f.clothing b/indra/newview/app_settings/static_assets/e2efe57f-70e8-35e5-b92c-280e3e9c6e1f.clothing
new file mode 100644
index 0000000000..24cbda241b
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/e2efe57f-70e8-35e5-b92c-280e3e9c6e1f.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F LOVE SHOES FOOTSHAPER
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id df110c10-72e6-40d6-8916-14b4b0366b18
+ owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ last_owner_id df110c10-72e6-40d6-8916-14b4b0366b18
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 6
+parameters 10
+198 1
+503 .41
+508 -.37
+513 .19
+514 .66
+616 1
+654 .38
+812 1
+813 1
+817 1
+textures 1
+7 3ab7e2fa-9572-ef36-1a30-d855dbea4f92
diff --git a/indra/newview/app_settings/static_assets/e4485e5d-6bcc-e5ca-96fd-303227e93d6c.gesture b/indra/newview/app_settings/static_assets/e4485e5d-6bcc-e5ca-96fd-303227e93d6c.gesture
new file mode 100644
index 0000000000..68f8555434
Binary files /dev/null and b/indra/newview/app_settings/static_assets/e4485e5d-6bcc-e5ca-96fd-303227e93d6c.gesture differ
diff --git a/indra/newview/app_settings/static_assets/e5c8f3c2-9e65-5c4b-03c4-d8205f626b37.bodypart b/indra/newview/app_settings/static_assets/e5c8f3c2-9e65-5c4b-03c4-d8205f626b37.bodypart
new file mode 100644
index 0000000000..251ea6e740
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/e5c8f3c2-9e65-5c4b-03c4-d8205f626b37.bodypart
@@ -0,0 +1,26 @@
+LLWearable version 22
+RASL - Eyes - Dark Blue
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ last_owner_id ef5ac61a-72b0-48a6-843f-adb506d7ba86
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 3
+parameters 2
+98 1
+99 0
+textures 1
+3 9b1c0ff8-42e6-46b1-2f90-a03e4df16030
diff --git a/indra/newview/app_settings/static_assets/e7135c15-a7bc-637e-2664-b6fbdc22428c.gesture b/indra/newview/app_settings/static_assets/e7135c15-a7bc-637e-2664-b6fbdc22428c.gesture
new file mode 100644
index 0000000000..01b050c192
Binary files /dev/null and b/indra/newview/app_settings/static_assets/e7135c15-a7bc-637e-2664-b6fbdc22428c.gesture differ
diff --git a/indra/newview/app_settings/static_assets/e7263f17-46cf-5deb-7e5a-ecc0776f5241.clothing b/indra/newview/app_settings/static_assets/e7263f17-46cf-5deb-7e5a-ecc0776f5241.clothing
new file mode 100644
index 0000000000..9a72103815
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/e7263f17-46cf-5deb-7e5a-ecc0776f5241.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+RASL F SHOP TOP
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 8
+parameters 9
+606 1
+607 1
+608 1
+609 1
+780 1
+834 1
+835 1
+836 1
+877 0
+textures 2
+13 58ff5b15-2394-eaf7-0c74-14b087a6472f
+14 9ed6836d-b34b-874d-11cd-2642e80cdee4
diff --git a/indra/newview/app_settings/static_assets/e7584536-86f2-c962-405d-d14adff71f38.gesture b/indra/newview/app_settings/static_assets/e7584536-86f2-c962-405d-d14adff71f38.gesture
new file mode 100644
index 0000000000..01bc3d91d2
Binary files /dev/null and b/indra/newview/app_settings/static_assets/e7584536-86f2-c962-405d-d14adff71f38.gesture differ
diff --git a/indra/newview/app_settings/static_assets/ea633413-8006-180a-c3ba-96dd1d756720.animatn b/indra/newview/app_settings/static_assets/ea633413-8006-180a-c3ba-96dd1d756720.animatn
new file mode 100644
index 0000000000..b398a7e1f9
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ea633413-8006-180a-c3ba-96dd1d756720.animatn differ
diff --git a/indra/newview/app_settings/static_assets/ea9ab69b-c2c7-3e18-a50b-37a9cfe457cd.gesture b/indra/newview/app_settings/static_assets/ea9ab69b-c2c7-3e18-a50b-37a9cfe457cd.gesture
new file mode 100644
index 0000000000..c723ee8732
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ea9ab69b-c2c7-3e18-a50b-37a9cfe457cd.gesture differ
diff --git a/indra/newview/app_settings/static_assets/eae8905b-271a-99e2-4c0e-31106afd100c.animatn b/indra/newview/app_settings/static_assets/eae8905b-271a-99e2-4c0e-31106afd100c.animatn
new file mode 100644
index 0000000000..33c8c57e7b
Binary files /dev/null and b/indra/newview/app_settings/static_assets/eae8905b-271a-99e2-4c0e-31106afd100c.animatn differ
diff --git a/indra/newview/app_settings/static_assets/ec952cca-61ef-aa3b-2789-4d1344f016de.animatn b/indra/newview/app_settings/static_assets/ec952cca-61ef-aa3b-2789-4d1344f016de.animatn
new file mode 100644
index 0000000000..c1b9190faf
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ec952cca-61ef-aa3b-2789-4d1344f016de.animatn differ
diff --git a/indra/newview/app_settings/static_assets/eefc79be-daae-a239-8c04-890f5d23654a.animatn b/indra/newview/app_settings/static_assets/eefc79be-daae-a239-8c04-890f5d23654a.animatn
new file mode 100644
index 0000000000..b289928497
Binary files /dev/null and b/indra/newview/app_settings/static_assets/eefc79be-daae-a239-8c04-890f5d23654a.animatn differ
diff --git a/indra/newview/app_settings/static_assets/ef62d355-c815-4816-2474-b1acc21094a6.animatn b/indra/newview/app_settings/static_assets/ef62d355-c815-4816-2474-b1acc21094a6.animatn
new file mode 100644
index 0000000000..afc8018690
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ef62d355-c815-4816-2474-b1acc21094a6.animatn differ
diff --git a/indra/newview/app_settings/static_assets/efdc1727-8b8a-c800-4077-975fc27ee2f2.animatn b/indra/newview/app_settings/static_assets/efdc1727-8b8a-c800-4077-975fc27ee2f2.animatn
new file mode 100644
index 0000000000..796bf8462c
Binary files /dev/null and b/indra/newview/app_settings/static_assets/efdc1727-8b8a-c800-4077-975fc27ee2f2.animatn differ
diff --git a/indra/newview/app_settings/static_assets/f061723d-0a18-754f-66ee-29a44795a32f.animatn b/indra/newview/app_settings/static_assets/f061723d-0a18-754f-66ee-29a44795a32f.animatn
new file mode 100644
index 0000000000..e4ae54b576
Binary files /dev/null and b/indra/newview/app_settings/static_assets/f061723d-0a18-754f-66ee-29a44795a32f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/f22fed8b-a5ed-2c93-64d5-bdd8b93c889f.animatn b/indra/newview/app_settings/static_assets/f22fed8b-a5ed-2c93-64d5-bdd8b93c889f.animatn
new file mode 100644
index 0000000000..a91d7eadc9
Binary files /dev/null and b/indra/newview/app_settings/static_assets/f22fed8b-a5ed-2c93-64d5-bdd8b93c889f.animatn differ
diff --git a/indra/newview/app_settings/static_assets/f2483d55-bc31-38c0-65b2-9f7e87fce5c4.gesture b/indra/newview/app_settings/static_assets/f2483d55-bc31-38c0-65b2-9f7e87fce5c4.gesture
new file mode 100644
index 0000000000..5ef31e06ca
Binary files /dev/null and b/indra/newview/app_settings/static_assets/f2483d55-bc31-38c0-65b2-9f7e87fce5c4.gesture differ
diff --git a/indra/newview/app_settings/static_assets/f2bed5f9-9d44-39af-b0cd-257b2a17fe40.animatn b/indra/newview/app_settings/static_assets/f2bed5f9-9d44-39af-b0cd-257b2a17fe40.animatn
new file mode 100644
index 0000000000..563bc436f2
Binary files /dev/null and b/indra/newview/app_settings/static_assets/f2bed5f9-9d44-39af-b0cd-257b2a17fe40.animatn differ
diff --git a/indra/newview/app_settings/static_assets/f3061aa3-0069-96b4-67b5-e16633a2ef30.clothing b/indra/newview/app_settings/static_assets/f3061aa3-0069-96b4-67b5-e16633a2ef30.clothing
new file mode 100644
index 0000000000..fc1ac9f111
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/f3061aa3-0069-96b4-67b5-e16633a2ef30.clothing
@@ -0,0 +1,28 @@
+LLWearable version 22
+RASL SOCKS TEAL
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 7
+parameters 4
+617 1
+818 1
+819 1
+820 1
+textures 1
+12 a900a787-09cc-8d9b-baaa-d93f4c9074fa
diff --git a/indra/newview/app_settings/static_assets/f3300ad9-3462-1d07-2044-0fef80062da0.animatn b/indra/newview/app_settings/static_assets/f3300ad9-3462-1d07-2044-0fef80062da0.animatn
new file mode 100644
index 0000000000..895b627163
Binary files /dev/null and b/indra/newview/app_settings/static_assets/f3300ad9-3462-1d07-2044-0fef80062da0.animatn differ
diff --git a/indra/newview/app_settings/static_assets/f4714624-bdc5-f596-5c6f-789b438becf9.bodypart b/indra/newview/app_settings/static_assets/f4714624-bdc5-f596-5c6f-789b438becf9.bodypart
new file mode 100644
index 0000000000..c8921aba5f
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/f4714624-bdc5-f596-5c6f-789b438becf9.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL M EXPLORE SHAPE (LOUIS)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .55
+2 -.31
+4 .23
+5 -.05
+6 .09
+7 -.28
+8 -.08
+10 .57
+11 .04
+12 .1
+13 .03
+14 .38
+15 -.18
+17 .09
+18 .5
+19 -.32
+20 -.26
+21 .17
+22 .27
+23 -.02
+24 .18
+25 .53
+27 .25
+33 1.14
+34 -.22
+35 .11
+36 -.42
+37 -.14
+38 -.08
+80 1
+105 .5
+155 -.48
+157 .03
+185 -.86
+193 .6
+196 -.98
+505 .67
+506 .08
+507 0
+515 -1
+517 -.05
+518 -.12
+629 .41
+637 .05
+646 .08
+647 .17
+649 .5
+650 0
+652 .49
+653 .8
+656 0
+659 .6
+662 .5
+663 0
+664 0
+665 .08
+675 -.13
+676 .02
+678 .46
+682 .6
+683 -.08
+684 0
+685 .01
+690 .4
+692 .12
+693 .02
+753 .83
+756 -.72
+758 -.63
+759 .38
+760 .5
+764 .84
+765 -.02
+769 .45
+773 .53
+795 .31
+796 .11
+799 .58
+841 .02
+842 -.28
+879 .32
+880 -.6
+textures 0
diff --git a/indra/newview/app_settings/static_assets/f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57.animatn b/indra/newview/app_settings/static_assets/f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57.animatn
new file mode 100644
index 0000000000..eae1310b21
Binary files /dev/null and b/indra/newview/app_settings/static_assets/f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57.animatn differ
diff --git a/indra/newview/app_settings/static_assets/f5fc7433-043d-e819-8298-f519a119b688.animatn b/indra/newview/app_settings/static_assets/f5fc7433-043d-e819-8298-f519a119b688.animatn
new file mode 100644
index 0000000000..68f791c22b
Binary files /dev/null and b/indra/newview/app_settings/static_assets/f5fc7433-043d-e819-8298-f519a119b688.animatn differ
diff --git a/indra/newview/app_settings/static_assets/f67a2a68-6c1d-6fc0-29fd-7ec01c0b5946.bodypart b/indra/newview/app_settings/static_assets/f67a2a68-6c1d-6fc0-29fd-7ec01c0b5946.bodypart
new file mode 100644
index 0000000000..31a488725e
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/f67a2a68-6c1d-6fc0-29fd-7ec01c0b5946.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL M PLAY SKIN (HEATH)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 0
+110 0
+111 .3
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 948ecc23-ea9f-229f-585a-a203d0f1d3a6
+5 2f404e84-85b9-713d-05c5-6c9bc5775dab
+6 4e411a4a-4f14-630d-7915-7c0372ed723e
diff --git a/indra/newview/app_settings/static_assets/f76e4009-1b0f-125f-1d81-e3d774f4a838.bodypart b/indra/newview/app_settings/static_assets/f76e4009-1b0f-125f-1d81-e3d774f4a838.bodypart
new file mode 100644
index 0000000000..1fd1d91d71
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/f76e4009-1b0f-125f-1d81-e3d774f4a838.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL F CREATE SKIN (Poppy)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 .04
+110 0
+111 .4
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 a25b31b2-1506-2529-5516-454a3a0e0824
+5 71855ea0-1773-9e70-32de-f188cc92b2dc
+6 34db688d-a76d-5b69-1720-f66c004095ff
diff --git a/indra/newview/app_settings/static_assets/f868fcfc-1377-396a-1635-4ac71a58a4fc.bodypart b/indra/newview/app_settings/static_assets/f868fcfc-1377-396a-1635-4ac71a58a4fc.bodypart
new file mode 100644
index 0000000000..1ac799f47c
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/f868fcfc-1377-396a-1635-4ac71a58a4fc.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+RASL F EXPLORE SHAPE (SOFIA)
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 0
+parameters 82
+1 .02
+2 -.47
+4 .07
+5 -.03
+6 -.14
+7 .08
+8 -.42
+10 .57
+11 .24
+12 .04
+13 0
+14 .63
+15 -.32
+17 .19
+18 .22
+19 -.5
+20 -.14
+21 .2
+22 0
+23 -.28
+24 -.34
+25 .05
+27 -.55
+33 .71
+34 -.04
+35 -.13
+36 -1.06
+37 -.56
+38 -.22
+80 0
+105 .58
+155 -.57
+157 0
+185 -.52
+193 .52
+196 -1.1
+505 .29
+506 -.52
+507 -.63
+515 -1
+517 -.11
+518 .11
+629 .48
+637 .04
+646 -.13
+647 .03
+649 .31
+650 .15
+652 .39
+653 .32
+656 0
+659 .7
+662 .5
+663 0
+664 0
+665 .08
+675 -.17
+676 -.58
+678 .5
+682 .51
+683 -.18
+684 .2
+685 0
+690 .4
+692 .46
+693 .28
+753 .76
+756 -.4
+758 .06
+759 .73
+760 .62
+764 .1
+765 -.16
+769 .47
+773 .46
+795 .26
+796 .08
+799 .48
+841 .02
+842 .12
+879 0
+880 -.72
+textures 0
diff --git a/indra/newview/app_settings/static_assets/fa743da9-7e6e-d88e-3e4f-143dcb4fc01b.gesture b/indra/newview/app_settings/static_assets/fa743da9-7e6e-d88e-3e4f-143dcb4fc01b.gesture
new file mode 100644
index 0000000000..aadded4e06
Binary files /dev/null and b/indra/newview/app_settings/static_assets/fa743da9-7e6e-d88e-3e4f-143dcb4fc01b.gesture differ
diff --git a/indra/newview/app_settings/static_assets/fb262981-4295-f048-c280-629081bf3b6b.gesture b/indra/newview/app_settings/static_assets/fb262981-4295-f048-c280-629081bf3b6b.gesture
new file mode 100644
index 0000000000..81be44cf09
Binary files /dev/null and b/indra/newview/app_settings/static_assets/fb262981-4295-f048-c280-629081bf3b6b.gesture differ
diff --git a/indra/newview/app_settings/static_assets/fc3de4b8-bd3e-662b-934c-b72714dab5bf.gesture b/indra/newview/app_settings/static_assets/fc3de4b8-bd3e-662b-934c-b72714dab5bf.gesture
new file mode 100644
index 0000000000..eca34162a8
Binary files /dev/null and b/indra/newview/app_settings/static_assets/fc3de4b8-bd3e-662b-934c-b72714dab5bf.gesture differ
diff --git a/indra/newview/app_settings/static_assets/fd037134-85d4-f241-72c6-4f42164fedee.animatn b/indra/newview/app_settings/static_assets/fd037134-85d4-f241-72c6-4f42164fedee.animatn
new file mode 100644
index 0000000000..eba81cff11
Binary files /dev/null and b/indra/newview/app_settings/static_assets/fd037134-85d4-f241-72c6-4f42164fedee.animatn differ
diff --git a/indra/newview/app_settings/static_assets/fe63b3df-0557-c6fe-836a-a353f8108660.bodypart b/indra/newview/app_settings/static_assets/fe63b3df-0557-c6fe-836a-a353f8108660.bodypart
new file mode 100644
index 0000000000..cb5b225cbf
--- /dev/null
+++ b/indra/newview/app_settings/static_assets/fe63b3df-0557-c6fe-836a-a353f8108660.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+RASL F LOVE SKIN (Gena) Rev
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 79908808-d272-49a8-864a-d133a10931e9
+ owner_id 79908808-d272-49a8-864a-d133a10931e9
+ last_owner_id 79908808-d272-49a8-864a-d133a10931e9
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 .01
+110 .01
+111 .4
+116 0
+117 0
+150 0
+162 0
+163 0
+165 0
+700 .25
+701 0
+702 0
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 38289ce5-6083-3349-03b1-28036d53c73e
+5 f38af42a-2b43-d277-c3aa-8c4bc9409326
+6 42ec6169-874a-42a9-ca33-57230beb4450
diff --git a/indra/newview/app_settings/static_assets/ff1114e1-4063-3abe-de2f-6d13f6cae508.gesture b/indra/newview/app_settings/static_assets/ff1114e1-4063-3abe-de2f-6d13f6cae508.gesture
new file mode 100644
index 0000000000..a1f155f66b
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ff1114e1-4063-3abe-de2f-6d13f6cae508.gesture differ
diff --git a/indra/newview/app_settings/static_assets/ff201a24-6893-4c41-77f2-bf707481e585.gesture b/indra/newview/app_settings/static_assets/ff201a24-6893-4c41-77f2-bf707481e585.gesture
new file mode 100644
index 0000000000..d1e8bad3bc
Binary files /dev/null and b/indra/newview/app_settings/static_assets/ff201a24-6893-4c41-77f2-bf707481e585.gesture differ
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index b67f3dae1b..49d0dc7e5c 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -56,7 +56,6 @@ RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 4.0
UseStartScreen 1 1
UseOcclusion 1 1
-//VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
@@ -95,7 +94,6 @@ RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.5
-//VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -127,7 +125,6 @@ RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.5
-//VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -158,7 +155,6 @@ RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-//VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -189,7 +185,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-//VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -220,7 +215,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-//VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -251,7 +245,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-//VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -282,7 +275,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-//VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 1
RenderDeferredSSAO 1 0
@@ -312,7 +304,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderVolumeLODFactor 1 3.0
-//VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferred 1 1
@@ -380,7 +371,6 @@ list NoPixelShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
RenderReflectionDetail 0 0
-//VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
@@ -394,7 +384,6 @@ list NoVertexShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
RenderReflectionDetail 0 0
-//VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 53814541ac..2edfc30e37 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -56,7 +56,6 @@ RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 4.0
UseStartScreen 1 1
UseOcclusion 1 1
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
@@ -94,7 +93,6 @@ RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.125
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -126,7 +124,6 @@ RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.5
-VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -157,7 +154,6 @@ RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -188,7 +184,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -219,7 +214,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 0
RenderUseAdvancedAtmospherics 1 0
@@ -250,7 +244,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -281,7 +274,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 1
RenderDeferredSSAO 1 0
@@ -311,7 +303,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderVolumeLODFactor 1 3.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferred 1 1
@@ -379,7 +370,6 @@ list NoPixelShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
RenderReflectionDetail 0 0
-VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
@@ -393,7 +383,6 @@ list NoVertexShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
RenderReflectionDetail 0 0
-VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index b9192ecb12..3de2d7d364 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -56,7 +56,6 @@ RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 4.0
UseStartScreen 1 1
UseOcclusion 1 1
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
@@ -95,7 +94,6 @@ RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.5
-VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -127,7 +125,6 @@ RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.5
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -158,7 +155,6 @@ RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.5
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -189,7 +185,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 1.5
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -220,7 +215,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
@@ -251,7 +245,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 1
RenderDeferredSSAO 1 0
@@ -282,7 +275,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
RenderDeferred 1 1
RenderDeferredSSAO 1 0
@@ -312,7 +304,6 @@ RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderVolumeLODFactor 1 3.0
-VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferred 1 1
@@ -374,7 +365,6 @@ list NoPixelShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
RenderReflectionDetail 0 0
-VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
@@ -388,7 +378,6 @@ list NoVertexShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
RenderReflectionDetail 0 0
-VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
diff --git a/indra/newview/fsfloaterteleporthistory.cpp b/indra/newview/fsfloaterteleporthistory.cpp
index f9ec067f38..c6f8004137 100644
--- a/indra/newview/fsfloaterteleporthistory.cpp
+++ b/indra/newview/fsfloaterteleporthistory.cpp
@@ -54,6 +54,15 @@ BOOL FSFloaterTeleportHistory::postBuild()
{
mHistoryPanel->setIsStandAlone(true);
+ mHistoryPanel->mTeleportBtn = getChild("teleport_btn");
+ mHistoryPanel->mShowOnMapBtn = getChild("map_btn");
+ mHistoryPanel->mShowProfile = getChild("profile_btn");
+
+ mHistoryPanel->mTeleportBtn->setClickedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleport, mHistoryPanel));
+ mHistoryPanel->mShowProfile->setClickedCallback(boost::bind(&LLTeleportHistoryPanel::onShowProfile, mHistoryPanel));
+ mHistoryPanel->mShowOnMapBtn->setClickedCallback(boost::bind(&LLTeleportHistoryPanel::onShowOnMap, mHistoryPanel));
+
+
mFilterEditor = getChild("Filter");
if (mFilterEditor)
{
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index a7608bb7a8..e9f1a469b1 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -126,7 +126,8 @@ const U8 AGENT_STATE_EDITING = 0x10;
// Autopilot constants
const F32 AUTOPILOT_HEIGHT_ADJUST_DISTANCE = 8.f; // meters
const F32 AUTOPILOT_MIN_TARGET_HEIGHT_OFF_GROUND = 1.f; // meters
-const F32 AUTOPILOT_MAX_TIME_NO_PROGRESS = 1.5f; // seconds
+const F32 AUTOPILOT_MAX_TIME_NO_PROGRESS_WALK = 1.5f; // seconds
+const F32 AUTOPILOT_MAX_TIME_NO_PROGRESS_FLY = 2.5f; // seconds. Flying is less presize, needs a bit more time
const F32 MAX_VELOCITY_AUTO_LAND_SQUARED = 4.f * 4.f;
const F64 CHAT_AGE_FAST_RATE = 3.0;
@@ -1040,25 +1041,14 @@ boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_cal
}
// static
-// FIRE-30774 displayname capability is targetting previous region
-// void LLAgent::capabilityReceivedCallback(const LLUUID ®ion_id)
-// {
-// LLViewerRegion* region = gAgent.getRegion();
-// if (region && region->getRegionID() == region_id)
-// {
-// region->requestSimulatorFeatures();
-// LLAppViewer::instance()->updateNameLookupUrl();
-// }
-// }
-void LLAgent::capabilityReceivedCallback(LLViewerRegion* regionp)
+void LLAgent::capabilityReceivedCallback(const LLUUID ®ion_id, LLViewerRegion *regionp)
{
- if (regionp)
+ if (regionp && regionp->getRegionID() == region_id)
{
regionp->requestSimulatorFeatures();
LLAppViewer::instance()->updateNameLookupUrl(regionp);
}
}
-//
//-----------------------------------------------------------------------------
// setRegion()
@@ -1110,17 +1100,11 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
if (regionp->capabilitiesReceived())
{
regionp->requestSimulatorFeatures();
- // FIRE-30774 displayname capability is targetting previous region
- // LLAppViewer::instance()->updateNameLookupUrl();
LLAppViewer::instance()->updateNameLookupUrl(regionp);
- //
}
else
{
- // FIRE-30774 displayname capability is targetting previous region
- // regionp->setCapabilitiesReceivedCallback(LLAgent::capabilityReceivedCallback);
- regionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::capabilityReceivedCallback, regionp));
- //
+ regionp->setCapabilitiesReceivedCallback(LLAgent::capabilityReceivedCallback);
}
}
@@ -1142,17 +1126,11 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
if (regionp->capabilitiesReceived())
{
- // FIRE-30774 displayname capability is targetting previous region
- // LLAppViewer::instance()->updateNameLookupUrl();
LLAppViewer::instance()->updateNameLookupUrl(regionp);
- //
}
else
{
- // FIRE-30774 displayname capability is targetting previous region
- // regionp->setCapabilitiesReceivedCallback([regionp](const LLUUID ®ion_id) {LLAppViewer::instance()->updateNameLookupUrl(); });
- regionp->setCapabilitiesReceivedCallback([regionp](const LLUUID ®ion_id) { LLAppViewer::instance()->updateNameLookupUrl(regionp); });
- //
+ regionp->setCapabilitiesReceivedCallback([](const LLUUID ®ion_id, LLViewerRegion* regionp) {LLAppViewer::instance()->updateNameLookupUrl(regionp); });
}
}
@@ -2018,6 +1996,12 @@ void LLAgent::startAutoPilotGlobal(
{
return;
}
+
+ if (target_global.isExactlyZero())
+ {
+ LL_WARNS() << "Canceling attempt to start autopilot towards invalid position" << LL_ENDL;
+ return;
+ }
// Are there any pending callbacks from previous auto pilot requests?
if (mAutoPilotFinishedCallback)
@@ -2233,7 +2217,16 @@ void LLAgent::autoPilot(F32 *delta_yaw)
if (target_dist >= mAutoPilotTargetDist)
{
mAutoPilotNoProgressFrameCount++;
- if (mAutoPilotNoProgressFrameCount > AUTOPILOT_MAX_TIME_NO_PROGRESS * gFPSClamped)
+ bool out_of_time = false;
+ if (getFlying())
+ {
+ out_of_time = mAutoPilotNoProgressFrameCount > AUTOPILOT_MAX_TIME_NO_PROGRESS_FLY * gFPSClamped;
+ }
+ else
+ {
+ out_of_time = mAutoPilotNoProgressFrameCount > AUTOPILOT_MAX_TIME_NO_PROGRESS_WALK * gFPSClamped;
+ }
+ if (out_of_time)
{
stopAutoPilot();
return;
@@ -2282,7 +2275,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
F32 slow_distance;
if (getFlying())
{
- slow_distance = llmax(6.f, mAutoPilotStopDistance + 5.f);
+ slow_distance = llmax(8.f, mAutoPilotStopDistance + 5.f);
}
else
{
@@ -2326,14 +2319,41 @@ void LLAgent::autoPilot(F32 *delta_yaw)
}
else if (mAutoPilotTargetDist > mAutoPilotStopDistance)
{
- // walking/flying slow
+ // walking/flying slow
+ U32 movement_flag = 0;
+
if (at * direction > 0.9f)
{
- setControlFlags(AGENT_CONTROL_AT_POS);
- }
- else if (at * direction < -0.9f)
- {
- setControlFlags(AGENT_CONTROL_AT_NEG);
+ movement_flag = AGENT_CONTROL_AT_POS;
+ }
+ else if (at * direction < -0.9f)
+ {
+ movement_flag = AGENT_CONTROL_AT_NEG;
+ }
+
+ if (getFlying())
+ {
+ // flying is too fast and has high inertia, artificially slow it down
+ // Don't update flags too often, server might not react
+ static U64 last_time_microsec = 0;
+ U64 time_microsec = LLTimer::getTotalTime();
+ U64 delta = time_microsec - last_time_microsec;
+ // fly during ~0-40 ms, stop during ~40-250 ms
+ if (delta > 250000) // 250ms
+ {
+ // reset even if !movement_flag
+ last_time_microsec = time_microsec;
+ }
+ else if (delta > 40000) // 40 ms
+ {
+ clearControlFlags(AGENT_CONTROL_AT_POS | AGENT_CONTROL_AT_POS);
+ movement_flag = 0;
+ }
+ }
+
+ if (movement_flag)
+ {
+ setControlFlags(movement_flag);
}
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index aea09d81ce..839fb68eaa 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -258,10 +258,7 @@ public:
boost::signals2::connection addParcelChangedCallback(parcel_changed_callback_t);
private:
- // FIRE-30774 displayname capability is targetting previous region
- // static void capabilityReceivedCallback(const LLUUID ®ion_id);
- static void capabilityReceivedCallback(LLViewerRegion* regionp);
- //
+ static void capabilityReceivedCallback(const LLUUID ®ion_id, LLViewerRegion *regionp);
typedef boost::signals2::signal parcel_changed_signal_t;
parcel_changed_signal_t mParcelChangedSignal;
diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
index 30464e2f08..407115480c 100644
--- a/indra/newview/llappcorehttp.cpp
+++ b/indra/newview/llappcorehttp.cpp
@@ -127,6 +127,7 @@ static const struct
};
static void setting_changed();
+static void ssl_verification_changed();
LLAppCoreHttp::HttpClass::HttpClass()
@@ -206,6 +207,23 @@ void LLAppCoreHttp::init()
LL_WARNS("Init") << "Failed to set SSL Verification. Reason: " << status.toString() << LL_ENDL;
}
+ // Set up Default SSL Verification option.
+ const std::string no_verify_ssl("NoVerifySSLCert");
+ if (gSavedSettings.controlExists(no_verify_ssl))
+ {
+ LLPointer cntrl_ptr = gSavedSettings.getControl(no_verify_ssl);
+ if (cntrl_ptr.isNull())
+ {
+ LL_WARNS("Init") << "Unable to set signal on global setting '" << no_verify_ssl
+ << "'" << LL_ENDL;
+ }
+ else
+ {
+ mSSLNoVerifySignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&ssl_verification_changed));
+ LLCore::HttpOptions::setDefaultSSLVerifyPeer(!cntrl_ptr->getValue().asBoolean());
+ }
+ }
+
// Tracing levels for library & libcurl (note that 2 & 3 are beyond spammy):
// 0 - None
// 1 - Basic start, stop simple transitions
@@ -307,6 +325,11 @@ void setting_changed()
LLAppViewer::instance()->getAppCoreHttp().refreshSettings(false);
}
+void ssl_verification_changed()
+{
+ LLCore::HttpOptions::setDefaultSSLVerifyPeer(!gSavedSettings.getBOOL("NoVerifySSLCert"));
+}
+
namespace
{
// The NoOpDeletor is used when wrapping LLAppCoreHttp in a smart pointer below for
@@ -366,6 +389,7 @@ void LLAppCoreHttp::cleanup()
{
mHttpClasses[i].mSettingsSignal.disconnect();
}
+ mSSLNoVerifySignal.disconnect();
mPipelinedSignal.disconnect();
delete mRequest;
diff --git a/indra/newview/llappcorehttp.h b/indra/newview/llappcorehttp.h
index e8e37e0706..8cd231d319 100644
--- a/indra/newview/llappcorehttp.h
+++ b/indra/newview/llappcorehttp.h
@@ -272,6 +272,7 @@ private:
HttpClass mHttpClasses[AP_COUNT];
bool mPipelined; // Global setting
boost::signals2::connection mPipelinedSignal; // Signal for 'HttpPipelining' setting
+ boost::signals2::connection mSSLNoVerifySignal; // Signal for 'NoVerifySSLCert' setting
static LLCore::HttpStatus sslVerify(const std::string &uri, const LLCore::HttpHandler::ptr_t &handler, void *appdata);
};
diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm
index cfad3a5d1f..40357123a2 100644
--- a/indra/newview/llappdelegate-objc.mm
+++ b/indra/newview/llappdelegate-objc.mm
@@ -66,14 +66,16 @@
constructViewer();
#if defined(LL_BUGSPLAT)
+ infos("bugsplat setup");
// Engage BugsplatStartupManager *before* calling initViewer() to handle
// any crashes during initialization.
// https://www.bugsplat.com/docs/platforms/os-x#initialization
- [BugsplatStartupManager sharedManager].autoSubmitCrashReport = YES;
- [BugsplatStartupManager sharedManager].askUserDetails = NO;
+ [BugsplatStartupManager sharedManager].autoSubmitCrashReport = NO;
+ [BugsplatStartupManager sharedManager].askUserDetails = YES;
[BugsplatStartupManager sharedManager].delegate = self;
[[BugsplatStartupManager sharedManager] start];
#endif
+ infos("post-bugsplat setup");
frameTimer = nil;
@@ -289,23 +291,28 @@ struct AttachmentInfo
- (NSArray *)attachmentsForBugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager
{
- const CrashMetadata& metadata(CrashMetadata_instance());
+ //const CrashMetadata& metadata(CrashMetadata_instance());
// Since we must do very similar processing for each of several file
// pathnames, start by collecting them into a vector so we can iterate
// instead of spelling out the logic for each.
- std::vector info{
- AttachmentInfo(metadata.logFilePathname, "text/plain"),
- AttachmentInfo(metadata.userSettingsPathname, "text/xml"),
- AttachmentInfo(metadata.accountSettingsPathname, "text/xml"),
- AttachmentInfo(metadata.staticDebugPathname, "text/xml")
- };
+ //std::vector info{
+ // AttachmentInfo(metadata.logFilePathname, "text/plain"),
+ // AttachmentInfo(metadata.userSettingsPathname, "text/xml"),
+ // AttachmentInfo(metadata.accountSettingsPathname, "text/xml"),
+ // AttachmentInfo(metadata.staticDebugPathname, "text/xml")
+ //};
+ std::vector info{};
// We "happen to know" that info[0].basename is "SecondLife.old" -- due to
// the fact that BugsplatMac only notices a crash during the viewer run
- // following the crash. Replace .old with .log to reduce confusion.
- info[0].basename =
- boost::filesystem::path(info[0].pathname).stem().string() + ".log";
+ // following the crash.
+ // The Bugsplat service doesn't respect the MIME type above when returning
+ // the log data to a browser, so take this opportunity to rename the file
+ // from .old to _log.txt
+ // info[0].basename =
+ // boost::filesystem::path(info[0].pathname).stem().string() + "_log.txt";
+ // infos("attachmentsForBugsplatStartupManager attaching log " + info[0].basename);
NSMutableArray *attachments = [[NSMutableArray alloc] init];
@@ -341,6 +348,9 @@ struct AttachmentInfo
{
// TODO: message string from NSError
infos("Could not send crash report to BugSplat");
+ NSString *pStr = [NSString stringWithFormat:@"%@", error];
+std::string bar = std::string([pStr UTF8String]);
+ infos(bar);
}
#endif // LL_BUGSPLAT
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index e7dafbb7b8..14035289fe 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -4101,7 +4101,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
}
llcoro::suspend();
- if (LLApp::isQuitting())
+ if (LLApp::isExiting())
{
return;
}
@@ -4168,7 +4168,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
- if (LLApp::isQuitting())
+ if (LLApp::isExiting())
{
return;
}
@@ -4208,7 +4208,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
- if (LLApp::isQuitting())
+ if (LLApp::isExiting())
{
return;
}
@@ -4894,6 +4894,17 @@ public:
}
virtual void done()
{
+ if (mComplete.size() <= 0)
+ {
+ // Ex: timeout
+ LL_WARNS() << "Failed to load data. Removing observer " << LL_ENDL;
+ gInventory.removeObserver(this);
+ doOnIdleOneTime(mCallable);
+
+ delete this;
+ return;
+ }
+
// What we do here is get the complete information on the
// items in the requested category, and set up an observer
// that will wait for that to happen.
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 262a231897..737a416699 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -813,14 +813,14 @@ LLAppViewer::LLAppViewer()
// from the previous viewer run between this constructor call and the
// init() call, which will overwrite the static_debug_info.log file for
// THIS run. So setDebugFileNames() early.
-#if LL_BUGSPLAT
+# ifdef LL_BUGSPLAT
// MAINT-8917: don't create a dump directory just for the
// static_debug_info.log file
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
-#else // ! LL_BUGSPLAT
+# else // ! LL_BUGSPLAT
// write Google Breakpad minidump files to a per-run dump directory to avoid multiple viewer issues.
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "");
-#endif // ! LL_BUGSPLAT
+# endif // ! LL_BUGSPLAT
mDumpPath = logdir;
setMiniDumpDir(logdir);
setDebugFileNames(logdir);
@@ -845,17 +845,6 @@ public:
}
};
-namespace {
-// With Xcode 6, _exit() is too magical to use with boost::bind(), so provide
-// this little helper function.
-void fast_exit(int rc)
-{
- _exit(rc);
-}
-
-
-}
-
bool LLAppViewer::init()
{
@@ -994,9 +983,9 @@ bool LLAppViewer::init()
if (rc >= 0)
{
// QAModeTermCode set, terminate with that rc on LL_ERRS. Use
- // fast_exit() rather than exit() because normal cleanup depends too
+ // _exit() rather than exit() because normal cleanup depends too
// much on successful startup!
- LLError::setFatalFunction(boost::bind(fast_exit, rc));
+ LLError::setFatalFunction([rc](const std::string&){ _exit(rc); });
}
// Get rid of unused LLAllocator
@@ -2558,28 +2547,6 @@ bool LLAppViewer::cleanup()
return true;
}
-// A callback for LL_ERRS() to call during the watchdog error.
-void watchdog_llerrs_callback(const std::string &error_string)
-{
- gLLErrorActivated = true;
-
- gDebugInfo["FatalMessage"] = error_string;
- LLAppViewer::instance()->writeDebugInfo();
-
-#ifdef LL_WINDOWS
- RaiseException(0,0,0,0);
-#else
- raise(SIGQUIT);
-#endif
-}
-
-// A callback for the watchdog to call.
-void watchdog_killer_callback()
-{
- LLError::setFatalFunction(watchdog_llerrs_callback);
- LL_ERRS() << "Watchdog killer event" << LL_ENDL;
-}
-
bool LLAppViewer::initThreads()
{
static const bool enable_threads = true;
@@ -2618,52 +2585,51 @@ bool LLAppViewer::initThreads()
return true;
}
-void errorCallback(const std::string &error_string)
+void errorCallback(LLError::ELevel level, const std::string &error_string)
{
- LLStringUtil::format_map_t map;
- map["ERROR_DETAILS"]=error_string;
- std::string error_display_string=LLTrans::getString("MBApplicationErrorDetails",map);
-
- // If we crash before loading the configuration, LLTrans
- // won't be able to find the localized string, so we
- // fall back to the English version instead of showing
- // a dialog saying "MissingString("".
- std::string caption = LLTrans::getString("MBApplicationError");
+ if (level == LLError::LEVEL_ERROR)
+ {
+ LLStringUtil::format_map_t map;
+ map["ERROR_DETAILS"]=error_string;
+ std::string error_display_string=LLTrans::getString("MBApplicationErrorDetails",map);
- if (error_display_string.find("MissingString(") != std::string::npos)
- {
- error_display_string = "We are sorry, but Firestorm has crashed and needs to be closed. If you see this issue happening repeatedly, please contact our support team and submit the following message:\n\n[ERROR_DETAILS]";
- LLStringUtil::format(error_display_string, map);
- }
- if (caption.find("MissingString(") != std::string::npos)
- {
- caption = "Application Error - Don't Panic";
- }
- //
+ // If we crash before loading the configuration, LLTrans
+ // won't be able to find the localized string, so we
+ // fall back to the English version instead of showing
+ // a dialog saying "MissingString("".
+ std::string caption = LLTrans::getString("MBApplicationError");
+
+ if (error_display_string.find("MissingString(") != std::string::npos)
+ {
+ error_display_string = "We are sorry, but Firestorm has crashed and needs to be closed. If you see this issue happening repeatedly, please contact our support team and submit the following message:\n\n[ERROR_DETAILS]";
+ LLStringUtil::format(error_display_string, map);
+ }
+ if (caption.find("MissingString(") != std::string::npos)
+ {
+ caption = "Application Error - Don't Panic";
+ }
+ //
#if !LL_RELEASE_FOR_DOWNLOAD
- // Changed to fix missing string error upon early crash
- //if (OSBTN_CANCEL == OSMessageBox(error_display_string, LLTrans::getString("MBApplicationError"), OSMB_OKCANCEL))
- if (OSBTN_CANCEL == OSMessageBox(error_display_string, caption, OSMB_OKCANCEL))
- return;
+ // Changed to fix missing string error upon early crash
+ //if (OSBTN_CANCEL == OSMessageBox(error_display_string, LLTrans::getString("MBApplicationError"), OSMB_OKCANCEL))
+ if (OSBTN_CANCEL == OSMessageBox(error_display_string, caption, OSMB_OKCANCEL))
+ return;
#else
- // Changed to fix missing string error upon early crash
- //OSMessageBox(error_display_string, LLTrans::getString("MBApplicationError"), OSMB_OK);
- OSMessageBox(error_display_string, caption, OSMB_OK);
+ // Changed to fix missing string error upon early crash
+ //OSMessageBox(error_display_string, LLTrans::getString("MBApplicationError"), OSMB_OK);
+ OSMessageBox(error_display_string, caption, OSMB_OK);
#endif // !LL_RELEASE_FOR_DOWNLOAD
- //Set the ErrorActivated global so we know to create a marker file
- gLLErrorActivated = true;
+ //Set the ErrorActivated global so we know to create a marker file
+ gLLErrorActivated = true;
- gDebugInfo["FatalMessage"] = error_string;
- // We're not already crashing -- we simply *intend* to crash. Since we
- // haven't actually trashed anything yet, we can afford to write the whole
- // static info file.
- LLAppViewer::instance()->writeDebugInfo();
-
-#ifndef SHADER_CRASH_NONFATAL
- LLError::crashAndLoop(error_string);
-#endif
+ gDebugInfo["FatalMessage"] = error_string;
+ // We're not already crashing -- we simply *intend* to crash. Since we
+ // haven't actually trashed anything yet, we can afford to write the whole
+ // static info file.
+ LLAppViewer::instance()->writeDebugInfo();
+ }
}
void LLAppViewer::initLoggingAndGetLastDuration()
@@ -2674,7 +2640,7 @@ void LLAppViewer::initLoggingAndGetLastDuration()
LLError::initForApplication( gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "")
,gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")
);
- LLError::setFatalFunction(errorCallback);
+ LLError::addGenericRecorder(&errorCallback);
//LLError::setTimeFunction(getRuntime);
// Remove old CEF log file (defined in dullahan.h)
@@ -3586,26 +3552,28 @@ bool LLAppViewer::initWindow()
LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
// Need to load feature table before cheking to start watchdog.
- // Fix Watchdog settings/feature table mess
- //bool use_watchdog = false;
- //int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled");
- //if (watchdog_enabled_setting == -1)
- //{
- // use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");
- //}
- //else
- //{
- // // The user has explicitly set this setting; always use that value.
- // use_watchdog = bool(watchdog_enabled_setting);
- //}
-
- //if (use_watchdog)
- if (gSavedSettings.getS32("WatchdogEnabled"))
- //
+ bool use_watchdog = false;
+ int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled");
+ if (watchdog_enabled_setting == -1)
{
- LLWatchdog::getInstance()->init(watchdog_killer_callback);
+ use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");
+ }
+ else
+ {
+ // The user has explicitly set this setting; always use that value.
+ use_watchdog = bool(watchdog_enabled_setting);
+ }
+
+ LL_INFOS("AppInit") << "watchdog"
+ << (use_watchdog ? " " : " NOT ")
+ << "enabled"
+ << " (setting = " << watchdog_enabled_setting << ")"
+ << LL_ENDL;
+
+ if (use_watchdog)
+ {
+ LLWatchdog::getInstance()->init();
}
- LL_INFOS("AppInit") << "watchdog setting is done." << LL_ENDL;
// Init group notices, IMs and chiclets position before the
// screenchannel gets created
@@ -4229,8 +4197,8 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE();
gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2();
- gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB().value());
- gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated.valueInUnits());
+ gDebugInfo["RAMInfo"]["Physical"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().value());
+ gDebugInfo["RAMInfo"]["Allocated"] = LLSD::Integer(gMemoryAllocated.valueInUnits());
gDebugInfo["OSInfo"] = LLOSInfo::instance().getOSStringSimple();
// The user is not logged on yet, but record the current grid choice login url
@@ -4243,12 +4211,18 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["MainloopThreadID"] = (S32)thread_id;
#endif
+#ifndef LL_BUGSPLAT
// "CrashNotHandled" is set here, while things are running well,
// in case of a freeze. If there is a freeze, the crash logger will be launched
// and can read this value from the debug_info.log.
// If the crash is handled by LLAppViewer::handleViewerCrash, ie not a freeze,
// then the value of "CrashNotHandled" will be set to true.
- gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)true;
+ gDebugInfo["CrashNotHandled"] = LLSD::Boolean(true);
+#else // LL_BUGSPLAT
+ // "CrashNotHandled" is obsolete; it used (not very successsfully)
+ // to try to distinguish crashes from freezes - the intent here to to avoid calling it a freeze
+ gDebugInfo["CrashNotHandled"] = LLSD::Boolean(false);
+#endif // ! LL_BUGSPLAT
// Insert crash host url (url to post crash log to) if configured. This insures
// that the crash report will go to the proper location in the case of a
@@ -4288,7 +4262,7 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
- gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin();
+ gDebugInfo["FirstLogin"] = LLSD::Boolean(gAgent.isFirstLogin());
gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall");
gDebugInfo["StartupState"] = LLStartUp::getStartupStateString();
@@ -4418,7 +4392,7 @@ void LLAppViewer::handleViewerCrash()
// The crash is being handled here so set this value to false.
// Otherwise the crash logger will think this crash was a freeze.
- gDebugInfo["Dynamic"]["CrashNotHandled"] = (LLSD::Boolean)false;
+ gDebugInfo["Dynamic"]["CrashNotHandled"] = LLSD::Boolean(false);
//Write out the crash status file
//Use marker file style setup, as that's the simplest, especially since
@@ -4491,6 +4465,8 @@ void LLAppViewer::handleViewerCrash()
if (LLWorld::instanceExists()) LLWorld::getInstance()->getInfo(gDebugInfo["Dynamic"]);
+ gDebugInfo["FatalMessage"] = LLError::getFatalMessage();
+
// Close the debug file
pApp->writeDebugInfo(false); //false answers the isStatic question with the least overhead.
}
@@ -4595,9 +4571,8 @@ void LLAppViewer::processMarkerFiles()
else if (marker_is_same_version)
{
// the file existed, is ours, and matched our version, so we can report on what it says
- LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec FROZE" << LL_ENDL;
- gLastExecEvent = LAST_EXEC_FROZE;
-
+ LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed" << LL_ENDL;
+ gLastExecEvent = LAST_EXEC_OTHER_CRASH;
}
else
{
@@ -4986,10 +4961,6 @@ bool LLAppViewer::initCache()
//const unsigned int disk_cache_bytes = disk_cache_mb * 1024 * 1024;
const uintmax_t disk_cache_bytes = disk_cache_mb * 1024 * 1024;
const bool enable_cache_debug_info = gSavedSettings.getBOOL("EnableDiskCacheDebugInfo");
- // Don't ignore cache path for asset cache; Moved further down until cache path has been set correctly
- //const std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, cache_dir_name);
- //LLDiskCache::initParamSingleton(cache_dir, disk_cache_bytes, enable_cache_debug_info);
- //
bool texture_cache_mismatch = false;
if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion())
@@ -5013,8 +4984,10 @@ bool LLAppViewer::initCache()
gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
LL_INFOS("AppCache") << "Scheduling texture purge, based on PurgeCache* settings." << LL_ENDL;
mPurgeCache = true;
- // STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad
- texture_cache_mismatch = true;
+ // No longer needed
+ // // STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad
+ // texture_cache_mismatch = true;
+ //
}
// If the J2C has changed since the last run, clear the cache
@@ -5060,10 +5033,8 @@ bool LLAppViewer::initCache()
}
//
- // Don't ignore cache path for asset cache
- const std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, cache_dir_name);
- LLDiskCache::initParamSingleton(cache_dir, disk_cache_bytes, enable_cache_debug_info);
- //
+ const std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, cache_dir_name);
+ LLDiskCache::initParamSingleton(cache_dir, disk_cache_bytes, enable_cache_debug_info);
if (!read_only)
{
@@ -5085,7 +5056,7 @@ bool LLAppViewer::initCache()
LLAppViewer::getPurgeDiskCacheThread()->start();
// FIRE-13066
- if (mPurgeTextures && !read_only)
+ if (!mPurgeCache && mPurgeTextures && !read_only) // no need to purge textures if we already purged the cache above
{
LL_INFOS("AppCache") << "Purging Texture Cache..." << LL_ENDL;
LLSplashScreen::update(LLTrans::getString("StartupClearingTextureCache"));
@@ -6092,13 +6063,9 @@ void LLAppViewer::sendLogoutRequest()
}
}
-// FIRE-30774 displayname capability is targetting previous region
-// void LLAppViewer::updateNameLookupUrl()
-void LLAppViewer::updateNameLookupUrl(const LLViewerRegion * region)
-//
+void LLAppViewer::updateNameLookupUrl(const LLViewerRegion * regionp)
{
- // LLViewerRegion* region = gAgent.getRegion();
- if (!region || !region->capabilitiesReceived())
+ if (!regionp || !regionp->capabilitiesReceived())
{
return;
}
@@ -6107,7 +6074,7 @@ void LLAppViewer::updateNameLookupUrl(const LLViewerRegion * region)
bool had_capability = name_cache->hasNameLookupURL();
std::string name_lookup_url;
name_lookup_url.reserve(128); // avoid a memory allocation below
- name_lookup_url = region->getCapability("GetDisplayNames");
+ name_lookup_url = regionp->getCapability("GetDisplayNames");
bool have_capability = !name_lookup_url.empty();
if (have_capability)
{
@@ -6455,6 +6422,33 @@ void LLAppViewer::forceErrorDriverCrash()
glDeleteTextures(1, NULL);
}
+void LLAppViewer::forceErrorCoroutineCrash()
+{
+ LL_WARNS() << "Forcing a crash in LLCoros" << LL_ENDL;
+ LLCoros::instance().launch("LLAppViewer::crashyCoro", [] {throw LLException("A deliberate crash from LLCoros"); });
+}
+
+void LLAppViewer::forceErrorThreadCrash()
+{
+ class LLCrashTestThread : public LLThread
+ {
+ public:
+
+ LLCrashTestThread() : LLThread("Crash logging test thread")
+ {
+ }
+
+ void run()
+ {
+ LL_ERRS() << "This is a deliberate llerror in thread" << LL_ENDL;
+ }
+ };
+
+ LL_WARNS() << "This is a deliberate crash in a thread" << LL_ENDL;
+ LLCrashTestThread *thread = new LLCrashTestThread();
+ thread->start();
+}
+
// Change from std::string to char const*, saving a lot of object construction/destruction per frame
//void LLAppViewer::initMainloopTimeout(const std::string& state, F32 secs)
void LLAppViewer::initMainloopTimeout( char const* state, F32 secs)
@@ -6507,11 +6501,6 @@ void LLAppViewer::pauseMainloopTimeout()
void LLAppViewer::pingMainloopTimeout( char const* state, F32 secs)
//
{
-// if(!restoreErrorTrap())
-// {
-// LL_WARNS() << "!!!!!!!!!!!!! Its an error trap!!!!" << state << LL_ENDL;
-// }
-
if(mMainloopTimeout)
{
if(secs < 0.0f)
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 861150bae2..e42a11d3e4 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -58,7 +58,7 @@ class LLImageDecodeThread;
class LLTextureFetch;
class LLWatchdogTimeout;
class LLViewerJoystick;
-class LLViewerRegion; //
+class LLViewerRegion;
class FSPurgeDiskCacheThread; // Regular disk cache cleanup
extern LLTrace::BlockTimerStatHandle FTM_FRAME;
@@ -151,6 +151,8 @@ public:
virtual void forceErrorInfiniteLoop();
virtual void forceErrorSoftwareException();
virtual void forceErrorDriverCrash();
+ virtual void forceErrorCoroutineCrash();
+ virtual void forceErrorThreadCrash();
// The list is found in app_settings/settings_files.xml
// but since they are used explicitly in code,
@@ -225,10 +227,7 @@ public:
// llcorehttp init/shutdown/config information.
LLAppCoreHttp & getAppCoreHttp() { return mAppCoreHttp; }
- // FIRE-30774 displayname capability is targetting previous region
- // void updateNameLookupUrl();
- void updateNameLookupUrl( const LLViewerRegion * region );
- //
+ void updateNameLookupUrl(const LLViewerRegion* regionp);
protected:
virtual bool initWindow(); // Initialize the viewer's window.
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 662164af2d..42946e4415 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -68,39 +68,21 @@ namespace
int gArgC;
char** gArgV;
LLAppViewerMacOSX* gViewerAppPtr = NULL;
-
- void (*gOldTerminateHandler)() = NULL;
std::string gHandleSLURL;
}
-static void exceptionTerminateHandler()
-{
- // reinstall default terminate() handler in case we re-terminate.
- if (gOldTerminateHandler) std::set_terminate(gOldTerminateHandler);
- // treat this like a regular viewer crash, with nice stacktrace etc.
- long *null_ptr;
- null_ptr = 0;
- *null_ptr = 0xDEADBEEF; //Force an exception that will trigger breakpad.
- //LLAppViewer::handleViewerCrash();
- // we've probably been killed-off before now, but...
- gOldTerminateHandler(); // call old terminate() handler
-}
-
void constructViewer()
{
// Set the working dir to /Contents/Resources
if (chdir(gDirUtilp->getAppRODataDir().c_str()) == -1)
{
- LL_WARNS() << "Could not change directory to "
+ LL_WARNS("InitOSX") << "Could not change directory to "
<< gDirUtilp->getAppRODataDir() << ": " << strerror(errno)
<< LL_ENDL;
}
gViewerAppPtr = new LLAppViewerMacOSX();
- // install unexpected exception handler
- gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);
-
gViewerAppPtr->setErrorHandler(LLAppViewer::handleViewerCrash);
}
@@ -109,7 +91,7 @@ bool initViewer()
bool ok = gViewerAppPtr->init();
if(!ok)
{
- LL_WARNS() << "Application init failed." << LL_ENDL;
+ LL_WARNS("InitOSX") << "Application init failed." << LL_ENDL;
}
else if (!gHandleSLURL.empty())
{
@@ -172,7 +154,7 @@ class CrashMetadataSingleton: public CrashMetadata, public LLSingletoninitCrashReporting();
}
-#endif
-
return success;
}
@@ -334,11 +313,12 @@ bool LLAppViewerMacOSX::restoreErrorTrap()
unsigned int reset_count = 0;
-#define SET_SIG(S) sigaction(SIGABRT, &act, &old_act); \
- if(act.sa_sigaction != old_act.sa_sigaction) \
- ++reset_count;
+#define SET_SIG(SIGNAL) sigaction(SIGNAL, &act, &old_act); \
+ if(act.sa_sigaction != old_act.sa_sigaction) ++reset_count;
// Synchronous signals
- SET_SIG(SIGABRT)
+# ifndef LL_BUGSPLAT
+ SET_SIG(SIGABRT) // let bugsplat catch this
+# endif
SET_SIG(SIGALRM)
SET_SIG(SIGBUS)
SET_SIG(SIGFPE)
@@ -369,6 +349,10 @@ bool LLAppViewerMacOSX::restoreErrorTrap()
void LLAppViewerMacOSX::initCrashReporting(bool reportFreeze)
{
+#if defined LL_BUGSPLAT
+ LL_DEBUGS("InitOSX", "Bugsplat") << "using BugSplat crash logger" << LL_ENDL;
+#elif LL_SEND_CRASH_REPORTS
+ LL_DEBUGS("InitOSX") << "Initializing legacy crash logger" << LL_ENDL;
std::string command_str = "mac-crash-logger.app";
std::stringstream pid_str;
@@ -380,6 +364,9 @@ void LLAppViewerMacOSX::initCrashReporting(bool reportFreeze)
LL_WARNS() << "about to launch mac-crash-logger" << pid_str.str()
<< " " << logdir << " " << appname << LL_ENDL;
launchApplication(&command_str, &args);
+#else
+ LL_DEBUGS("InitOSX") << "No crash logger enabled" << LL_ENDL;
+#endif // ! LL_BUGSPLAT
}
std::string LLAppViewerMacOSX::generateSerialNumber()
@@ -391,7 +378,8 @@ std::string LLAppViewerMacOSX::generateSerialNumber()
CFStringRef serialNumber = NULL;
io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"));
- if (platformExpert) {
+ if (platformExpert)
+ {
serialNumber = (CFStringRef) IORegistryEntryCreateCFProperty(platformExpert,
CFSTR(kIOPlatformSerialNumberKey),
kCFAllocatorDefault, 0);
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 818e09999f..9092edb115 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -233,7 +233,7 @@ static void exceptionTerminateHandler()
long *null_ptr;
null_ptr = 0;
*null_ptr = 0xDEADBEEF; //Force an exception that will trigger breakpad.
- //LLAppViewer::handleViewerCrash();
+
// we've probably been killed-off before now, but...
gOldTerminateHandler(); // call old terminate() handler
}
@@ -494,10 +494,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
-#if LL_SEND_CRASH_REPORTS
- // ::SetUnhandledExceptionFilter(catchallCrashHandler);
-#endif
-
// Set a debug info flag to indicate if multiple instances are running.
bool found_other_instance = !create_app_mutex();
gDebugInfo["FoundOtherInstanceAtStartup"] = LLSD::Boolean(found_other_instance);
@@ -784,6 +780,13 @@ bool LLAppViewerWin32::init()
#else // LL_BUGSPLAT
#pragma message("Building with BugSplat")
// Pre BugSplat dance, make sure settings are valid, query crash behavior and then set up Bugsplat accordingly"
+ //if (!isSecondInstance())
+ //{
+ // // Cleanup previous session
+ // std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "bugsplat.log");
+ // LLFile::remove(log_file, ENOENT);
+ //}
+
success = LLAppViewer::init();
if (!success)
return false;
@@ -812,7 +815,7 @@ bool LLAppViewerWin32::init()
llifstream inf(build_data_fname.c_str());
if (! inf.is_open())
{
- LL_WARNS() << "Can't initialize BugSplat, can't read '" << build_data_fname
+ LL_WARNS("BUGSPLAT") << "Can't initialize BugSplat, can't read '" << build_data_fname
<< "'" << LL_ENDL;
}
else
@@ -822,7 +825,7 @@ bool LLAppViewerWin32::init()
if (! reader.parse(inf, build_data, false)) // don't collect comments
{
// gah, the typo is baked into Json::Reader API
- LL_WARNS() << "Can't initialize BugSplat, can't parse '" << build_data_fname
+ LL_WARNS("BUGSPLAT") << "Can't initialize BugSplat, can't parse '" << build_data_fname
<< "': " << reader.getFormatedErrorMessages() << LL_ENDL;
}
else
@@ -830,7 +833,7 @@ bool LLAppViewerWin32::init()
Json::Value BugSplat_DB = build_data["BugSplat DB"];
if (! BugSplat_DB)
{
- LL_WARNS() << "Can't initialize BugSplat, no 'BugSplat DB' entry in '"
+ LL_WARNS("BUGSPLAT") << "Can't initialize BugSplat, no 'BugSplat DB' entry in '"
<< build_data_fname << "'" << LL_ENDL;
}
else
@@ -841,31 +844,40 @@ bool LLAppViewerWin32::init()
LL_VIEWER_VERSION_PATCH << '.' <<
LL_VIEWER_VERSION_BUILD));
- // have to convert normal wide strings to strings of __wchar_t
-
// Set up Bugsplat to ask or always send
+ //DWORD dwFlags = MDSF_NONINTERACTIVE | // automatically submit report without prompting
+ // MDSF_PREVENTHIJACKING; // disallow swiping Exception filter
+ DWORD dwFlags = dwAsk |
+ MDSF_PREVENTHIJACKING; // disallow swiping Exception filter
+ //
- // sBugSplatSender = new MiniDmpSender(
- // WCSTR(BugSplat_DB.asString()),
- // WCSTR(LL_TO_WSTRING(LL_VIEWER_CHANNEL)),
- // WCSTR(version_string),
- // nullptr, // szAppIdentifier -- set later
- // MDSF_NONINTERACTIVE | // automatically submit report without prompting
- // MDSF_PREVENTHIJACKING); // disallow swiping Exception filter
-
+ //bool needs_log_file = !isSecondInstance() && debugLoggingEnabled("BUGSPLAT");
+ //if (needs_log_file)
+ //{
+ // // Startup only!
+ // LL_INFOS("BUGSPLAT") << "Engaged BugSplat logging to bugsplat.log" << LL_ENDL;
+ // dwFlags |= MDSF_LOGFILE | MDSF_LOG_VERBOSE;
+ //}
+
+ // have to convert normal wide strings to strings of __wchar_t
sBugSplatSender = new MiniDmpSender(
WCSTR(BugSplat_DB.asString()),
WCSTR(LL_TO_WSTRING(LL_VIEWER_CHANNEL)),
WCSTR(version_string),
nullptr, // szAppIdentifier -- set later
- dwAsk |
- MDSF_PREVENTHIJACKING); // disallow swiping Exception filter
- //
+ dwFlags);
sBugSplatSender->setCallback(bugsplatSendLog);
+ //if (needs_log_file)
+ //{
+ // // Log file will be created in %TEMP%, but it will be moved into logs folder in case of crash
+ // std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "bugsplat.log");
+ // sBugSplatSender->setLogFilePath(WCSTR(log_file));
+ //}
+
// engage stringize() overload that converts from wstring
- LL_INFOS() << "Engaged BugSplat(" << LL_TO_STRING(LL_VIEWER_CHANNEL)
+ LL_INFOS("BUGSPLAT") << "Engaged BugSplat(" << LL_TO_STRING(LL_VIEWER_CHANNEL)
<< ' ' << stringize(version_string) << ')' << LL_ENDL;
} // got BugSplat_DB
} // parsed build_data.json
@@ -899,6 +911,16 @@ bool LLAppViewerWin32::cleanup()
return result;
}
+void LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo)
+{
+#if defined(LL_BUGSPLAT)
+ if (sBugSplatSender)
+ {
+ sBugSplatSender->createReport((EXCEPTION_POINTERS*)pExcepInfo);
+ }
+#endif // LL_BUGSPLAT
+}
+
void LLAppViewerWin32::initLoggingAndGetLastDuration()
{
LLAppViewer::initLoggingAndGetLastDuration();
@@ -1040,8 +1062,7 @@ bool LLAppViewerWin32::beingDebugged()
bool LLAppViewerWin32::restoreErrorTrap()
{
- return true;
- //return LLWinDebug::checkExceptionHandler();
+ return true; // we don't check for handler collisions on windows, so just say they're ok
}
void LLAppViewerWin32::initCrashReporting(bool reportFreeze)
@@ -1238,7 +1259,10 @@ DWORD WINAPI purgeThread( LPVOID lpParameter )
::FindClose( hFindHandle );
for( auto dir : vctDirs )
+ {
+ LL_INFOS("CachePurge") << "Removing an old cache" << LL_ENDL;
deleteCacheDirectory( dir );
+ }
return 0;
}
diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h
index 9f0b6aaf95..ca271af7a0 100644
--- a/indra/newview/llappviewerwin32.h
+++ b/indra/newview/llappviewerwin32.h
@@ -40,20 +40,22 @@ public:
//
// Main application logic
//
- virtual bool init(); // Override to do application initialization
- virtual bool cleanup();
+ bool init() override; // Override to do application initialization
+ bool cleanup() override;
+
+ void reportCrashToBugsplat(void* pExcepInfo) override;
protected:
- virtual void initLoggingAndGetLastDuration(); // Override to clean stack_trace info.
- virtual void initConsole(); // Initialize OS level debugging console.
- virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware.
- virtual bool initParseCommandLine(LLCommandLineParser& clp);
+ void initLoggingAndGetLastDuration() override; // Override to clean stack_trace info.
+ void initConsole() override; // Initialize OS level debugging console.
+ bool initHardwareTest() override; // Win32 uses DX9 to test hardware.
+ bool initParseCommandLine(LLCommandLineParser& clp) override;
- virtual bool beingDebugged();
- virtual bool restoreErrorTrap();
- virtual void initCrashReporting(bool reportFreeze);
+ bool beingDebugged() override;
+ bool restoreErrorTrap() override;
+ void initCrashReporting(bool reportFreeze) override;
- virtual bool sendURLToOtherInstance(const std::string& url);
+ bool sendURLToOtherInstance(const std::string& url) override;
std::string generateSerialNumber();
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 910a4eda86..cdf063af2d 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -867,6 +867,14 @@ void LLAvatarActions::csr(const LLUUID& id, std::string name)
//static
void LLAvatarActions::share(const LLUUID& id)
{
+// [RLVa:KB] - @share
+ if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(id)) )
+ {
+ RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Share, LLSD().with("RECIPIENT", id));
+ return;
+ }
+// [/RLVa:KB]
+
// FIRE-8804: Prevent opening inventory from using share in radar context menu
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWINV))
{
@@ -1120,10 +1128,34 @@ namespace action_give_inventory
* @param avatar_names - avatar names request to be sent.
* @param avatar_uuids - avatar names request to be sent.
*/
- static void give_inventory(const uuid_vec_t& avatar_uuids, const std::vector avatar_names, LLInventoryPanel* panel = NULL)
+// static void give_inventory(const uuid_vec_t& avatar_uuids, const std::vector avatar_names, LLInventoryPanel* panel = NULL)
+// [RLVa:KB] - @share
+ static void give_inventory(uuid_vec_t avatar_uuids, std::vector avatar_names, LLInventoryPanel* panel = NULL)
+// [/RLVa:KB]
{
llassert(avatar_names.size() == avatar_uuids.size());
+// [RLVa:KB] - @share
+ if ( (RlvActions::isRlvEnabled()) && (RlvActions::hasBehaviour(RLV_BHVR_SHARE)) )
+ {
+ for (int idxAvatar = avatar_uuids.size() - 1; idxAvatar >= 0; idxAvatar--)
+ {
+ if (!RlvActions::canGiveInventory(avatar_uuids[idxAvatar]))
+ {
+ RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Share, LLSD().with("RECIPIENT", LLSLURL("agent", avatar_uuids[idxAvatar], "completename").getSLURLString()));
+
+ avatar_uuids.erase(avatar_uuids.begin() + idxAvatar);
+ avatar_names.erase(avatar_names.begin() + idxAvatar);
+ }
+ }
+ }
+
+ if (avatar_uuids.empty())
+ {
+ return;
+ }
+// [/RLVa:KB]
+
const std::set inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs(panel);
if (inventory_selected_uuids.empty())
{
@@ -1249,6 +1281,14 @@ std::set LLAvatarActions::getInventorySelectedUUIDs(LLInventoryPanel* ac
//static
void LLAvatarActions::shareWithAvatars(LLView * panel)
{
+// [RLVa:KB] - @share
+ if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory()) )
+ {
+ RlvUtil::notifyBlocked(RlvStringKeys::Blocked::ShareGeneric);
+ return;
+ }
+// [/RLVa:KB]
+
using namespace action_give_inventory;
LLFloater* root_floater = gFloaterView->getParentFloater(panel);
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index 49b07a0ac7..07cdecf920 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -449,7 +449,7 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren
bool LLFloaterCompileQueue::processScript(LLHandle hfloater,
const LLPointer &object, LLInventoryObject* inventory, LLEventPump &pump)
{
- if (LLApp::isQuitting())
+ if (LLApp::isExiting())
{
// Reply from coroutine came on shutdown
// We are quiting, don't start any more coroutines!
diff --git a/indra/newview/lldelayedgestureerror.cpp b/indra/newview/lldelayedgestureerror.cpp
index ef1b644ad4..934a38bb8e 100644
--- a/indra/newview/lldelayedgestureerror.cpp
+++ b/indra/newview/lldelayedgestureerror.cpp
@@ -113,7 +113,7 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)
}
}
- if(!LLApp::isQuitting())
+ if(!LLApp::isExiting())
{
LLNotificationsUtil::add(ent.mNotifyName, args);
}
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 6122000989..991fb813bb 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -1110,7 +1110,7 @@ void LLEnvironment::onRegionChange()
}
if (!cur_region->capabilitiesReceived())
{
- cur_region->setCapabilitiesReceivedCallback([](const LLUUID ®ion_id) { LLEnvironment::instance().requestRegion(); });
+ cur_region->setCapabilitiesReceivedCallback([](const LLUUID ®ion_id, LLViewerRegion* regionp) { LLEnvironment::instance().requestRegion(); });
return;
}
requestRegion();
@@ -1242,9 +1242,38 @@ void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, LLEnvironm
}
else if (!environment->getSky())
{
- LL_DEBUGS("ENVIRONMENT") << "Blank sky for " << env_selection_to_string(env) << ". Reusing environment for sky." << LL_ENDL;
- environment->setSky(mCurrentEnvironment->getSky());
- environment->setFlags(DayInstance::NO_ANIMATE_SKY);
+ if (mCurrentEnvironment->getEnvironmentSelection() != ENV_NONE)
+ {
+ // Note: This looks suspicious. Shouldn't we assign whole day if mCurrentEnvironment has whole day?
+ // and then add water/sky on top
+ // This looks like it will result in sky using single keyframe instead of whole day if day is present
+ // when setting static water without static sky
+ environment->setSky(mCurrentEnvironment->getSky());
+ environment->setFlags(DayInstance::NO_ANIMATE_SKY);
+ }
+ else
+ {
+ // Environment is not properly initialized yet, but we should have environment by this point
+ DayInstance::ptr_t substitute = getEnvironmentInstance(ENV_PARCEL, true);
+ if (!substitute || !substitute->getSky())
+ {
+ substitute = getEnvironmentInstance(ENV_REGION, true);
+ }
+ if (!substitute || !substitute->getSky())
+ {
+ substitute = getEnvironmentInstance(ENV_DEFAULT, true);
+ }
+
+ if (substitute && substitute->getSky())
+ {
+ environment->setSky(substitute->getSky());
+ environment->setFlags(DayInstance::NO_ANIMATE_SKY);
+ }
+ else
+ {
+ LL_WARNS("ENVIRONMENT") << "Failed to assign substitute water/sky, environment is not properly initialized" << LL_ENDL;
+ }
+ }
}
if (fixed.second)
@@ -1255,9 +1284,38 @@ void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, LLEnvironm
}
else if (!environment->getWater())
{
- LL_DEBUGS("ENVIRONMENT") << "Blank water for " << env_selection_to_string(env) << ". Reusing environment for water." << LL_ENDL;
- environment->setWater(mCurrentEnvironment->getWater());
- environment->setFlags(DayInstance::NO_ANIMATE_WATER);
+ if (mCurrentEnvironment->getEnvironmentSelection() != ENV_NONE)
+ {
+ // Note: This looks suspicious. Shouldn't we assign whole day if mCurrentEnvironment has whole day?
+ // and then add water/sky on top
+ // This looks like it will result in water using single keyframe instead of whole day if day is present
+ // when setting static sky without static water
+ environment->setWater(mCurrentEnvironment->getWater());
+ environment->setFlags(DayInstance::NO_ANIMATE_WATER);
+ }
+ else
+ {
+ // Environment is not properly initialized yet, but we should have environment by this point
+ DayInstance::ptr_t substitute = getEnvironmentInstance(ENV_PARCEL, true);
+ if (!substitute || !substitute->getWater())
+ {
+ substitute = getEnvironmentInstance(ENV_REGION, true);
+ }
+ if (!substitute || !substitute->getWater())
+ {
+ substitute = getEnvironmentInstance(ENV_DEFAULT, true);
+ }
+
+ if (substitute && substitute->getWater())
+ {
+ environment->setWater(substitute->getWater());
+ environment->setFlags(DayInstance::NO_ANIMATE_WATER);
+ }
+ else
+ {
+ LL_WARNS("ENVIRONMENT") << "Failed to assign substitute water/sky, environment is not properly initialized" << LL_ENDL;
+ }
+ }
}
if (!mSignalEnvChanged.empty())
@@ -1824,8 +1882,11 @@ void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentI
}
else
{
- setEnvironment(ENV_REGION, envinfo->mDayCycle, envinfo->mDayLength, envinfo->mDayOffset, envinfo->mEnvVersion);
mTrackAltitudes = envinfo->mAltitudes;
+ // update track selection based on new altitudes
+ mCurrentTrack = calculateSkyTrackForAltitude(gAgent.getPositionAgent().mV[VZ]);
+
+ setEnvironment(ENV_REGION, envinfo->mDayCycle, envinfo->mDayLength, envinfo->mDayOffset, envinfo->mEnvVersion);
}
LL_DEBUGS("ENVIRONMENT") << "Altitudes set to {" << mTrackAltitudes[0] << ", "<< mTrackAltitudes[1] << ", " << mTrackAltitudes[2] << ", " << mTrackAltitudes[3] << LL_ENDL;
@@ -2461,6 +2522,15 @@ void LLEnvironment::onAgentPositionHasChanged(const LLVector3 &localpos)
return;
mCurrentTrack = trackno;
+
+ LLViewerRegion* cur_region = gAgent.getRegion();
+ if (!cur_region || !cur_region->capabilitiesReceived())
+ {
+ // Environment not ready, environment will be updated later, don't cause 'blend' yet.
+ // But keep mCurrentTrack updated in case we won't get new altitudes for some reason
+ return;
+ }
+
for (S32 env = ENV_LOCAL; env < ENV_DEFAULT; ++env)
{
if (mEnvironments[env])
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 2e5fff5589..d3c051c6cc 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -239,6 +239,7 @@ void LLFloaterAbout::fetchServerReleaseNotesCoro(std::string cap_url)
httpOpts->setWantHeaders(true);
httpOpts->setFollowRedirects(false);
+ httpOpts->setSSLVerifyPeer(false); // We want this data even if SSL verification fails
LLSD result = httpAdapter->getAndSuspend(httpRequest, cap_url, httpOpts);
diff --git a/indra/newview/llfloatercreatelandmark.cpp b/indra/newview/llfloatercreatelandmark.cpp
index eb93a6a75a..588f72e85b 100644
--- a/indra/newview/llfloatercreatelandmark.cpp
+++ b/indra/newview/llfloatercreatelandmark.cpp
@@ -160,16 +160,9 @@ void LLFloaterCreateLandmark::populateFoldersList(const LLUUID &folder_id)
mFolderCombo->removeall();
// Put the "My Favorites" folder first in list.
- LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
- LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
- if (!favorites_cat)
- {
- LL_WARNS() << "Cannot find the favorites folder" << LL_ENDL;
- }
- else
- {
- mFolderCombo->add(getString("favorites_bar"), favorites_cat->getUUID());
- }
+ // Code moved below because of:
+ // FIRE-31031 New Create Landmark Floater: Default to Landmarks Folder
+ //
// Add the "Landmarks" category.
const LLViewerInventoryCategory* lmcat = gInventory.getCategory(mLandmarksID);
@@ -183,6 +176,19 @@ void LLFloaterCreateLandmark::populateFoldersList(const LLUUID &folder_id)
mFolderCombo->add(cat_full_name, lmcat->getUUID());
}
+ // FIRE-31031 New Create Landmark Floater: Default to Landmarks Folder
+ LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
+ if (!favorites_cat)
+ {
+ LL_WARNS() << "Cannot find the favorites folder" << LL_ENDL;
+ }
+ else
+ {
+ mFolderCombo->add(getString("favorites_bar"), favorites_cat->getUUID());
+ }
+ //
+
typedef std::vector folder_vec_t;
folder_vec_t folders;
// Sort the folders by their full name.
@@ -320,4 +326,4 @@ void LLFloaterCreateLandmark::setItem(const uuid_set_t& items)
}
}
}
-}
\ No newline at end of file
+}
diff --git a/indra/newview/llfloatereditenvironmentbase.cpp b/indra/newview/llfloatereditenvironmentbase.cpp
index 1d28921878..2850951668 100644
--- a/indra/newview/llfloatereditenvironmentbase.cpp
+++ b/indra/newview/llfloatereditenvironmentbase.cpp
@@ -262,7 +262,7 @@ void LLFloaterEditEnvironmentBase::onSaveAsCommit(const LLSD& notification, cons
{
const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
LLUUID parent_id = mInventoryItem->getParentUUID();
- if ((marketplacelistings_id == parent_id) || gInventory.isObjectDescendentOf(mInventoryItem->getUUID(), gInventory.getLibraryRootFolderID()))
+ if (marketplacelistings_id == parent_id || gInventory.isObjectDescendentOf(mInventoryItem->getUUID(), gInventory.getLibraryRootFolderID()))
{
parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SETTINGS);
}
diff --git a/indra/newview/llfloaterexperienceprofile.cpp b/indra/newview/llfloaterexperienceprofile.cpp
index 8c414ecde9..33bf76ee21 100644
--- a/indra/newview/llfloaterexperienceprofile.cpp
+++ b/indra/newview/llfloaterexperienceprofile.cpp
@@ -211,6 +211,20 @@ bool LLFloaterExperienceProfile::experiencePermission( LLHandlesetSSLVerifyPeer(false); // We want this data even if SSL fails
httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML);
std::string url = gSavedSettings.getString("GridStatusRSS");
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index 701b057383..5d0d77d87e 100644
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -348,6 +348,7 @@ void LLFloaterInspect::refresh()
LLResMgr& res_mgr = LLResMgr::instance();
LLSelectMgr& sel_mgr = LLSelectMgr::instance();
S32 fcount = 0;
+ S32 fcount_visible = 0;
S32 tcount = 0;
S32 vcount = 0;
S32 objcount = 0;
@@ -383,6 +384,7 @@ void LLFloaterInspect::refresh()
LLSelectNode* obj = *iter;
LLSD row;
std::string owner_name, creator_name;
+ auto vobj{obj->getObject()};
if (obj->mCreationDate == 0)
{ // Don't have valid information from the server, so skip this one
@@ -462,12 +464,12 @@ void LLFloaterInspect::refresh()
mCreatorNameCacheConnection = LLAvatarNameCache::get(idCreator, boost::bind(&LLFloaterInspect::onGetCreatorNameCallback, this));
}
- row["id"] = obj->getObject()->getID();
+ row["id"] = vobj->getID();
row["columns"][0]["column"] = "object_name";
row["columns"][0]["type"] = "text";
// make sure we're either at the top of the link chain
// or top of the editable chain, for attachments
- if(!(obj->getObject()->isRoot() || obj->getObject()->isRootEdit()))
+ if(!(vobj->isRoot() || vobj->isRootEdit()))
{
row["columns"][0]["value"] = std::string(" ") + obj->mName;
}
@@ -495,17 +497,17 @@ void LLFloaterInspect::refresh()
row["columns"][5]["value"] = llformat("%d", timestamp);
//
// PoundLife - Improved Object Inspect
- res_mgr.getIntegerString(format_res_string, obj->getObject()->getNumFaces());
+ res_mgr.getIntegerString(format_res_string, vobj->getNumFaces());
row["columns"][6]["column"] = "facecount";
row["columns"][6]["type"] = "text";
row["columns"][6]["value"] = format_res_string;
- res_mgr.getIntegerString(format_res_string, obj->getObject()->getNumVertices());
+ res_mgr.getIntegerString(format_res_string, vobj->getNumVertices());
row["columns"][7]["column"] = "vertexcount";
row["columns"][7]["type"] = "text";
row["columns"][7]["value"] = format_res_string;
- res_mgr.getIntegerString(format_res_string, obj->getObject()->getNumIndices() / 3);
+ res_mgr.getIntegerString(format_res_string, vobj->getNumIndices() / 3);
row["columns"][8]["column"] = "trianglecount";
row["columns"][8]["type"] = "text";
row["columns"][8]["value"] = format_res_string;
@@ -513,7 +515,7 @@ void LLFloaterInspect::refresh()
// Poundlife - Get VRAM
U32 texture_memory = 0;
U32 vram_memory = 0;
- getObjectTextureMemory(obj->getObject(), texture_memory, vram_memory);
+ getObjectTextureMemory(vobj, texture_memory, vram_memory);
res_mgr.getIntegerString(format_res_string, texture_memory / 1024);
row["columns"][9]["column"] = "tramcount";
row["columns"][9]["type"] = "text";
@@ -526,15 +528,15 @@ void LLFloaterInspect::refresh()
row["columns"][11]["column"] = "facecount_sort";
row["columns"][11]["type"] = "text";
- row["columns"][11]["value"] = LLSD::Integer(obj->getObject()->getNumFaces());
+ row["columns"][11]["value"] = LLSD::Integer(vobj->getNumFaces());
row["columns"][12]["column"] = "vertexcount_sort";
row["columns"][12]["type"] = "text";
- row["columns"][12]["value"] = LLSD::Integer(obj->getObject()->getNumVertices());
+ row["columns"][12]["value"] = LLSD::Integer(vobj->getNumVertices());
row["columns"][13]["column"] = "trianglecount_sort";
row["columns"][13]["type"] = "text";
- row["columns"][13]["value"] = LLSD::Integer(obj->getObject()->getNumIndices() / 3);
+ row["columns"][13]["value"] = LLSD::Integer(vobj->getNumIndices() / 3);
row["columns"][14]["column"] = "tramcount_sort";
row["columns"][14]["type"] = "text";
@@ -546,9 +548,11 @@ void LLFloaterInspect::refresh()
primcount = sel_mgr.getSelection()->getObjectCount();
objcount = sel_mgr.getSelection()->getRootObjectCount();
- fcount += obj->getObject()->getNumFaces();
- tcount += obj->getObject()->getNumIndices() / 3;
- vcount += obj->getObject()->getNumVertices();
+ fcount += vobj->getNumFaces();
+ fcount_visible += vobj->getNumVisibleFaces();
+ tcount += vobj->getNumIndices() / 3;
+ vcount += vobj->getNumVertices();
+
// PoundLife - END
mObjectList->addElement(row, ADD_TOP);
}
@@ -613,6 +617,8 @@ void LLFloaterInspect::refresh()
args["NUM_OBJECTS"] = format_res_string;
res_mgr.getIntegerString(format_res_string, primcount);
args["NUM_PRIMS"] = format_res_string;
+ res_mgr.getIntegerString(format_res_string, fcount_visible);
+ args["NUM_VISIBLE_FACES"] = format_res_string;
res_mgr.getIntegerString(format_res_string, fcount);
args["NUM_FACES"] = format_res_string;
res_mgr.getIntegerString(format_res_string, vcount);
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 78ab6ae055..edd3a57595 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -1142,7 +1142,7 @@ void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)
// FIRE-30963 Support pre-defined physics shapes (initially cube)
// S32 which_lod = num_lods - which_mode;
// sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
- if(which_mode >= num_lods)
+ if(which_mode > num_lods)
{
// which_mode is between the last LOD entry and file selection
// so it is a preset
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index f2efef0c33..63bce3d2eb 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -122,8 +122,7 @@ void LLFloaterURLEntry::headerFetchComplete(S32 status, const std::string& mime_
}
}
- // Decrement the cursor
- getWindow()->decBusyCount();
+
getChildView("loading_label")->setVisible( false);
closeFloater();
}
@@ -302,3 +301,9 @@ bool LLFloaterURLEntry::callback_clear_url_list(const LLSD& notification, const
}
return false;
}
+
+void LLFloaterURLEntry::onClose( bool app_quitting )
+{
+ // Decrement the cursor
+ getWindow()->decBusyCount();
+}
diff --git a/indra/newview/llfloaterurlentry.h b/indra/newview/llfloaterurlentry.h
index 20f4604907..04a8eca069 100644
--- a/indra/newview/llfloaterurlentry.h
+++ b/indra/newview/llfloaterurlentry.h
@@ -42,6 +42,7 @@ public:
// that panel via the handle.
static LLHandle show(LLHandle panel_land_media_handle, const std::string media_url);
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose( bool app_quitting );
void headerFetchComplete(S32 status, const std::string& mime_type);
bool addURLToCombobox(const std::string& media_url);
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index 6966be90ce..c1563ac89f 100644
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -49,6 +49,7 @@
#include "llvoavatarself.h"
// [RLVa:KB] - Checked: RLVa-1.2.2
#include "llavatarnamecache.h"
+#include "llslurl.h"
#include "rlvactions.h"
#include "rlvcommon.h"
#include "rlvui.h"
@@ -201,7 +202,10 @@ bool LLGiveInventory::doGiveInventoryItem(const LLUUID& to_agent,
if (item->getPermissions().allowCopyBy(gAgentID))
{
// just give it away.
- LLGiveInventory::commitGiveInventoryItem(to_agent, item, im_session_id);
+// [RLVa:KB] - @share
+ res = LLGiveInventory::commitGiveInventoryItem(to_agent, item, im_session_id);
+// [/RLVa:KB]
+// LLGiveInventory::commitGiveInventoryItem(to_agent, item, im_session_id);
}
else
{
@@ -376,6 +380,14 @@ bool LLGiveInventory::handleCopyProtectedItem(const LLSD& notification, const LL
switch(option)
{
case 0: // "Yes"
+// [RLVa:KB] - @share
+ if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(notification["payload"]["agent_id"].asUUID())) )
+ {
+ RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Share, LLSD().with("RECIPIENT", LLSLURL("agent", notification["payload"]["agent_id"], "completename").getSLURLString()));
+ return false;
+ }
+// [/RLVa:KB]
+
for (LLSD::array_iterator it = itmes.beginArray(); it != itmes.endArray(); it++)
{
item = gInventory.getItem((*it).asUUID());
@@ -409,11 +421,24 @@ bool LLGiveInventory::handleCopyProtectedItem(const LLSD& notification, const LL
}
// static
-void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent,
+//void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent,
+// const LLInventoryItem* item,
+// const LLUUID& im_session_id)
+// [RLVa:KB] - @share
+bool LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent,
const LLInventoryItem* item,
const LLUUID& im_session_id)
+// [/RLVa:KB]
{
- if (!item) return;
+// if (!item) return;
+// [RLVa:KB] - @share
+ if (!item) return false;
+ if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(to_agent)) )
+ {
+ return false;
+ }
+// [/RLVa:KB]
+
std::string name;
std::string item_name = item->getName();
LLAgentUI::buildFullname(name);
@@ -467,6 +492,7 @@ void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent,
{
LLRecentPeople::instance().add(to_agent);
}
+ return true;
// [/RLVa:KB]
}
@@ -482,6 +508,14 @@ bool LLGiveInventory::handleCopyProtectedCategory(const LLSD& notification, cons
cat = gInventory.getCategory(notification["payload"]["folder_id"].asUUID());
if (cat)
{
+// [RLVa:KB] - @share
+ if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(notification["payload"]["agent_id"].asUUID())) )
+ {
+ RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Share, LLSD().with("RECIPIENT", LLSLURL("agent", notification["payload"]["agent_id"], "completename").getSLURLString()));
+ return false;
+ }
+// [/RLVa:KB]
+
give_successful = LLGiveInventory::commitGiveInventoryCategory(notification["payload"]["agent_id"].asUUID(),
cat);
LLViewerInventoryCategory::cat_array_t cats;
@@ -529,6 +563,13 @@ bool LLGiveInventory::commitGiveInventoryCategory(const LLUUID& to_agent,
{
return false;
}
+// [RLVa:KB] - @share
+ if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(to_agent)) )
+ {
+ return false;
+ }
+// [/RLVa:KB]
+
LL_INFOS() << "LLGiveInventory::commitGiveInventoryCategory() - "
<< cat->getUUID() << LL_ENDL;
diff --git a/indra/newview/llgiveinventory.h b/indra/newview/llgiveinventory.h
index 20e6df76e5..86919f9010 100644
--- a/indra/newview/llgiveinventory.h
+++ b/indra/newview/llgiveinventory.h
@@ -82,9 +82,14 @@ private:
const std::string& item_name = std::string(),
bool is_folder = false);
- static void commitGiveInventoryItem(const LLUUID& to_agent,
+// [RLVa:KB] - @share
+ static bool commitGiveInventoryItem(const LLUUID& to_agent,
const LLInventoryItem* item,
const LLUUID &im_session_id = LLUUID::null);
+// [/RLVa:KB]
+// static void commitGiveInventoryItem(const LLUUID& to_agent,
+// const LLInventoryItem* item,
+// const LLUUID &im_session_id = LLUUID::null);
// give inventory category functionality
static bool handleCopyProtectedCategory(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 4d8e4b8866..f65485d161 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -78,13 +78,11 @@ const F32 PARCEL_POST_HEIGHT = 0.666f;
// Returns true if you got at least one object
void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
{
-// [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c
+// [RLVa:KB] - @edit* and @interact
// Block rectangle selection if:
- // - prevented from editing and no exceptions are set (see below for the case where exceptions are set)
+ // - prevented from editing anything at all
// - prevented from interacting at all
- if ( (rlv_handler_t::isEnabled()) &&
- ( ((gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (!gRlvHandler.hasException(RLV_BHVR_EDIT))) ||
- (gRlvHandler.hasBehaviour(RLV_BHVR_INTERACT)) ) )
+ if (RlvActions::isRlvEnabled() && (RlvActions::canEdit(ERlvCheckType::Nothing) || RlvActions::hasBehaviour(RLV_BHVR_INTERACT)) )
{
return;
}
diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index 9c27269beb..d180b20267 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -106,10 +106,8 @@ LLHUDNameTag::LLHUDNameTag(const U8 type)
LLPointer ptr(this);
sTextObjects.insert(ptr);
- // Performance improvement
- mRoundedRectImg = LLUI::getUIImage("Rounded_Rect");
- mRoundedRectTopImg = LLUI::getUIImage("Rounded_Rect_Top");
- //
+ mRoundedRectImgp = LLUI::getUIImage("Rounded_Rect");
+ mRoundedRectTopImgp = LLUI::getUIImage("Rounded_Rect_Top");
}
LLHUDNameTag::~LLHUDNameTag()
@@ -279,10 +277,6 @@ void LLHUDNameTag::renderText(BOOL for_select)
mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
- // *TODO: cache this image
- // Performance improvement
- //LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Rect");
-
// *TODO: make this a per-text setting
//LLColor4 bg_color = LLUIColorTable::instance().getColor("NameTagBackground");
//bg_color.setAlpha(gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor);
@@ -319,14 +313,9 @@ void LLHUDNameTag::renderText(BOOL for_select)
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
LLRect screen_rect;
screen_rect.setCenterAndSize(0, static_cast(lltrunc(-mHeight / 2 + mOffsetY)), static_cast(lltrunc(mWidth)), static_cast(lltrunc(mHeight)));
- // Performance improvement
- //imagep->draw3D(render_position, x_pixel_vec, y_pixel_vec, screen_rect, bg_color);
- mRoundedRectImg->draw3D(render_position, x_pixel_vec, y_pixel_vec, screen_rect, bg_color);
- //
+ mRoundedRectImgp->draw3D(render_position, x_pixel_vec, y_pixel_vec, screen_rect, bg_color);
if (mLabelSegments.size())
{
- // Performance improvement
- //LLUIImagePtr rect_top_image = LLUI::getUIImage("Rounded_Rect_Top");
LLRect label_top_rect = screen_rect;
const S32 label_height = ll_round((mFontp->getLineHeight() * (F32)mLabelSegments.size() + (VERTICAL_PADDING / 3.f)));
label_top_rect.mBottom = label_top_rect.mTop - label_height;
@@ -336,10 +325,7 @@ void LLHUDNameTag::renderText(BOOL for_select)
label_top_color.mV[VALPHA] = color_alpha;
//
- // Performance improvement
- //rect_top_image->draw3D(render_position, x_pixel_vec, y_pixel_vec, label_top_rect, label_top_color);
- mRoundedRectTopImg->draw3D(render_position, x_pixel_vec, y_pixel_vec, label_top_rect, label_top_color);
- //
+ mRoundedRectTopImgp->draw3D(render_position, x_pixel_vec, y_pixel_vec, label_top_rect, label_top_color);
}
F32 y_offset = (F32)mOffsetY;
diff --git a/indra/newview/llhudnametag.h b/indra/newview/llhudnametag.h
index f41a06d280..7577dd5de6 100644
--- a/indra/newview/llhudnametag.h
+++ b/indra/newview/llhudnametag.h
@@ -40,10 +40,8 @@
#include
#include
-#include "lluiimage.h"
-
-class LLDrawable;
class LLHUDNameTag;
+class LLUIImage;
struct llhudnametag_further_away
{
@@ -173,6 +171,8 @@ private:
EVertAlignment mVertAlignment;
S32 mLOD;
BOOL mHidden;
+ LLPointer mRoundedRectImgp;
+ LLPointer mRoundedRectTopImgp;
static BOOL sDisplayText ;
static std::set > sTextObjects;
@@ -180,11 +180,6 @@ private:
// static std::vector > sVisibleHUDTextObjects;
typedef std::set >::iterator TextObjectIterator;
typedef std::vector >::iterator VisibleTextObjectIterator;
-
- // Performance improvement
- LLUIImagePtr mRoundedRectImg;
- LLUIImagePtr mRoundedRectTopImg;
- //
};
#endif
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index f833e888ea..ef1897ae30 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -148,10 +148,6 @@ void LLHUDText::renderText()
mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
- // *TODO: cache this image
- // Performance improvement
- //LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
-
// *TODO: make this a per-text setting
// Performance improvement
//LLColor4 bg_color = LLUIColorTable::instance().getColor("ObjectBubbleColor");
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 90dcb751eb..3b571ac75a 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -4367,7 +4367,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
const LLUUID &favorites = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
const LLUUID &marketplace_listings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
- const LLUUID &outfits_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false); // Fix "outfits" context menu
+ const LLUUID &outfits_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
// FIRE-11628: Option to delete broken links from AO folder
if (mUUID == AOEngine::instance().getAOFolder())
@@ -4375,7 +4375,9 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
items.push_back(std::string("Cleanup broken Links"));
}
//
+
// Fix "outfits" context menu
+ //if (outfits_id == mUUID)
if (model->isObjectDescendentOf(mUUID, outfits_id) && getCategory() &&
(getCategory()->getPreferredType() == LLFolderType::FT_NONE ||
getCategory()->getPreferredType() == LLFolderType::FT_MY_OUTFITS))
@@ -4383,6 +4385,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
items.push_back(std::string("New Outfit"));
}
//
+
if (lost_and_found_id == mUUID)
{
// This is the lost+found folder.
@@ -4484,7 +4487,8 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
// Not sure what the right thing is to do here.
if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT))
{
- if (!isInboxFolder()) // don't allow creation in inbox
+ if (!isInboxFolder() // don't allow creation in inbox
+ && outfits_id != mUUID)
{
// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
@@ -6565,6 +6569,19 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
BOOL rv = FALSE;
if(item)
{
+// [RLVa:KB] - @share
+ if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(item->getCreatorUUID())) )
+ {
+ if (drop)
+ {
+ RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Share, LLSD().with("RECIPIENT", LLSLURL("agent", item->getCreatorUUID(), "completename").getSLURLString()));
+ }
+ // We should return false but our caller uses the return value as both 'will accept' *and* 'was handled' so
+ // returning false will result in the dropped item being moved when it is blocked.
+ return true;
+ }
+// [/RLVa:KB]
+
// check the type
switch(cargo_type)
{
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index c67c7e49f1..d2715a008c 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -893,11 +893,13 @@ void show_item_original(const LLUUID& item_uuid)
LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel("inventory");
if (sidepanel_inventory)
{
- LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
- if (main_inventory)
- {
- main_inventory->resetFilters();
- }
+ // FIRE-31037: "Recent" inventory filter gets reset when using "Show Original"
+ //LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ //if (main_inventory)
+ //{
+ // main_inventory->resetFilters();
+ //}
+ //
reset_inventory_filter();
if (!LLFloaterReg::getTypedInstance("inventory")->isInVisibleChain())
diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp
index a8c2c3ccfc..31e76267e6 100644
--- a/indra/newview/lllandmarklist.cpp
+++ b/indra/newview/lllandmarklist.cpp
@@ -74,6 +74,16 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
{
return NULL;
}
+
+ if (cb)
+ {
+ // Multiple different sources can request same landmark,
+ // mLoadedCallbackMap is a multimap that allows multiple pairs with same key
+ // Todo: this might need to be improved to not hold identical callbacks multiple times
+ loaded_callback_map_t::value_type vt(asset_uuid, cb);
+ mLoadedCallbackMap.insert(vt);
+ }
+
if ( mWaitList.find(asset_uuid) != mWaitList.end() )
{
// Landmark is sheduled for download, but not requested yet
@@ -89,12 +99,6 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
return NULL;
}
}
-
- if (cb)
- {
- loaded_callback_map_t::value_type vt(asset_uuid, cb);
- mLoadedCallbackMap.insert(vt);
- }
if (mRequestedList.size() > MAX_SIMULTANEOUS_REQUESTS)
{
@@ -131,37 +135,49 @@ void LLLandmarkList::processGetAssetReply(
LLFileSystem file(uuid, type);
S32 file_length = file.getSize();
- std::vector buffer(file_length + 1);
- file.read( (U8*)&buffer[0], file_length);
- buffer[ file_length ] = 0;
+ if (file_length > 0)
+ {
+ std::vector buffer(file_length + 1);
+ file.read((U8*)&buffer[0], file_length);
+ buffer[file_length] = 0;
- LLLandmark* landmark = LLLandmark::constructFromString(&buffer[0]);
- if (landmark)
- {
- gLandmarkList.mList[ uuid ] = landmark;
- gLandmarkList.mRequestedList.erase(uuid);
-
- LLVector3d pos;
- if(!landmark->getGlobalPos(pos))
- {
- LLUUID region_id;
- if(landmark->getRegionID(region_id))
- {
- LLLandmark::requestRegionHandle(
- gMessageSystem,
- gAgent.getRegionHost(),
- region_id,
- boost::bind(&LLLandmarkList::onRegionHandle, &gLandmarkList, uuid));
- }
+ LLLandmark* landmark = LLLandmark::constructFromString(&buffer[0], buffer.size());
+ if (landmark)
+ {
+ gLandmarkList.mList[uuid] = landmark;
+ gLandmarkList.mRequestedList.erase(uuid);
- // the callback will be called when we get the region handle.
- }
- else
- {
- gLandmarkList.makeCallbacks(uuid);
- }
- }
- else gLandmarkList.mLoadedCallbackMap.erase(uuid); // Clean up callback map
+ LLVector3d pos;
+ if (!landmark->getGlobalPos(pos))
+ {
+ LLUUID region_id;
+ if (landmark->getRegionID(region_id))
+ {
+ LLLandmark::requestRegionHandle(
+ gMessageSystem,
+ gAgent.getRegionHost(),
+ region_id,
+ boost::bind(&LLLandmarkList::onRegionHandle, &gLandmarkList, uuid));
+ }
+
+ // the callback will be called when we get the region handle.
+ }
+ else
+ {
+ gLandmarkList.makeCallbacks(uuid);
+ }
+ }
+ else
+ {
+ // failed to parse, shouldn't happen
+ gLandmarkList.eraseCallbacks(uuid);
+ }
+ }
+ else
+ {
+ // got a good status, but no file, shouldn't happen
+ gLandmarkList.eraseCallbacks(uuid);
+ }
}
else
{
@@ -179,8 +195,7 @@ void LLLandmarkList::processGetAssetReply(
gLandmarkList.mBadList.insert(uuid);
gLandmarkList.mRequestedList.erase(uuid); //mBadList effectively blocks any load, so no point keeping id in requests
- // todo: this should clean mLoadedCallbackMap!
- gLandmarkList.mLoadedCallbackMap.erase(uuid); // Clean up callback map
+ gLandmarkList.eraseCallbacks(uuid);
}
// getAssetData can fire callback immediately, causing
@@ -224,34 +239,39 @@ BOOL LLLandmarkList::assetExists(const LLUUID& asset_uuid)
void LLLandmarkList::onRegionHandle(const LLUUID& landmark_id)
{
LLLandmark* landmark = getAsset(landmark_id);
-
- if (!landmark)
- {
- LL_WARNS() << "Got region handle but the landmark not found." << LL_ENDL;
- mLoadedCallbackMap.erase(landmark_id); // Clean up callback map
- return;
- }
+ if (!landmark)
+ {
+ LL_WARNS() << "Got region handle but the landmark " << landmark_id << " not found." << LL_ENDL;
+ eraseCallbacks(landmark_id);
+ return;
+ }
// Calculate landmark global position.
// This should succeed since the region handle is available.
LLVector3d pos;
if (!landmark->getGlobalPos(pos))
{
- LL_WARNS() << "Got region handle but the landmark global position is still unknown." << LL_ENDL;
- mLoadedCallbackMap.erase(landmark_id); // Clean up callback map
- return;
+ LL_WARNS() << "Got region handle but the landmark " << landmark_id << " global position is still unknown." << LL_ENDL;
+ eraseCallbacks(landmark_id);
+ return;
}
+ // Call this even if no landmark exists to clean mLoadedCallbackMap
makeCallbacks(landmark_id);
}
+void LLLandmarkList::eraseCallbacks(const LLUUID& landmark_id)
+{
+ mLoadedCallbackMap.erase(landmark_id);
+}
+
void LLLandmarkList::makeCallbacks(const LLUUID& landmark_id)
{
LLLandmark* landmark = getAsset(landmark_id);
if (!landmark)
{
- LL_WARNS() << "Landmark to make callbacks for not found." << LL_ENDL;
+ LL_WARNS() << "Landmark " << landmark_id << " to make callbacks for not found." << LL_ENDL;
}
// make all the callbacks here.
diff --git a/indra/newview/lllandmarklist.h b/indra/newview/lllandmarklist.h
index 0e4859dbc9..f5fa958204 100644
--- a/indra/newview/lllandmarklist.h
+++ b/indra/newview/lllandmarklist.h
@@ -64,6 +64,7 @@ public:
protected:
void onRegionHandle(const LLUUID& landmark_id);
+ void eraseCallbacks(const LLUUID& landmark_id);
void makeCallbacks(const LLUUID& landmark_id);
typedef std::map landmark_list_t;
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 3f33aad867..b0baeb0ca6 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -31,6 +31,7 @@
#include "lluictrl.h"
#include "llframetimer.h"
+#include "llnotificationptr.h"
class LLViewBorder;
class LLUICtrlFactory;
@@ -145,7 +146,7 @@ public:
void setTextureSize(S32 width, S32 height);
- void showNotification(boost::shared_ptr notify);
+ void showNotification(LLNotificationPtr notify);
void hideNotification();
void setTrustedContent(bool trusted);
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 0f1dc1b1da..0c5cc892ae 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -909,7 +909,7 @@ void LLMeshRepoThread::run()
LL_WARNS(LOG_MESH) << "Convex decomposition unable to be loaded. Expect severe problems." << LL_ENDL;
}
- while (!LLApp::isQuitting())
+ while (!LLApp::isExiting())
{
// *TODO: Revise sleep/wake strategy and try to move away
// from polling operations in this thread. We can sleep
@@ -926,7 +926,7 @@ void LLMeshRepoThread::run()
mSignal->wait();
- if (LLApp::isQuitting())
+ if (LLApp::isExiting())
{
break;
}
@@ -1196,7 +1196,7 @@ void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
void LLMeshRepoThread::lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
{
- if (!LLAppViewer::isQuitting())
+ if (!LLAppViewer::isExiting())
{
loadMeshLOD(mesh_params, lod);
}
@@ -2776,7 +2776,7 @@ void LLMeshUploadThread::doWholeModelUpload()
LL_DEBUGS(LOG_MESH) << "POST request issued." << LL_ENDL;
mHttpRequest->update(0);
- while (! LLApp::isQuitting() && ! finished() && ! isDiscarded())
+ while (! LLApp::isExiting() && ! finished() && ! isDiscarded())
{
ms_sleep(sleep_time);
sleep_time = llmin(250U, sleep_time + sleep_time);
@@ -2825,7 +2825,7 @@ void LLMeshUploadThread::requestWholeModelFee()
U32 sleep_time(10);
mHttpRequest->update(0);
- while (! LLApp::isQuitting() && ! finished() && ! isDiscarded())
+ while (! LLApp::isExiting() && ! finished() && ! isDiscarded())
{
ms_sleep(sleep_time);
sleep_time = llmin(250U, sleep_time + sleep_time);
@@ -3274,7 +3274,7 @@ common_exit:
LLMeshHeaderHandler::~LLMeshHeaderHandler()
{
- if (!LLApp::isQuitting())
+ if (!LLApp::isExiting())
{
if (! mProcessed)
{
@@ -3418,7 +3418,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
LLMeshLODHandler::~LLMeshLODHandler()
{
- if (! LLApp::isQuitting())
+ if (! LLApp::isExiting())
{
if (! mProcessed)
{
@@ -3688,7 +3688,7 @@ void LLMeshRepository::shutdown()
mUploads[i]->discard() ; //discard the uploading requests.
}
- mThread->mSignal->signal();
+ mThread->mSignal->broadcast();
while (!mThread->isStopped())
{
@@ -4930,7 +4930,8 @@ void LLPhysicsDecomp::shutdown()
if (mSignal)
{
mQuitting = true;
- mSignal->signal();
+ // There is only one wait(), but just in case 'broadcast'
+ mSignal->broadcast();
while (!isStopped())
{
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 51b79c3cc2..6409b29e00 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -3002,14 +3002,33 @@ void LLModelPreview::lookupLODModelFiles(S32 lod)
S32 next_lod = (lod - 1 >= LLModel::LOD_IMPOSTOR) ? lod - 1 : LLModel::LOD_PHYSICS;
std::string lod_filename = mLODFile[LLModel::LOD_HIGH];
- std::string ext = ".dae";
- std::string::size_type i = lod_filename.rfind(ext);
- if (i != std::string::npos)
+ // BUG-230890 fix case-sensitive filename handling
+ // std::string ext = ".dae";
+ // std::string::size_type i = lod_filename.rfind(ext);
+ // if (i != std::string::npos)
+ // {
+ // lod_filename.replace(i, lod_filename.size() - ext.size(), getLodSuffix(next_lod) + ext);
+ // }
+ // Note: we cannot use gDirUtilp here because the getExtension forces a tolower which would then break uppercase extensions on Linux/Mac
+ std::size_t offset = lod_filename.find_last_of('.');
+ std::string ext = (offset == std::string::npos || offset == 0) ? "" : lod_filename.substr(offset+1);
+ lod_filename = gDirUtilp->getDirName(lod_filename) + gDirUtilp->getDirDelimiter() + gDirUtilp->getBaseFileName(lod_filename, true) + getLodSuffix(next_lod) + "." + ext;
+ std::ostringstream out;
+ out << "Looking for file: " << lod_filename << " for LOD " << next_lod;
+ LL_DEBUGS("MeshUpload") << out.str() << LL_ENDL;
+ if(mImporterDebug)
{
- lod_filename.replace(i, lod_filename.size() - ext.size(), getLodSuffix(next_lod) + ext);
+ LLFloaterModelPreview::addStringToLog(out, true);
}
+ out.str("");
+ //
if (gDirUtilp->fileExists(lod_filename))
{
+ // extra logging is helpful here, so add to log tab
+ out << "Auto Loading LOD" << next_lod << " from " << lod_filename;
+ LL_INFOS() << out.str() << LL_ENDL;
+ LLFloaterModelPreview::addStringToLog(out, true);
+ //
LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
if (fmp)
{
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 4550c71e6d..fa5187dce6 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -67,6 +67,7 @@ LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p)
mOutfitsObserver(NULL),
mScrollPanel(NULL),
mGalleryPanel(NULL),
+ mLastRowPanel(NULL),
mGalleryCreated(false),
mRowCount(0),
mItemsAddedCount(0),
@@ -169,9 +170,7 @@ bool compareGalleryItem(LLOutfitGalleryItem* item1, LLOutfitGalleryItem* item2)
std::string name1 = item1->getItemName();
std::string name2 = item2->getItemName();
- LLStringUtil::toUpper(name1);
- LLStringUtil::toUpper(name2);
- return name1 < name2;
+ return (LLStringUtil::compareDict(name1, name2) < 0);
}
else
{
@@ -244,7 +243,15 @@ void LLOutfitGallery::removeLastRow()
mGalleryPanel->removeChild(mLastRowPanel);
mUnusedRowPanels.push_back(mLastRowPanel);
mRowPanels.pop_back();
- mLastRowPanel = mRowPanels.back();
+ if (mRowPanels.size() > 0)
+ {
+ // Just removed last row
+ mLastRowPanel = mRowPanels.back();
+ }
+ else
+ {
+ mLastRowPanel = NULL;
+ }
}
LLPanel* LLOutfitGallery::addToRow(LLPanel* row_stack, LLOutfitGalleryItem* item, int pos, int hgap)
@@ -1114,7 +1121,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
}
}
- if (mGalleryCreated && !LLApp::isQuitting())
+ if (mGalleryCreated && !LLApp::isExiting())
{
reArrangeRows();
}
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index c0662cddda..bb43a61c45 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -67,10 +67,7 @@ bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LL
std::string name1 = tab1->getTitle();
std::string name2 = tab2->getTitle();
- LLStringUtil::toUpper(name1);
- LLStringUtil::toUpper(name2);
-
- return name1 < name2;
+ return (LLStringUtil::compareDict(name1, name2) < 0);
}
struct outfit_accordion_tab_params : public LLInitParam::Block
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index c3a20f45f2..dca3c9072b 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -70,6 +70,8 @@ static void expand_all_folders(LLFolderView* root_folder);
static bool has_expanded_folders(LLFolderView* root_folder);
static bool has_collapsed_folders(LLFolderView* root_folder);
static void toggle_restore_menu(LLMenuGL* menu, BOOL visible, BOOL enabled);
+// FIRE-31051: Hide empty folders in Places floater when filtering
+static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list);
/**
* Functor counting expanded and collapsed folders in folder view tree to know
@@ -197,6 +199,9 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string)
if (sFilterSubString != string)
sFilterSubString = string;
+
+ // FIRE-31051: Hide empty folders in Places floater when filtering
+ updateShowFolderState();
}
// virtual
@@ -208,6 +213,13 @@ void LLLandmarksPanel::onShowOnMap()
return;
}
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ // Disable the "Map" button because loading landmark can take some time.
+ // During this time the button is useless. It will be enabled on callback finish
+ // or upon switching to other item.
+ mShowOnMapBtn->setEnabled(FALSE);
+ //
+
doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doShowOnMap, this, _1));
}
@@ -293,6 +305,16 @@ void LLLandmarksPanel::updateVerbs()
{
sRemoveBtn->setEnabled(isActionEnabled("delete") && (isFolderSelected() || isLandmarkSelected()));
}
+
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ if (!isTabVisible())
+ return;
+
+ bool landmark_selected = isLandmarkSelected();
+ mTeleportBtn->setEnabled(landmark_selected && isActionEnabled("teleport"));
+ mShowProfile->setEnabled(landmark_selected && isActionEnabled("more_info"));
+ mShowOnMapBtn->setEnabled(landmark_selected && isActionEnabled("show_on_map"));
+ //
}
void LLLandmarksPanel::setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus)
@@ -308,6 +330,27 @@ void LLLandmarksPanel::setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_
root->scrollToShowSelection();
}
+// FIRE-31051: Hide empty folders in Places floater when filtering
+void LLLandmarksPanel::updateShowFolderState()
+{
+ if (!mLandmarksInventoryPanel)
+ {
+ return;
+ }
+
+ bool show_all_folders = mLandmarksInventoryPanel->getFilterSubString().empty();
+ if (show_all_folders)
+ {
+ show_all_folders = category_has_descendents(mLandmarksInventoryPanel);
+ }
+
+ mLandmarksInventoryPanel->setShowFolderState(show_all_folders ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS :
+ LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS
+ );
+}
+//
+
//////////////////////////////////////////////////////////////////////////
// PROTECTED METHODS
//////////////////////////////////////////////////////////////////////////
@@ -1071,6 +1114,7 @@ void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark)
LLFloaterReg::showInstance("world_map", "center");
}
+ mShowOnMapBtn->setEnabled(TRUE); // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
mGearLandmarkMenu->setItemEnabled("show_on_map", TRUE);
}
@@ -1255,6 +1299,19 @@ void toggle_restore_menu(LLMenuGL *menu, BOOL visible, BOOL enabled)
}
}
+// FIRE-31051: Hide empty folders in Places floater when filtering
+static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list)
+{
+ LLViewerInventoryCategory* category = gInventory.getCategory(inventory_list->getRootFolderID());
+ if (category)
+ {
+ return category->getDescendentCount() > 0;
+ }
+
+ return false;
+}
+//
+
LLFavoritesPanel::LLFavoritesPanel()
: LLLandmarksPanel(false)
{
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index d7408269b5..2f99e6c47b 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -87,6 +87,9 @@ public:
void resetSelection();
+ // FIRE-31051: Hide empty folders in Places floater when filtering
+ void updateShowFolderState();
+
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 54c137d5a6..9c383a6f4b 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -256,7 +256,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLLineEditor* password_edit(getChild("password_edit"));
password_edit->setKeystrokeCallback(onPassKey, this);
// STEAM-14: When user presses Enter with this field in focus, initiate login
- password_edit->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
+ password_edit->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, false));
// change z sort of clickable text to be behind buttons
sendChildToBack(getChildView("forgot_password_text"));
@@ -267,7 +267,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
{
LLComboBox* favorites_combo = getChild("start_location_combo");
updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
- favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
+ favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, false));
favorites_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLocationSLURL, this));
LLComboBox* server_choice_combo = getChild("server_combo");
@@ -460,6 +460,9 @@ void LLPanelLogin::addFavoritesToStartLocation()
if (combo->getValue().asString().empty())
{
combo->selectFirstItem();
+ // Value 'home' or 'last' should have been taken from NextLoginLocation
+ // but NextLoginLocation was not set, so init it from combo explicitly
+ onLocationSLURL();
}
}
@@ -1006,12 +1009,15 @@ void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent ev
// Protected methods
//---------------------------------------------------------------------------
// static
-void LLPanelLogin::onClickConnect(void *)
+void LLPanelLogin::onClickConnect(bool commit_fields)
{
if (sInstance && sInstance->mCallback)
{
- // JC - Make sure the fields all get committed.
- sInstance->setFocus(FALSE);
+ if (commit_fields)
+ {
+ // JC - Make sure the fields all get committed.
+ sInstance->setFocus(FALSE);
+ }
LLComboBox* combo = sInstance->getChild("server_combo");
LLSD combo_val = combo->getSelectedValue();
@@ -1134,7 +1140,7 @@ void LLPanelLogin::onUserListCommit(void*)
}
else
{
- onClickConnect(NULL);
+ onClickConnect();
}
}
}
@@ -1366,6 +1372,7 @@ void LLPanelLogin::onSelectServer()
{
// the grid specified by the location is not this one, so clear the combo
location_combo->setCurrentByIndex(0); // last location on the new grid
+ onLocationSLURL();
}
}
break;
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 9e2a69317e..f832507b09 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -101,7 +101,7 @@ private:
static void setFields(LLPointer credential);
- static void onClickConnect(void*);
+ static void onClickConnect(bool commit_fields = true);
static void onClickNewAccount(void*);
static void onClickVersion(void*);
static void onClickForgotPassword(void*);
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index de8688fc5d..d7b07dc5f8 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -307,6 +307,11 @@ BOOL LLPanelPlaces::postBuild()
mOverflowBtn = getChild("overflow_btn");
mOverflowBtn->setMouseDownCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this));
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ mPlaceInfoBtn = getChild("profile_btn");
+ mPlaceInfoBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onProfileButtonClicked, this));
+ //
+
mGearMenuButton = getChild("options_gear_btn");
mGearMenuButton->setMouseDownCallback(boost::bind(&LLPanelPlaces::onGearMenuClick, this));
@@ -355,7 +360,7 @@ BOOL LLPanelPlaces::postBuild()
}
mButtonsContainer = getChild("button_layout_panel");
- mButtonsContainer->setVisible(FALSE);
+ //mButtonsContainer->setVisible(FALSE); // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
mFilterContainer = getChild("top_menu_panel");
mFilterEditor = getChild("Filter");
@@ -963,6 +968,16 @@ void LLPanelPlaces::onOverflowButtonClicked()
mOverflowBtn->setMenu(menu, LLMenuButton::MP_TOP_RIGHT);
}
+// FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+void LLPanelPlaces::onProfileButtonClicked()
+{
+ if (!mActivePanel)
+ return;
+
+ mActivePanel->onShowProfile();
+}
+//
+
bool LLPanelPlaces::onOverflowMenuItemEnable(const LLSD& param)
{
std::string value = param.asString();
@@ -1245,6 +1260,9 @@ void LLPanelPlaces::createTabs()
LLFavoritesPanel* favorites_panel = new LLFavoritesPanel();
if (favorites_panel)
{
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ favorites_panel->setPanelPlacesButtons(this);
+
mTabContainer->addTabPanel(
LLTabContainer::TabPanelParams().
panel(favorites_panel).
@@ -1255,6 +1273,9 @@ void LLPanelPlaces::createTabs()
LLLandmarksPanel* landmarks_panel = new LLLandmarksPanel();
if (landmarks_panel)
{
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ landmarks_panel->setPanelPlacesButtons(this);
+
mTabContainer->addTabPanel(
LLTabContainer::TabPanelParams().
panel(landmarks_panel).
@@ -1265,6 +1286,9 @@ void LLPanelPlaces::createTabs()
LLTeleportHistoryPanel* teleport_history_panel = new LLTeleportHistoryPanel();
if (teleport_history_panel)
{
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ teleport_history_panel->setPanelPlacesButtons(this);
+
mTabContainer->addTabPanel(
LLTabContainer::TabPanelParams().
panel(teleport_history_panel).
@@ -1369,12 +1393,17 @@ void LLPanelPlaces::updateVerbs()
mSaveBtn->setVisible(isLandmarkEditModeOn);
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ mPlaceInfoBtn->setVisible(!is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn && !is_pick_panel_visible);
bool show_options_btn = is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn;
mOverflowBtn->setVisible(show_options_btn);
getChild("lp_options")->setVisible(show_options_btn);
getChild("lp2")->setVisible(!show_options_btn);
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ mPlaceInfoBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
+
if (is_place_info_visible)
{
mShowOnMapBtn->setEnabled(have_3d_pos);
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index 24b7605fd6..81f1c6d70e 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -104,6 +104,7 @@ private:
bool onOverflowMenuItemEnable(const LLSD& param);
void onCreateLandmarkButtonClicked(const LLUUID& folder_id);
void onBackButtonClicked();
+ void onProfileButtonClicked(); // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
void onGearMenuClick();
void onSortingMenuClick();
void onAddMenuClick();
@@ -140,6 +141,7 @@ private:
LLButton* mCancelBtn;
LLButton* mCloseBtn;
LLMenuButton* mOverflowBtn;
+ LLButton* mPlaceInfoBtn; // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
// Top menu
LLMenuButton* mGearMenuButton;
diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp
index 1594cac817..139949a9c8 100644
--- a/indra/newview/llpanelplacestab.cpp
+++ b/indra/newview/llpanelplacestab.cpp
@@ -48,6 +48,15 @@ bool LLPanelPlacesTab::isTabVisible()
return true;
}
+// FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+void LLPanelPlacesTab::setPanelPlacesButtons(LLPanelPlaces* panel)
+{
+ mTeleportBtn = panel->getChild("teleport_btn");
+ mShowOnMapBtn = panel->getChild("map_btn");
+ mShowProfile = panel->getChild("profile_btn");
+}
+//
+
void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos,
U64 region_handle,
const std::string& url,
diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h
index aab1c130c1..9376d1a6df 100644
--- a/indra/newview/llpanelplacestab.h
+++ b/indra/newview/llpanelplacestab.h
@@ -58,6 +58,7 @@ public:
bool isTabVisible(); // Check if parent TabContainer is visible.
+ void setPanelPlacesButtons(LLPanelPlaces* panel); // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
void onRegionResponse(const LLVector3d& landmark_global_pos,
U64 region_handle,
const std::string& url,
@@ -70,6 +71,12 @@ public:
void setRemoveBtn(LLButton* trash_btn) { sRemoveBtn = trash_btn; }
protected:
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ LLButton* mTeleportBtn;
+ LLButton* mShowOnMapBtn;
+ LLButton* mShowProfile;
+ //
+
// Search string for filtering landmarks and teleport history locations
static std::string sFilterSubString;
static LLButton* sRemoveBtn;
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 7b0cbe45e0..a5dbb5a212 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -661,6 +661,22 @@ void LLTeleportHistoryPanel::updateVerbs()
{
sRemoveBtn->setEnabled(true);
}
+
+ // FIRE-31033: Keep Teleport/Map/Profile buttons on places floater
+ if (!mLastSelectedFlatlList)
+ {
+ mTeleportBtn->setEnabled(false);
+ mShowProfile->setEnabled(false);
+ mShowOnMapBtn->setEnabled(false);
+ return;
+ }
+
+ LLTeleportHistoryFlatItem* itemp = dynamic_cast (mLastSelectedFlatlList->getSelectedItem());
+
+ mTeleportBtn->setEnabled(NULL != itemp);
+ mShowProfile->setEnabled(NULL != itemp);
+ mShowOnMapBtn->setEnabled(NULL != itemp);
+ //
}
// virtual
@@ -1235,6 +1251,12 @@ void LLTeleportHistoryPanel::onGearMenuAction(const LLSD& userdata)
LLLandmarkActions::getSLURLfromPosGlobal(globalPos,
boost::bind(&LLTeleportHistoryPanel::gotSLURLCallback, _1));
}
+ // FIRE-31025: Clear TP history doesn't work anymore
+ else if ("clear_history" == command_name)
+ {
+ onRemoveSelected();
+ }
+ //
}
bool LLTeleportHistoryPanel::isActionEnabled(const LLSD& userdata) const
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 6d2042753f..0a081176ba 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -1100,14 +1100,17 @@ bool LLScriptEdCore::writeToFile(const std::string& filename, bool unprocessed)
void LLScriptEdCore::sync()
{
- // Sync with external editor.
- std::string tmp_file = mContainer->getTmpFileName();
- llstat s;
- if (LLFile::stat(tmp_file, &s) == 0) // file exists
- {
- if (mLiveFile) mLiveFile->ignoreNextUpdate();
- writeToFile(tmp_file,gSavedSettings.getBOOL("_NACL_LSLPreprocessor"));
- }
+ // Sync with external editor.
+ if (mLiveFile)
+ {
+ std::string tmp_file = mLiveFile->filename();
+ llstat s;
+ if (LLFile::stat(tmp_file, &s) == 0) // file exists
+ {
+ mLiveFile->ignoreNextUpdate();
+ writeToFile(tmp_file, gSavedSettings.getBOOL("_NACL_LSLPreprocessor"));
+ }
+ }
}
bool LLScriptEdCore::hasChanged()
@@ -1572,9 +1575,25 @@ void LLScriptEdCore::openInExternalEditor()
// from above).
delete mLiveFile; // deletes file
- // Save the script to a temporary file.
- std::string filename = mContainer->getTmpFileName();
- writeToFile(filename,gSavedSettings.getBOOL("_NACL_LSLPreprocessor"));
+ // Generate a suitable filename
+ std::string script_name = mScriptName;
+ std::string forbidden_chars = "<>:\"\\/|?*";
+ for (std::string::iterator c = forbidden_chars.begin(); c != forbidden_chars.end(); c++)
+ {
+ script_name.erase(std::remove(script_name.begin(), script_name.end(), *c), script_name.end());
+ }
+ std::string filename = mContainer->getTmpFileName(script_name);
+
+ // Save the script to a temporary file.
+ if (!writeToFile(filename, gSavedSettings.getBOOL("_NACL_LSLPreprocessor")))
+ {
+ // In case some characters from script name are forbidden
+ // and not accounted for, name is too long or some other issue,
+ // try file that doesn't include script name
+ script_name.clear();
+ filename = mContainer->getTmpFileName(script_name);
+ writeToFile(filename, gSavedSettings.getBOOL("_NACL_LSLPreprocessor"));
+ }
// Start watching file changes.
mLiveFile = new LLLiveLSLFile(filename, boost::bind(&LLScriptEdContainer::onExternalChange, mContainer, _1));
@@ -2052,7 +2071,7 @@ std::string LLScriptEdContainer::getBackupFileName() const
}
// [/SL:KB]
-std::string LLScriptEdContainer::getTmpFileName()
+std::string LLScriptEdContainer::getTmpFileName(const std::string& script_name)
{
// Take script inventory item id (within the object inventory)
// to consideration so that it's possible to edit multiple scripts
@@ -2064,7 +2083,14 @@ std::string LLScriptEdContainer::getTmpFileName()
LLMD5 script_id_hash((const U8 *)script_id.c_str());
script_id_hash.hex_digest(script_id_hash_str);
- return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + ".lsl";
+ if (script_name.empty())
+ {
+ return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + ".lsl";
+ }
+ else
+ {
+ return std::string(LLFile::tmpdir()) + "sl_script_" + script_name + "_" + script_id_hash_str + ".lsl";
+ }
}
bool LLScriptEdContainer::onExternalChange(const std::string& filename)
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 4d709d07a6..659a603440 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -286,7 +286,7 @@ public:
void updateStyle();
protected:
- std::string getTmpFileName();
+ std::string getTmpFileName(const std::string& script_name);
// [SL:KB] - Patch: Build-ScriptRecover | Checked: 2011-11-23 (Catznip-3.2.0) | Added: Catznip-3.2.0
virtual std::string getBackupFileName() const;
bool onBackupTimer();
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index e50f137fbb..36b64c04e9 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -4553,8 +4553,9 @@ void LLSelectMgr::convertTransient()
void LLSelectMgr::deselectAllIfTooFar()
{
-// [RLVa:KB] - Checked: RLVa-1.3.0
- if ( (!mSelectedObjects->isEmpty()) && ((gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_EDITOBJ))) )
+// [RLVa:KB] - @edit*
+ // Continuously verify the selection as soon as there is at least one prim we shouldn't be able to edit
+ if ( !mSelectedObjects->isEmpty() && RlvActions::isRlvEnabled() && !RlvActions::canEdit(ERlvCheckType::All) )
{
struct NotTransientOrFocusedMediaOrEditable : public LLSelectedNodeFunctor
{
diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
index 7e40bffc4e..90e498e341 100644
--- a/indra/newview/llskinningutil.cpp
+++ b/indra/newview/llskinningutil.cpp
@@ -141,7 +141,7 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin
// for (U32 j = 0; j < count; ++j)
// {
// S32 joint_num = skin->mJointNums[j];
-// LLJoint * joint = NULL;
+// LLJoint *joint = NULL;
// if (joint_num >= 0 && joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS)
// {
// joint = avatar->getJoint(joint_num);
@@ -204,7 +204,7 @@ void LLSkinningUtil::initSkinningMatrixPalette(
for (U32 j = 0; j < count; ++j)
{
S32 joint_num = skin->mJointNums[j];
- LLJoint * joint = NULL;
+ LLJoint *joint = NULL;
if (joint_num >= 0 && joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS)
{
joint = avatar->getJoint(joint_num);
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 93418415df..2c771018a8 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2581,9 +2581,6 @@ bool idle_startup()
display_startup();
- //all categories loaded. lets create "My Favorites" category
- gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
-
// set up callbacks
LL_INFOS() << "Registering Callbacks" << LL_ENDL;
LLMessageSystem* msg = gMessageSystem;
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index 7a329174bc..35f5c99a9d 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -220,6 +220,12 @@ void LLTeleportHistoryStorage::load()
std::string line;
while (std::getline(file, line))
{
+ if (line.empty())
+ {
+ LL_WARNS() << "Teleport history contains empty line."<< LL_ENDL;
+ continue;
+ }
+
LLSD s_item;
std::istringstream iss(line);
if (parser->parse(iss, s_item, line.length()) == LLSDParser::PARSE_FAILURE)
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index aa51c67b13..77d7c9bbca 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -61,6 +61,7 @@
#include "llworld.h"
#include "llpanelface.h"
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1)
+#include "rlvactions.h"
#include "rlvhandler.h"
#include "rlvlocks.h"
// [/RLVa:KB]
@@ -1650,6 +1651,14 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
EAcceptance* accept,
const LLSD& dest)
{
+// [RLVa:KB] - @share
+ if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(dest_agent)) )
+ {
+ *accept = ACCEPT_NO_LOCKED;
+ return true;
+ }
+// [/RLVa:KB]
+
// check the type
switch(cargo_type)
{
@@ -2473,6 +2482,12 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryObject(
}
if( obj && avatar )
{
+// [RLVa:KB] - @share
+ if ( (obj) && (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(obj->getID())) )
+ {
+ return ACCEPT_NO_LOCKED;
+ }
+// [/RLVa:KB]
if(drop)
{
LLGiveInventory::doGiveInventoryItem(obj->getID(), item );
@@ -2499,6 +2514,12 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventory(
{
return ACCEPT_NO;
}
+// [RLVa:KB] - @share
+ if ( (obj) && (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(obj->getID())) )
+ {
+ return ACCEPT_NO_LOCKED;
+ }
+// [/RLVa:KB]
if (drop && obj)
{
LLGiveInventory::doGiveInventoryItem(obj->getID(), item);
@@ -2512,6 +2533,12 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryCategory(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
LL_DEBUGS() << "LLToolDragAndDrop::dad3dGiveInventoryCategory()" << LL_ENDL;
+// [RLVa:KB] - @share
+ if ( (obj) && (RlvActions::isRlvEnabled()) && (!RlvActions::canGiveInventory(obj->getID())) )
+ {
+ return ACCEPT_NO_LOCKED;
+ }
+// [/RLVa:KB]
if(drop && obj)
{
LLViewerInventoryItem* item;
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index ae6547b77e..7fea202ee0 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -450,7 +450,7 @@ void LLToolMgr::clearTransientTool()
void LLToolMgr::onAppFocusLost()
{
- if (LLApp::isQuitting())
+ if (LLApp::isExiting())
return;
if (mSelectedTool)
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index b01e287de3..3422aaed33 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1605,7 +1605,8 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
{
- if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("ShowHoverTips")) return TRUE;
+ static LLCachedControl show_hover_tips(*LLUI::getInstance()->mSettingGroups["config"], "ShowHoverTips", true);
+ if (!show_hover_tips) return TRUE;
if (!mHoverPick.isValid()) return TRUE;
// [RLVa:KB] - Checked: 2010-05-03 (RLVa-1.2.0g) | Modified: RLVa-1.2.0g
#ifdef RLV_EXTENSION_CMD_INTERACT
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index 4369b146a0..ae66c596ac 100644
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -144,6 +144,7 @@ void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, std::
httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
httpOpts->setFollowRedirects(true);
+ httpOpts->setSSLVerifyPeer(false);
std::string url = this->getKeyVerificationURL(key);
if (url.empty())
@@ -185,6 +186,7 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
httpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_TEXT_PLAIN);
httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+ httpOpts->setSSLVerifyPeer(false);
std::string url = this->getTranslateURL(fromTo.first, fromTo.second, msg);
if (url.empty())
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index 6d009c0a8c..a36c11db18 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -114,6 +114,7 @@ LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *
mCountSucceeded(0),
mTotalBytesFetched(0)
{
+ LLCoprocedureManager::instance().initializePool(VIEWER_ASSET_STORAGE_CORO_POOL);
}
LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer)
@@ -125,6 +126,7 @@ LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *
mCountSucceeded(0),
mTotalBytesFetched(0)
{
+ LLCoprocedureManager::instance().initializePool(VIEWER_ASSET_STORAGE_CORO_POOL);
}
LLViewerAssetStorage::~LLViewerAssetStorage()
@@ -581,7 +583,7 @@ void LLViewerAssetStorage::assetRequestCoro(
LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url, httpOpts);
- if (LLApp::isQuitting() || !gAssetStorage)
+ if (LLApp::isExiting() || !gAssetStorage)
{
// Bail out if result arrives after shutdown has been started.
return;
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index d9ff1ec149..585eecf38d 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -66,6 +66,7 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color, LLSD args
{
switch(chat.mSourceType)
{
+ case CHAT_SOURCE_TELEPORT: // FIRE-31034: New teleport info system message ignoring system chat color
case CHAT_SOURCE_SYSTEM:
r_color = LLUIColorTable::instance().getColor("SystemChatColor");
break;
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 2f2a7cefe6..e23d990184 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -1661,10 +1661,9 @@ void render_ui_2d()
if (renderUIBuffer)
//
{
- LLUI* ui_inst = LLUI::getInstance();
- if (ui_inst->mDirty)
+ if (LLView::sIsRectDirty)
{
- ui_inst->mDirty = FALSE;
+ LLView::sIsRectDirty = false;
LLRect t_rect;
gPipeline.mUIScreen.bindTarget();
@@ -1672,26 +1671,26 @@ void render_ui_2d()
{
static const S32 pad = 8;
- ui_inst->mDirtyRect.mLeft -= pad;
- ui_inst->mDirtyRect.mRight += pad;
- ui_inst->mDirtyRect.mBottom -= pad;
- ui_inst->mDirtyRect.mTop += pad;
+ LLView::sDirtyRect.mLeft -= pad;
+ LLView::sDirtyRect.mRight += pad;
+ LLView::sDirtyRect.mBottom -= pad;
+ LLView::sDirtyRect.mTop += pad;
LLGLEnable scissor(GL_SCISSOR_TEST);
- static LLRect last_rect = ui_inst->mDirtyRect;
+ static LLRect last_rect = LLView::sDirtyRect;
//union with last rect to avoid mouse poop
- last_rect.unionWith(ui_inst->mDirtyRect);
+ last_rect.unionWith(LLView::sDirtyRect);
- t_rect = ui_inst->mDirtyRect;
- ui_inst->mDirtyRect = last_rect;
+ t_rect = LLView::sDirtyRect;
+ LLView::sDirtyRect = last_rect;
last_rect = t_rect;
// Factor out instance() call
- //last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / ui_inst->getScaleFactor().mV[0]);
- //last_rect.mRight = LLRect::tCoordType(last_rect.mRight / ui_inst->getScaleFactor().mV[0]);
- //last_rect.mTop = LLRect::tCoordType(last_rect.mTop / ui_inst->getScaleFactor().mV[1]);
- //last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / ui_inst->getScaleFactor().mV[1]);
+ //last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / LLUI::getScaleFactor().mV[0]);
+ //last_rect.mRight = LLRect::tCoordType(last_rect.mRight / LLUI::getScaleFactor().mV[0]);
+ //last_rect.mTop = LLRect::tCoordType(last_rect.mTop / LLUI::getScaleFactor().mV[1]);
+ //last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / LLUI::getScaleFactor().mV[1]);
last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / ui_scale_factor.mV[0]);
last_rect.mRight = LLRect::tCoordType(last_rect.mRight / ui_scale_factor.mV[0]);
last_rect.mTop = LLRect::tCoordType(last_rect.mTop / ui_scale_factor.mV[1]);
@@ -1707,7 +1706,7 @@ void render_ui_2d()
gPipeline.mUIScreen.flush();
gGL.setColorMask(true, false);
- ui_inst->mDirtyRect = t_rect;
+ LLView::sDirtyRect = t_rect;
}
LLGLDisable cull(GL_CULL_FACE);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 3348ae35b4..e1e41312c1 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -157,7 +157,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "Inv_FavoritesOpen", "Inv_FavoritesClosed", FALSE, true));
addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE, false));
- addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE, true));
+ addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE, false));
addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE, true));
addEntry(LLFolderType::FT_MESH, new ViewerFolderEntry("Meshes", "Inv_MeshesOpen", "Inv_MeshesClosed", FALSE, true));
addEntry(LLFolderType::FT_SETTINGS, new ViewerFolderEntry("Settings", "Inv_SettingsOpen", "Inv_SettingsClosed", FALSE, true));
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 2a04844b51..040b794e34 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1261,6 +1261,7 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
httpOpts->setFollowRedirects(true);
httpOpts->setWantHeaders(true);
+ httpOpts->setSSLVerifyPeer(false); // viewer's cert bundle doesn't appear to agree with web certs from "https://my.secondlife.com/"
LLURL hostUrl(url.c_str());
std::string hostAuth = hostUrl.getAuthority();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 5ceef9237b..e9cfed0072 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -352,6 +352,8 @@ void force_error_bad_memory_access(void *);
void force_error_infinite_loop(void *);
void force_error_software_exception(void *);
void force_error_driver_crash(void *);
+void force_error_coroutine_crash(void *);
+void force_error_thread_crash(void *);
void handle_force_delete(void*);
void print_object_info(void*);
@@ -2671,6 +2673,24 @@ class LLAdvancedForceErrorDriverCrash : public view_listener_t
}
};
+class LLAdvancedForceErrorCoroutineCrash : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ force_error_coroutine_crash(NULL);
+ return true;
+ }
+};
+
+class LLAdvancedForceErrorThreadCrash : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ force_error_thread_crash(NULL);
+ return true;
+ }
+};
+
class LLAdvancedForceErrorDisconnectViewer : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -3638,17 +3658,19 @@ bool enable_object_edit()
}
else if (LLSelectMgr::getInstance()->selectGetAllValidAndObjectsFound())
{
-// enable = true;
-// [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c
- bool fRlvCanEdit = (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_EDITOBJ));
- if (!fRlvCanEdit)
+// [RLVa:KB] - @edit*
+ if (RlvActions::isRlvEnabled() && !RlvActions::canEdit(ERlvCheckType::All))
{
LLObjectSelectionHandle hSel = LLSelectMgr::getInstance()->getSelection();
RlvSelectIsEditable f;
- fRlvCanEdit = (hSel.notNull()) && ((hSel->getFirstRootNode(&f, TRUE)) == NULL);
+ enable = (hSel.notNull()) && (!hSel->getFirstRootNode(&f, true));
+ }
+ else
+ {
+ enable = true;
}
- enable = fRlvCanEdit;
// [/RLVa:KB]
+// enable = true;
}
return enable;
@@ -5268,30 +5290,36 @@ void near_sit_down_point(BOOL success, void *)
class LLLandSit : public view_listener_t
{
- bool handleEvent(const LLSD& userdata)
- {
+ bool handleEvent(const LLSD& userdata)
+ {
// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.2.1f
- if ( (rlv_handler_t::isEnabled()) && ((!RlvActions::canStand()) || (gRlvHandler.hasBehaviour(RLV_BHVR_SIT))) )
- return true;
+ if ( (rlv_handler_t::isEnabled()) && ((!RlvActions::canStand()) || (gRlvHandler.hasBehaviour(RLV_BHVR_SIT))) )
+ return true;
// [/RLVa:KB]
- gAgent.standUp();
- LLViewerParcelMgr::getInstance()->deselectLand();
+ LLVector3d posGlobal = LLToolPie::getInstance()->getPick().mPosGlobal;
- LLVector3d posGlobal = LLToolPie::getInstance()->getPick().mPosGlobal;
-
- LLQuaternion target_rot;
- if (isAgentAvatarValid())
- {
- target_rot = gAgentAvatarp->getRotation();
- }
- else
- {
- target_rot = gAgent.getFrameAgent().getQuaternion();
- }
- gAgent.startAutoPilotGlobal(posGlobal, "Sit", &target_rot, near_sit_down_point, NULL, 0.7f);
- return true;
- }
+ LLQuaternion target_rot;
+ if (isAgentAvatarValid())
+ {
+ target_rot = gAgentAvatarp->getRotation();
+ }
+ else
+ {
+ target_rot = gAgent.getFrameAgent().getQuaternion();
+ }
+ gAgent.startAutoPilotGlobal(posGlobal, "Sit", &target_rot, near_sit_down_point, NULL, 0.7f);
+ return true;
+ }
+};
+
+class LLLandCanSit : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLVector3d posGlobal = LLToolPie::getInstance()->getPick().mPosGlobal;
+ return !posGlobal.isExactlyZero(); // valid position, not beyond draw distance
+ }
};
//-------------------------------------------------------------------
@@ -10327,6 +10355,16 @@ void force_error_driver_crash(void *)
LLAppViewer::instance()->forceErrorDriverCrash();
}
+void force_error_coroutine_crash(void *)
+{
+ LLAppViewer::instance()->forceErrorCoroutineCrash();
+}
+
+void force_error_thread_crash(void *)
+{
+ LLAppViewer::instance()->forceErrorThreadCrash();
+}
+
class LLToolsUseSelectionForGrid : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -11926,6 +11964,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedForceErrorInfiniteLoop(), "Advanced.ForceErrorInfiniteLoop");
view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareException(), "Advanced.ForceErrorSoftwareException");
view_listener_t::addMenu(new LLAdvancedForceErrorDriverCrash(), "Advanced.ForceErrorDriverCrash");
+ view_listener_t::addMenu(new LLAdvancedForceErrorCoroutineCrash(), "Advanced.ForceErrorCoroutineCrash");
+ view_listener_t::addMenu(new LLAdvancedForceErrorThreadCrash(), "Advanced.ForceErrorThreadCrash");
view_listener_t::addMenu(new LLAdvancedForceErrorDisconnectViewer(), "Advanced.ForceErrorDisconnectViewer");
// Advanced (toplevel)
@@ -12091,6 +12131,7 @@ void initialize_menus()
// Land pie menu
view_listener_t::addMenu(new LLLandBuild(), "Land.Build");
view_listener_t::addMenu(new LLLandSit(), "Land.Sit");
+ view_listener_t::addMenu(new LLLandCanSit(), "Land.CanSit");
view_listener_t::addMenu(new LLLandBuyPass(), "Land.BuyPass");
view_listener_t::addMenu(new LLLandEdit(), "Land.Edit");
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 00deddbf73..fd388b1435 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -516,6 +516,21 @@ void LLViewerObject::markDead()
}
}
+S32 LLViewerObject::getNumVisibleFaces() const
+{
+ int v{0};
+ if(mDrawable.notNull())
+ {
+ for (int i = 0;i < mDrawable->getNumFaces();i++)
+ {
+ if(mDrawable->getFace(i)->getTextureEntry()->getAlpha() != 0.f)
+ v++;
+ }
+ }
+ return v;
+};
+
+
void LLViewerObject::dump() const
{
LL_INFOS() << "Type: " << pCodeToString(mPrimitiveCode) << LL_ENDL;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 07498bec2b..6b2d4ed877 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -199,6 +199,7 @@ public:
virtual U32 getNumVertices() const;
virtual U32 getNumIndices() const;
S32 getNumFaces() const { return mNumFaces; }
+ S32 getNumVisibleFaces() const;
// Graphical stuff for objects - maybe broken out into render class later?
virtual void updateTextures();
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index daa4200552..77cece4577 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -83,6 +83,8 @@
#include "llcallstack.h"
#include "llsettingsdaycycle.h"
+#include
+
// Firestorm includes
#include "lfsimfeaturehandler.h"
#include "llviewermenu.h"
@@ -150,15 +152,22 @@ public:
// build a secondlife://{PLACE} SLurl from this SLapp
std::string url = "secondlife://";
+ boost::regex name_rx("[A-Za-z0-9()_%]+");
+ boost::regex coord_rx("[0-9]+");
for (int i = 0; i < num_params; i++)
{
if (i > 0)
{
url += "/";
}
+ if (!boost::regex_match(params[i].asString(), i > 0 ? coord_rx : name_rx))
+ {
+ return false;
+ }
+
url += params[i].asString();
}
-
+
// Process the SLapp as if it was a secondlife://{PLACE} SLurl
LLURLDispatcher::dispatch(url, "clicked", web, true);
return true;
@@ -2407,7 +2416,7 @@ void LLViewerRegion::setSimulatorFeaturesReceived(bool received)
mSimulatorFeaturesReceived = received;
if (received)
{
- mSimulatorFeaturesReceivedSignal(getRegionID());
+ mSimulatorFeaturesReceivedSignal(getRegionID(), this);
mSimulatorFeaturesReceivedSignal.disconnect_all_slots();
}
}
@@ -3421,7 +3430,7 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)
// so that they can safely use getCapability().
if (received)
{
- mCapabilitiesReceivedSignal(getRegionID());
+ mCapabilitiesReceivedSignal(getRegionID(), this);
LLFloaterPermsDefault::sendInitialPerms();
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 9c1715d6aa..2aa8258a75 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -97,7 +97,7 @@ public:
NUM_PARTITIONS
} eObjectPartitions;
- typedef boost::signals2::signal caps_received_signal_t;
+ typedef boost::signals2::signal caps_received_signal_t;
LLViewerRegion(const U64 &handle,
const LLHost &host,
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index adf09bed17..18fba85be1 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -581,7 +581,8 @@ void send_viewer_stats(bool include_preferences)
fail["invalid"] = (S32) gMessageSystem->mInvalidOnCircuitPackets;
fail["missing_updater"] = (S32) LLAppViewer::instance()->isUpdaterMissing();
- body["ui"] = LLUIUsage::instance().asLLSD();
+ // We do not need to send UI usage stats according to Jess...
+ //body["ui"] = LLUIUsage::instance().asLLSD();
body["stats"]["voice"] = LLVoiceVivoxStats::getInstance()->read();
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index a46da8ef0d..0f31bb6b6e 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -259,6 +259,7 @@ LLViewerTextureList::~LLViewerTextureList()
void LLViewerTextureList::shutdown()
{
+ LL_WARNS() << "Shutdown called" << LL_ENDL;
// clear out preloads
mImagePreloads.clear();
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index dac81d94f3..7dc754cf37 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2033,7 +2033,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)
if (!LLAppViewer::instance()->restoreErrorTrap())
{
- LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
+ // this always happens, so downgrading it to INFO
+ LL_INFOS("Window") << " Someone took over my signal/exception handler (post createWindow; normal)" << LL_ENDL;
}
const bool do_not_enforce = false;
@@ -3010,7 +3011,7 @@ void LLViewerWindow::draw()
static LLCachedControl renderUIBuffer(gSavedSettings, "RenderUIBuffer");
if (!renderUIBuffer)
{
- LLUI::getInstance()->mDirtyRect = getWindowRectScaled();
+ LLView::sDirtyRect = getWindowRectScaled();
}
// HACK for timecode debugging
@@ -7199,11 +7200,11 @@ void LLPickInfo::fetchResults()
// [RLVa:KB] - Checked: RLVa-2.2 (@setoverlay)
if ( (RlvActions::hasBehaviour(RLV_BHVR_SETOVERLAY)) && (hit_object) && (!hit_object->isHUDAttachment()) )
{
- std::list effects;
+ std::list effects;
LLVfxManager::instance().getEffects(effects);
- for (const LLVisualEffect* pEffect : effects)
+ for (const RlvOverlayEffect* pEffect : effects)
{
- if (pEffect->getEnabled() && static_cast(pEffect)->hitTest(mMousePt))
+ if (pEffect->getEnabled() && pEffect->hitTest(mMousePt))
{
hit_object = nullptr;
break;
diff --git a/indra/newview/llvisualeffect.h b/indra/newview/llvisualeffect.h
index ab8f1e5aa0..121d7beb17 100644
--- a/indra/newview/llvisualeffect.h
+++ b/indra/newview/llvisualeffect.h
@@ -170,7 +170,7 @@ public:
LLVisualEffect* getEffect(EVisualEffect eCode, const LLUUID& idEffect) const;
template T* getEffect(const LLUUID& idEffect) const { return dynamic_cast(getEffect(T::EffectCode, idEffect)); }
bool getEffects(std::list& effectList, std::function fnFilter);
- template bool getEffects(std::list& effectList) { return getEffects(effectList, [](const LLVisualEffect* pEffect) { return pEffect->getCode() == T::EffectCode; }); }
+ template bool getEffects(std::list& effectList);
bool hasEffect(EVisualEffect eCode) const;
bool removeEffect(EVisualEffect eCode, const LLUUID& idEffect);
template bool removeEffect(const LLUUID& idEffect) { return removeEffect(T::EffectCode, idEffect); }
@@ -197,4 +197,23 @@ inline bool LLVfxManager::hasEffect(EVisualEffect eCode) const
return m_Effects.end() != std::find_if(m_Effects.begin(), m_Effects.end(), [eCode](const LLVisualEffect* pEffect) { return pEffect->getCode() == eCode; });
}
+template
+inline bool LLVfxManager::getEffects(std::list& effectList)
+{
+ effectList.clear();
+
+ std::function fnFilter = [](const LLVisualEffect* pEffect) { return pEffect->getCode() == T::EffectCode; };
+ auto itEffect = boost::make_filter_iterator(fnFilter, m_Effects.begin(), m_Effects.end()),
+ endEffect = boost::make_filter_iterator(fnFilter, m_Effects.end(), m_Effects.end());
+ while (itEffect != endEffect)
+ {
+ if (T* pEffect = dynamic_cast(*itEffect++))
+ {
+ effectList.push_back(pEffect);
+ }
+ }
+
+ return effectList.size();
+}
+
// ============================================================================
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index cf8916f91f..f930646d63 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -11660,7 +11660,8 @@ void LLVOAvatar::accountRenderComplexityForObject(
LL_DEBUGS("ARCdetail") << "Attachment costs " << attached_object->getAttachmentItemID()
<< " total: " << attachment_total_cost
<< ", volume: " << attachment_volume_cost
- << ", textures: " << attachment_texture_cost
+ << ", " << textures.size()
+ << " textures: " << attachment_texture_cost
<< ", " << volume->numChildren()
<< " children: " << attachment_children_cost
<< LL_ENDL;
@@ -11784,10 +11785,23 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
ETextureIndex tex_index = baked_dict->mTextureIndex;
if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT)))
{
- if (isTextureVisible(tex_index))
- {
- cost +=COMPLEXITY_BODY_PART_COST;
- }
+ // Same as isTextureVisible(), but doesn't account for isSelf to ensure identical numbers for all avatars
+ if (isIndexLocalTexture(tex_index))
+ {
+ if (isTextureDefined(tex_index, 0))
+ {
+ cost += COMPLEXITY_BODY_PART_COST;
+ }
+ }
+ else
+ {
+ // baked textures can use TE images directly
+ if (isTextureDefined(tex_index)
+ && (getTEImage(tex_index)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha))
+ {
+ cost += COMPLEXITY_BODY_PART_COST;
+ }
+ }
}
}
LL_DEBUGS("ARCdetail") << "Avatar body parts complexity: " << cost << LL_ENDL;
@@ -11843,9 +11857,8 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
// Diagnostic output to identify all avatar-related textures.
// Does not affect rendering cost calculation.
- // Could be wrapped in a debug option if output becomes problematic.
// Disable useless diagnostics
- //if (isSelf())
+ //if (isSelf() && debugLoggingEnabled("ARCdetail"))
//{
// // print any attachment textures we didn't already know about.
// for (LLVOVolume::texture_cost_t::iterator it = textures.begin(); it != textures.end(); ++it)
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index b6a432bc74..268e8bc096 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -44,6 +44,9 @@ F32 LLVOCacheEntry::sFrontPixelThreshold = 1.0f;
F32 LLVOCacheEntry::sRearPixelThreshold = 1.0f;
BOOL LLVOCachePartition::sNeedsOcclusionCheck = FALSE;
+const S32 ENTRY_HEADER_SIZE = 6 * sizeof(S32);
+const S32 MAX_ENTRY_BODY_SIZE = 10000;
+
BOOL check_read(LLAPRFile* apr_file, void* src, S32 n_bytes)
{
return apr_file->read(src, n_bytes) == n_bytes ;
@@ -111,32 +114,22 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
{
S32 size = -1;
BOOL success;
+ static U8 data_buffer[ENTRY_HEADER_SIZE];
mDP.assignBuffer(mBuffer, 0);
-
- 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));
+
+ success = check_read(apr_file, (void *)data_buffer, ENTRY_HEADER_SIZE);
+ if (success)
+ {
+ memcpy(&mLocalID, data_buffer, sizeof(U32));
+ memcpy(&mCRC, data_buffer + sizeof(U32), sizeof(U32));
+ memcpy(&mHitCount, data_buffer + (2 * sizeof(U32)), sizeof(S32));
+ memcpy(&mDupeCount, data_buffer + (3 * sizeof(U32)), sizeof(S32));
+ memcpy(&mCRCChangeCount, data_buffer + (4 * sizeof(U32)), sizeof(S32));
+ memcpy(&size, data_buffer + (5 * sizeof(U32)), sizeof(S32));
// Corruption in the cache entries
- if ((size > 10000) || (size < 1))
+ if ((size > MAX_ENTRY_BODY_SIZE) || (size < 1))
{
// We've got a bogus size, skip reading it.
// We won't bother seeking, because the rest of this file
@@ -345,26 +338,25 @@ void LLVOCacheEntry::dump() const
<< LL_ENDL;
}
-BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const
+S32 LLVOCacheEntry::writeToBuffer(U8 *data_buffer) const
{
- static const S32 data_buffer_size = 6 * sizeof(S32);
- static U8 data_buffer[data_buffer_size];
S32 size = mDP.getBufferSize();
+ if (size > MAX_ENTRY_BODY_SIZE)
+ {
+ LL_WARNS() << "Failed to write entry with size above allowed limit: " << size << LL_ENDL;
+ return 0;
+ }
+
memcpy(data_buffer, &mLocalID, sizeof(U32));
memcpy(data_buffer + sizeof(U32), &mCRC, sizeof(U32));
memcpy(data_buffer + (2 * sizeof(U32)), &mHitCount, sizeof(S32));
memcpy(data_buffer + (3 * sizeof(U32)), &mDupeCount, sizeof(S32));
memcpy(data_buffer + (4 * sizeof(U32)), &mCRCChangeCount, sizeof(S32));
memcpy(data_buffer + (5 * sizeof(U32)), &size, sizeof(S32));
+ memcpy(data_buffer + ENTRY_HEADER_SIZE, (void*)mBuffer, size);
- BOOL success = check_write(apr_file, (void*)data_buffer, data_buffer_size);
- if (success)
- {
- success = check_write(apr_file, (void*)mBuffer, size);
- }
-
- return success;
+ return ENTRY_HEADER_SIZE + size;
}
//static
@@ -1402,11 +1394,11 @@ void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
bool success = true ;
{
std::string filename;
+ LLUUID cache_id;
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) ;
+ success = check_read(&apr_file, cache_id.mData, UUID_BYTES);
if(success)
{
@@ -1418,7 +1410,7 @@ void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
if(success)
{
- S32 num_entries;
+ S32 num_entries; // if removal was enabled during write num_entries might be wrong
success = check_read(&apr_file, &num_entries, sizeof(S32)) ;
if(success)
@@ -1525,30 +1517,57 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
{
std::string filename;
getObjectCacheFilename(handle, filename);
- // Fix bogus cache entry size warning
- //LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
- LLAPRFile apr_file(filename, APR_FOPEN_CREATE|APR_FOPEN_WRITE|APR_FOPEN_BINARY|APR_FOPEN_TRUNCATE, mLocalAPRFilePoolp);
-
- success = check_write(&apr_file, (void*)id.mData, UUID_BYTES) ;
-
+ LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY|APR_TRUNCATE, mLocalAPRFilePoolp);
+
+ success = check_write(&apr_file, (void*)id.mData, UUID_BYTES);
if(success)
{
- S32 num_entries = cache_entry_map.size() ;
+ S32 num_entries = cache_entry_map.size(); // if removal is enabled num_entries might be wrong
success = check_write(&apr_file, &num_entries, sizeof(S32));
+ if (success)
+ {
+ const S32 buffer_size = 32768; //should be large enough for couple MAX_ENTRY_BODY_SIZE
+ U8 data_buffer[buffer_size]; // generaly entries are fairly small, so collect them and drop onto disk in one go
+ S32 size_in_buffer = 0;
- // This can have a lot of entries, so might be better to dump them into buffer first and write in one go.
- for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); success && iter != cache_entry_map.end(); ++iter)
- {
- if(!removal_enabled || iter->second->isValid())
- {
- success = iter->second->writeToFile(&apr_file) ;
- if(!success)
- {
- break;
- }
- }
- }
+ // This can have a lot of entries, so might be better to dump them into buffer first and write in one go.
+ for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); success && iter != cache_entry_map.end(); ++iter)
+ {
+ if (!removal_enabled || iter->second->isValid())
+ {
+ S32 size = iter->second->writeToBuffer(data_buffer + size_in_buffer);
+
+ if (size > ENTRY_HEADER_SIZE) // body is minimum of 1
+ {
+ size_in_buffer += size;
+ }
+ else
+ {
+ success = false;
+ break;
+ }
+
+ // Make sure we have space in buffer for next element
+ if (buffer_size - size_in_buffer < MAX_ENTRY_BODY_SIZE + ENTRY_HEADER_SIZE)
+ {
+ success = check_write(&apr_file, (void*)data_buffer, size_in_buffer);
+ size_in_buffer = 0;
+ if (!success)
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ if (success && size_in_buffer > 0)
+ {
+ // final write
+ success = check_write(&apr_file, (void*)data_buffer, size_in_buffer);
+ size_in_buffer = 0;
+ }
+ }
}
}
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 6c95541c11..dd6afd6b85 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -106,7 +106,7 @@ public:
F32 getSceneContribution() const { return mSceneContrib;}
void dump() const;
- BOOL writeToFile(LLAPRFile* apr_file) const;
+ S32 writeToBuffer(U8 *data_buffer) const;
LLDataPackerBinaryBuffer *getDP();
void recordHit();
void recordDupe() { mDupeCount++; }
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 76763fe250..746ddfdb02 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -703,7 +703,6 @@ void LLVivoxVoiceClient::idle(void* user_data)
{
}
-
//=========================================================================
// the following are methods to support the coroutine implementation of the
// voice connection and processing. They should only be called in the context
@@ -750,12 +749,15 @@ void LLVivoxVoiceClient::voiceControlCoro()
gSavedSettings.getControl("VivoxVadNoiseFloor")->getSignal()->connect(boost::bind(&LLVivoxVoiceClient::onVADSettingsChange, this));
gSavedSettings.getControl("VivoxVadSensitivity")->getSignal()->connect(boost::bind(&LLVivoxVoiceClient::onVADSettingsChange, this));
- if (mTuningMode)
+ if (mTuningMode && !sShuttingDown)
{
performMicTuning();
}
- waitForChannel(); // this doesn't normally return unless relog is needed or shutting down
+ if (!sShuttingDown)
+ {
+ waitForChannel(); // this doesn't normally return unless relog is needed or shutting down
+ }
LL_DEBUGS("Voice") << "lost channel RelogRequested=" << mRelogRequested << LL_ENDL;
endAndDisconnectSession();
@@ -797,7 +799,6 @@ void LLVivoxVoiceClient::voiceControlCoro()
LL_INFOS("Voice") << "exiting" << LL_ENDL;
}
-
bool LLVivoxVoiceClient::startAndConnectSession()
{
bool ok = false;
@@ -1146,7 +1147,14 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
{
F32 timeout = pow(PROVISION_RETRY_TIMEOUT, static_cast(retryCount));
LL_WARNS("Voice") << "Provision CAP 404. Retrying in " << timeout << " seconds." << LL_ENDL;
- llcoro::suspendUntilTimeout(timeout);
+ if (sShuttingDown)
+ {
+ return false;
+ }
+ else
+ {
+ llcoro::suspendUntilTimeout(timeout);
+ }
}
else if (!status)
{
@@ -1373,8 +1381,13 @@ bool LLVivoxVoiceClient::loginToVivox()
// tell the user there is a problem
LL_WARNS("Voice") << "login " << loginresp << " will retry login in " << timeout << " seconds." << LL_ENDL;
-
- llcoro::suspendUntilTimeout(timeout);
+
+ if (!sShuttingDown)
+ {
+ // Todo: this is way to long, viewer can get stuck waiting during shutdown
+ // either make it listen to pump or split in smaller waits with checks for shutdown
+ llcoro::suspendUntilTimeout(timeout);
+ }
}
else if (loginresp == "failed")
{
@@ -1440,6 +1453,11 @@ void LLVivoxVoiceClient::logoutOfVivox(bool wait)
result = llcoro::suspendUntilEventOnWithTimeout(mVivoxPump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
+ if (sShuttingDown)
+ {
+ break;
+ }
+
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
// Don't get confused by prior queued events -- note that it's
// very important that mVivoxPump is an LLEventMailDrop, which
@@ -1679,6 +1697,12 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
{
result = llcoro::suspendUntilEventOnWithTimeout(mVivoxPump, SESSION_JOIN_TIMEOUT, timeoutResult);
+ if (sShuttingDown)
+ {
+ mIsJoiningSession = false;
+ return false;
+ }
+
LL_INFOS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
if (result.has("session"))
{
@@ -1875,7 +1899,7 @@ bool LLVivoxVoiceClient::waitForChannel()
if (sShuttingDown)
{
- logoutOfVivox(true);
+ logoutOfVivox(false);
return false;
}
@@ -1922,7 +1946,7 @@ bool LLVivoxVoiceClient::waitForChannel()
// the parcel is changed, or we have no pending audio sessions,
// so try to request the parcel voice info
// if we have the cap, we move to the appropriate state
- requestParcelVoiceInfo();
+ requestParcelVoiceInfo(); //suspends for http reply
}
else if (sessionNeedsRelog(mNextAudioSession))
{
@@ -1934,7 +1958,7 @@ bool LLVivoxVoiceClient::waitForChannel()
{
sessionStatePtr_t joinSession = mNextAudioSession;
mNextAudioSession.reset();
- if (!runSession(joinSession))
+ if (!runSession(joinSession)) //suspends
{
LL_DEBUGS("Voice") << "runSession returned false; leaving inner loop" << LL_ENDL;
break;
@@ -1949,7 +1973,7 @@ bool LLVivoxVoiceClient::waitForChannel()
}
}
- if (!mNextAudioSession)
+ if (!mNextAudioSession && !sShuttingDown)
{
llcoro::suspendUntilTimeout(1.0);
}
@@ -1970,9 +1994,9 @@ bool LLVivoxVoiceClient::waitForChannel()
mIsProcessingChannels = false;
- logoutOfVivox(true);
+ logoutOfVivox(!sShuttingDown /*bool wait*/);
- if (mRelogRequested)
+ if (mRelogRequested && !sShuttingDown)
{
LL_DEBUGS("Voice") << "Relog Requested, restarting provisioning" << LL_ENDL;
if (!provisionVoiceAccount())
@@ -2022,7 +2046,12 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
while (mVoiceEnabled && isGatewayRunning() && !mSessionTerminateRequested && !mTuningMode)
{
- sendCaptureAndRenderDevices();
+ sendCaptureAndRenderDevices(); // suspends
+ if (mSessionTerminateRequested)
+ {
+ break;
+ }
+
if (mAudioSession && mAudioSession->mParticipantsChanged)
{
mAudioSession->mParticipantsChanged = false;
@@ -2249,7 +2278,7 @@ bool LLVivoxVoiceClient::performMicTuning()
mIsInTuningMode = true;
llcoro::suspend();
- while (mTuningMode)
+ while (mTuningMode && !sShuttingDown)
{
if (mCaptureDeviceDirty || mRenderDeviceDirty)
@@ -2285,9 +2314,12 @@ bool LLVivoxVoiceClient::performMicTuning()
tuningCaptureStartSendMessage(1); // 1-loop, zero, don't loop
//---------------------------------------------------------------------
- llcoro::suspend();
+ if (!sShuttingDown)
+ {
+ llcoro::suspend();
+ }
- while (mTuningMode && !mCaptureDeviceDirty && !mRenderDeviceDirty)
+ while (mTuningMode && !mCaptureDeviceDirty && !mRenderDeviceDirty && !sShuttingDown)
{
// process mic/speaker volume changes
if (mTuningMicVolumeDirty || mTuningSpeakerVolumeDirty)
@@ -2327,7 +2359,7 @@ bool LLVivoxVoiceClient::performMicTuning()
// transition out of mic tuning
tuningCaptureStopSendMessage();
- if (mCaptureDeviceDirty || mRenderDeviceDirty)
+ if ((mCaptureDeviceDirty || mRenderDeviceDirty) && !sShuttingDown)
{
llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
}
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 686e2b9910..886acf677a 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -456,7 +456,6 @@ protected:
// local audio updates, mic mute, speaker mute, mic volume and speaker volumes
void sendLocalAudioUpdates();
-
/////////////////////////////
// Response/Event handlers
void connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index cc8b2980da..7ce1730b26 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4179,7 +4179,25 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
{
if (textures.find(img->getID()) == textures.end())
{
- S32 texture_cost = 256 + (S32)(ARC_TEXTURE_COST * (img->getFullHeight() / 128.f + img->getFullWidth() / 128.f));
+ S32 texture_cost = 0;
+ S8 type = img->getType();
+ if (type == LLViewerTexture::FETCHED_TEXTURE || type == LLViewerTexture::LOD_TEXTURE)
+ {
+ const LLViewerFetchedTexture* fetched_texturep = static_cast(img);
+ if (fetched_texturep
+ && fetched_texturep->getFTType() == FTT_LOCAL_FILE
+ && (img->getID() == IMG_ALPHA_GRAD_2D || img->getID() == IMG_ALPHA_GRAD)
+ )
+ {
+ // These two textures appear to switch between each other, but are of different sizes (4x256 and 256x256).
+ // Hardcode cost from larger one to not cause random complexity changes
+ texture_cost = 320;
+ }
+ }
+ if (texture_cost == 0)
+ {
+ texture_cost = 256 + (S32)(ARC_TEXTURE_COST * (img->getFullHeight() / 128.f + img->getFullWidth() / 128.f));
+ }
textures.insert(texture_cost_t::value_type(img->getID(), texture_cost));
}
}
@@ -5722,8 +5740,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
U32 useage = group->getSpatialPartition()->mBufferUsage;
- LLCachedControl max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
- LLCachedControl max_node_size(gSavedSettings, "RenderMaxNodeSize", 65536);
+ static LLCachedControl max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
+ static LLCachedControl max_node_size(gSavedSettings, "RenderMaxNodeSize", 65536);
U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
U32 max_total = (max_node_size * 1024) / LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
@@ -6540,7 +6558,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
#endif
- LLCachedControl max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
+ static LLCachedControl max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp
index 3aba7a87e3..152f957cc5 100644
--- a/indra/newview/llwatchdog.cpp
+++ b/indra/newview/llwatchdog.cpp
@@ -31,15 +31,6 @@
const U32 WATCHDOG_SLEEP_TIME_USEC = 1000000;
-void default_killer_callback()
-{
-#ifdef LL_WINDOWS
- RaiseException(0,0,0,0);
-#else
- raise(SIGQUIT);
-#endif
-}
-
// This class runs the watchdog timing thread.
class LLWatchdogTimerThread : public LLThread
{
@@ -165,11 +156,10 @@ void LLWatchdogTimeout::ping(const char *state)
}
// LLWatchdog
-LLWatchdog::LLWatchdog() :
- mSuspectsAccessMutex(),
- mTimer(NULL),
- mLastClockCount(0),
- mKillerCallback(&default_killer_callback)
+LLWatchdog::LLWatchdog()
+ :mSuspectsAccessMutex()
+ ,mTimer(NULL)
+ ,mLastClockCount(0)
{
}
@@ -191,9 +181,8 @@ void LLWatchdog::remove(LLWatchdogEntry* e)
unlockThread();
}
-void LLWatchdog::init(killer_event_callback func)
+void LLWatchdog::init()
{
- mKillerCallback = func;
if(!mSuspectsAccessMutex && !mTimer)
{
mSuspectsAccessMutex = new LLMutex();
@@ -260,8 +249,7 @@ void LLWatchdog::run()
mTimer->stop();
}
- LL_INFOS() << "Watchdog detected error:" << LL_ENDL;
- mKillerCallback();
+ LL_ERRS() << "Watchdog timer expired; assuming viewer is hung and crashing" << LL_ENDL;
}
}
diff --git a/indra/newview/llwatchdog.h b/indra/newview/llwatchdog.h
index a77212c6fc..fd0b0fdbce 100644
--- a/indra/newview/llwatchdog.h
+++ b/indra/newview/llwatchdog.h
@@ -98,9 +98,7 @@ public:
void add(LLWatchdogEntry* e);
void remove(LLWatchdogEntry* e);
- typedef boost::function killer_event_callback;
-
- void init(killer_event_callback func = NULL);
+ void init();
void run();
void cleanup();
@@ -113,8 +111,6 @@ private:
LLMutex* mSuspectsAccessMutex;
LLWatchdogTimerThread* mTimer;
U64 mLastClockCount;
-
- killer_event_callback mKillerCallback;
};
#endif // LL_LLTHREADWATCHDOG_H
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index a04c22789f..be1027a473 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -242,8 +242,8 @@ bool LLWeb::useExternalBrowser(const std::string &url)
std::string uri_string = up.host();
// FIRE-20796: Grid check status page ignores opening SL links in internal browser setting
- //boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com)$", boost::regex::perl|boost::regex::icase);
- boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com|secondlifegrid.net|secondlife-status.statuspage.io)$", boost::regex::perl|boost::regex::icase);
+ //boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com|secondlife.io)$", boost::regex::perl|boost::regex::icase);
+ boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com|secondlife.io|secondlifegrid.net|secondlife-status.statuspage.io)$", boost::regex::perl|boost::regex::icase);
//
boost::match_results matches;
return !(boost::regex_search(uri_string, matches, pattern));
diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp
index 182beba574..f2d7e4585a 100644
--- a/indra/newview/llwebprofile.cpp
+++ b/indra/newview/llwebprofile.cpp
@@ -113,6 +113,7 @@ void LLWebProfile::uploadImageCoro(LLPointer image, std::strin
httpOpts->setWantHeaders(true);
httpOpts->setFollowRedirects(false);
+ httpOpts->setSSLVerifyPeer(false); ; // viewer's cert bundle doesn't appear to agree with web certs from "https://my.secondlife.com/"
// Get upload configuration data.
std::string configUrl(getProfileURL(std::string()) + "snapshots/s3_upload_config");
diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp
index 730aa3774f..d55e1b7cd3 100644
--- a/indra/newview/llwlhandlers.cpp
+++ b/indra/newview/llwlhandlers.cpp
@@ -51,7 +51,7 @@ bool LLEnvironmentRequest::initiate(LLEnvironment::environment_apply_fn cb)
if (!cur_region->capabilitiesReceived())
{
LL_INFOS("WindlightCaps") << "Deferring windlight settings request until we've got region caps" << LL_ENDL;
- cur_region->setCapabilitiesReceivedCallback([cb](const LLUUID ®ion_id) { LLEnvironmentRequest::onRegionCapsReceived(region_id, cb); });
+ cur_region->setCapabilitiesReceivedCallback([cb](const LLUUID ®ion_id, LLViewerRegion* regionp) { LLEnvironmentRequest::onRegionCapsReceived(region_id, cb); });
return false;
}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 8e64265bf2..be66720237 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1022,7 +1022,10 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
mFXAABuffer.release();
}
- if (shadow_detail > 0 || ssao || RenderDepthOfField || samples > 0)
+// if (shadow_detail > 0 || ssao || RenderDepthOfField || samples > 0)
+// [RLVa:KB] - @setsphere
+ if (shadow_detail > 0 || ssao || RenderDepthOfField || samples > 0 || RlvActions::hasPostProcess())
+// [/RLVa:KB]
{ //only need mDeferredLight for shadows OR ssao OR dof OR fxaa
if (!mDeferredLight.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
}
diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp
index 690250c164..f7fc62d28b 100644
--- a/indra/newview/rlvactions.cpp
+++ b/indra/newview/rlvactions.cpp
@@ -18,6 +18,7 @@
#include "llagent.h"
#include "llimview.h"
#include "llviewercamera.h"
+#include "llvisualeffect.h"
#include "llvoavatarself.h"
#include "llworld.h"
@@ -133,6 +134,20 @@ bool RlvActions::canChangeActiveGroup(const LLUUID& idRlvObject)
return (idRlvObject.isNull()) ? !gRlvHandler.hasBehaviour(RLV_BHVR_SETGROUP) : !gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETGROUP, idRlvObject);
}
+bool RlvActions::canGiveInventory()
+{
+ // User can give at least one (unspecified) avatar inventory if:
+ // - not specifically restricted from giving inventory (or at least one exception exists)
+ return (!gRlvHandler.hasBehaviour(RLV_BHVR_SHARE)) || (gRlvHandler.hasException(RLV_BHVR_SHARE));
+}
+
+bool RlvActions::canGiveInventory(const LLUUID& idAgent)
+{
+ // User can give another avatar inventory if:
+ // - not specifically restricted from giving inventory (or the target is an exception)
+ return (!gRlvHandler.hasBehaviour(RLV_BHVR_SHARE)) || (gRlvHandler.isException(RLV_BHVR_SHARE, idAgent));
+}
+
// Little helper function to check the IM exclusion range for @recvim, @sendim and @startim (returns: min_dist <= (pos user - pos target) <= max_dist)
static bool rlvCheckAvatarIMDistance(const LLUUID& idAvatar, ERlvBehaviourModifier eModDistMin, ERlvBehaviourModifier eModDistMax)
{
@@ -385,6 +400,11 @@ bool RlvActions::canChangeEnvironment(const LLUUID& idRlvObject)
return (idRlvObject.isNull()) ? !gRlvHandler.hasBehaviour(RLV_BHVR_SETENV) : !gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETENV, idRlvObject);
}
+bool RlvActions::hasPostProcess()
+{
+ return LLVfxManager::instance().hasEffect(EVisualEffect::RlvSphere);
+}
+
// ============================================================================
// World interaction
//
@@ -407,19 +427,53 @@ bool RlvActions::canBuyObject(const LLUUID& idObj)
return (!RlvHandler::instance().hasBehaviour(RLV_BHVR_BUY));
}
-// Handles: @edit and @editobj
+// Handles: @edit, @editobj, @editattach and @editworld
+bool RlvActions::canEdit(ERlvCheckType eCheckType)
+{
+ RlvHandler& rlvHandler = RlvHandler::instance();
+ switch (eCheckType)
+ {
+ case ERlvCheckType::All:
+ // No edit restrictions of any kind
+ return
+ !rlvHandler.hasBehaviour(RLV_BHVR_EDIT) && !rlvHandler.hasBehaviour(RLV_BHVR_EDITOBJ) &&
+ !rlvHandler.hasBehaviour(RLV_BHVR_EDITATTACH) && !rlvHandler.hasBehaviour(RLV_BHVR_EDITWORLD);
+
+ case ERlvCheckType::Some:
+ // Not @edit restricted (or at least one exception) and either not @editattach or not @editworld restricted
+ return
+ (!rlvHandler.hasBehaviour(RLV_BHVR_EDIT) || rlvHandler.hasException(RLV_BHVR_EDIT)) &&
+ (!rlvHandler.hasBehaviour(RLV_BHVR_EDITATTACH) || rlvHandler.hasBehaviour(RLV_BHVR_EDITWORLD));
+
+ case ERlvCheckType::Nothing:
+ // Either @edit restricted with no exceptions or @editattach and @editworld restricted at the same time
+ return
+ (rlvHandler.hasBehaviour(RLV_BHVR_EDIT) && !rlvHandler.hasException(RLV_BHVR_EDIT)) ||
+ (rlvHandler.hasBehaviour(RLV_BHVR_EDITATTACH) && rlvHandler.hasBehaviour(RLV_BHVR_EDITWORLD));
+
+ default:
+ RLV_ASSERT(false);
+ return false;
+ }
+}
+
+// Handles: @edit, @editobj, @editattach and @editworld
bool RlvActions::canEdit(const LLViewerObject* pObj)
{
// User can edit the specified object if:
// - not generally restricted from editing (or the object's root is an exception)
// - not specifically restricted from editing this object's root
+ // - it's an attachment and not restricted from editing attachments
+ // it's a rezzed object and not restricted from editing any world objects
// NOTE-RLVa: edit checks should *never* be subject to @fartouch distance checks since we don't have the pick offset so
// instead just implicitly rely on the presence of a (transient) selection
return
(pObj) &&
( (!RlvHandler::instance().hasBehaviour(RLV_BHVR_EDIT)) || (RlvHandler::instance().isException(RLV_BHVR_EDIT, pObj->getRootEdit()->getID())) ) &&
- ( (!RlvHandler::instance().hasBehaviour(RLV_BHVR_EDITOBJ)) || (!RlvHandler::instance().isException(RLV_BHVR_EDITOBJ, pObj->getRootEdit()->getID())) );
+ ( (!RlvHandler::instance().hasBehaviour(RLV_BHVR_EDITOBJ)) || (!RlvHandler::instance().isException(RLV_BHVR_EDITOBJ, pObj->getRootEdit()->getID())) ) &&
+ ( (pObj->isAttachment()) ? !RlvHandler::instance().hasBehaviour(RLV_BHVR_EDITATTACH)
+ : !RlvHandler::instance().hasBehaviour(RLV_BHVR_EDITWORLD) );
}
// Handles: @fartouch and @interact
@@ -466,6 +520,12 @@ bool RlvActions::canGroundSit()
return (!hasBehaviour(RLV_BHVR_SIT)) && (canStand());
}
+bool RlvActions::canGroundSit(const LLUUID& idRlvObjExcept)
+{
+ // See canGroundSit() but disregard any restrictions held by the issuing object
+ return (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_SIT, idRlvObjExcept)) && (canStand(idRlvObjExcept));
+}
+
bool RlvActions::canSit(const LLViewerObject* pObj, const LLVector3& posOffset /*=LLVector3::zero*/)
{
// User can sit on the specified object if:
@@ -519,8 +579,8 @@ bool RlvActions::canTouch(const LLViewerObject* pObj, const LLVector3& posOffset
// (2) Attachment (on another avatar)
// - a) not prevented from touching any object
// - b) not specifically prevented from touching that object
- // - d) not prevented from touching attachments (or the attachment is an exception)
- // - e) not prevented from touching other avatar's attachments (or the attachment is an exception)
+ // - d) not prevented from touching attachments (or the attachment and/or its wearer is/are an exception)
+ // - e) not prevented from touching other avatar's attachments (or the attachment is worn by a specific avatar on the exception list)
// - h) not prevented from touching faraway objects (or the attachment's center + pick offset is within range)
// - i) specifically allowed to touch that object (overrides all restrictions)
// (3) Attachment (on own avatar)
@@ -538,7 +598,7 @@ bool RlvActions::canTouch(const LLViewerObject* pObj, const LLVector3& posOffset
// NOTE-RLVa: * touch restrictions apply linkset-wide (as opposed to, for instance, hover text which is object-specific) but only the root object's restrictions are tested
// * @touchall affects world objects and world attachments (self and others') but >not< HUD attachments
// * @fartouch distance matches against the specified object + pick offset (so >not< the linkset root)
- // * @touchattachother exceptions are only checked under the general @touchattach exceptions
+ // * @touchattachother exceptions change when they specify an avatar id (=block all) or an object id (=allow indiviual - see general @touchattach exceptions)
// * @touchattachself exceptions are only checked under the general @touchattach exceptions
// * @touchme in any object of a linkset affects that entire linkset (= if you can specifically touch one prim in a linkset you can touch that entire linkset)
const LLUUID& idRoot = (pObj) ? pObj->getRootEdit()->getID() : LLUUID::null;
@@ -551,12 +611,23 @@ bool RlvActions::canTouch(const LLViewerObject* pObj, const LLVector3& posOffset
( (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHTHIS)) || (!rlvHandler.isException(RLV_BHVR_TOUCHTHIS, idRoot, ERlvExceptionCheck::Permissive)) );
if (fCanTouch)
{
- if ( (!pObj->isAttachment()) || (!pObj->permYouOwner()) )
+ if (!pObj->isAttachment())
{
- // Rezzed or attachment worn by other - test for (1.c), (2.d), (2.e) and (1/2.h)
+ // Rezzed object - test for (1.c) and (1.h)
fCanTouch =
- ( (!pObj->isAttachment()) ? (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHWORLD)) || (rlvHandler.isException(RLV_BHVR_TOUCHWORLD, idRoot, ERlvExceptionCheck::Permissive))
- : ((!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACH)) && (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACHOTHER))) || (rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idRoot, ERlvExceptionCheck::Permissive)) ) &&
+ ( (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHWORLD)) || (rlvHandler.isException(RLV_BHVR_TOUCHWORLD, idRoot, ERlvExceptionCheck::Permissive)) ) &&
+ ( (!rlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) || (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) <= s_nFartouchDist * s_nFartouchDist) );
+ }
+ else if (!pObj->permYouOwner())
+ {
+ // Attachment worn by other - test for (2.d), (2.e) and (2.h)
+ const LLUUID& idAttachAgent = static_cast(pObj->getRoot())->getID();
+ fCanTouch =
+ (
+ ( (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACH) && !rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACHOTHER)) ||
+ (rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idRoot, ERlvExceptionCheck::Permissive) || rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idAttachAgent, ERlvExceptionCheck::Permissive)) ) &&
+ (!rlvHandler.isException(RLV_BHVR_TOUCHATTACHOTHER, idAttachAgent))
+ ) &&
( (!rlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) || (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) <= s_nFartouchDist * s_nFartouchDist) );
}
else if (!pObj->isHUDAttachment())
diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h
index 39fd2beac7..9ff7e18939 100644
--- a/indra/newview/rlvactions.h
+++ b/indra/newview/rlvactions.h
@@ -34,6 +34,8 @@ class LLVOAvatar;
// RlvActions class declaration - developer-friendly non-RLVa code facing class, use in lieu of RlvHandler whenever possible
//
+enum class ERlvCheckType { All, Some, Nothing };
+
class RlvActions
{
// ======
@@ -90,6 +92,16 @@ public:
*/
static bool canChangeActiveGroup(const LLUUID& idRlvObject = LLUUID::null);
+ /*
+ * Returns true if the user is allowed to give inventory to at least one (unspecified) avatar (used to blanket ban use of 'Share' if the user cannot give items to *anyone*)
+ */
+ static bool canGiveInventory();
+
+ /*
+ * Returns true if the user is allowed to give the specified avatar inventory
+ */
+ static bool canGiveInventory(const LLUUID& idAgent);
+
/*
* Returns true if the user is allowed to receive IMs from the specified sender (can be an avatar or a group)
*/
@@ -225,6 +237,10 @@ public:
*/
static bool canChangeEnvironment(const LLUUID& idRlvObject = LLUUID::null);
+ /*
+ * Returns true if a postprocessing shader is currently active
+ */
+ static bool hasPostProcess();
// =================
// World interaction
@@ -246,6 +262,11 @@ public:
*/
static bool canBuyObject(const LLUUID& idObj);
+ /*
+ * Returns true if the user can edit all, some, or nothing (used to bail early, or to skip expensive selection checks)
+ */
+ static bool canEdit(ERlvCheckType eCheckType);
+
/*
* Returns true if the user can edit the specified object (with an optional relative offset)
*/
@@ -255,6 +276,7 @@ public:
* Returns true if the user can sit on the ground
*/
static bool canGroundSit();
+ static bool canGroundSit(const LLUUID& idRlvObjExcept);
/*
* Returns true if the user can interact with the specified object (with an optional relative offset)
diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h
index c0e19fe324..4977a42632 100644
--- a/indra/newview/rlvdefines.h
+++ b/indra/newview/rlvdefines.h
@@ -129,6 +129,7 @@ enum ERlvBehaviour {
RLV_BHVR_SENDGESTURE,
RLV_BHVR_PERMISSIVE, // "permissive"
RLV_BHVR_NOTIFY, // "notify"
+ RLV_BHVR_SHARE,
RLV_BHVR_SHOWINV, // "showinv"
RLV_BHVR_SHOWMINIMAP, // "showminimap"
RLV_BHVR_SHOWWORLDMAP, // "showworldmap"
@@ -156,7 +157,9 @@ enum ERlvBehaviour {
RLV_BHVR_ALLOWIDLE, // "allowidle"
RLV_BHVR_BUY, // "buy"
RLV_BHVR_EDIT, // "edit"
+ RLV_BHVR_EDITATTACH,
RLV_BHVR_EDITOBJ, // "editobj"
+ RLV_BHVR_EDITWORLD,
RLV_BHVR_VIEWTRANSPARENT,
RLV_BHVR_VIEWWIREFRAME,
RLV_BHVR_PAY, // "pay"
@@ -176,6 +179,7 @@ enum ERlvBehaviour {
RLV_BHVR_SETGROUP, // "setgroup"
RLV_BHVR_UNSIT, // "unsit"
RLV_BHVR_SIT, // "sit"
+ RLV_BHVR_SITGROUND,
RLV_BHVR_SITTP, // "sittp"
RLV_BHVR_STANDTP, // "standtp"
RLV_BHVR_SETDEBUG, // "setdebug"
@@ -248,6 +252,7 @@ enum ERlvBehaviour {
// Effects
RLV_BHVR_SETSPHERE, // Gives an object exclusive control of the 'vision spheres' effect
RLV_BHVR_SETOVERLAY, // Gives an object exclusive control of the overlay
+ RLV_BHVR_SETOVERLAY_TOUCH, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction
RLV_BHVR_SETOVERLAY_TWEEN, // Animate between the current overlay settings and the supplied values
RLV_BHVR_COUNT,
@@ -288,7 +293,6 @@ enum class ERlvLocalBhvrModifier
OverlayAlpha, // Transparency level of the overlay texture (in addition to the texture's own alpha channel)
OverlayTexture, // Specifies the UUID of the overlay texture
OverlayTint, // The tint that's applied to the overlay texture
- OverlayTouch, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction
// @setsphere
SphereMode, // The type of effect that will apply to any pixel that intersects with the sphere (e.g. blend, blur, ...)
SphereOrigin, // The origin of the sphere can either be the avatar or the camera position
@@ -459,6 +463,8 @@ namespace RlvStringKeys
/*inline*/ constexpr boost::string_view RecvIm = make_string_view("blocked_recvim");
/*inline*/ constexpr boost::string_view RecvImRemote = make_string_view("blocked_recvim_remote");
/*inline*/ constexpr boost::string_view SendIm = make_string_view("blocked_sendim");
+ /*inline*/ constexpr boost::string_view Share = make_string_view("blocked_share");
+ /*inline*/ constexpr boost::string_view ShareGeneric = make_string_view("blocked_share_generic");
/*inline*/ constexpr boost::string_view StartConference = make_string_view("blocked_startconf");
/*inline*/ constexpr boost::string_view StartIm = make_string_view("blocked_startim");
/*inline*/ constexpr boost::string_view Teleport = make_string_view("blocked_teleport");
@@ -476,6 +482,8 @@ namespace RlvStringKeys
constexpr const char RecvIm[] = "blocked_recvim";
constexpr const char RecvImRemote[] = "blocked_recvim_remote";
constexpr const char SendIm[] = "blocked_sendim";
+ constexpr const char Share[] = "blocked_share";
+ constexpr const char ShareGeneric[] = "blocked_share_generic";
constexpr const char StartConference[] = "blocked_startconf";
constexpr const char StartIm[] = "blocked_startim";
constexpr const char Teleport[] = "blocked_teleport";
diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp
index 70e9030144..b3ad464646 100644
--- a/indra/newview/rlveffects.cpp
+++ b/indra/newview/rlveffects.cpp
@@ -58,15 +58,6 @@ ERlvCmdRet RlvOverlayEffect::onAlphaValueChanged(const LLUUID& idRlvObj, const b
return RLV_RET_SUCCESS;
}
-// static
-ERlvCmdRet RlvOverlayEffect::onBlockTouchValueChanged(const LLUUID& idRlvObj, const boost::optional newValue)
-{
- if (RlvOverlayEffect* pEffect = LLVfxManager::instance().getEffect(idRlvObj))
- {
- pEffect->m_fBlockTouch = (newValue) ? boost::get(newValue.value()) : false;
- }
- return RLV_RET_SUCCESS;
-}
// static
ERlvCmdRet RlvOverlayEffect::onColorValueChanged(const LLUUID& idRlvObj, const boost::optional newValue)
{
diff --git a/indra/newview/rlveffects.h b/indra/newview/rlveffects.h
index d4378da88f..e0649ad90b 100644
--- a/indra/newview/rlveffects.h
+++ b/indra/newview/rlveffects.h
@@ -39,10 +39,10 @@ public:
public:
bool hitTest(const LLCoordGL& ptMouse) const;
void run(const LLVisualEffectParams*) override;
+ void setBlockTouch(bool block_touch) { m_fBlockTouch = block_touch; }
void tweenAlpha(float endAlpha, double duration) { m_nAlpha.start(endAlpha, duration); }
void tweenColor(LLColor3 endColor, double duration) { m_Color.start(endColor, duration); }
static ERlvCmdRet onAlphaValueChanged(const LLUUID& idRlvObj, const boost::optional newValue);
- static ERlvCmdRet onBlockTouchValueChanged(const LLUUID& idRlvObj, const boost::optional newValue);
static ERlvCmdRet onColorValueChanged(const LLUUID& idRlvObj, const boost::optional newValue);
static ERlvCmdRet onTextureChanged(const LLUUID& idRlvObj, const boost::optional newValue);
protected:
diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp
index fd92632ec0..2d6bbb39a6 100644
--- a/indra/newview/rlvhandler.cpp
+++ b/indra/newview/rlvhandler.cpp
@@ -901,10 +901,7 @@ void RlvHandler::setCameraOverride(bool fOverride)
// Checked: 2010-08-29 (RLVa-1.2.1c) | Modified: RLVa-1.2.1c
void RlvHandler::onSitOrStand(bool fSitting)
{
- if (rlv_handler_t::isEnabled())
- {
- RlvSettings::updateLoginLastLocation();
- }
+ RlvSettings::updateLoginLastLocation();
if ( (hasBehaviour(RLV_BHVR_STANDTP)) && (!fSitting) && (!m_posSitSource.isExactlyZero()) )
{
@@ -916,6 +913,30 @@ void RlvHandler::onSitOrStand(bool fSitting)
doOnIdleOneTime(boost::bind(RlvUtil::forceTp, m_posSitSource));
m_posSitSource.setZero();
}
+ else if ( (!fSitting) && (m_fPendingGroundSit) )
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
+ send_agent_update(TRUE, TRUE);
+
+ m_fPendingGroundSit = false;
+ m_idPendingSitActor = m_idPendingUnsitActor;
+ }
+
+ if (isAgentAvatarValid())
+ {
+ const LLViewerObject* pSitObj = static_cast(gAgentAvatarp->getParent());
+ const LLUUID& idSitObj = (pSitObj) ? pSitObj->getID() : LLUUID::null;
+ if (fSitting)
+ {
+ RlvBehaviourNotifyHandler::instance().onSit(idSitObj, !gRlvHandler.hasBehaviourExcept(RLV_BHVR_SIT, m_idPendingSitActor));
+ m_idPendingSitActor.setNull();
+ }
+ else
+ {
+ RlvBehaviourNotifyHandler::instance().onStand(idSitObj, !gRlvHandler.hasBehaviourExcept(RLV_BHVR_UNSIT, m_idPendingUnsitActor));
+ m_idPendingUnsitActor.setNull();
+ }
+ }
}
// Checked: 2010-03-11 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
@@ -2083,7 +2104,7 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand&
}
// Refresh overlay effects according to object hierarchy
- std::list effects;
+ std::list effects;
if (LLVfxManager::instance().getEffects(effects))
{
auto itActiveEffect = std::find_if(effects.begin(), effects.end(), [](const LLVisualEffect* pEffect) { return pEffect->getEnabled(); });
@@ -2094,17 +2115,30 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand&
}
const LLUUID idActiveRootObj = (effects.end() != itActiveEffect) ? Rlv::getObjectRootId((*itActiveEffect)->getId()) : LLUUID::null;
- for (LLVisualEffect* pEffect : effects)
+ for (RlvOverlayEffect* pEffect : effects)
{
bool isActive = (idActiveRootObj.isNull() && pEffect == effects.front()) || (Rlv::getObjectRootId(pEffect->getId()) == idActiveRootObj);
int nPriority = (isActive) ? 256 - Rlv::getObjectLinkNumber(pEffect->getId()) : pEffect->getPriority();
LLVfxManager::instance().updateEffect(pEffect, isActive, nPriority);
+ pEffect->setBlockTouch(gRlvHandler.hasBehaviour(pEffect->getId(), RLV_BHVR_SETOVERLAY_TOUCH));
}
}
return eRet;
}
+// Handles: @setoverlay_touch=n
+template<> template<>
+ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
+{
+ if (RlvOverlayEffect* pOverlayEffect = LLVfxManager::instance().getEffect(rlvCmd.getObjectID()))
+ {
+ pOverlayEffect->setBlockTouch( RLV_TYPE_ADD == rlvCmd.getParamType() );
+ }
+
+ return RLV_RET_SUCCESS;
+}
+
// Handles: @setsphere=n|y
template<> template<>
ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
@@ -2118,6 +2152,8 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand&
{
if (gRlvHandler.hasBehaviour(rlvCmd.getObjectID(), rlvCmd.getBehaviourType()))
{
+ LLVfxManager::instance().addEffect(new RlvSphereEffect(rlvCmd.getObjectID()));
+
Rlv::forceAtmosphericShadersIfAvailable();
// If we're not using deferred but are using Windlight shaders we need to force use of FBO and depthmap texture
@@ -2131,8 +2167,13 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand&
gPipeline.resetVertexBuffers();
LLViewerShaderMgr::instance()->setShaders();
}
-
- LLVfxManager::instance().addEffect(new RlvSphereEffect(rlvCmd.getObjectID()));
+ else if (!gPipeline.mDeferredLight.isComplete())
+ {
+ // In case of deferred with no shadows, no ambient occlusion, no depth of field, and no antialiasing
+ gPipeline.releaseGLBuffers();
+ gPipeline.createGLBuffers();
+ RLV_ASSERT(gPipeline.mDeferredLight.isComplete());
+ }
}
else
{
@@ -2794,6 +2835,9 @@ ERlvCmdRet RlvHandler::processForceCommand(const RlvCommand& rlvCmd) const
{
gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
send_agent_update(TRUE, TRUE); // See behaviour notes on why we have to force an agent update here
+
+ gRlvHandler.m_idPendingSitActor.setNull();
+ gRlvHandler.m_idPendingUnsitActor = gRlvHandler.getCurrentObject();
}
}
break;
@@ -3236,6 +3280,34 @@ ERlvCmdRet RlvForceHandler::onCommand(const RlvCommand& rlvCm
return (fValid) ? RLV_RET_SUCCESS : RLV_RET_FAILED_OPTION;
}
+// Handles: @sitground=force
+template<> template<>
+ERlvCmdRet RlvForceHandler::onCommand(const RlvCommand& rlvCmd)
+{
+ if ( (!RlvActions::canGroundSit(rlvCmd.getObjectID())) || (!isAgentAvatarValid()) )
+ return RLV_RET_FAILED_LOCK;
+
+ if (!gAgentAvatarp->isSitting())
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
+
+ gRlvHandler.m_fPendingGroundSit = false;
+ gRlvHandler.m_idPendingSitActor = gRlvHandler.getCurrentObject();
+ gRlvHandler.m_idPendingUnsitActor.setNull();
+ }
+ else if (gAgentAvatarp->getParent())
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
+
+ gRlvHandler.m_fPendingGroundSit = true;
+ gRlvHandler.m_idPendingSitActor.setNull();
+ gRlvHandler.m_idPendingUnsitActor = gRlvHandler.getCurrentObject();
+ }
+ send_agent_update(TRUE, TRUE);
+
+ return RLV_RET_SUCCESS;
+}
+
// Handles: @sit:=force
template<> template<>
ERlvCmdRet RlvForceHandler::onCommand(const RlvCommand& rlvCmd)
@@ -3247,10 +3319,7 @@ ERlvCmdRet RlvForceHandler::onCommand(const RlvCommand& rlvCmd)
LLViewerObject* pObj = NULL;
if (idTarget.isNull())
{
- if ( (!RlvActions::canGroundSit()) || ((isAgentAvatarValid()) && (gAgentAvatarp->isSitting())) )
- return RLV_RET_FAILED_LOCK;
- gAgent.sitDown();
- send_agent_update(TRUE, TRUE);
+ return RlvForceHandler::onCommand(rlvCmd);
}
else if ( ((pObj = gObjectList.findObject(idTarget)) != NULL) && (LL_PCODE_VOLUME == pObj->getPCode()))
{
@@ -3273,6 +3342,9 @@ ERlvCmdRet RlvForceHandler::onCommand(const RlvCommand& rlvCmd)
gMessageSystem->addUUIDFast(_PREHASH_TargetID, pObj->mID);
gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3::zero);
pObj->getRegion()->sendReliableMessage();
+
+ gRlvHandler.m_idPendingSitActor = gRlvHandler.getCurrentObject();
+ gRlvHandler.m_idPendingUnsitActor.setNull();
}
else
{
diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h
index 01da4b6269..e5a6b0895e 100644
--- a/indra/newview/rlvhandler.h
+++ b/indra/newview/rlvhandler.h
@@ -266,6 +266,9 @@ protected:
bool m_fCanCancelTp; // @accepttp=n and @tpto=force
mutable LLVector3d m_posSitSource; // @standtp=n (mutable because onForceXXX handles are all declared as const)
+ bool m_fPendingGroundSit = false; // @sitground=force
+ LLUUID m_idPendingSitActor; // @sit=force and @sitground=force
+ LLUUID m_idPendingUnsitActor; // @unsit=force
mutable LLUUID m_idAgentGroup; // @setgroup=n
std::pair m_PendingGroupChange; // @setgroup=force
std::pair m_GroupChangeExpiration; // @setgroup=force
diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp
index f633d12770..7af251e9ca 100644
--- a/indra/newview/rlvhelper.cpp
+++ b/indra/newview/rlvhelper.cpp
@@ -106,7 +106,9 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourInfo("detachthis_except", RLV_BHVR_DETACHTHISEXCEPT, RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_NODE));
addEntry(new RlvBehaviourInfo("detachallthis_except", RLV_BHVR_DETACHTHISEXCEPT, RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_SUBTREE));
addEntry(new RlvBehaviourGenericToggleProcessor("edit"));
+ addEntry(new RlvBehaviourGenericProcessor("editattach", RLV_BHVR_EDITATTACH));
addEntry(new RlvBehaviourGenericProcessor("editobj", RLV_BHVR_EDITOBJ));
+ addEntry(new RlvBehaviourGenericProcessor("editworld", RLV_BHVR_EDITWORLD));
addEntry(new RlvBehaviourGenericToggleProcessor("viewtransparent", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvBehaviourGenericToggleProcessor("viewwireframe", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvBehaviourGenericProcessor("emote", RLV_BHVR_EMOTE));
@@ -142,6 +144,7 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourGenericToggleProcessor("setdebug"));
addEntry(new RlvBehaviourGenericToggleProcessor("setenv"));
addEntry(new RlvBehaviourGenericProcessor("setgroup", RLV_BHVR_SETGROUP));
+ addEntry(new RlvBehaviourGenericProcessor("share", RLV_BHVR_SHARE, RlvBehaviourInfo::BHVR_STRICT));
addEntry(new RlvBehaviourInfo("sharedunwear", RLV_BHVR_SHAREDUNWEAR, RLV_TYPE_ADDREM, RlvBehaviourInfo::BHVR_EXTENDED));
addEntry(new RlvBehaviourInfo("sharedwear", RLV_BHVR_SHAREDWEAR, RLV_TYPE_ADDREM, RlvBehaviourInfo::BHVR_EXTENDED));
addEntry(new RlvBehaviourProcessor("showhovertext"));
@@ -169,7 +172,7 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourGenericProcessor("temprun", RLV_BHVR_TEMPRUN));
addEntry(new RlvBehaviourGenericProcessor("touchall", RLV_BHVR_TOUCHALL));
addEntry(new RlvBehaviourGenericProcessor("touchattach", RLV_BHVR_TOUCHATTACH));
- addEntry(new RlvBehaviourGenericProcessor("touchattachother", RLV_BHVR_TOUCHATTACHOTHER));
+ addEntry(new RlvBehaviourGenericProcessor("touchattachother", RLV_BHVR_TOUCHATTACHOTHER));
addEntry(new RlvBehaviourGenericProcessor("touchattachself", RLV_BHVR_TOUCHATTACHSELF));
addEntry(new RlvBehaviourGenericProcessor("touchfar", RLV_BHVR_FARTOUCH, RlvBehaviourInfo::BHVR_SYNONYM));
addEntry(new RlvBehaviourGenericProcessor("touchhud", RLV_BHVR_TOUCHHUD, RlvBehaviourInfo::BHVR_EXTENDED));
@@ -229,8 +232,8 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayAlpha, typeid(float), "alpha", &RlvOverlayEffect::onAlphaValueChanged);
pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayTexture, typeid(LLUUID), "texture", &RlvOverlayEffect::onTextureChanged);
pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayTint, typeid(LLVector3), "tint", &RlvOverlayEffect::onColorValueChanged);
- pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayTouch, typeid(LLVector3), "touch", &RlvOverlayEffect::onBlockTouchValueChanged);
addEntry(pSetOverlayBhvr);
+ addEntry(new RlvBehaviourProcessor("setoverlay_touch"));
addEntry(new RlvForceProcessor("setoverlay_tween"));
// Sphere
@@ -293,6 +296,7 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvForceProcessor("setcam_mode", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvForceProcessor("setgroup"));
addEntry(new RlvForceProcessor("sit"));
+ addEntry(new RlvForceProcessor("sitground"));
addEntry(new RlvForceProcessor("tpto"));
addEntry(new RlvBehaviourInfo("unsit", RLV_BHVR_UNSIT, RLV_TYPE_FORCE));
@@ -1927,6 +1931,22 @@ void RlvBehaviourNotifyHandler::onReattach(const LLViewerJointAttachment* pAttac
sendNotification(llformat("reattached %s %s", (fAllowed) ? "legally" : "illegally", pAttachPt->getName().c_str()));
}
+void RlvBehaviourNotifyHandler::onSit(const LLUUID& idObj, bool fAllowed)
+{
+ if (idObj.isNull())
+ sendNotification(llformat("sat ground %s", (fAllowed) ? "legally" : "illegally"));
+ else
+ sendNotification(llformat("sat object %s %s", (fAllowed) ? "legally" : "illegally", idObj.asString().c_str()));
+}
+
+void RlvBehaviourNotifyHandler::onStand(const LLUUID& idObj, bool fAllowed)
+{
+ if (idObj.isNull())
+ sendNotification(llformat("unsat ground %s", (fAllowed) ? "legally" : "illegally"));
+ else
+ sendNotification(llformat("unsat object %s %s", (fAllowed) ? "legally" : "illegally", idObj.asString().c_str()));
+}
+
// =========================================================================
// Various helper classes/timers/functors
//
diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h
index c36cde75b0..d20ba1790b 100644
--- a/indra/newview/rlvhelper.h
+++ b/indra/newview/rlvhelper.h
@@ -625,11 +625,13 @@ public:
* Event handlers
*/
public:
- static void onWear(LLWearableType::EType eType, bool fAllowed);
- static void onTakeOff(LLWearableType::EType eType, bool fAllowed);
- static void onAttach(const LLViewerJointAttachment* pAttachPt, bool fAllowed);
- static void onDetach(const LLViewerJointAttachment* pAttachPt, bool fAllowed);
- static void onReattach(const LLViewerJointAttachment* pAttachPt, bool fAllowed);
+ static void onWear(LLWearableType::EType eType, bool fAllowed);
+ static void onTakeOff(LLWearableType::EType eType, bool fAllowed);
+ static void onAttach(const LLViewerJointAttachment* pAttachPt, bool fAllowed);
+ static void onDetach(const LLViewerJointAttachment* pAttachPt, bool fAllowed);
+ static void onReattach(const LLViewerJointAttachment* pAttachPt, bool fAllowed);
+ void onSit(const LLUUID& idObj, bool fAllowed);
+ void onStand(const LLUUID& idObj, bool fAllowed);
protected:
void onCommand(const RlvCommand& rlvCmd, ERlvCmdRet eRet, bool fInternal);
diff --git a/indra/newview/skins/ansastorm/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/ansastorm/xui/en/panel_outfits_inventory.xml
index aa8dbb34b4..ed7e3b6e8a 100644
--- a/indra/newview/skins/ansastorm/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/ansastorm/xui/en/panel_outfits_inventory.xml
@@ -106,7 +106,7 @@
+
diff --git a/indra/newview/skins/default/xui/da/panel_landmarks.xml b/indra/newview/skins/default/xui/da/panel_landmarks.xml
deleted file mode 100644
index e9e5e506fd..0000000000
--- a/indra/newview/skins/default/xui/da/panel_landmarks.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/de/floater_fs_teleporthistory.xml b/indra/newview/skins/default/xui/de/floater_fs_teleporthistory.xml
index 9298217fa3..a5a3a82ca6 100644
--- a/indra/newview/skins/default/xui/de/floater_fs_teleporthistory.xml
+++ b/indra/newview/skins/default/xui/de/floater_fs_teleporthistory.xml
@@ -3,4 +3,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/de/floater_inspect.xml b/indra/newview/skins/default/xui/de/floater_inspect.xml
index f8058a1a24..1f6fe35bc4 100644
--- a/indra/newview/skins/default/xui/de/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/de/floater_inspect.xml
@@ -12,6 +12,7 @@
[NUM_OBJECTS] Objekte, [NUM_PRIMS] Prims
Flächen: [NUM_FACES]
+Sichtbar: [NUM_VISIBLE_FACES]
Vertices: [NUM_VERTICES]
Dreiecke: [NUM_TRIANGLES]
Komplex.: [COMPLEXITY]
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index ac38518782..56b6e0b63d 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -439,8 +439,10 @@
-
+
+
+
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 133c702867..30a71b2eff 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -4019,6 +4019,9 @@ Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „In
[FNAME] wurde nicht gefunden und konnte deshalb nicht aktualisiert werden.
Zukünftige Aktualisierungen dieser Datei werden deaktiviert.
+
+ <nolink>„[OBJ_NAME]“</nolink> kann nicht als Inhalt des Objekts gespeichert werden, da Sie keine Berechtigung zur Übertragung des Gegenstands besitzen.
+
[FNAME] konnte auch nach [NRETRIES] Versuchen nicht geöffnet oder decodiert werden und gilt als beschädigt.
Zukünftige Aktualisierungen dieser Datei werden deaktiviert.
diff --git a/indra/newview/skins/default/xui/de/panel_landmarks.xml b/indra/newview/skins/default/xui/de/panel_landmarks.xml
deleted file mode 100644
index c0b09f5838..0000000000
--- a/indra/newview/skins/default/xui/de/panel_landmarks.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
index 2293d0d8c1..049935bece 100644
--- a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
@@ -17,7 +17,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/de/panel_places.xml b/indra/newview/skins/default/xui/de/panel_places.xml
index e8219ca866..4efbfc9c27 100644
--- a/indra/newview/skins/default/xui/de/panel_places.xml
+++ b/indra/newview/skins/default/xui/de/panel_places.xml
@@ -42,6 +42,11 @@
+
+
+
+
+
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 c5f6172488..031baaf38e 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -324,7 +324,7 @@
Teleport nach Hause (Befehl: cmd)
- Teleport zu Region x (cmd regionname | x y z)
+ Teleport zu Region (cmd regionname | x y z)
diff --git a/indra/newview/skins/default/xui/de/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/de/panel_settings_sky_sunmoon.xml
index dda79a2a18..8548b1f6e0 100644
--- a/indra/newview/skins/default/xui/de/panel_settings_sky_sunmoon.xml
+++ b/indra/newview/skins/default/xui/de/panel_settings_sky_sunmoon.xml
@@ -5,14 +5,12 @@
Sonne & Sterne
+
Position:
- Bild:
-
-
- Skalierung:
+ Bild & Skalierung:
Farbe:
@@ -30,37 +28,29 @@
Leuchtgröße:
- Helligkeit Sterne:
+ Helligk. Sterne:
-
-
-
-
-
- Mond
-
-
- Position:
-
-
- Bild:
-
-
- Skalierung:
-
-
- Azimut:
-
-
- Höhenwinkel:
-
-
- Helligkeit:
-
-
-
-
+
+
+ Mond
+
+
+
+ Position:
+
+
+ Bild & Skalierung:
+
+
+ Azimut:
+
+
+ Höhenwinkel:
+
+
+ Helligkeit:
+
diff --git a/indra/newview/skins/default/xui/de/rlva_strings.xml b/indra/newview/skins/default/xui/de/rlva_strings.xml
index 6c0e648605..69eac78c55 100644
--- a/indra/newview/skins/default/xui/de/rlva_strings.xml
+++ b/indra/newview/skins/default/xui/de/rlva_strings.xml
@@ -86,6 +86,16 @@
value
Skript-Dialog oder Textbox kann aufgrund von RLV-Einschränkungen nicht angezeigt werden.
+ blocked_share
+
+ value
+ Inventar konnte aufgrund von RLV-Einschränkungen nicht mit [RECIPIENT] geteilt werden.
+
+ blocked_share_generic
+
+ value
+ Inventar konnte aufgrund von RLV-Einschränkungen nicht geteilt werden.
+
blocked_startim
value
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 8af051c4dd..f7578c6aaf 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -91,7 +91,7 @@ Dummy Name replaced at run time
-Firestorm is a community development project to improve the SecondLife(tm) Viewer experience. We package contributions from various community developers along with code from Linden Lab and ourselves to bring you a quality, feature-rich viewer experience backed up by a large volunteer support team. Firestorm is brought to you by The Phoenix Firestorm Project, Inc., a non-profit organization.
+Firestorm is a community development project to improve the SecondLife(tm) Viewer experience. We package contributions from various community developers along with code from Linden Lab and ourselves to bring you a quality, feature-rich viewer experience backed up by a large volunteer support team. Firestorm is brought to you by The Phoenix Firestorm Project, Inc., a non-profit organization.
The Firestorm Development Team:
@@ -169,14 +169,14 @@ Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Animats, Armin
-Special thanks to our Firestorm Support Team, wiki editors, educators, and translators:
+Special thanks to our Firestorm Support Team, Beta Testers, wiki editors, educators and translators:
-Firestorm includes Starlight, modified for Firestorm. It is provided by residents for residents, with the intention of providing an alternative, brighter, and hopefully easier to use interface. For further details see <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>.
+Firestorm includes Starlight, modified for Firestorm. It is provided by residents for residents, with the intention of providing an alternative, brighter, and hopefully easier to use interface. For further details see <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>.
UI Artists and Designers:
diff --git a/indra/newview/skins/default/xui/en/floater_associate_listing.xml b/indra/newview/skins/default/xui/en/floater_associate_listing.xml
index 0e8a6bb049..5606ecf7fe 100644
--- a/indra/newview/skins/default/xui/en/floater_associate_listing.xml
+++ b/indra/newview/skins/default/xui/en/floater_associate_listing.xml
@@ -1,4 +1,4 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml
index 70d441b072..7c19e550d8 100644
--- a/indra/newview/skins/default/xui/en/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/en/floater_inspect.xml
@@ -25,6 +25,7 @@
[NUM_OBJECTS] objects, [NUM_PRIMS] prims
Faces: [NUM_FACES]
+Visible: [NUM_VISIBLE_FACES]
Vertices: [NUM_VERTICES]
Triangles: [NUM_TRIANGLES]
Complex.: [COMPLEXITY]
diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
index 3ac56166f3..51792aeb41 100644
--- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
@@ -1,4 +1,4 @@
-
+
+
+
+
+
+ visible="false">
Loading...
diff --git a/indra/newview/skins/default/xui/en/menu_land.xml b/indra/newview/skins/default/xui/en/menu_land.xml
index 3a7f24fdf5..b2b8c072d1 100644
--- a/indra/newview/skins/default/xui/en/menu_land.xml
+++ b/indra/newview/skins/default/xui/en/menu_land.xml
@@ -21,6 +21,8 @@
+
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 2af50bb76a..6a98a4bc77 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -3865,6 +3865,18 @@
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 5d292d81fb..1428ca9d14 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -10923,6 +10923,15 @@ Do you want to enable the automatic viewer version display?
Disabling future updates for this file.
+
+
+ fail
+ Cannot save <nolink>'[OBJ_NAME]'</nolink> to object contents because you do not have permission to transfer the object's ownership.
+
+
+
+ width="197" />
+
@@ -154,11 +163,11 @@
tool_tip="Remove an avatar's display name"
width="80" />
Members: [COUNT]
diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml
index 307b30f62e..940c2878c8 100644
--- a/indra/newview/skins/default/xui/en/panel_login_first.xml
+++ b/indra/newview/skins/default/xui/en/panel_login_first.xml
@@ -234,32 +234,6 @@
left_pad="32"
name="image_right"
top="0" />
-
- Your first step is Learning Island. Find the exit portal!
-
-
- Then explore Social Island and meet other new residents!
-
+
Sun & Stars
+
Position:
@@ -49,7 +58,7 @@
name="sun_rotation"
follows="left|top"
left_delta="0"
- top_delta="20"
+ top_delta="15"
height="150"
width="150"
thumb_mode="sun" />
@@ -59,55 +68,46 @@
height="10"
layout="topleft"
left_delta="160"
- top_delta="-20"
+ top_delta="-15"
width="200">
- Image:
+ Image and scale:
-
- Scale:
-
-
+ orientation="vertical"
+ width="16"
+ can_edit_text="false"/>
Color:
+ left="20"
+ top_delta="45"
+ width="90">
Azimuth:
+ width="90">
Elevation:
+ width="90">
Glow Focus:
+ width="90">
Glow Size:
+ width="90">
Star Brightness:
-
-
-
+ can_edit_text="true"/>
-
-
-
- Moon
-
-
- Position:
-
+
+ Moon
+
+
+
+ Position:
+
- Image:
+ Image and scale:
-
- Scale:
-
-
+ orientation="vertical"
+ width="16"
+ can_edit_text="false"/>
+ left="20"
+ top_delta="160"
+ width="90">
Azimuth:
+ width="90">
Elevation:
+ width="90">
Brightness:
-
-
-
-
+ can_edit_text="true"/>
diff --git a/indra/newview/skins/default/xui/en/rlva_strings.xml b/indra/newview/skins/default/xui/en/rlva_strings.xml
index de0e99d6d0..3ffb3d9009 100644
--- a/indra/newview/skins/default/xui/en/rlva_strings.xml
+++ b/indra/newview/skins/default/xui/en/rlva_strings.xml
@@ -141,6 +141,16 @@
value
Unable to show script dialog or textbox due to RLV restrictions
+ blocked_share
+
+ value
+ Unable to share inventory with [RECIPIENT] due to RLV restrictions.
+
+ blocked_share_generic
+
+ value
+ Unable to share inventory due to RLV restrictions.
+
blocked_startim
value
diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml b/indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml
index 72af3924c1..ee61a302f5 100644
--- a/indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml
+++ b/indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml
@@ -1,4 +1,4 @@
-
+
-
+
diff --git a/indra/newview/skins/default/xui/es/panel_landmarks.xml b/indra/newview/skins/default/xui/es/panel_landmarks.xml
deleted file mode 100644
index 50930a4056..0000000000
--- a/indra/newview/skins/default/xui/es/panel_landmarks.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 b814ccff60..454f42121c 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -254,7 +254,7 @@
Teleportar a mi base (uso: cmd)
- Telep. al sim X (uso: cmd nombredelsim)
+ Telep. al sim (uso: cmd nombredelsim)
diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml
index 7b1cbf820e..b87d0619f8 100644
--- a/indra/newview/skins/default/xui/fr/floater_camera.xml
+++ b/indra/newview/skins/default/xui/fr/floater_camera.xml
@@ -4,14 +4,7 @@
Zoom en direction du point central
Déplace la caméra vers le haut et le bas, la gauche et la droite
Voir l'objet
- Utiliser le préréglage
-
-
-
-
-
-
-
+ Utiliser réglage
@@ -19,11 +12,26 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/fr/floater_create_landmark.xml b/indra/newview/skins/default/xui/fr/floater_create_landmark.xml
new file mode 100644
index 0000000000..290d4d37b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_create_landmark.xml
@@ -0,0 +1,14 @@
+
+
+
+ Barre des favoris
+
+
+
+
+
+ [secondlife:/// Créer un nouveau dossier]
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/floater_fs_teleporthistory.xml b/indra/newview/skins/default/xui/fr/floater_fs_teleporthistory.xml
index 671ad34e47..b94bb6b702 100644
--- a/indra/newview/skins/default/xui/fr/floater_fs_teleporthistory.xml
+++ b/indra/newview/skins/default/xui/fr/floater_fs_teleporthistory.xml
@@ -7,7 +7,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/fr/menu_inventory_search_visibility.xml
new file mode 100644
index 0000000000..bcab3a1128
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_search_visibility.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_landmarks.xml b/indra/newview/skins/default/xui/fr/panel_landmarks.xml
deleted file mode 100644
index 7cfb977b07..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_landmarks.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
index 50d53853a3..1e9e3ab981 100644
--- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
@@ -21,6 +21,7 @@
+
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
index 718c1a081e..f8662971f3 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
@@ -11,9 +11,14 @@
-
+
+
+
+
+
+
+
-
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_firestorm.xml b/indra/newview/skins/default/xui/fr/panel_preferences_firestorm.xml
index dba0daf029..fdf233e59b 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_firestorm.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_firestorm.xml
@@ -11,6 +11,7 @@
+
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index 265af157a3..61ce45eece 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -34,6 +34,12 @@
Taille du cache ([https://wiki.firestormviewer.org/cache Besoin d'aide ?]) :
Mo
+
+ Cache des ressources de données (actifs) :
+
+
+ Mo
+
Emplacement du cache :
diff --git a/indra/newview/skins/default/xui/fr/rlva_strings.xml b/indra/newview/skins/default/xui/fr/rlva_strings.xml
new file mode 100644
index 0000000000..4b298af428
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/rlva_strings.xml
@@ -0,0 +1,244 @@
+
+
+
+
+ strings
+
+
+ hidden_generic
+
+ value
+ (Caché)
+
+ hidden_parcel
+
+ value
+ (Parcelle cachée)
+
+ hidden_region
+
+ value
+ (Région cachée)
+
+
+
+ blocked_recvim
+
+ value
+ *** IM bloqué par votre viewer
+ description
+ Affiché à la place du message original lorsqu'un IM entrant est bloqué.
+ label
+ IM entrant bloqué (local)
+ customizable
+ 1
+
+ blocked_sendim
+
+ value
+ *** IM bloqué par le viewer de l'expéditeur
+ description
+ Affiché (et envoyé à l'interlocuteur distant) lorsqu'un im sortant est bloqué.
+ label
+ IM sortant bloqué (local + distant)
+ customizable
+ 1
+
+
+
+ imquery_list_deny
+
+ value
+ *** L'autre partie vous demande respectueusement de vous occuper de vos affaires. (les lapins m'ont fait faire ça !)
+ description
+ Envoyé à la partie distante lorsque vous refusez sa demande de lister vos restrictions RLV actives.)
+ label
+ commandes @list et @except (distantes)
+ customizable
+ 1
+
+
+
+ imquery_list_suffix
+
+ value
+ (Utilisez @except pour voir la liste des exceptions actives.)
+ description
+ Envoyé à la partie distante en tant que suffixe à @list pour l'informer de la manière de demander vos exceptions.
+ label
+ Suffixe de commande @list (distant)
+ customizable
+ 0
+
+
+
+ stopim_nosession
+
+ value
+ *** L'autre partie n'est pas soumise à une restriction @startim.
+ description
+ Envoyé à la partie distante lorsqu'elle tente de fermer de force votre conversation en IM avec elle (et qu'une telle session n'existe pas).
+ label
+ Commande @stopim sans session (à distance)
+ customizable
+ 1
+
+ stopim_endsession_remote
+
+ value
+ *** La session a été terminée pour l'autre partie
+ description
+ Envoyé à la partie distante lorsqu'elle tente de fermer de force la conversation IM (et qu'elle existe)
+ label
+ Commande @stopim avec une session active (à distance)
+ customizable
+ 1
+
+ stopim_endsession_local
+
+ value
+ [NAME] a clos à distance la conversation en IM avec @stopim
+
+
+
+ blocked_autopilot
+
+ value
+ Impossible d'utiliser le pilote automatique en raison des restrictions RLV
+
+ blocked_generic
+
+ value
+ Impossible d'effectuer l'action en raison de restrictions RLV
+
+ blocked_groupchange
+
+ value
+ Impossible de changer de groupe actif en raison d'une restriction RLV ; repasse en mode "[GROUP_SLURL]"
+
+ blocked_invfolder
+
+ value
+ Impossible d'effectuer l'action d'inventaire demandée en raison d'un dossier verrouillé RLV.
+
+ blocked_nearby
+
+ value
+ Impossible de voir la présence d'avatars proches en raison des restrictions RLV
+
+ blocked_permattach
+
+ value
+ La tentative d'attacher '[OBJECT]' a été refusée en raison de restrictions RLV.
+
+ blocked_permteleport
+
+ value
+ '[OBJECT]' s'est vu refuser la permission de vous téléporter en raison des restrictions RLV
+
+ blocked_scriptdialog
+
+ value
+ Impossible d'afficher une boîte de dialogue ou de texte de script en raison de restrictions RLV
+
+ blocked_share
+
+ value
+ Impossible de partager l'inventaire avec [RECIPIENT] en raison de restrictions RLV.
+
+ blocked_share_generic
+
+ value
+ Impossible de partager l'inventaire en raison des restrictions RLV.
+
+ blocked_startim
+
+ value
+ Impossible de démarrer une session IM avec [RECIPIENT] en raison de restrictions RLV
+
+ blocked_startconf
+
+ value
+ Impossible de commencer la conférence avec [RECIPIENT] en raison de restrictions RLV
+
+ blocked_teleport
+
+ value
+ Impossible d'initier la téléportation en raison des restrictions RLV
+
+ blocked_teleport_offer
+
+ value
+ Impossible de proposer la téléportation en raison des restrictions RLV
+
+ blocked_viewxxx
+
+ value
+ Impossible d'ouvrir [TYPE] en raison de restrictions RLV
+
+ blocked_wireframe
+
+ value
+ Impossible d'activer le mode filaire en raison des restrictions RLV
+
+
+
+ blocked_recvim_remote
+
+ value
+ Le résident auquel vous avez envoyé un IM est empêché de les lire pour le moment, veuillez réessayer plus tard.
+ description
+ Envoyé à la partie distante lorsque son IM était bloqué
+ label
+ Message IM entrant bloqué (à distance)
+ customizable
+ 1
+
+ blocked_tplurerequest_remote
+
+ value
+ Le résident est actuellement empêché d'accepter. Veuillez réessayer plus tard.
+ description
+ Envoyé à la partie distante lorsque son offre ou sa demande de téléportation était bloquée.
+ label
+ Offre/demande de téléportation bloquée (à distance)
+ customizable
+ 1
+
+
+
+
+ anonyms
+
+ Un résident
+ Ce résident
+ Ce résident
+ Un individu
+ Cet individu
+ Cet individu
+ Une personne
+ Cette personne
+ Cette personne
+ Un étranger
+ Cet étranger
+ Cet étranger
+ Un être
+ Cet être
+ Cet être
+ Un agent
+ Cet agent
+ Cet agent
+ Une âme
+ Cette âme
+ Cette âme
+ Quelqu'un
+ Certaines personnes
+ Quelqu'un
+ Le mystérieux
+ Un être inconnu
+ Une personne non identifiée
+ Une personne inconnue
+
+
+
+
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 ad80a0d44f..21554b11d0 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -444,7 +444,7 @@ media:
Consenti l'accesso solo ai residenti che:
-
+
diff --git a/indra/newview/skins/default/xui/it/panel_landmarks.xml b/indra/newview/skins/default/xui/it/panel_landmarks.xml
deleted file mode 100644
index a4c52105bf..0000000000
--- a/indra/newview/skins/default/xui/it/panel_landmarks.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index a566ad22c8..4764d3c051 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -2181,13 +2181,13 @@ Se il messaggio persiste, contattare il supporto Second Life per assistenza http
Dipendente Linden Lab
- Informazioni di pagamento usate
+ Info di pagamento usate
- Informazioni di pagamento registrate
+ Info di pagamento registrate
- Nessuna informazione di pagamento disponibile
+ Nessuna info di pagamento disponibile
Età verificata
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_camera.xml b/indra/newview/skins/default/xui/ja/control_table_contents_camera.xml
new file mode 100644
index 0000000000..b27949f939
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_camera.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml
new file mode 100644
index 0000000000..4c5a02fa2e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_editing.xml b/indra/newview/skins/default/xui/ja/control_table_contents_editing.xml
new file mode 100644
index 0000000000..40e83bb26b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_editing.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_media.xml b/indra/newview/skins/default/xui/ja/control_table_contents_media.xml
new file mode 100644
index 0000000000..07d4a4de2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_media.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_movement.xml b/indra/newview/skins/default/xui/ja/control_table_contents_movement.xml
new file mode 100644
index 0000000000..cf654775d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_movement.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/floater_adjust_environment.xml b/indra/newview/skins/default/xui/ja/floater_adjust_environment.xml
index c629272e49..824f89be12 100644
--- a/indra/newview/skins/default/xui/ja/floater_adjust_environment.xml
+++ b/indra/newview/skins/default/xui/ja/floater_adjust_environment.xml
@@ -22,6 +22,8 @@
太陽:
+ 方位角:
+ 標高:
量:
焦点:
@@ -30,6 +32,8 @@
月:
+ 方位角:
+ 標高:
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
index ce269df6da..990b58d3b6 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -15,6 +15,9 @@
(再販・プレゼント不可)
+
+ 複数選択
+
中身:
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index fb0b8dcb3b..e45a2450c3 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -12,27 +12,36 @@
オブジェクトを見る
- プリセットを使用
-
-
-
-
-
-
-
-
-
+
+ プリセットを使用
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
diff --git a/indra/newview/skins/default/xui/ja/floater_create_landmark.xml b/indra/newview/skins/default/xui/ja/floater_create_landmark.xml
new file mode 100644
index 0000000000..af098e8cc6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_create_landmark.xml
@@ -0,0 +1,15 @@
+
+
+
+ お気に入りバー
+
+
+
+
+
+ [secondlife:/// 新規フォルダを作成]
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/floater_fs_asset_blacklist.xml b/indra/newview/skins/default/xui/ja/floater_fs_asset_blacklist.xml
index b05b3fcd0a..572b862494 100644
--- a/indra/newview/skins/default/xui/ja/floater_fs_asset_blacklist.xml
+++ b/indra/newview/skins/default/xui/ja/floater_fs_asset_blacklist.xml
@@ -21,11 +21,17 @@
不明の地域
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/floater_fs_teleporthistory.xml b/indra/newview/skins/default/xui/ja/floater_fs_teleporthistory.xml
index ba83946f46..5b0096c3f5 100644
--- a/indra/newview/skins/default/xui/ja/floater_fs_teleporthistory.xml
+++ b/indra/newview/skins/default/xui/ja/floater_fs_teleporthistory.xml
@@ -1,24 +1,19 @@
-
-
-
-
+
+
+
-
-
-
-
-
+
diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml
index 726592b129..c77f5dc0f9 100644
--- a/indra/newview/skins/default/xui/ja/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml
@@ -9,6 +9,7 @@
[NUM_OBJECTS] オブジェクト, [NUM_PRIMS] プリム
面: [NUM_FACES]
+可視面: [NUM_VISIBLE_FACES]
頂点: [NUM_VERTICES]
三角形: [NUM_TRIANGLES]
複雑さ: [COMPLEXITY]
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
index e7d330fdb4..8b06092821 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
@@ -15,6 +15,9 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml
index daa480ef5a..66bd4b53a5 100644
--- a/indra/newview/skins/default/xui/ja/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml
@@ -18,6 +18,58 @@
+
+
+ ジョイスティックモニタ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Xスケール
@@ -105,15 +157,4 @@
-
-
-
-
-
-
-
-
-
- デバイスは検出されませんでした
-
diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
index d8500f147a..0636442419 100644
--- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
@@ -10,6 +10,9 @@
エラー:モデルの材料は参考モデルのサブセットではありません。
+
+ エラー:LOD モデルにペアレントがありません。
+
ローディング...
@@ -61,6 +64,18 @@
一部の物理的な外殻構造が頂点の制限を超えます。
+
+ いくつかのモデルが外殻構造の制限(256)を越えています。もっと単純化して下さい。
+
+
+ 物理メッシュが細かすぎます。細かく薄い三角形を除去してみて下さい。(プレビューをご参照下さい。)
+
+
+ このバージョンは Havok 対応ではありません。従ってセカンドライフに物理アップロードするのはお勧めできません。その結果は予測不可能なものとなります。
+
+
+ 不明のエラーが発生しました。
+
全て
@@ -73,6 +88,24 @@
未定
+
+
+
+ ジョイントが多すぎてスキニングが無効化されました: [JOINTS], 最大値:[MAX]
+
+
+ 不明なジョイント [NAME] に連結されました
+
+
+ [COUNT] 個の不明なジョイントによりスキニングが無効化されました
+
+
+ モデル [MODEL_NAME] がロードされました
+
+
+ テクスチャの座標データが不完全です。
+
+
@@ -173,11 +206,20 @@
最低
+
+ 立方体
+
+
+ 六角形
+
+
+ ユーザー定義
+
ファイルから
-
+
@@ -243,29 +285,86 @@
[X] X [Y] X [Z]
+
+
+
+
+
+
Z オフセット(アバターを上下調整):
-
+
+
+ スキニングされたジョイントが多すぎます
+
+
+ モデルに不明のジョイントがあります
+
+
+ ジョイント:
+
+
+ [CONFLICTS] 件のコンフリクトが [JOINTS_COUNT] 個のジョイントで発生しています
+
+
+ 次のジョイントでポジションのオーバーライドが発生しています:'[JOINT]':
+
+
+
+
+
+
+
+
+
+
+ モデルアップロードの挙動設定:
+
+
+
+
+ ユーザー定義プリセットの物理:
+
+
+
+ モデルアップロードをプレビューする色:
+
+
+ 一般:
+
+
+
+
+
+ 物理:
+
+
+
+
+ 物理的問題:
+
+
+
+
+
アップロード料金:L$ [FEE]
@@ -281,6 +380,62 @@
サーバー負荷:[SIM]
+
+
+
+ コスト明細
+
+
+
+ダウンロード:
+物理効果:
+インスタンス:
+テクスチャ:
+モデル:
+
+
+ [STREAMING]
+ [PHYSICS]
+ [INSTANCES]
+ [TEXTURES]
+ [MODEL]
+
+
+
+
+ 物理効果のコスト
+
+
+ 基本外殻構造:
+ メッシュ:
+ 解析結果:
+
+
+
+
+
+
+ プレビュー制御
+
+
+ 高
+ 中
+ 低
+ 最低
+
+
+
+
+
+
+
+ プレビュースプレッド:
+
+
+
+
+
+
ご注意:
@@ -291,35 +446,10 @@
[STATUS]
+
プレビュー:
-
-
-
- 高
-
-
- 中
-
-
- 低
-
-
- 最低
-
-
-
- ディスプレイ...
-
-
-
-
-
-
-
- プレビュースプレッド:
-
-
+
diff --git a/indra/newview/skins/default/xui/ja/floater_phototools.xml b/indra/newview/skins/default/xui/ja/floater_phototools.xml
index 2c53660e63..4826fcb665 100644
--- a/indra/newview/skins/default/xui/ja/floater_phototools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_phototools.xml
@@ -4,11 +4,11 @@
-
+
- Windlight 設定
+ 自然環境設定
@@ -17,19 +17,19 @@
-
- WLの空
+
+ 空
-
- WLの水
+
+ 水
-
+
デイサイクル
@@ -40,15 +40,17 @@
+
- WindLight クィック設定
+ クィック自然環境設定
@@ -243,6 +245,7 @@
+
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 24d9bd2e08..23a0c587a8 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -8,6 +8,7 @@
+
@@ -17,6 +18,7 @@
+
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
index 4f7f871b57..9dc3e9ce54 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -9,10 +9,34 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
index 01699d1593..67357f8234 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
@@ -2,11 +2,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
index b0a619bcb0..539a4d89bf 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -22,9 +22,10 @@
-
-
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml
index 4708b1446c..6285c2f49c 100644
--- a/indra/newview/skins/default/xui/ja/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml
@@ -2,9 +2,12 @@
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
index e728d80ab2..d9a9af9fb5 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
@@ -1,6 +1,7 @@
+
@@ -40,5 +41,11 @@
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml
new file mode 100644
index 0000000000..bba1f3b749
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index d7fa4adc15..4f8a1a4aed 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -9,6 +9,13 @@
+
diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml
index 61642048b8..24a4c0126e 100644
--- a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml
@@ -1,6 +1,7 @@
-
+
-
+
+
-
+
diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
index 27acbdc030..68142ffe57 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
@@ -1,14 +1,26 @@
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml
index 1dd3d79438..165f73b8cf 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_group.xml
@@ -1,6 +1,14 @@
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index 3696d9f09d..5c58406dca 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -10,16 +10,38 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -121,6 +143,7 @@
+
@@ -140,11 +163,17 @@
+
+
+
+
+
+
@@ -328,6 +357,7 @@
+
@@ -361,7 +391,9 @@
+
@@ -422,6 +454,10 @@
+
+
+
+
@@ -489,6 +525,9 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 2fe9af6f05..6757f1448f 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -81,7 +81,7 @@
- [APP_NAME] をアップデート中にエラーが発生しました。 ビューワの [https://www.firestormviewer.org/downloads 最新バージョンをダウンロード] してください。
+ [APP_NAME] のインストールに失敗しました。ビューワの [https://www.firestormviewer.org/downloads 最新バージョンをダウンロード] して、もう一度インストールし直してください。
@@ -546,6 +546,17 @@ L$ が不足しているのでこのグループに参加することができ
[CURRENT_GRID] へのログインを続けるには、取引条件、プライバシーポリシー、及び利用規約に同意してください。
+
+[TITLE]
+[MESSAGE]
+
+
+
+
+[TITLE]
+[MESSAGE]
+
+
アウトフィットを装着できません。
アウトフィットフォルダに衣類、身体部位、アタッチメントがありません。
@@ -721,7 +732,9 @@ L$ が不足しているのでこのグループに参加することができ
ファイル [[FILE]] を書き込めません。
- お使いのコンピューターは [APP_NAME] の必要最低限の動作環境を満たしていません。 パフォーマンスの低下を感じるかもしれません。 恐れ入りますが [SUPPORT_SITE] ではサポート対象外のシステムに関する技術的サポートは行っておりません。
+お使いのコンピューターは [APP_NAME] の必要最低限の動作環境を満たしていません。 パフォーマンスの低下を感じるかもしれません。 恐れ入りますが [SUPPORT_SITE] ではサポート対象外のシステムに関する技術的サポートは行っておりません。
+
+[MINSPECS]
[_URL] に移動して確認をしますか?
@@ -968,6 +981,13 @@ L$ が不足しているのでこのグループに参加することができ
土地の所有者が許可していないため、ランドマークを作成することはできません。
+
+ フォルダの名前を選択して下さい:
+
+
「リコンパイル」できません。
スクリプトのオブジェクトを選択してください。
@@ -1021,8 +1041,7 @@ L$ が不足しているのでこのグループに参加することができ
[REASON]
- テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。
+ テレポートできるのは1分間に6回までの制限があります。もしテレポートで問題を抱えている場合は、もう1分待ってから再度テレポートしてみて下さい。問題が解消しないようであれば一度ログアウトして、ログインし直して下さい。
リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。
@@ -1348,6 +1367,15 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries を参照してく
+
+
+ [NAME] の名前を選択して下さい
+
+
+
フレンドリストから <nolink>[NAME]</nolink> を削除しますか?
@@ -1516,13 +1544,13 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries を参照してく
- あなたの [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 avatar complexity] は [AGENT_COMPLEXITY] です。
+ あなたの [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 アバターの複雑度] は [AGENT_COMPLEXITY] です。
[OVERLIMIT_MSG]
- あなたの [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 avatar complexity] は [AGENT_COMPLEXITY] です。
+ あなたの [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 アバターの複雑度] は [AGENT_COMPLEXITY] です。
@@ -1580,6 +1608,13 @@ F1 キーを押してください。
現在のグリッド([CURRENT_GRID])とはグリッド([GRID])が異なるため、[SLURL] にテレポートできませんでした。 ビューワを閉じてからもう一度お試しください。
+
+
+サーバーに接続できませんでした。
+[REASON]
+
+
+
サーバーに接続できませんでした。
[REASON]
@@ -1738,17 +1773,23 @@ https://secondlife.com/support/downloads/ からダウンロードしてくだ
- ログインするには、バージョン [VERSION] が必要です。
+ログインするには、バージョン [VERSION] が必要です。
+リリースノート:[URL]
+
[OK] をクリックして、ダウンロードとインストールを開始します。
- バージョン [VERSION] のダウンロードが完了し、インストールの準備ができました。
+バージョン [VERSION] のダウンロードが完了し、インストールの準備ができました。
+リリースノート:[URL]
+
[OK] をクリックして、インストールを開始します。
- バージョン [VERSION] のダウンロードが完了し、インストールの準備ができました。
+バージョン [VERSION] のダウンロードが完了し、インストールの準備ができました。
+リリースノート:[URL]
+
続けますか?
@@ -1807,9 +1848,7 @@ https://secondlife.com/support/downloads/ からダウンロードしてくだ
グループから脱退しますか?
-
- グループ '<nolink>[group_name]</nolink>' を抜けました。
-
+
現在、あなたは <nolink>[GROUP]</nolink> グループのメンバーです。再度入会する場合は L$[AMOUNT] の費用がかかります。
グループから脱退しますか?
@@ -2167,7 +2206,9 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してくだ
- これから訪問しようとしている地域には、あなたの現在のレーティング設定を越えるコンテンツがあります。レーティング設定の変更は、「アバター」>「 環境設定」>「一般」で行えます。
+ これから訪問しようとしている地域には、あなたの現在のレーティング設定を越えるレーティングが設定されています。「アバター」>「 環境設定」>「一般」からこの設定を変更して下さい。
+
+レーティングに関する詳しい情報は、[https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ ここ]で見つかります。
@@ -2203,7 +2244,9 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してくだ
- 訪問しようとしている地域(リージョン)には現在の環境設定を超えるコンテンツが含まれています。「ミー」 > 「環境設定」 > 「一般」を選択して、環境設定を変更できます。
+ 訪問しようとしている地域(リージョン)には現在最大に設定されているレーティングを超えるレーティングが設定されています。「アバター」>「環境設定」>「一般」からこの設定を変更してください。
+
+レーティングに関する詳しい情報は、[https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ ここ]で見つかります。
@@ -2244,15 +2287,17 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してくだ
- 今後、[RATING] コンテンツ付きの地域(リージョン)を訪問しようとしているという通知を受け取りません。後でメニューバーの「ミー」 > 「環境設定」 > 「一般」を使用して、コンテンツの環境設定を変更できます。
+ 今後、[RATING] コンテンツ付きの地域(リージョン)を訪問しようとしているという通知を受け取りません。後でメニューバーの「アバター」>「環境設定」>「一般」を使用して、コンテンツの環境設定を変更できます。
- 現在、[PREFERRED_MATURITY] コンテンツを表示するように環境設定を変更できませんでした。あなたの環境設定は、[ACTUAL_MATURITY] コンテンツを表示するようにリセットされました。メニューバーの「ミー」 > 「環境設定」 > 「一般」を使用して、もう一度環境設定を変更できます。
+ 現在、[PREFERRED_MATURITY] コンテンツを表示するように環境設定を変更できませんでした。あなたの環境設定は、[ACTUAL_MATURITY] コンテンツを表示するようにリセットされました。メニューバーの「アバター」>「環境設定」>「一般」を使用して、もう一度環境設定を変更できます。
- 取得しようとしている土地には現在の環境設定を超えるレーティング区分が含まれています。「ミー」 > 「環境設定」 > 「一般」を選択して、環境設定を変更できます。
+ 取得しようとしている土地には現在の環境設定を超えるレーティング区分が含まれています。「アバター」>「環境設定」>「一般」をからこの設定を変更できます。
+
+レーティングに関する詳しい情報は、[https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ ここ]で見つかります。
@@ -3117,7 +3162,9 @@ URL: [AUDIOURL]
そのリージョンにいないと公共の土地を取得することはできません。
- 訪問しようとしている地域(リージョン)には現在の環境設定を超えるコンテンツが含まれています。「ミー」 > 「環境設定」 > 「一般」を選択して、環境設定を変更できます。
+ 訪問しようとしている地域(リージョン)には現在最大に設定されているレーティングを超えるレーティングが設定されています。「アバター」>「環境設定」>「一般」からこの設定を変更してください。
+レーティングに関する詳しい情報は[https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ ここ]で見つかります。
+
あなたが入ろうとしている地域はこれからシャットダウンするところです。
@@ -3697,8 +3744,14 @@ M キーを押して変更します。
[COUNT] 個のアイテムをアップロードすることにより、合計 L$[COST] のコストがかかります。アップロードを続けますか?
-
+
+
+
+現在の残高 L$[BALANCE] では [COUNT] 個のアイテムをアップロードするのに必要な合計 L$[COST] に足りません。
+
+
+
選択されたファイルの一括アップロードはできません。
@@ -3712,7 +3765,7 @@ M キーを押して変更します。
- テレポート履歴を削除しますか?
+ あなたがこれまで訪れた場所の記録が全て失われます。この操作は取り消すことができません。削除を実行してもよろしいですか?
@@ -3791,9 +3844,14 @@ M キーを押して変更します。
容姿の更新は[TIME]秒後に送信されました。
[STATUS]
+
+
+ビューワーはあなたが雲状態で表示されるかもしれないことを検知し、現在自動的にこの問題を解決しようとしています。
+
+
( [EXISTENCE] 秒)
-アバター「 NAME 」がクラウドになりました。
+アバター「 NAME 」が雲状態になりました。
( [EXISTENCE] 秒)
@@ -3801,7 +3859,7 @@ M キーを押して変更します。
( [EXISTENCE] 秒)
-アバター「 [NAME] 」が [TIME] 秒でクラウド状態から出現します。
+アバター「 [NAME] 」が [TIME] 秒で雲状態から脱しました。
( [EXISTENCE] 秒)
@@ -4083,11 +4141,25 @@ UDP: 3478, 3479, 5060, 5062, 6250, 12000-32000
選択されたオブジェクトはナビメッシュに影響を与えます。オブジェクトをフレキシブルパスに変更すると、ナビメッシュから削除されます。
+
+
+[APP_NAME] のハードウェア必要条件を満たしていないようです。[APP_NAME] は、OpenGL 2.0 以降のシェーダーに対応している必要があります。もしこの要件が満たされているのであれば、ご利用のグラフィックカードのドライバが最新になっているか、また OS のサービスパックやパッチが最新になっているかご確認ください。
+
+この問題が何度も起きる場合は、[SUPPORT_SITE] をご確認ください。
+
+
[APP_NAME] に必要なハードウェアがないようです。 [APP_NAME] にはマルチテクスチャをサポートする OpenGL グラフィックカードが必要です。 お使いのグラフィックカードの最新ドライバがインストールされているかどうか、オペレーティングシステムのサービスパックとパッチが入っているかをご確認ください。
この問題が何度も起きる場合は、[SUPPORT_SITE] をご確認ください。
+
+
+インストールされている [GPUNAME] のインテル製グラフィックドライバのバージョン [VERSION] は極めて古いものとなっており、プログラムのクラッシュを高い頻度で引き起こすことが知られています。最新のインテル製ドライバにアップグレードすることを強くお勧めします。
+
+インテルドライバのウェブサイトを確認しますか?
+
+
796
@@ -4095,11 +4167,21 @@ UDP: 3478, 3479, 5060, 5062, 6250, 12000-32000
510
- - あなたのグラフィックカードは必須動作環境の条件を満たしていません。
+ - あなたのグラフィックカードは必要動作環境の条件を満たしていません。
+
+
+ - あなたの CPU は必要動作環境の条件を満たしていません。
+
+
- - あなたのシステムメモリは必須動作環境の条件を満たしていません。
+ - あなたのシステムメモリは必要動作環境の条件を満たしていません。
+
+
+アップデートサービス [UPDATER_APP] の起動に失敗しました。ビューワが正しくインストールされていること、アプリの起動に必要な権限設定がされていることを確認してください。この問題が何度も起きる場合は、[SUPPORT_SITE] をご確認ください。
+
+
自分の土地をお持ちの場合、「ホーム」に設定できます。
お持ちでない場合は、地図で「インフォハブ」をお探しください。
@@ -4632,7 +4714,7 @@ Phoenix/Firestorm ビューワのサポート・グループへようこそ!
テキストを追加できません!
- 資産サーバーがタイムリーに応答しませんでした。オブジェクトが sim に返されました。
+ 資産サーバーがタイムリーに応答しませんでした。オブジェクトが地域に返されました。
このリージョンでは、物理的シェイプが有効にされていません。
@@ -5062,6 +5144,12 @@ Phoenix/Firestorm ビューワのサポート・グループへようこそ!
これにより、過去の会話のログ、およびそのファイルのすべてのバックアップが削除されます。
+
+
+ コントロールの値を全てデフォルトに戻してよいですか?
+
+
+
この操作によって以前のすべての会話のテキストが全て削除されます。過去の会話リストは影響を受けません。[FOLDER]フォルダにある「.txt」と「txt.backup」の拡張子の全てのファイルが削除されます。
@@ -5075,6 +5163,21 @@ Phoenix/Firestorm ビューワのサポート・グループへようこそ!
+
+ [REASON]
+
+
+
+
+次のページで L$ の金額を選択して
+「注文を確定」ボタンをクリックしてください。
+チェックアウト時の支払方法が追加されます。
+
+
+
LSL の色設定文字列がクリップボードにコピーされました。スクリプトに貼り付けてこれを利用することができます。
@@ -5440,4 +5543,18 @@ Firestorm ビューワを利用して行った通貨の購入は、ユーザー
「共有された環境」と「デイサイクル依存」のものは選択できませんのでご注意下さい!
+
+
+ 次の持ち物アイテムを作成できません:[NAME]
+
+
+
+ Windlight の一括インポートが完了しました。
+
+
+
+ Firestorm の AO メッセージ:[AO_MESSAGE]
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
index 00c4711595..2649ac75ca 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
@@ -19,20 +19,7 @@ Ctrl キーを押しながらメンバー名をクリックすると
[AREA] 平方メートル
-
-
- Inv_FolderClosed
-
-
- Checkbox_On
-
-
- Checkbox_Off
-
-
+
@@ -87,19 +74,6 @@ Ctrl キーを押しながらメンバー名をクリックすると
活動を行うことを許可する能力。さまざまな能力が提供されます。
-
- Inv_FolderClosed
-
-
- Checkbox_On
-
-
- Checkbox_Off
-
-
diff --git a/indra/newview/skins/default/xui/ja/panel_landmarks.xml b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
deleted file mode 100644
index 9adaf7296f..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_landmarks.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
index bda6c302ba..f255581e23 100644
--- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
@@ -29,6 +29,7 @@
+
diff --git a/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
index 25f4ba225a..809e3f51ad 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
@@ -16,7 +16,7 @@
-
+
@@ -55,6 +55,9 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
index b058c38841..8ed188b2be 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
@@ -17,7 +17,10 @@
-
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
index 6a746b9621..060a585e1d 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -1,15 +1,16 @@
-
+
- 友達を見つけるには、[secondlife:///app/search/people 検索] をするか、住人を右クリックしてフレンド登録してください。
-一緒に何かする仲間をお探しですか? [secondlife:///app/worldmap 世界地図] をお試しください。
+ 誰かを友だちとして追加するには、対象のアバターかその名前を右クリックしてください。
+もっと人のいる場所をお探しですか? [secondlife:///app/floater/destinations 行き先ガイド] にはグリッドのオペレータスタッフが選んだ場所が掲載されています。
+[secondlife:///app/search/ Search] では、キーワードに一致した場所をグリッド全体から検索できます。
お探しのものは見つかりましたか? [secondlife:///app/search/people/[SEARCH_TERM] 検索] をお試しください。
@@ -19,10 +20,13 @@
-->
-
-
-
-
+
+ あなたはどこのグループにも属していません。
+ [https://community.secondlife.com/knowledgebase/joining-and-participating-in-groups-r51/ グループ] でグループを探してみて下さい。
+
+
+
+
連絡先セットに何も登録がありません。
diff --git a/indra/newview/skins/default/xui/ja/panel_places.xml b/indra/newview/skins/default/xui/ja/panel_places.xml
index 7884a6a575..b4d221be2a 100644
--- a/indra/newview/skins/default/xui/ja/panel_places.xml
+++ b/indra/newview/skins/default/xui/ja/panel_places.xml
@@ -2,69 +2,70 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_UI.xml b/indra/newview/skins/default/xui/ja/panel_preferences_UI.xml
index e61e540bde..3963d80dde 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_UI.xml
@@ -92,6 +92,7 @@
(再起動が必要)
+
@@ -117,6 +118,20 @@
+
+ 時刻の形式:
+
+
+
+
+
+
+
+
+
+
+
+
ナビゲーション&お気に入りバー:
@@ -135,6 +150,7 @@
+
次の項目に独立したウィンドウを使用:
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
index 65b72ccbe2..3c078e75eb 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
@@ -65,13 +65,17 @@
-
-
- 常に表示するメッセージ:
-
-
- 表示しないメッセージ:
+
+
+ 表示または非表示にするビューワの通知:
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_controls.xml b/indra/newview/skins/default/xui/ja/panel_preferences_controls.xml
new file mode 100644
index 0000000000..656175c554
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_controls.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_firestorm.xml b/indra/newview/skins/default/xui/ja/panel_preferences_firestorm.xml
index d2b94f4bd9..0059465a36 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_firestorm.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_firestorm.xml
@@ -15,9 +15,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index a0fe70b8c5..705d4f6dcc 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -58,17 +58,23 @@
- ブラウザのホームページ:
+ ブラウザのホームページ:
- キャッシュサイズ ([https://wiki.firestormviewer.org/cache 推奨設定を確認しますか?]):
+ テクスチャのキャッシュサイズ ([https://wiki.firestormviewer.org/cache 推奨設定を確認しますか?]):
MB
+
+ アセットキャッシュのサイズ:
+
+
+ MB
+
キャッシュの場所:
@@ -78,7 +84,7 @@
- サウンドキャッシュの場所:
+ サウンドキャッシュの場所:
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 959c086cf7..45d4ba5da4 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -29,6 +29,11 @@
+
+ テレポート後にミュート解除:
+
+
+
フレンドのステータスが変わったら通知音:
@@ -128,17 +133,15 @@
-
+
+
+
-
-
-
-
diff --git a/indra/newview/skins/default/xui/ja/panel_region_environment.xml b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
index 714ab71d27..d014e53126 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_environment.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
@@ -53,7 +53,7 @@
自然環境を選択
-
+
diff --git a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
index 58e396877c..624c487093 100644
--- a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
@@ -13,7 +13,7 @@
-
-
+
+
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index d61a75c898..6cd7f3ef43 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -25,6 +25,8 @@
グラフィックを初期化できませんでした。グラフィックドライバを更新してください。
+
+
HiDPI 表示モード: [HIDPI]
@@ -34,15 +36,21 @@
ビルド構成
+
+
復元中です...
解像度を変更中です...
+
+
明るさ全開(レガシー)
+
+
ログイン中です。[APP_NAME]の表示がフリーズする場合があります。 しばらくお待ちください。
@@ -121,9 +129,15 @@
サーバーの証明書チェーンに証明書が多すぎます。 グリッド管理者にご連絡ください。
+
+ 証明書を読み込めませんでした。グリッド管理者にご連絡ください。
+
グリッドサーバーが返した証明書の署名を認証できませんでした。グリッドの管理者にお問い合わせください。
+
+ 証明書に OpenSSL のメモリを割り当てるのに失敗しました。
+
ネットワークエラー:接続を確立できませんでした。お使いのネットワーク接続をご確認ください。
@@ -1166,6 +1180,11 @@ https://www.firestormviewer.org/support
メインランド / フルリージョン
+
+ リンデンホーム / フルリージョン
+
+
+
全てのファイル
@@ -1223,25 +1242,24 @@ https://www.firestormviewer.org/support
辞書
-
-
オブジェクトのバックアップ
-
+
+ COLLADA モデル
+
+
+ CSV
+
+
+ リコンパイル
+
-
- 一時退席中解除
-
-
- 一時退席中
-
-
- 取り込み中解除
-
-
- 取り込み中
+
+
+ スクリプトを [SLEEP_TIME] 秒間スリープ
+
@@ -1289,6 +1307,9 @@ https://www.firestormviewer.org/support
タトゥ
+
+ ユニバーサル
+
物理作用
@@ -1298,6 +1319,17 @@ https://www.firestormviewer.org/support
なし
+
+ 空
+
+
+ 水
+
+
+ デイサイクル
+
+
+
シャツ未着用
@@ -1331,12 +1363,17 @@ https://www.firestormviewer.org/support
タトゥー未着用
+
+ ユニバーサル未着用
+
物理作用なし
無効
+
+
新しいシェイプを作成
@@ -1382,15 +1419,23 @@ https://www.firestormviewer.org/support
新しいタトゥを作成
+
+ 新しいユニバーサルを作成
+
新しい物理作用を作成
無効
+
+
新しい [WEARABLE_ITEM]
+
+
+
次へ
@@ -1418,6 +1463,10 @@ https://www.firestormviewer.org/support
添付アイテムを保存
+
+ 送信者:[SENDER], [GROUPNAME]
+
+
テレポートを送る
@@ -1427,6 +1476,8 @@ https://www.firestormviewer.org/support
あなたにはさらに %d 通の通知があります
+
+
右腕
@@ -1448,6 +1499,8 @@ https://www.firestormviewer.org/support
拡張スケルトン
+
+
低
@@ -1457,9 +1510,13 @@ https://www.firestormviewer.org/support
高
+
+
ESC キーを押してワールドビューに戻ります
+
+
お探しのものは見つかりましたか? [secondlife:///app/search/all/[SEARCH_TERM] 検索] をお試しください。
@@ -1469,6 +1526,9 @@ https://www.firestormviewer.org/support
ここにランドマークをドラッグしてお気に入りに追加します。
+
+ まだ商品リストがありません。
+
アイテムが見つかりませんでした。検索文字列のスペルを確認して、もう一度やり直してください。
@@ -1652,6 +1712,8 @@ https://www.firestormviewer.org/support
いいえ
+
+
@@ -1662,6 +1724,8 @@ https://www.firestormviewer.org/support
+
+
@@ -1672,9 +1736,18 @@ https://www.firestormviewer.org/support
+
+
+
+
+
+
+
+
+
インベントリ
@@ -1774,12 +1847,19 @@ https://www.firestormviewer.org/support
全員
+
+ 自分のスーツケース
+
+
着用しているアタッチメントはありません
アタッチメント(残りのスロット数:[COUNT])
+
+
+
買う
@@ -2481,6 +2561,8 @@ https://www.firestormviewer.org/support
右後足
+
+
[LINE] 行目、[COLUMN] 列目
@@ -2499,9 +2581,31 @@ https://www.firestormviewer.org/support
新規スクリプト
+
+
メッセージを送った住人は、誰にも邪魔をされたくないため現在「取り込み中」モードです。 あなたのメッセージは、あとで確認できるように IM パネルに表示されます。
+
+ メッセージを送った住人は、[APP_NAME] ビューワの「自動応答モード」を起動しています。これは、その住人が今は誰にも邪魔をされたくないことを意味しています。あなたのメッセージはあとで確認できるように IM パネルに表示されます。
+
+
+ メッセージを送った住人は、[APP_NAME] ビューワの「自動応答モード」を起動しています。これは、その住人が今は誰にも邪魔をされたくないことを意味しています。あなたのメッセージはあとで確認できるように IM パネルに表示されます。
+
+
+ メッセージを送った住人は、[APP_NAME] ビューワの「全てのテレポートを拒否モード」を起動しています。これは、その住人が今はテレポートを受け入れたり、テレポートを送ったりして誰にも邪魔をされたくないことを意味しています。IM を送ること自体は可能です。
+
+
+ メッセージを送った住人は、[APP_NAME] ビューワの「フレンド申請拒否モード」を起動しています。これは、その住人が今はフレンド申請を受け付けることで誰にも邪魔をされたくないことを意味しています。IM を送ること自体は可能です。
+
+
+ メッセージを送った住人は、あなたがどのようなメッセージを送ることに対してもブロックしています。
+
+
+ メッセージを送った住人は現在 AFK(離席中)です。あなたのメッセージはあとで確認できるように IM パネルに表示されます。.
+
+
+
(名称別)
@@ -2520,18 +2624,24 @@ https://www.firestormviewer.org/support
この不動産には約款がありません。
+
+
この不動産には約款がありません。 この不動産上の土地は不動産所有者により販売され、Linden Lab は販売しません。 販売に関するお問い合わせは、不動産所有者までお願い致します。
+
+
グループ所有
パブリック
+
+
ローカル設定
@@ -2559,12 +2669,16 @@ https://www.firestormviewer.org/support
透明
+
+
クリック数: [TELEPORT] テレポート、 [MAP] 地図、 [PROFILE] プロフィール
(掲載後更新)
+
+
ピックやクラシファイド広告を作成していません。 作成するには、下にある「プラス」ボタンをクリックします。
@@ -2664,6 +2778,8 @@ https://www.firestormviewer.org/support
内容
+
+
取得アイテム
@@ -2673,9 +2789,6 @@ https://www.firestormviewer.org/support
[NAME] のアップロード料金は L$[AMOUNT] です
-
- これを L$[AMOUNT] で購入します
-
不明の拡張子: %s
使用可能な拡張子: .wav, .tga, .bmp, .jpg, .jpeg, or .anim
@@ -4605,10 +4718,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
この住人をブロックしています。 メッセージを送ると、ブロックが自動的に解除されます。
- リクエスト中にエラーが発生しました。あとでもう一度お試しください。
+ 会話ウィンドウを一度閉じて開き直して下さい。またはリログしてもう一度お試しください。
- 要求中にエラーが発生しました。後でもう一度試してください。
+ 会話ウィンドウを一度閉じて開き直して下さい。またはリログしてもう一度お試しください。
あなたには充分な権限がありません。
@@ -4658,11 +4771,14 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
[SOURCES] は何か新しいことを言いました。
+
+ あなたは今、
+
セッションの初期化がタイムアウトしました
- 家の配置の設定。
+ ホームポジションが設定されました。
https://secondlife.com/destination/voice-island
@@ -4735,9 +4851,6 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
クラシファイド広告を掲載する
-
- L$[AMOUNT] を渡します
-
アップロード料金は L$[AMOUNT] です
@@ -4745,10 +4858,13 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
料金は L$[AMOUNT] です
- 選択した土地を L$ [AMOUNT] で購入します
+ この土地の費用
- このオブジェクトは L$[AMOUNT] です
+ このアイテムの費用
+
+
+ 支払おうとしています
全員
@@ -4767,6 +4883,8 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
嫌がらせの報告
+
+
新しいシェイプ
@@ -4851,6 +4969,8 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
一般的ジェスチャー
+
+
男性 - すみません
@@ -4943,6 +5063,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
新しいデイサイクル
新しい水
新しい空
+ 新しい自然環境設定
/おじぎする
@@ -5025,6 +5146,8 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
ダンス8
+
+
[year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt]
@@ -5043,6 +5166,8 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
写真の大きさが検証できません。写真サイズがピッカーに表示されるまでお待ち下さい。
+
+
大変申し訳ございませんが、予期しない問題が発生しました。
@@ -5050,6 +5175,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
サービスに関する既知の問題については、https://secondlife-status.statuspage.io をご覧ください。
問題が引き続き発生する場合は、お使いのネットワークやファイアウォールの設定を調べてください。
+
+
日曜日:月曜日:火曜日:水曜日:木曜日:金曜日:土曜日
@@ -5071,9 +5200,13 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
PM
+
+
US$ [AMOUNT]
+
+
グループへの立入禁止
@@ -5116,15 +5249,25 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
チャット
+
+
- ベース
+ 無料会員
- プレミアム
+ プレミアム会員
- プレミアムプラス
+ プレミアムプラス会員
+
+ プレミアム会員にアップグレード
+
+
+ プレミアム会員資格
+
+
+
選択したアイテムを削除しますか
@@ -5134,6 +5277,8 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
このアウトフィットにはアイテムがありません
+
+
環境変数 LL_SCRIPT_EDITOR を設定するか、ExternalEditor 設定を使ってエディターを選択します。
@@ -5148,12 +5293,16 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
外部エディターを実行できませんでした。
+
+
翻訳できませんでした:[REASON]
翻訳の応答にエラーが発生しました。
+
+
Esc
@@ -5463,6 +5612,16 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
Z
+
+
+ LMB
+ MMB
+ RMB
+ MB4
+ MB5
+ Double LMB
+
+
パーティクル源ビーコン(青)を表示中
@@ -5997,7 +6156,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
[NAME] caused a collision of unknown type.
- ムーブメントロックが有効になりました
+ 「アバター」>「ムーブメント」>「ムーブメントをロック」が有効になりました
取り込み時の自動応答
@@ -6219,8 +6378,10 @@ Secondlife.com のサポートセクションから
不明:通常の範囲を超えています。デバッグ設定で「RenderQualityPerformance」を確認して下さい。
+
+ 環境設定で「LSL クライアントブリッジ」が無効化されていると、[APP_NAME] は LSL ブリッジを作成できません。
- Firestorm は LSL ブリッジを作成できませんでした。ライブラリを有効にしてリログして下さい。
+ [APP_NAME] は LSL ブリッジを作成できませんでした。ライブラリを有効にしてリログして下さい。
現在ブリッジを作成中ですので、別のインスタンスを開始することはできません。2,3分待ってからもう一度お試し下さい。
@@ -6229,19 +6390,19 @@ Secondlife.com のサポートセクションから
現在ブリッジを作成中です。この処理には時間がかかることがあります。お待ち下さい。
- ブリッジは作成されませんでした。ブリッジの名前が正しくありません。Firestorm のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
+ ブリッジは作成されませんでした。ブリッジの名前が正しくありません。[APP_NAME] のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
- ブリッジは作成されませんでした。ブリッジがインベントリにみつかりません。Firestorm のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
+ ブリッジは作成されませんでした。ブリッジがインベントリにみつかりません。[APP_NAME] のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
- ブリッジを装着できませんでした。このブリッジは現行バージョンのものではありません。Firestorm のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
+ ブリッジを装着できませんでした。このブリッジは現行バージョンのものではありません。[APP_NAME] のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
- ブリッジを装着できませんでした。ブリッジがインベントリ内の正しい場所にみつかりませんでした。Firestorm のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
+ ブリッジを装着できませんでした。ブリッジがインベントリ内の正しい場所にみつかりませんでした。[APP_NAME] のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
- ブリッジを装着できませんでした。何か別のものがブリッジの装着ポイントを使用しています。Firestorm のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
+ ブリッジを装着できませんでした。何か別のものがブリッジの装着ポイントを使用しています。[APP_NAME] のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行って下さい。
ブリッジのオブジェクトがみつかりませんでした。作成処理を進めることができませんので中止します。
@@ -6250,11 +6411,19 @@ Secondlife.com のサポートセクションから
ブリッジのインベントリに想定外のアイテムが入っています。
- ブリッジの作成が完了していません。ブリッジを使用するには、Firestorm のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行う必要があるかもしれません。
+ ブリッジの作成が完了していません。ブリッジを使用するには、[APP_NAME] のメニューから「アバター>アバターの状態>ブリッジの再作成」を選択し、ブリッジの再作成を行う必要があるかもしれません。
- ブリッジが外されました。
- ブリッジが作成されました。
-
+ ブリッジが外されました。
+ ブリッジが作成されました。
+
+
+ [APP_NAME] の AO が有効化されました。
+ [APP_NAME] の AO が無効化されました。
+ スクリプト入りの装着物により停止されました。
+ スクリプト入りの装着物により復帰しました。
+ スクリプト入りの装着物により、Stand のアニメーションが停止されました。
+ スクリプト入りの装着物により、Stand のアニメーションが復帰しました。
+
描画距離
最大パーティクル数
@@ -6358,10 +6527,30 @@ Secondlife.com のサポートセクションから
表示しない
完全表示
- 表示の複雑さ: [COMPLEXITY]
+ 表示の複雑さ:[COMPLEXITY]
+ テクスチャの範囲; [TEXTURE_AREA] m²
不明なフォント
不明なモード
ハイブリッド
テキスト
+
+
+ アップロード中...
+[ASSET_NAME]
+
+ はい
+ いいえ
+ 持ち物フォルダを装着
+ アウトフィットの写真
+ (不明のスクリプト)
+ L$[COST]
+
+ Windlight をインポート中...
+
+
+ アイテムなし
+ 1 個のアイテム
+ [NUM_ELEMENTS] 個のアイテム
+
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index 4555420ba8..62b1b828e0 100644
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -2,8 +2,7 @@
- テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。
+ テレポートできるのは1分間に6回までの制限があります。もしテレポートで問題を抱えている場合は、もう1分待ってから再度テレポートしてみて下さい。問題が解消しないようであれば一度ログアウトして、ログインし直して下さい。
リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。
diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml
index 03d4c70baa..aa2adbbc65 100644
--- a/indra/newview/skins/default/xui/pl/floater_about.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about.xml
@@ -26,7 +26,7 @@ Zespół programistów Firestorma:
Dodatkowy wkład w rozwój kodu Firestorma:
- Specjalne podziękowania dla naszego zespołu wsparcia, edytorów wiki, nauczycieli i tłumaczy:
+ Specjalne podziękowania dla naszego zespołu wsparcia, beta testerów, edytorów wiki, nauczycieli i tłumaczy:
Firestorm zawiera Starlight, zmodyfikowany dla Firestorma. Jest on tworzony przez rezydentów dla rezydentów, z intencją dostarczenia alternatywnego, jaśniejszego i w założeniach łatwiejszego w użytkowaniu interfejsu. Więcej szczegółów pod <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>.
diff --git a/indra/newview/skins/default/xui/pl/floater_add_payment_method.xml b/indra/newview/skins/default/xui/pl/floater_add_payment_method.xml
new file mode 100644
index 0000000000..2ef78d3d35
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_add_payment_method.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ Dodaj metodę płatności, aby kupić Lindeny i lepiej doświadczać Second Life.
+
+
+
+
+ Stwórz awatara, którego pokochasz. Wybieraj spośród milionów sklepów i Second Life Marketplace. Twój styl jest tutaj.
+
+
+ Wspieraj swoich ulubionych wykonawców i gospodarzy. Pomożesz im tworzyć wspaniałe doświadczenia.
+
+
+ Stwórz dom swoich marzeń. Miliony przedmiotów dostępnych do kupienia mogą uczynić Twoje gniazdko wyjątkowym.
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_adjust_environment.xml b/indra/newview/skins/default/xui/pl/floater_adjust_environment.xml
index 5966ca63c9..33dd99e491 100644
--- a/indra/newview/skins/default/xui/pl/floater_adjust_environment.xml
+++ b/indra/newview/skins/default/xui/pl/floater_adjust_environment.xml
@@ -48,6 +48,12 @@
Słońce:
+
+ Azymut:
+
+
+ Elewacja:
+
Rozmiar:
@@ -66,6 +72,12 @@
Księżyc:
+
+ Azymut:
+
+
+ Elewacja:
+
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
index 866900bc7e..7b3a47a8b6 100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
@@ -1,56 +1,79 @@
-
-
+
+
Kup [LINDENS] L$ za [LOCALAMOUNT]
Nie można kupić
-
- Potrzebujesz więcej L$
-
-
- Kontaktowanie z LindeX...
-
-
- Kup L$
-
-
- Obecnie posiadam
-
-
- [AMT]L$
-
-
- Chcę kupić
-
-
- Cena
-
-
- za [LOCALAMOUNT]
-
-
- Kalkulowanie...
-
-
- Mój nowy stan konta
-
-
- [AMT]L$
-
-
- [http://www.secondlife.com/my/account/payment_method_management.php metoda płatności] | [http://www.secondlife.com/my/account/currency.php waluta]
-
-
- Wpisz ponownie kwotę aby zobaczyć ostatni kurs wymiany.
-
-
- Potwierdzasz zakup L$, nie obiektu.
-
-
- Nie zakupiono wystarczającej ilości L$. Proszę zwiększyć kwotę.
-
-
-
+
+
+
+ Potrzeba więcej L$
+
+
+ Kup L$
+
+
+
+
+ Potrzeba
+
+
+ [AMT] L$
+
+
+
+
+ Obecnie masz
+
+
+ [AMT] L$
+
+
+
+
+ Musisz kupić przynajmniej
+
+
+ [AMT] L$
+
+
+
+
+ Kwota do zakupu
+
+
+ Około [LOCALAMOUNT]
+
+
+ Obliczanie...
+
+
+ Nowy stan konta
+
+
+ [AMT] L$
+
+
+
+
+ [http://www.secondlife.com/my/account/payment_method_management.php metoda płatności] | [http://www.secondlife.com/my/account/currency.php waluta]
+
+
+ Wpisz kwotę ponownie by zobaczyć najnowszy kurs wymiany.
+
+
+ Po otrzymaniu L$ powinieneś/aś spróbować
+ponownie dokonać zakupu.
+
+
+
+
+ Kontaktowanie z LindeX...
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_create_landmark.xml b/indra/newview/skins/default/xui/pl/floater_create_landmark.xml
new file mode 100644
index 0000000000..7d2a302d20
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_create_landmark.xml
@@ -0,0 +1,14 @@
+
+
+
+ Pasek ulubionych
+
+
+
+
+
+ [secondlife:/// Stwórz nowy folder]
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_search.xml b/indra/newview/skins/default/xui/pl/floater_fs_search.xml
index 77acd9eb23..98d605d302 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_search.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_search.xml
@@ -41,6 +41,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_teleporthistory.xml b/indra/newview/skins/default/xui/pl/floater_fs_teleporthistory.xml
index 0c35693bcf..f463868ec6 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_teleporthistory.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_teleporthistory.xml
@@ -1,6 +1,8 @@
-
+
+
+
@@ -11,11 +13,11 @@
-
+
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_inspect.xml b/indra/newview/skins/default/xui/pl/floater_inspect.xml
index dc1647bfe6..64fa70e143 100644
--- a/indra/newview/skins/default/xui/pl/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inspect.xml
@@ -9,6 +9,7 @@
Obiekty: [NUM_OBJECTS], primy: [NUM_PRIMS]
Strony: [NUM_FACES]
+Widoczne: [NUM_VISIBLE_FACES]
Wierzchołki: [NUM_VERTICES]
Trójkąty: [NUM_TRIANGLES]
Złożoność: [COMPLEXITY]
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 7c72a33b80..0913ed0e1b 100644
--- a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
@@ -9,10 +9,33 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 4ecf738b8f..3e00b652ae 100644
--- a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
@@ -21,9 +21,10 @@
+
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_favorites.xml b/indra/newview/skins/default/xui/pl/menu_favorites.xml
index 2e0b341e83..b5afa55bfd 100644
--- a/indra/newview/skins/default/xui/pl/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/pl/menu_favorites.xml
@@ -2,9 +2,12 @@
-
+
+
+
+
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 5b44f93dcc..c58d3fbe45 100755
--- a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
@@ -14,7 +14,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/pl/menu_inventory_search_visibility.xml
new file mode 100644
index 0000000000..254c9acb4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_search_visibility.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/menu_login.xml b/indra/newview/skins/default/xui/pl/menu_login.xml
index b06127461c..9b509ff507 100644
--- a/indra/newview/skins/default/xui/pl/menu_login.xml
+++ b/indra/newview/skins/default/xui/pl/menu_login.xml
@@ -10,7 +10,6 @@
@@ -9,12 +10,36 @@
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -22,11 +47,11 @@
-
+
-
+
-
\ No newline at end of file
+
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
index 29cd221525..c610364db8 100644
--- a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
@@ -18,12 +18,14 @@
+
-
-
-
+
+
+
+
@@ -32,7 +34,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/ru/menu_favorites.xml b/indra/newview/skins/default/xui/ru/menu_favorites.xml
index 2a8881bb44..0a0713619a 100644
--- a/indra/newview/skins/default/xui/ru/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/ru/menu_favorites.xml
@@ -1,10 +1,13 @@
-
-
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory.xml b/indra/newview/skins/default/xui/ru/menu_inventory.xml
index d5b8138cd7..33260718dc 100644
--- a/indra/newview/skins/default/xui/ru/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ru/menu_inventory.xml
@@ -115,8 +115,8 @@
-
-
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/ru/menu_inventory_search_visibility.xml
new file mode 100644
index 0000000000..10ecd98da1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inventory_search_visibility.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_login.xml b/indra/newview/skins/default/xui/ru/menu_login.xml
index c865a637d1..8be0306a1d 100644
--- a/indra/newview/skins/default/xui/ru/menu_login.xml
+++ b/indra/newview/skins/default/xui/ru/menu_login.xml
@@ -2,6 +2,8 @@
+
+
@@ -29,8 +31,7 @@
-
-
+
diff --git a/indra/newview/skins/default/xui/ru/menu_picks.xml b/indra/newview/skins/default/xui/ru/menu_picks.xml
index fe3ee04aeb..ed89d88682 100644
--- a/indra/newview/skins/default/xui/ru/menu_picks.xml
+++ b/indra/newview/skins/default/xui/ru/menu_picks.xml
@@ -1,7 +1,8 @@
-
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_pie_attachment_self.xml b/indra/newview/skins/default/xui/ru/menu_pie_attachment_self.xml
index 587ae16f94..4ac890d94c 100644
--- a/indra/newview/skins/default/xui/ru/menu_pie_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ru/menu_pie_attachment_self.xml
@@ -6,7 +6,7 @@
-
+
@@ -14,6 +14,7 @@
+
diff --git a/indra/newview/skins/default/xui/ru/menu_place_add_button.xml b/indra/newview/skins/default/xui/ru/menu_place_add_button.xml
index 321fa032f9..8db1663566 100644
--- a/indra/newview/skins/default/xui/ru/menu_place_add_button.xml
+++ b/indra/newview/skins/default/xui/ru/menu_place_add_button.xml
@@ -1,5 +1,5 @@
-
+
+
-
-
+
diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml
index 0e328db344..ad6a24c8e0 100644
--- a/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml
@@ -10,7 +10,4 @@
-
-
-
diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml
index 54f5014137..66fa4142fe 100644
--- a/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml
@@ -1,19 +1,17 @@
-
+
+
+
+
-
-
+
+
-
-
+
-
-
-
-
diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_sorting.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_sorting.xml
new file mode 100644
index 0000000000..f616434bab
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_places_gear_sorting.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml
index 8dc1500b83..9589dea55b 100644
--- a/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml
@@ -1,5 +1,5 @@
-
+
@@ -12,4 +12,4 @@
-
+
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml
index 18b2d1e602..f9cc5ea860 100644
--- a/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml
@@ -1,6 +1,7 @@
-
+
-
-
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_timezone.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_timezone.xml
new file mode 100644
index 0000000000..2827d6f8df
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_timezone.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 9a6511a07d..0931c70eb1 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -13,7 +13,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -109,11 +131,12 @@
+
-
+
-
+
@@ -407,7 +430,7 @@
-
+
@@ -530,7 +553,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml
index 5d1e716ea8..20c464a30f 100644
--- a/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml
+++ b/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml
@@ -3,11 +3,11 @@
-
-
+
+
-
+
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index f1d4893358..5f7e3adbd1 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -874,6 +874,13 @@
Вы не можете создать закладку потому что владелец земли не разрешает этого.
+
+ Выберите имя для папки:
+
+
Невозможно произвести перекомпиляцию.
Выберите объект со сценарием.
@@ -927,8 +934,7 @@
[REASON]
- При запросе телепортации возникла проблема. Возможно, для телепортации придется повторить вход в программу.
-Если данное сообщение повторится, посетите сайт [SUPPORT_SITE].
+ Количество попыток телепортации ограничено до 6 в минуту. Если у вас возникли проблемы, подождите минуту и попробуйте телепортироваться снова. Если проблема не исчезнет, выйдите из системы и войдите снова.
При пересечении границы региона возникла проблема. Возможно, для пересечения границы придется повторить вход в программу.
@@ -1248,6 +1254,13 @@
+
+ Выберите новое имя для [NAME]
+
+
Удалить жителя <nolink>[NAME]</nolink> из вашего списка друзей?
@@ -2056,7 +2069,9 @@
- Вы пытаетесь посетить регион, контент в котором не соответствует вашим настройкам. Попробуйте изменить настройки в меню "Аватар > Настройки > Общие".
+ Регион, который вы собираетесь посетить, имеет рейтинг зрелости, превышающий ваш максимальный уровень зрелости. Попробуйте изменить настройки в меню "Аватар > Настройки > Общие".
+
+Полную информацию о рейтингах зрелости можно найти [https://community.secondlife.com/t5/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F-%D0%B1%D0%B0%D0%B7%D0%B0-%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B9/%D0%A0%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B8-%D0%B7%D1%80%D0%B5%D0%BB%D0%BE%D1%81%D1%82%D0%B8/ta-p/1613715 здесь].
[MESSAGE]
@@ -2090,7 +2105,9 @@
У нас возникли технические трудности с вашим входом в, потому что ваши настройки не синхронизированы с сервером.
- Вы пытаетесь посетить регион, контент в котором не соответствует вашим настройкам. Попробуйте изменить настройки в меню "Аватар > Настройки > Общие".
+ Регион, который вы собираетесь посетить, имеет рейтинг зрелости, превышающий ваш максимальный уровень зрелости. Попробуйте изменить настройки в меню "Аватар > Настройки > Общие".
+
+Полную информацию о рейтингах зрелости можно найти [https://community.secondlife.com/t5/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F-%D0%B1%D0%B0%D0%B7%D0%B0-%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B9/%D0%A0%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B8-%D0%B7%D1%80%D0%B5%D0%BB%D0%BE%D1%81%D1%82%D0%B8/ta-p/1613715 здесь].
Вы пытаетесь посетить регион, контент в котором имеет рейтинг [REGIONMATURITY] и предназначен только для взрослых.
@@ -2134,7 +2151,9 @@
Не удалось изменить ваши настройки так, чтобы вы могли видеть контент с рейтингом [PREFERRED_MATURITY]. Ваши теперешние настройки разрешают просматривать контент [ACTUAL_MATURITY]. Попробуйте изменить настройки снова с помощью команд меню "Аватар > Настройки > Общие".
- Вы претендуете на землю, рейтинг зрелости контента на которой не соответствует вашим настройкам. Попробуйте изменить настройки в меню "Аватар > Настройки > Общие".
+ Регион, который вы собираетесь посетить, имеет рейтинг зрелости, превышающий ваш максимальный уровень зрелости. Попробуйте изменить настройки в меню "Аватар > Настройки > Общие".
+
+Полную информацию о рейтингах зрелости можно найти [https://community.secondlife.com/t5/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F-%D0%B1%D0%B0%D0%B7%D0%B0-%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B9/%D0%A0%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B8-%D0%B7%D1%80%D0%B5%D0%BB%D0%BE%D1%81%D1%82%D0%B8/ta-p/1613715 здесь].
На эту землю могут претендовать только взрослые.
@@ -2159,6 +2178,8 @@
Вы пытаетесь купить землю, рейтинг зрелости контента на которой не соответствует вашим настройкам. Попробуйте изменить настройки в меню "Аватар > Настройки > Общие".
+
+Полную информацию о рейтингах зрелости можно найти [https://community.secondlife.com/t5/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F-%D0%B1%D0%B0%D0%B7%D0%B0-%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B9/%D0%A0%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B8-%D0%B7%D1%80%D0%B5%D0%BB%D0%BE%D1%81%D1%82%D0%B8/ta-p/1613715 здесь].
Эту землю могут купить только взрослые.
@@ -2969,7 +2990,9 @@ URL: [AUDIOURL]
Вы можете претендовать на публичную землю только в регионе, в котором вы находитесь.
- Вы пытаетесь посетить регион, контент в котором не соответствует вашим настройкам. Попробуйте изменить настройки в меню "Я > Настройки > Общие".
+ Регион, который вы собираетесь посетить, имеет рейтинг зрелости, превышающий ваш максимальный уровень зрелости. Попробуйте изменить настройки в меню "Аватар > Настройки > Общие".
+
+Полную информацию о рейтингах зрелости можно найти [https://community.secondlife.com/t5/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F-%D0%B1%D0%B0%D0%B7%D0%B0-%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B9/%D0%A0%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B8-%D0%B7%D1%80%D0%B5%D0%BB%D0%BE%D1%81%D1%82%D0%B8/ta-p/1613715 здесь].
Регион, в который вы пытаетесь попасть, сейчас недоступен
@@ -3568,7 +3591,7 @@ URL: [AUDIOURL]
- Вы действительно хотите удалить историю телепортаций?
+ Это приведет к удалению всего списка мест, которые вы посетили, и его нельзя будет отменить. Продолжать?
@@ -4918,6 +4941,15 @@ URL: [AUDIOURL]
[REASON]
+
+На следующей странице выберите сумму L$ и
+нажмите кнопку «Разместить заказ». Вы сможете
+добавить способ оплаты при оформлении заказа.
+
+
Цвет LSL был скопирован в буфер обмена. Теперь вы можете вставить его в сценарий, чтобы использовать.
- Телепорт в другой регион (имя региона)
+ Телепорт в регион (регион | x y z)
diff --git a/indra/newview/skins/default/xui/ru/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/ru/panel_settings_sky_sunmoon.xml
index 143fc4e274..9b62a1da6a 100644
--- a/indra/newview/skins/default/xui/ru/panel_settings_sky_sunmoon.xml
+++ b/indra/newview/skins/default/xui/ru/panel_settings_sky_sunmoon.xml
@@ -1,16 +1,18 @@
-
+
Солнце и Звезды
Позиция:
Изображение:
Масштаб:
-
Цвет:
+ Азимут:
+ Высота:
Фокус свечения:
Размер свечения:
Яркость звезд:
+
@@ -19,11 +21,12 @@
Позиция:
Изображение:
Масштаб:
-
+ Азимут:
+ Высота:
Яркость:
+
-
diff --git a/indra/newview/skins/default/xui/ru/panel_teleport_history.xml b/indra/newview/skins/default/xui/ru/panel_teleport_history.xml
index c457bc2269..9bc98ace1b 100644
--- a/indra/newview/skins/default/xui/ru/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/ru/panel_teleport_history.xml
@@ -13,7 +13,4 @@
-
-
-
diff --git a/indra/newview/skins/default/xui/ru/rlva_strings.xml b/indra/newview/skins/default/xui/ru/rlva_strings.xml
index 9f80ba7cd0..695abbbd9b 100644
--- a/indra/newview/skins/default/xui/ru/rlva_strings.xml
+++ b/indra/newview/skins/default/xui/ru/rlva_strings.xml
@@ -141,6 +141,16 @@
value
Невозможно отобразить диалоговое окно или текстовое поле скрипта из-за ограничений RLV
+ blocked_share
+
+ value
+ Невозможно поделиться инвентарем с [RECIPIENT] из-за ограничений RLV.
+
+ blocked_share_generic
+
+ value
+ Невозможно поделиться инвентарем из-за ограничений RLV.
+
blocked_startim
value
diff --git a/indra/newview/skins/default/xui/ru/teleport_strings.xml b/indra/newview/skins/default/xui/ru/teleport_strings.xml
index eff5c6a05c..25491c40cd 100644
--- a/indra/newview/skins/default/xui/ru/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ru/teleport_strings.xml
@@ -2,8 +2,7 @@
- При запросе телепортации возникла проблема. Возможно, вам придется повторить вход перед тем, как вы сможете телепортироваться.
-Если данное сообщение повторится, посетите сайт [SUPPORT_SITE].
+ Количество попыток телепортации ограничено до 6 в минуту. Если у вас возникли проблемы, подождите минуту и попробуйте телепортироваться снова. Если проблема не исчезнет, выйдите из системы и войдите снова.
При пересечении границы региона возникла проблема. Возможно, вам придется повторить вход перед тем, как вы сможете перейти границу.
@@ -39,6 +38,9 @@
Системе не удалось своевременно выполнить ваше пересечение границы. Повторите попытку через несколько минут.
+
+ Cистема не смогла запустить ваш телепорт. Пожалуйста, попробуйте еще раз через несколько минут.
+
Не удается найти назначение телепорта. Назначение может быть временно недоступно или не существует. Пожалуйста, попробуйте еще раз через несколько минут.
diff --git a/indra/newview/skins/default/xui/tr/panel_landmarks.xml b/indra/newview/skins/default/xui/tr/panel_landmarks.xml
deleted file mode 100644
index d40d0c1543..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_landmarks.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/zh/panel_landmarks.xml b/indra/newview/skins/default/xui/zh/panel_landmarks.xml
deleted file mode 100644
index eea406170a..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_landmarks.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/firestorm/xui/es/panel_edit_shape.xml b/indra/newview/skins/firestorm/xui/es/panel_edit_shape.xml
index ba764afbef..25c86ff1f4 100644
--- a/indra/newview/skins/firestorm/xui/es/panel_edit_shape.xml
+++ b/indra/newview/skins/firestorm/xui/es/panel_edit_shape.xml
@@ -3,8 +3,6 @@
Metros
Pies
Altura:
- White_50
- White
diff --git a/indra/newview/skins/firestorm/xui/it/panel_edit_shape.xml b/indra/newview/skins/firestorm/xui/it/panel_edit_shape.xml
index 56210c665d..5a0de7610e 100644
--- a/indra/newview/skins/firestorm/xui/it/panel_edit_shape.xml
+++ b/indra/newview/skins/firestorm/xui/it/panel_edit_shape.xml
@@ -3,8 +3,6 @@
Metri
Piedi
Altezza:
- White_50
- White
diff --git a/indra/newview/skins/starlight/xui/en/panel_main_inventory.xml b/indra/newview/skins/starlight/xui/en/panel_main_inventory.xml
index 830e10e0cd..7906d5b768 100644
--- a/indra/newview/skins/starlight/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/starlight/xui/en/panel_main_inventory.xml
@@ -46,7 +46,7 @@
height="21"
top="18"
left="10"
- follows="top|right"
+ follows="top|left"
layout="topleft">
diff --git a/indra/newview/skins/starlight/xui/en/panel_navigation_bar.xml b/indra/newview/skins/starlight/xui/en/panel_navigation_bar.xml
index ea040cc599..35411975fb 100644
--- a/indra/newview/skins/starlight/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/starlight/xui/en/panel_navigation_bar.xml
@@ -235,7 +235,7 @@
left="0"
name="favorite"
image_drag_indication="Accordion_ArrowOpened_Off"
- tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
+ tool_tip="Drag Landmarks here for quick access to your favorite places!"
width="1024">
+
+
+
@@ -110,9 +103,12 @@
+
+
+
@@ -120,13 +116,8 @@
-
+
アイテム
-
-
-
-
-
diff --git a/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml b/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml
index 8400bfb23c..2d492c649e 100644
--- a/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml
+++ b/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml
@@ -97,6 +97,7 @@
+
diff --git a/indra/newview/tests/cppfeatures_test.cpp b/indra/newview/tests/cppfeatures_test.cpp
new file mode 100644
index 0000000000..923bb1e1b2
--- /dev/null
+++ b/indra/newview/tests/cppfeatures_test.cpp
@@ -0,0 +1,386 @@
+/**
+ * @file cppfeatures_test
+ * @author Vir
+ * @date 2021-03
+ * @brief cpp features
+ *
+ * $LicenseInfo:firstyear=2021&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2021, 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$
+ */
+
+// Tests related to newer C++ features, for verifying support across compilers and platforms
+
+#include "linden_common.h"
+#include "../test/lltut.h"
+
+namespace tut
+{
+
+struct cpp_features_test {};
+typedef test_group cpp_features_test_t;
+typedef cpp_features_test_t::object cpp_features_test_object_t;
+tut::cpp_features_test_t tut_cpp_features_test("LLCPPFeatures");
+
+// bracket initializers
+// Can initialize containers or values using curly brackets
+template<> template<>
+void cpp_features_test_object_t::test<1>()
+{
+ S32 explicit_val{3};
+ ensure(explicit_val==3);
+
+ S32 default_val{};
+ ensure(default_val==0);
+
+ std::vector fibs{1,1,2,3,5};
+ ensure(fibs[4]==5);
+}
+
+// auto
+//
+// https://en.cppreference.com/w/cpp/language/auto
+//
+// Can use auto in place of a more complex type specification, if the compiler can infer the type
+template<> template<>
+void cpp_features_test_object_t::test<2>()
+{
+ std::vector numbers{3,6,9};
+
+ // auto element
+ auto& aval = numbers[1];
+ ensure("auto element", aval==6);
+
+ // auto iterator (non-const)
+ auto it = numbers.rbegin();
+ *it += 1;
+ S32 val = *it;
+ ensure("auto iterator", val==10);
+}
+
+// range for
+//
+// https://en.cppreference.com/w/cpp/language/range-for
+//
+// Can iterate over containers without explicit iterator
+template<> template<>
+void cpp_features_test_object_t::test<3>()
+{
+
+ // Traditional iterator for with container
+ //
+ // Problems:
+ // * Have to create a new variable for the iterator, which is unrelated to the problem you're trying to solve.
+ // * Redundant and somewhat fragile. Have to make sure begin() and end() are both from the right container.
+ std::vector numbers{3,6,9};
+ for (auto it = numbers.begin(); it != numbers.end(); ++it)
+ {
+ auto& n = *it;
+ n *= 2;
+ }
+ ensure("iterator for vector", numbers[2]==18);
+
+ // Range for with container
+ //
+ // Under the hood, this is doing the same thing as the traditional
+ // for loop above. Still uses begin() and end() but you don't have
+ // to access them directly.
+ std::vector numbersb{3,6,9};
+ for (auto& n: numbersb)
+ {
+ n *= 2;
+ }
+ ensure("range for vector", numbersb[2]==18);
+
+ // Range for over a C-style array.
+ //
+ // This is handy because the language determines the range automatically.
+ // Getting this right manually is a little trickier.
+ S32 pows[] = {1,2,4,8,16};
+ S32 sum{};
+ for (const auto& v: pows)
+ {
+ sum += v;
+ }
+ ensure("for C-array", sum==31);
+}
+
+// override specifier
+//
+// https://en.cppreference.com/w/cpp/language/override
+//
+// Specify that a particular class function is an override of a virtual function.
+// Benefits:
+// * Makes code somewhat easier to read by showing intent.
+// * Prevents mistakes where you think something is an override but it doesn't actually match the declaration in the parent class.
+// Drawbacks:
+// * Some compilers require that any class using override must use it consistently for all functions.
+// This makes switching a class to use override a lot more work.
+
+class Foo
+{
+public:
+ virtual bool is_happy() const = 0;
+};
+
+class Bar: public Foo
+{
+public:
+ bool is_happy() const override { return true; }
+ // Override would fail: non-const declaration doesn't match parent
+ // bool is_happy() override { return true; }
+ // Override would fail: wrong name
+ // bool is_happx() override { return true; }
+};
+
+template<> template<>
+void cpp_features_test_object_t::test<4>()
+{
+ Bar b;
+ ensure("override", b.is_happy());
+}
+
+// final
+//
+// https://en.cppreference.com/w/cpp/language/final: "Specifies that a
+// virtual function cannot be overridden in a derived class or that a
+// class cannot be inherited from."
+
+class Vehicle
+{
+public:
+ virtual bool has_wheels() const = 0;
+};
+
+class WheeledVehicle: public Vehicle
+{
+public:
+ virtual bool has_wheels() const final override { return true; }
+};
+
+class Bicycle: public WheeledVehicle
+{
+public:
+ // Error: can't override final version in WheeledVehicle
+ // virtual bool has_wheels() override const { return true; }
+};
+
+template<> template<>
+void cpp_features_test_object_t::test<5>()
+{
+ Bicycle bi;
+ ensure("final", bi.has_wheels());
+}
+
+// deleted function declaration
+//
+// https://en.cppreference.com/w/cpp/language/function#Deleted_functions
+//
+// Typical case: copy constructor doesn't make sense for a particular class, so you want to make
+// sure the no one tries to copy-construct an instance of the class, and that the
+// compiler won't generate a copy constructor for you automatically.
+// Traditional fix is to declare a
+// copy constructor but never implement it, giving you a link-time error if anyone tries to use it.
+// Now you can explicitly declare a function to be deleted, which has at least two advantages over
+// the old way:
+// * Makes the intention clear
+// * Creates an error sooner, at compile time
+
+class DoNotCopy
+{
+public:
+ DoNotCopy() {}
+ DoNotCopy(const DoNotCopy& ref) = delete;
+};
+
+template<> template<>
+void cpp_features_test_object_t::test<6>()
+{
+ DoNotCopy nc; // OK, default constructor
+ //DoNotCopy nc2(nc); // No, can't copy
+ //DoNotCopy nc3 = nc; // No, this also calls copy constructor (even though it looks like an assignment)
+}
+
+// defaulted function declaration
+//
+// https://en.cppreference.com/w/cpp/language/function#Function_definition
+//
+// What about the complementary case to the deleted function declaration, where you want a copy constructor
+// and are happy with the default implementation the compiler will make (memberwise copy).
+// Now you can explicitly declare that too.
+// Usage: I guess it makes the intent clearer, but otherwise not obviously useful.
+class DefaultCopyOK
+{
+public:
+ DefaultCopyOK(): mVal(123) {}
+ DefaultCopyOK(const DefaultCopyOK&) = default;
+ S32 val() const { return mVal; }
+private:
+ S32 mVal;
+};
+
+template<> template<>
+void cpp_features_test_object_t::test<7>()
+{
+ DefaultCopyOK d; // OK
+ DefaultCopyOK d2(d); // OK
+ DefaultCopyOK d3 = d; // OK
+ ensure("default copy d", d.val()==123);
+ ensure("default copy d2", d.val()==d2.val());
+ ensure("default copy d3", d.val()==d3.val());
+}
+
+// initialize class members inline
+//
+// https://en.cppreference.com/w/cpp/language/data_members#Member_initialization
+//
+// Default class member values can be set where they are declared, using either brackets or =
+
+// It is preferred to skip creating a constructor if all the work can be done by inline initialization:
+// http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines.html#c45-dont-define-a-default-constructor-that-only-initializes-data-members-use-in-class-member-initializers-instead
+//
+class InitInline
+{
+public:
+ S32 mFoo{10};
+};
+
+class InitInlineWithConstructor
+{
+public:
+ // Here mFoo is not specified, so you will get the default value of 10.
+ // mBar is specified, so 25 will override the default value.
+ InitInlineWithConstructor():
+ mBar(25)
+ {}
+
+ // Default values set using two different styles, same effect.
+ S32 mFoo{10};
+ S32 mBar = 20;
+};
+
+template<> template<>
+void cpp_features_test_object_t::test<8>()
+{
+ InitInline ii;
+ ensure("init member inline 1", ii.mFoo==10);
+
+ InitInlineWithConstructor iici;
+ ensure("init member inline 2", iici.mFoo=10);
+ ensure("init member inline 3", iici.mBar==25);
+}
+
+// constexpr
+//
+// https://en.cppreference.com/w/cpp/language/constexpr
+//
+// Various things can be computed at compile time, and flagged as constexpr.
+constexpr S32 compute2() { return 2; }
+
+constexpr S32 ce_factorial(S32 n)
+{
+ if (n<=0)
+ {
+ return 1;
+ }
+ else
+ {
+ return n*ce_factorial(n-1);
+ }
+}
+
+template<> template<>
+void cpp_features_test_object_t::test<9>()
+{
+ S32 val = compute2();
+ ensure("constexpr 1", val==2);
+
+ // Compile-time factorial. You used to need complex templates to do something this useless.
+ S32 fac5 = ce_factorial(5);
+ ensure("constexpr 2", fac5==120);
+}
+
+// static assert
+//
+// https://en.cppreference.com/w/cpp/language/static_assert
+//
+// You can add asserts to be checked at compile time. The thing to be checked must be a constexpr.
+// There are two forms:
+// * static_assert(expr);
+// * static_assert(expr, message);
+//
+// Currently only the 2-parameter form works on windows. The 1-parameter form needs a flag we don't set.
+
+template<> template<>
+void cpp_features_test_object_t::test<10>()
+{
+ // static_assert(ce_factorial(6)==720); No, needs a flag we don't currently set.
+ static_assert(ce_factorial(6)==720, "bad factorial"); // OK
+}
+
+// type aliases
+//
+// https://en.cppreference.com/w/cpp/language/type_alias
+//
+// You can use the "using" statement to create simpler templates that
+// are aliases for more complex ones. "Template typedef"
+
+// This makes stringmap an alias for std::map
+template
+using stringmap = std::map;
+
+template<> template<>
+void cpp_features_test_object_t::test<11>()
+{
+ stringmap name_counts{ {"alice", 3}, {"bob", 2} };
+ ensure("type alias", name_counts["bob"]==2);
+}
+
+// Other possibilities:
+
+// nullptr
+
+// class enums
+
+// std::unique_ptr and make_unique
+
+// std::shared_ptr and make_shared
+
+// lambdas
+
+// perfect forwarding
+
+// variadic templates
+
+// std::thread
+
+// std::mutex
+
+// thread_local
+
+// rvalue reference &&
+
+// move semantics
+
+// std::move
+
+// string_view
+
+} // namespace tut
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 9df75d05dc..9510532b3c 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -116,6 +116,12 @@ class ViewerManifest(LLManifest,FSViewerManifest):
self.path("beams")
self.path("beamsColors")
+ # package static_assets folder
+ if self.fs_is_opensim():
+ self.path("static_assets")
+ self.path("fs_static_assets")
+ #
+
# include the extracted packages information (see BuildPackagesInfo.cmake)
self.path(src=os.path.join(self.args['build'],"packages-info.txt"), dst="packages-info.txt")
# CHOP-955: If we have "sourceid" or "viewer_channel" in the
@@ -782,11 +788,6 @@ class WindowsManifest(ViewerManifest):
self.path("libvlccore.dll")
self.path("plugins/")
- # pull in the crash logger from other projects
- # tag:"crash-logger" here as a cue to the exporter
- self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'],
- dst="win_crash_logger.exe")
-
if not self.is_packaging_viewer():
self.package_file = "copied_deps"
@@ -1346,6 +1347,20 @@ class DarwinManifest(ViewerManifest):
chardetdir = os.path.join(pkgdir, "lib", "python", "chardet")
idnadir = os.path.join(pkgdir, "lib", "python", "idna")
+ with self.prefix(src="", dst="Contents"): # everything goes in Contents
+ bugsplat_db = self.args.get('bugsplat')
+ if bugsplat_db:
+ # Inject BugsplatServerURL into Info.plist if provided.
+ Info_plist = self.dst_path_of("Info.plist")
+ Info = plistlib.readPlist(Info_plist)
+ # https://www.bugsplat.com/docs/platforms/os-x#configuration
+ Info["BugsplatServerURL"] = \
+ "https://{}.bugsplat.com/".format(bugsplat_db)
+ self.put_in_file(
+ plistlib.writePlistToString(Info),
+ os.path.basename(Info_plist),
+ "Info.plist")
+
with self.prefix(dst="Contents"): # everything goes in Contents
# self.path("Info.plist", dst="Info.plist")
@@ -1474,10 +1489,8 @@ class DarwinManifest(ViewerManifest):
# our apps
executable_path = {}
- for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"),
- # plugin launcher
- (os.path.join("llplugin", "slplugin"), "SLPlugin.app"),
- ):
+ embedded_apps = [ (os.path.join("llplugin", "slplugin"), "SLPlugin.app") ]
+ for app_bld_dir, app in embedded_apps:
self.path2basename(os.path.join(os.pardir,
app_bld_dir, self.args['configuration']),
app)
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index 95b4d99c0d..2c72a71a5a 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -13,6 +13,7 @@ include(LLXML)
include(Linking)
include(Tut)
include(LLAddBuildTest)
+include(bugsplat)
# Google Mock/Test is not used
#include(GoogleMock)
#
@@ -84,6 +85,10 @@ list(APPEND test_SOURCE_FILES ${test_HEADER_FILES})
add_executable(lltest ${test_SOURCE_FILES})
+if (USE_BUGSPLAT)
+ set_target_properties(lltest PROPERTIES COMPILE_DEFINITIONS "${BUGSPLAT_DEFINE}")
+endif (USE_BUGSPLAT)
+
target_link_libraries(lltest
${LEGACY_STDIO_LIBS}
${LLDATABASE_LIBRARIES}
diff --git a/indra/win_crash_logger/README.txt b/indra/win_crash_logger/README.txt
new file mode 100644
index 0000000000..6932a8d9c3
--- /dev/null
+++ b/indra/win_crash_logger/README.txt
@@ -0,0 +1,3 @@
+This component is no longer used in Linden Lab builds.
+Change requests to support continued use by open source
+builds are welcome.
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 01763e7e05..7d2991d1ee 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -542,7 +542,7 @@ bool LLCrashLoggerWindows::frame()
MSG msg;
memset(&msg, 0, sizeof(msg));
- while (!LLApp::isQuitting() && GetMessage(&msg, NULL, 0, 0))
+ while (!LLApp::isExiting() && GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
diff --git a/scripts/metrics/viewerstats.py b/scripts/metrics/viewerstats.py
new file mode 100755
index 0000000000..f7be3d967e
--- /dev/null
+++ b/scripts/metrics/viewerstats.py
@@ -0,0 +1,226 @@
+#!runpy.sh
+
+"""\
+
+This module contains code for analyzing ViewerStats data as uploaded by the viewer.
+
+$LicenseInfo:firstyear=2021&license=viewerlgpl$
+Second Life Viewer Source Code
+Copyright (C) 2021, 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 argparse
+import numpy as np
+import pandas as pd
+import json
+from collections import Counter, defaultdict
+from llbase import llsd
+import io
+import re
+import os
+import sys
+
+def show_stats_by_key(recs,indices,settings_sd = None):
+ result = ()
+ cnt = Counter()
+ per_key_cnt = defaultdict(Counter)
+ for r in recs:
+ try:
+ d = r
+ for idx in indices:
+ d = d[idx]
+ for k,v in d.items():
+ if isinstance(v,dict):
+ continue
+ cnt[k] += 1
+ if isinstance(v,list):
+ v = tuple(v)
+ per_key_cnt[k][v] += 1
+ except Exception as e:
+ print "err", e
+ print "d", d, "k", k, "v", v
+ raise
+ mc = cnt.most_common()
+ print "========================="
+ keyprefix = ""
+ if len(indices)>0:
+ keyprefix = ".".join(indices) + "."
+ for i,m in enumerate(mc):
+ k = m[0]
+ bigc = m[1]
+ unset_cnt = len(recs) - bigc
+ kmc = per_key_cnt[k].most_common(5)
+ print i, keyprefix+str(k), bigc
+ if settings_sd is not None and k in settings_sd and "Value" in settings_sd[k]:
+ print " ", "default",settings_sd[k]["Value"],"count",unset_cnt
+ for v in kmc:
+ print " ", "value",v[0],"count",v[1]
+ if settings_sd is not None:
+ print "Total keys in settings", len(settings_sd.keys())
+ unused_keys = list(set(settings_sd.keys()) - set(cnt.keys()))
+ unused_keys_non_str = [k for k in unused_keys if settings_sd[k]["Type"] != "String"]
+ unused_keys_str = [k for k in unused_keys if settings_sd[k]["Type"] == "String"]
+
+ # Things that no one in the sample has set to a non-default value. Possible candidates for removal.
+ print "\nUnused_keys_non_str", len(unused_keys_non_str)
+ print "======================"
+ print "\n".join(sorted(unused_keys_non_str))
+
+ # Strings are not currently logged, so we have no info on usage.
+ print "\nString keys (usage unknown)", len(unused_keys_str)
+ print "======================"
+ print "\n".join(sorted(unused_keys_str))
+
+ # Things that someone has set but that aren't recognized settings.
+ unrec_keys = list(set(cnt.keys()) - set(settings_sd.keys()))
+ print "\nUnrecognized keys", len(unrec_keys)
+ print "======================"
+ print "\n".join(sorted(unrec_keys))
+
+ result = (settings_sd.keys(), unused_keys_str, unused_keys_non_str, unrec_keys)
+ return result
+
+def parse_settings_xml(fname):
+ # assume we're in scripts/metrics
+ fname = "../../indra/newview/app_settings/" + fname
+ with open(fname,"r") as f:
+ contents = f.read()
+ return llsd.parse_xml(contents)
+
+def read_raw_settings_xml(fname):
+ # assume we're in scripts/metrics
+ fname = "../../indra/newview/app_settings/" + fname
+ contents = None
+ with open(fname,"r") as f:
+ contents = f.read()
+ return contents
+
+def write_settings_xml(fname, contents):
+ # assume we're in scripts/metrics
+ fname = "../../indra/newview/app_settings/" + fname
+ with open(fname,"w") as f:
+ f.write(llsd.format_pretty_xml(contents))
+ f.close()
+
+def write_raw_settings_xml(fname, string):
+ # assume we're in scripts/metrics
+ fname = "../../indra/newview/app_settings/" + fname
+ with io.open(fname,"w", newline='\n') as f:
+ f.write(string.decode('latin1'))
+ f.close()
+
+def remove_settings(string, to_remove):
+ for r in to_remove:
+ subs_str = r"" + r + r"<.*?\n"
+ string = re.sub(subs_str,"",string,flags=re.S|re.DOTALL)
+ return string
+
+def get_used_strings(root_dir):
+ used_str = set()
+ skipped_ext = set()
+ for dir_name, sub_dir_list, file_list in os.walk(root_dir):
+ for fname in file_list:
+ if fname in ["settings.xml", "settings.xml.edit", "settings_per_account.xml"]:
+ print "skip", fname
+ continue
+ (base,ext) = os.path.splitext(fname)
+ #if ext not in [".cpp", ".hpp", ".h", ".xml"]:
+ # skipped_ext.add(ext)
+ # continue
+
+ full_name = os.path.join(dir_name,fname)
+
+ with open(full_name,"r") as f:
+ #print full_name
+ lines = f.readlines()
+ for l in lines:
+ ms = re.findall(r'[>\"]([A-Za-z0-9_]+)[\"<]',l)
+ for m in ms:
+ #print "used_str",m
+ used_str.add(m)
+ print "skipped extensions", skipped_ext
+ print "got used_str", len(used_str)
+ return used_str
+
+
+if __name__ == "__main__":
+
+ parser = argparse.ArgumentParser(description="process tab-separated table containing viewerstats logs")
+ parser.add_argument("--verbose", action="store_true",help="verbose flag")
+ parser.add_argument("--preferences", action="store_true", help="analyze preference info")
+ parser.add_argument("--remove_unused", action="store_true", help="remove unused preferences")
+ parser.add_argument("--column", help="name of column containing viewerstats info")
+ parser.add_argument("infiles", nargs="+", help="name of .tsv files to process")
+ args = parser.parse_args()
+
+ for fname in args.infiles:
+ print "process", fname
+ df = pd.read_csv(fname,sep='\t')
+ #print "DF", df.describe()
+ jstrs = df['RAW_LOG:BODY']
+ #print "JSTRS", jstrs.describe()
+ recs = []
+ for i,jstr in enumerate(jstrs):
+ recs.append(json.loads(jstr))
+ show_stats_by_key(recs,[])
+ show_stats_by_key(recs,["agent"])
+ if args.preferences:
+ print "\nSETTINGS.XML"
+ settings_sd = parse_settings_xml("settings.xml")
+ #for skey,svals in settings_sd.items():
+ # print skey, "=>", svals
+ (all_str,_,_,_) = show_stats_by_key(recs,["preferences","settings"],settings_sd)
+ print
+
+ #print "\nSETTINGS_PER_ACCOUNT.XML"
+ #settings_pa_sd = parse_settings_xml("settings_per_account.xml")
+ #show_stats_by_key(recs,["preferences","settings_per_account"],settings_pa_sd)
+
+ if args.remove_unused:
+ # walk codebase looking for strings
+ all_str_set = set(all_str)
+ used_strings = get_used_strings("../../indra")
+ used_strings_set = set(used_strings)
+ unref_strings = all_str_set-used_strings_set
+ # Some settings names are generated by appending to a prefix. Need to look for this case.
+ prefix_used = set()
+ print "checking unref_strings", len(unref_strings)
+ for u in unref_strings:
+ for k in range(6,len(u)):
+ prefix = u[0:k]
+ if prefix in all_str_set and prefix in used_strings_set:
+ prefix_used.add(u)
+ #print "PREFIX_USED",u,prefix
+ print "PREFIX_USED", len(prefix_used), ",".join(list(prefix_used))
+ print
+ unref_strings = unref_strings - prefix_used
+
+ print "\nUNREF_IN_CODE " + str(len(unref_strings)) + "\n"
+ print "\n".join(list(unref_strings))
+ settings_str = read_raw_settings_xml("settings.xml")
+ # Do this via direct string munging to generate minimal changeset
+ settings_edited = remove_settings(settings_str,unref_strings)
+ write_raw_settings_xml("settings.xml.edit",settings_edited)
+
+
+
+
+
+