diff options
| author | Rider Linden <rider@lindenlab.com> | 2015-09-14 16:10:20 -0700 | 
|---|---|---|
| committer | Rider Linden <rider@lindenlab.com> | 2015-09-14 16:10:20 -0700 | 
| commit | 196caf21a828f114daf95fe02d81d8690cb1e8a8 (patch) | |
| tree | 7444e6884ab29dee4fcd8feabbe1fbc4f7888a00 /indra/test | |
| parent | 32912a395839712b4edd4f39737d116f1730f5bf (diff) | |
MAINT-5507: Removal of sdrpc client/server
MAINT-5507: removal of LLCurl::Easy, LLCurl::Multi LLCurl::Responder
Diffstat (limited to 'indra/test')
| -rwxr-xr-x | indra/test/io.cpp | 422 | 
1 files changed, 0 insertions, 422 deletions
| diff --git a/indra/test/io.cpp b/indra/test/io.cpp index 099331b727..ff900ab96b 100755 --- a/indra/test/io.cpp +++ b/indra/test/io.cpp @@ -41,8 +41,6 @@  #include "llpipeutil.h"  #include "llpumpio.h"  #include "llsd.h" -#include "llsdrpcclient.h" -#include "llsdrpcserver.h"  #include "llsdserialize.h"  #include "llcommon.h"  #include "lluuid.h" @@ -1177,426 +1175,6 @@ namespace tut  	}  } -#if 0 -namespace tut -{ -	struct rpc_server_data -	{ -		class LLSimpleRPCResponse : public LLSDRPCResponse -		{ -		public: -			LLSimpleRPCResponse(LLSD* response) : -				mResponsePtr(response) -			{ -			} -			~LLSimpleRPCResponse()  -			{ -			} -			virtual bool response(LLPumpIO* pump) -			{ -				*mResponsePtr = mReturnValue; -				return true; -			} -			virtual bool fault(LLPumpIO* pump) -			{ -				*mResponsePtr = mReturnValue; -				return false; -			} -			virtual bool error(LLPumpIO* pump) -			{ -				ensure("LLSimpleRPCResponse::error()", false); -				return false; -			} -		public: -			LLSD* mResponsePtr; -		}; - -		class LLSimpleRPCClient : public LLSDRPCClient -		{ -		public: -			LLSimpleRPCClient(LLSD* response) : -				mResponsePtr(response) -			{ -			} -			~LLSimpleRPCClient() {} -			void echo(const LLSD& parameter) -			{ -				LLSimpleRPCResponse* resp; -				resp = new LLSimpleRPCResponse(mResponsePtr); -				static const std::string URI_NONE; -				static const std::string METHOD_ECHO("echo"); -				call(URI_NONE, METHOD_ECHO, parameter, resp, EPBQ_CALLBACK); -			} -		public: -			LLSD* mResponsePtr; -		}; - -		class LLSimpleRPCServer : public LLSDRPCServer -		{ -		public: -			LLSimpleRPCServer() -			{ -				mMethods["echo"] = new mem_fn_t( -					this, -					&LLSimpleRPCServer::rpc_Echo); -			} -			~LLSimpleRPCServer() {} -		protected: -			typedef LLSDRPCMethodCall<LLSimpleRPCServer> mem_fn_t; -			ESDRPCSStatus rpc_Echo( -				const LLSD& parameter, -				const LLChannelDescriptors& channels, -				LLBufferArray* data) -			{ -				buildResponse(channels, data, parameter); -				return ESDRPCS_DONE; -			} -		}; - -		apr_pool_t* mPool; -		LLPumpIO* mPump; -		LLPumpIO::chain_t mChain; -		LLSimpleRPCClient* mClient; -		LLSD mResponse; - -		rpc_server_data() : -			mPool(NULL), -			mPump(NULL), -			mClient(NULL) -		{ -			apr_pool_create(&mPool, NULL); -			mPump = new LLPumpIO(mPool); -			mClient = new LLSimpleRPCClient(&mResponse); -			mChain.push_back(LLIOPipe::ptr_t(mClient)); -			mChain.push_back(LLIOPipe::ptr_t(new LLFilterSD2XMLRPCRequest)); -			mChain.push_back(LLIOPipe::ptr_t(new LLFilterXMLRPCRequest2LLSD)); -			mChain.push_back(LLIOPipe::ptr_t(new LLSimpleRPCServer)); -			mChain.push_back(LLIOPipe::ptr_t(new LLFilterSD2XMLRPCResponse)); -			mChain.push_back(LLIOPipe::ptr_t(new LLFilterXMLRPCResponse2LLSD)); -			mChain.push_back(LLIOPipe::ptr_t(mClient)); -		} -		~rpc_server_data() -		{ -			mChain.clear(); -			delete mPump; -			mPump = NULL; -			apr_pool_destroy(mPool); -			mPool = NULL; -		} -		void pump_loop(const LLSD& request) -		{ -			LLTimer timer; -			timer.setTimerExpirySec(1.0f); -			mClient->echo(request); -			mPump->addChain(mChain, DEFAULT_CHAIN_EXPIRY_SECS); -			while(mResponse.isUndefined() && !timer.hasExpired()) -			{ -				mPump->pump(); -				mPump->callback(); -			} -		} -	}; -	typedef test_group<rpc_server_data> rpc_server_test; -	typedef rpc_server_test::object rpc_server_object; -	tut::rpc_server_test rpc("rpc_server"); - -	template<> template<> -	void rpc_server_object::test<1>() -	{ -		LLSD request; -		request = 1; -		pump_loop(request); -		//LL_INFOS() << "request: " << *request << LL_ENDL; -		//LL_INFOS() << "response: " << *mResponse << LL_ENDL; -		ensure_equals("integer request response", mResponse.asInteger(), 1); -	} - -	template<> template<> -	void rpc_server_object::test<2>() -	{ -//#if LL_WINDOWS && _MSC_VER >= 1400 -//        skip_fail("Fails on VS2005 due to broken LLSDSerialize::fromNotation() parser."); -//#endif -		std::string uri("sl-am:66.150.244.180:12035/location?start=region&px=70.9247&py=254.378&pz=38.7304&lx=-0.043753&ly=-0.999042&lz=0"); -		std::stringstream stream; -		stream << "{'task_id':ucc706f2d-0b68-68f8-11a4-f1043ff35ca0}\n{\n\tname\tObject|\n\tpermissions 0\n}"; -		std::vector<U8> expected_binary; -		expected_binary.resize(stream.str().size()); -		memcpy(&expected_binary[0], stream.str().c_str(), stream.str().size());		/* Flawfinder: ignore */ -		stream.str(""); -		stream << "[{'uri':'" << uri << "'}, {'version':i1}, " -				  << "{'agent_id':'3c115e51-04f4-523c-9fa6-98aff1034730', 'session_id':'2c585cec-038c-40b0-b42e-a25ebab4d132', 'circuit_code':i1075, 'start':'region', 'limited_to_estate':i1 'first_name':'Phoenix', 'last_name':'Linden', 'group_title':'', 'group_id':u00000000-0000-0000-0000-000000000000, 'position':[r70.9247,r254.378,r38.7304], 'look_at':[r-0.043753,r-0.999042,r0], 'granters':[ua2e76fcd-9360-4f6d-a924-000000000003], 'texture_data':['5e481e8a-58a6-fc34-6e61-c7a36095c07f', 'c39675f5-ca90-a304-bb31-42cdb803a132', '5c989edf-88d1-b2ac-b00b-5ed4bab8e368', '6522e74d-1660-4e7f-b601-6f48c1659a77', '7ca39b4c-bd19-4699-aff7-f93fd03d3e7b', '41c58177-5eb6-5aeb-029d-bc4093f3c130', '97b75473-8b93-9b25-2a11-035b9ae93195', '1c2d8d9b-90eb-89d4-dea8-c1ed83990614', '69ec543f-e27b-c07c-9094-a8be6300f274', 'c9f8b80f-c629-4633-04ee-c566ce9fea4b', '989cddba-7ab6-01ed-67aa-74accd2a2a65', '45e319b2-6a8c-fa5c-895b-1a7149b88aef', '5748decc-f629-461c-9a36-a35a221fe21f', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', '685fbe10-ab40-f065-0aec-726cc6dfd7a1', '406f98fd-9c89-1d52-5f39-e67d508c5ee5', '685fbe10-ab40-f065-0aec-726cc6dfd7a1', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97'], " -				  << "'attachment_data':[" -				  << "{'attachment_point':i2, 'item_id':'d6852c11-a74e-309a-0462-50533f1ef9b3', 'asset_id':'c69b29b1-8944-58ae-a7c5-2ca7b23e22fb'}," -				  << "{'attachment_point':i10, 'item_id':'ff852c22-a74e-309a-0462-50533f1ef900', 'asset_data':b(" << expected_binary.size() << ")\""; -		stream.write((const char*)&expected_binary[0], expected_binary.size()); -		stream << "\"}" -				  << "]" -				  << "}]"; - -		LLSD request; -		S32 count = LLSDSerialize::fromNotation( -			request, -			stream, -			stream.str().size()); -		ensure("parsed something", (count > 0)); - -		pump_loop(request); -		ensure_equals("return type", mResponse.type(), LLSD::TypeArray); -		ensure_equals("return size", mResponse.size(), 3); - -		ensure_equals( -			"uri parameter type", -			mResponse[0].type(), -			LLSD::TypeMap); -		ensure_equals( -			"uri type", -			mResponse[0]["uri"].type(), -			LLSD::TypeString); -		ensure_equals("uri value", mResponse[0]["uri"].asString(), uri); - -		ensure_equals( -			"version parameter type", -			mResponse[1].type(), -			LLSD::TypeMap); -		ensure_equals( -			"version type", -			mResponse[1]["version"].type(), -			LLSD::TypeInteger); -		ensure_equals( -			"version value", -			mResponse[1]["version"].asInteger(), -			1); - -		ensure_equals("agent params type", mResponse[2].type(), LLSD::TypeMap); -		LLSD attachment_data = mResponse[2]["attachment_data"]; -		ensure("attachment data exists", attachment_data.isDefined()); -		ensure_equals( -			"attachment type", -			attachment_data.type(), -			LLSD::TypeArray); -		ensure_equals( -			"attachment type 0", -			attachment_data[0].type(), -			LLSD::TypeMap); -		ensure_equals( -			"attachment type 1", -			attachment_data[1].type(), -			LLSD::TypeMap); -		ensure_equals("attachment size 1", attachment_data[1].size(), 3); -		ensure_equals( -			"asset data type", -			attachment_data[1]["asset_data"].type(), -			LLSD::TypeBinary); -		std::vector<U8> actual_binary; -		actual_binary = attachment_data[1]["asset_data"].asBinary(); -		ensure_equals( -			"binary data size", -			actual_binary.size(), -			expected_binary.size()); -		ensure( -			"binary data", -			(0 == memcmp( -				&actual_binary[0], -				&expected_binary[0], -				expected_binary.size()))); -	} - -	template<> template<> -	void rpc_server_object::test<3>() -	{ -//#if LL_WINDOWS && _MSC_VER >= 1400 -//        skip_fail("Fails on VS2005 due to broken LLSDSerialize::fromNotation() parser."); -//#endif -		std::string uri("sl-am:66.150.244.180:12035/location?start=region&px=70.9247&py=254.378&pz=38.7304&lx=-0.043753&ly=-0.999042&lz=0"); - -		LLBufferArray buffer; -		LLChannelDescriptors buffer_channels = buffer.nextChannel(); -		LLBufferStream stream(buffer_channels, &buffer); -		stream << "[{'uri':'" << uri << "'}, {'version':i1}, " -				  << "{'agent_id':'3c115e51-04f4-523c-9fa6-98aff1034730', 'session_id':'2c585cec-038c-40b0-b42e-a25ebab4d132', 'circuit_code':i1075, 'start':'region', 'limited_to_estate':i1 'first_name':'Phoenix', 'last_name':'Linden', 'group_title':'', 'group_id':u00000000-0000-0000-0000-000000000000, 'position':[r70.9247,r254.378,r38.7304], 'look_at':[r-0.043753,r-0.999042,r0], 'granters':[ua2e76fcd-9360-4f6d-a924-000000000003], 'texture_data':['5e481e8a-58a6-fc34-6e61-c7a36095c07f', 'c39675f5-ca90-a304-bb31-42cdb803a132', '5c989edf-88d1-b2ac-b00b-5ed4bab8e368', '6522e74d-1660-4e7f-b601-6f48c1659a77', '7ca39b4c-bd19-4699-aff7-f93fd03d3e7b', '41c58177-5eb6-5aeb-029d-bc4093f3c130', '97b75473-8b93-9b25-2a11-035b9ae93195', '1c2d8d9b-90eb-89d4-dea8-c1ed83990614', '69ec543f-e27b-c07c-9094-a8be6300f274', 'c9f8b80f-c629-4633-04ee-c566ce9fea4b', '989cddba-7ab6-01ed-67aa-74accd2a2a65', '45e319b2-6a8c-fa5c-895b-1a7149b88aef', '5748decc-f629-461c-9a36-a35a221fe21f', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', '685fbe10-ab40-f065-0aec-726cc6dfd7a1', '406f98fd-9c89-1d52-5f39-e67d508c5ee5', '685fbe10-ab40-f065-0aec-726cc6dfd7a1', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97'], " -				  << "'attachment_data':[" -				  << "{'attachment_point':i2, 'item_id':'d6852c11-a74e-309a-0462-50533f1ef9b3', 'asset_id':'c69b29b1-8944-58ae-a7c5-2ca7b23e22fb'},"; - -		std::stringstream tmp_str; -		tmp_str << "{'task_id':ucc706f2d-0b68-68f8-11a4-f1043ff35ca0}\n{\n\tname\tObject|\n\tpermissions 0\n}"; -		std::vector<U8> expected_binary; -		expected_binary.resize(tmp_str.str().size()); -		memcpy(		/* Flawfinder: ignore */ -			&expected_binary[0], -			tmp_str.str().c_str(), -			tmp_str.str().size()); - -		LLBufferArray attachment_buffer; -		LLChannelDescriptors attach_channels = attachment_buffer.nextChannel(); -		LLBufferStream attach_stream(attach_channels, &attachment_buffer); -		attach_stream.write((const char*)&expected_binary[0], expected_binary.size()); -		attach_stream.flush(); -		S32 len = attachment_buffer.countAfter(attach_channels.out(), NULL); -		stream << "{'attachment_point':i10, 'item_id':'ff852c22-a74e-309a-0462-50533f1ef900', 'asset_data':b(" << len << ")\""; -		stream.flush(); -		buffer.takeContents(attachment_buffer); -		stream << "\"}]}]"; -		stream.flush(); - -		LLChannelDescriptors read_channel = buffer.nextChannel(); -		LLBufferStream read_stream(read_channel, &buffer); -		LLSD request; -		S32 count = LLSDSerialize::fromNotation( -			request, -			read_stream, -			buffer.count(read_channel.in())); -		ensure("parsed something", (count > 0)); -		ensure("deserialized", request.isDefined()); - -		// do the rpc round trip -		pump_loop(request); - -		ensure_equals("return type", mResponse.type(), LLSD::TypeArray); -		ensure_equals("return size", mResponse.size(), 3); - -		LLSD child = mResponse[0]; -		ensure("uri map exists", child.isDefined()); -		ensure_equals("uri parameter type", child.type(), LLSD::TypeMap); -		ensure("uri string exists", child.has("uri")); -		ensure_equals("uri type", child["uri"].type(), LLSD::TypeString); -		ensure_equals("uri value", child["uri"].asString(), uri); - -		child = mResponse[1]; -		ensure("version map exists",	child.isDefined()); -		ensure_equals("version param type", child.type(), LLSD::TypeMap); -		ensure_equals( -			"version type", -			child["version"].type(), -			LLSD::TypeInteger); -		ensure_equals("version value", child["version"].asInteger(), 1); - -		child = mResponse[2]; -		ensure("agent params map exists", child.isDefined()); -		ensure_equals("agent params type", child.type(), LLSD::TypeMap); -		child = child["attachment_data"]; -		ensure("attachment data exists", child.isDefined()); -		ensure_equals("attachment type", child.type(), LLSD::TypeArray); -		LLSD attachment = child[0]; -		ensure_equals("attachment type 0", attachment.type(), LLSD::TypeMap); -		attachment = child[1]; -		ensure_equals("attachment type 1", attachment.type(), LLSD::TypeMap); -		ensure_equals("attachment size 1", attachment.size(), 3); -		ensure_equals( -			"asset data type", -			attachment["asset_data"].type(), -			LLSD::TypeBinary); -		std::vector<U8> actual_binary = attachment["asset_data"].asBinary(); -		ensure_equals( -			"binary data size", -			actual_binary.size(), -			expected_binary.size()); -		ensure( -			"binary data", -			(0 == memcmp( -				&actual_binary[0], -				&expected_binary[0], -				expected_binary.size()))); -	} - -	template<> template<> -	void rpc_server_object::test<4>() -	{ -		std::string message("parcel '' is naughty."); -		std::stringstream str; -		str << "{'message':'" << LLSDNotationFormatter::escapeString(message) -			<< "'}"; -		LLSD request; -		S32 count = LLSDSerialize::fromNotation( -			request, -			str, -			str.str().size()); -		ensure_equals("parse count", count, 2); -		ensure_equals("request type", request.type(), LLSD::TypeMap); -		pump_loop(request); -		ensure("valid response", mResponse.isDefined()); -		ensure_equals("response type", mResponse.type(), LLSD::TypeMap); -		std::string actual = mResponse["message"].asString(); -		ensure_equals("message contents", actual, message); -	} - -	template<> template<> -	void rpc_server_object::test<5>() -	{ -		// test some of the problem cases with llsdrpc over xmlrpc - -		// for example: -		// * arrays are auto-converted to parameter lists, thus, this -		// becomes one parameter. -		// * undef goes over the wire as false (this might not be a good idea) -		// * uuids are converted to string. -		std::string val = "[{'failures':!,'successfuls':[u3c115e51-04f4-523c-9fa6-98aff1034730]}]"; -		std::istringstream istr; -		istr.str(val); -		LLSD sd; -		LLSDSerialize::fromNotation(sd, istr, val.size()); -		pump_loop(sd); -		ensure("valid response", mResponse.isDefined()); -		ensure_equals("parsed type", mResponse.type(), LLSD::TypeMap); -		ensure_equals("parsed size", mResponse.size(), 2); -		LLSD failures = mResponse["failures"]; -		ensure_equals("no failures.", failures.asBoolean(), false); -		LLSD success = mResponse["successfuls"]; -		ensure_equals("success type", success.type(), LLSD::TypeArray); -		ensure_equals("success size", success.size(), 1); -		ensure_equals( -			"success instance type", -			success[0].type(), -			LLSD::TypeString); -	} - -/* -	template<> template<> -	void rpc_server_object::test<5>() -	{ -		std::string expected("\xf3");//\xffsomething"); -		LLSD* request = LLSD::createString(expected); -		pump_loop(request); -		std::string actual; -		mResponse->getString(actual); -		if(actual != expected) -		{ -			//LL_WARNS() << "iteration " << i << LL_ENDL; -			std::ostringstream e_str; -			std::string::iterator iter = expected.begin(); -			std::string::iterator end = expected.end(); -			for(; iter != end; ++iter) -			{ -				e_str << (S32)((U8)(*iter)) << " "; -			} -			e_str << std::endl; -			llsd_serialize_string(e_str, expected); -			LL_WARNS() << "expected size: " << expected.size() << LL_ENDL; -			LL_WARNS() << "expected:	  " << e_str.str() << LL_ENDL; - -			std::ostringstream a_str; -			iter = actual.begin(); -			end = actual.end(); -			for(; iter != end; ++iter) -			{ -				a_str << (S32)((U8)(*iter)) << " "; -			} -			a_str << std::endl; -			llsd_serialize_string(a_str, actual); -			LL_WARNS() << "actual size:	  " << actual.size() << LL_ENDL; -			LL_WARNS() << "actual:		" << a_str.str() << LL_ENDL; -		} -		ensure_equals("binary string request response", actual, expected); -		delete request; -	} - -	template<> template<> -	void rpc_server_object::test<5>() -	{ -	} -*/ -} -#endif -  /*  'asset_data':b(12100)"{'task_id':ucc706f2d-0b68-68f8-11a4-f1043ff35ca0}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444921\n\ttotal_crc\t323\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.368634403\t0.00781063363\t-0.569040775\n\toldpos\t150.117996\t25.8658009\t8.19664001\n\trotation\t-0.06293071806430816650390625\t-0.6995697021484375\t-0.7002241611480712890625\t0.1277817934751510620117188\n\tchildpos\t-0.00499999989\t-0.0359999985\t0.307999998\n\tchildrot\t-0.515492737293243408203125\t-0.46601200103759765625\t0.529055416584014892578125\t0.4870323240756988525390625\n\tscale\t0.074629\t0.289956\t0.01\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t16\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\tscale_x\t1\n\t\t\tscale_y\t1\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t1\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t6\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t-1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061088050622956\n\treztime\t1094866329019785\n\tparceltime\t1133568981980596\n\ttax_rate\t1.00084\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':u61fa7364-e151-0597-774c-523312dae31b}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444922\n\ttotal_crc\t324\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.367110789\t0.00780026987\t-0.566269755\n\toldpos\t150.115005\t25.8479004\t8.18669987\n\trotation\t0.47332942485809326171875\t-0.380102097988128662109375\t-0.5734078884124755859375\t0.550168216228485107421875\n\tchildpos\t-0.00499999989\t-0.0370000005\t0.305000007\n\tchildrot\t-0.736649334430694580078125\t-0.03042060509324073791503906\t-0.02784589119255542755126953\t0.67501628398895263671875\n\tscale\t0.074629\t0.289956\t0.01\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t16\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\tscale_x\t1\n\t\t\tscale_y\t1\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t1\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t6\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t-1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087839248891\n\treztime\t1094866329020800\n\tparceltime\t1133568981981983\n\ttax_rate\t1.00084\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':ub8d68643-7dd8-57af-0d24-8790032aed0c}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444923\n\ttotal_crc\t235\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.120029509\t-0.00284469454\t-0.0302077383\n\toldpos\t150.710999\t25.8584995\t8.19172001\n\trotation\t0.145459949970245361328125\t-0.1646589934825897216796875\t0.659558117389678955078125\t-0.718826770782470703125\n\tchildpos\t0\t-0.182999998\t-0.26699999\n\tchildrot\t0.991444766521453857421875\t3.271923924330621957778931e-05\t-0.0002416197530692443251609802\t0.1305266767740249633789062\n\tscale\t0.0382982\t0.205957\t0.368276\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t32\n\t\t\tbegin\t0.3\n\t\t\tend\t0.65\n\t\t\tscale_x\t1\n\t\t\tscale_y\t0.05\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t0\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t3\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087534454174\n\treztime\t1094866329021741\n\tparceltime\t1133568981982889\n\ttax_rate\t1.00326\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':ue4b19200-9d33-962f-c8c5-6f25be3a3fd0}\n{\n\tname\tApotheosis_Immolaine_tail|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444924\n\ttotal_crc\t675\n\ttype\t1\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.34780401\t-0.00968400016\t-0.260098994\n\toldpos\t0\t0\t0\n\trotation\t0.73164522647857666015625\t-0.67541944980621337890625\t-0.07733880728483200073242188\t0.05022468417882919311523438\n\tvelocity\t0\t0\t0\n\tangvel\t0\t0\t0\n\tscale\t0.0382982\t0.32228\t0.383834\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t32\n\t\t\tbegin\t0.3\n\t\t\tend\t0.65\n\t\t\tscale_x\t1\n\t\t\tscale_y\t0.05\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t0\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t3\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087463950186\n\treztime\t1094866329022555\n\tparceltime\t1133568981984359\n\tdescription\t(No Description)|\n\ttax_rate\t1.01736\n\tnamevalue\tAttachPt U32 RW S 10\n\tnamevalue\tAttachmentOrientation VEC3 RW DS -3.110088, -0.182018, 1.493795\n\tnamevalue\tAttachmentOffset VEC3 RW DS -0.347804, -0.009684, -0.260099\n\tnamevalue\tAttachItemID STRING RW SV 20f36c3a-b44b-9bc7-87f3-018bfdfc8cda\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\torig_asset_id\t8747acbc-d391-1e59-69f1-41d06830e6c0\n\torig_item_id\t20f36c3a-b44b-9bc7-87f3-018bfdfc8cda\n\tfrom_task_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tlinked\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n"  */ | 
