diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index b12de563e4324d96a47cf2f11230244bd267a669..04ac2476a75a06a371d230714ec31e9a917dbe99 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -1085,7 +1085,7 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLTexture* texture, LLTexUnit::eTextu
     return uniform;
 }
 
-S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth, LLTexUnit::eTextureFilterOptions mode)
+S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth, LLTexUnit::eTextureFilterOptions mode, U32 index)
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
 
@@ -1103,7 +1103,7 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth,
         }
         else {
             bool has_mips = mode == LLTexUnit::TFO_TRILINEAR || mode == LLTexUnit::TFO_ANISOTROPIC;
-            gGL.getTexUnit(uniform)->bindManual(texture->getUsage(), texture->getTexture(0), has_mips);
+            gGL.getTexUnit(uniform)->bindManual(texture->getUsage(), texture->getTexture(index), has_mips);
         }
 
         gGL.getTexUnit(uniform)->setTextureFilteringOption(mode);
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 37f86acd4e31ffc3efbf4b246884de92b3133e24..9d187c972c673f430b90ba45d6312374bb6bca09 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -244,7 +244,7 @@ class LLGLSLShader
     S32 bindTexture(const std::string& uniform, LLTexture* texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureColorSpace space = LLTexUnit::TCS_LINEAR);
     S32 bindTexture(S32 uniform, LLTexture* texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureColorSpace space = LLTexUnit::TCS_LINEAR);
     S32 bindTexture(const std::string& uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR);
-    S32 bindTexture(S32 uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR);
+    S32 bindTexture(S32 uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR, U32 index = 0);
     S32 unbindTexture(const std::string& uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
     S32 unbindTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
 
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 6f6162723529195ca908cee1c4b0e5f2ff79e375..909a1de2b3fda0790cfd8f875b3ff95430fb9c3a 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -87,6 +87,13 @@ class LLTexUnit
 		TFO_ANISOTROPIC			// Equal to: min=anisotropic, max=anisotropic, mip=linear.
 	} eTextureFilterOptions;
 
+	typedef enum
+	{
+		TMG_NONE = 0,			// Mipmaps are not automatically generated for this texture.
+		TMG_AUTO,				// Mipmaps are automatically generated for this texture.
+		TMG_MANUAL				// Mipmaps are manually generated for this texture.
+	} eTextureMipGeneration;
+
 	typedef enum 
 	{
 		TB_REPLACE = 0,
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 7f507a0b58dd31ce48c43bdc25d5ecc934c78bca..629664b76d51c858413e5644b8b330b2507898b1 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -102,7 +102,7 @@ void LLRenderTarget::resize(U32 resx, U32 resy)
 }
     
 
-bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLTexUnit::eTextureType usage)
+bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLTexUnit::eTextureType usage, LLTexUnit::eTextureMipGeneration generateMipMaps)
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
     llassert(usage == LLTexUnit::TT_TEXTURE);
@@ -118,6 +118,13 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLT
 
     mUsage = usage;
     mUseDepth = depth;
+
+    mGenerateMipMaps = generateMipMaps;
+
+    if (mGenerateMipMaps != LLTexUnit::TMG_NONE) {
+        // Calculate the number of mip levels based upon resolution that we should have.
+        mMipLevels = 1 + floor(log10((float)llmax(mResX, mResY))/log10(2.0));
+    }
     
     if (depth)
     {
@@ -512,6 +519,12 @@ void LLRenderTarget::flush()
     llassert(sCurFBO == mFBO);
     llassert(sBoundTarget == this);
 
+    if (mGenerateMipMaps == LLTexUnit::TMG_AUTO) {
+        LL_PROFILE_GPU_ZONE("rt generate mipmaps");
+        bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR);
+        glGenerateMipmap(GL_TEXTURE_2D);
+    }
+
     if (mPreviousRT)
     {
         // a bit hacky -- pop the RT stack back two frames and push
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index 71727bf09d3a03f1015ab2b75db6aedf0b34efe7..9fcea35e3df2d29b6a1212a53c9b1c357eee21cb 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -80,7 +80,7 @@ class LLRenderTarget
     // color_fmt - GL color format (e.g. GL_RGB)
     // depth - if true, allocate a depth buffer
     // usage - deprecated, should always be TT_TEXTURE
-	bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth = false, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE);
+	bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth = false, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureMipGeneration generateMipMaps = LLTexUnit::TMG_NONE);
 
 	//resize existing attachments to use new resolution and color format
 	// CAUTION: if the GL runs out of memory attempting to resize, this render target will be undefined
@@ -179,6 +179,8 @@ class LLRenderTarget
 
     U32 mDepth;
     bool mUseDepth;
+	LLTexUnit::eTextureMipGeneration mGenerateMipMaps;
+	U32 mMipLevels;
 
 	LLTexUnit::eTextureType mUsage;
 	
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 3d8cbc952789c360979b31490f6f221cd5942b61..102d9165300e36741830caa259d943e3a6c4ad6c 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8942,6 +8942,17 @@
       <key>Value</key>
       <real>1.0</real>
     </map>
+  <key>RenderBufferVisualization</key>
+  <map>
+    <key>Comment</key>
+    <string>Outputs a selected buffer to the screen.  -1 = final render buffer.  0 = Albedo, 1 = Specular/ORM, 2 = Normal, 3 = Emissive, 4 = Eye luminance</string>
+    <key>Persist</key>
+    <integer>0</integer>
+    <key>Type</key>
+    <string>S32</string>
+    <key>Value</key>
+    <integer>-1</integer>
+  </map>
   <key>RenderCompressTextures</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredVisualizeBuffers.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredVisualizeBuffers.glsl
new file mode 100644
index 0000000000000000000000000000000000000000..f75b8e265876f655ac15e47f7002fd46dc6dbe24
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredVisualizeBuffers.glsl
@@ -0,0 +1,47 @@
+/** 
+ * @file postDeferredNoDoFF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, 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$
+ */
+ 
+#extension GL_ARB_texture_rectangle : enable
+
+/*[EXTRA_CODE_HERE]*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D diffuseRect;
+uniform float mipLevel;
+
+VARYING vec2 vary_fragcoord;
+
+void main() 
+{
+	vec4 diff = textureLod(diffuseRect, vary_fragcoord.xy, mipLevel);
+	
+	frag_color = diff;
+}
+
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 1fd536ceacc8e815b6f15bb826649b5acc09b5c8..b0123a116a371d7c165e38e1407d8f760b4d9b01 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -204,6 +204,7 @@ LLGLSLShader            gDeferredSkinnedFullbrightAlphaMaskProgram;
 LLGLSLShader            gDeferredSkinnedFullbrightAlphaMaskAlphaProgram;
 LLGLSLShader			gNormalMapGenProgram;
 LLGLSLShader            gDeferredGenBrdfLutProgram;
+LLGLSLShader            gDeferredBufferVisualProgram;
 
 // Deferred materials shaders
 LLGLSLShader			gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2];
@@ -1022,6 +1023,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
         
 		gNormalMapGenProgram.unload();
         gDeferredGenBrdfLutProgram.unload();
+		gDeferredBufferVisualProgram.unload();
 
 		for (U32 i = 0; i < LLMaterial::SHADER_COUNT*2; ++i)
 		{
@@ -2741,6 +2743,15 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
         success = gPostScreenSpaceReflectionProgram.createShader(NULL, NULL);
 	}
 
+	if (success) {
+		gDeferredBufferVisualProgram.mName = "Deferred Buffer Visualization Shader";
+		gDeferredBufferVisualProgram.mShaderFiles.clear();
+		gDeferredBufferVisualProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+		gDeferredBufferVisualProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredVisualizeBuffers.glsl", GL_FRAGMENT_SHADER));
+		gDeferredBufferVisualProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+		success = gDeferredBufferVisualProgram.createShader(NULL, NULL);
+	}
+
 	return success;
 }
 
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 0a23c33b78547133c7b94babe62dbff13170987f..129802aca5966cca9b0adf909c7952b2b79477ff 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -265,6 +265,7 @@ extern LLGLSLShader			gDeferredFullbrightShinyProgram;
 extern LLGLSLShader         gHUDFullbrightShinyProgram;
 extern LLGLSLShader			gNormalMapGenProgram;
 extern LLGLSLShader         gDeferredGenBrdfLutProgram;
+extern LLGLSLShader			gDeferredBufferVisualProgram;
 
 // Deferred materials shaders
 extern LLGLSLShader			gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2];
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index f7882b98ba559a6aad6f119cb8bfcc1dfe428344..fb39e0a8ea5bd3d153606900008e7a3a14f2c8d8 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -190,6 +190,7 @@ F32 LLPipeline::CameraMaxCoF;
 F32 LLPipeline::CameraDoFResScale;
 F32 LLPipeline::RenderAutoHideSurfaceAreaLimit;
 bool LLPipeline::RenderScreenSpaceReflections;
+S32 LLPipeline::RenderBufferVisualization;
 LLTrace::EventStatHandle<S64> LLPipeline::sStatBatchSize("renderbatchsize");
 
 const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f;
@@ -542,6 +543,7 @@ void LLPipeline::init()
 	connectRefreshCachedSettingsSafe("CameraDoFResScale");
 	connectRefreshCachedSettingsSafe("RenderAutoHideSurfaceAreaLimit");
     connectRefreshCachedSettingsSafe("RenderScreenSpaceReflections");
+	connectRefreshCachedSettingsSafe("RenderBufferVisualization");
 	gSavedSettings.getControl("RenderAutoHideSurfaceAreaLimit")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
 }
 
@@ -1025,6 +1027,7 @@ void LLPipeline::refreshCachedSettings()
 	CameraDoFResScale = gSavedSettings.getF32("CameraDoFResScale");
 	RenderAutoHideSurfaceAreaLimit = gSavedSettings.getF32("RenderAutoHideSurfaceAreaLimit");
     RenderScreenSpaceReflections = gSavedSettings.getBOOL("RenderScreenSpaceReflections");
+	RenderBufferVisualization = gSavedSettings.getS32("RenderBufferVisualization");
     sReflectionProbesEnabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionsEnabled") && gSavedSettings.getBOOL("RenderReflectionsEnabled");
 	RenderSpotLight = nullptr;
 
@@ -1267,7 +1270,7 @@ void LLPipeline::createLUTBuffers()
     mExposureMap.clear();
     mExposureMap.flush();
 
-    mLuminanceMap.allocate(256, 256, GL_R16F);
+    mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_AUTO);
 
     mLastExposure.allocate(1, 1, GL_R16F);
 }
@@ -6888,58 +6891,21 @@ void LLPipeline::bindScreenToTexture()
 
 static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom");
 
-void LLPipeline::renderPostProcess()
-{
-	LLVertexBuffer::unbind();
-	LLGLState::checkStates();
-
-	assertInitialized();
-
-	LLVector2 tc1(0, 0);
-	LLVector2 tc2((F32)mRT->screen.getWidth() * 2, (F32)mRT->screen.getHeight() * 2);
-
-	LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM);
-	LL_PROFILE_GPU_ZONE("renderPostProcess");
-
-	LLGLDepthTest depth(GL_FALSE);
-	LLGLDisable blend(GL_BLEND);
-	LLGLDisable cull(GL_CULL_FACE);
-
-	enableLightsFullbright();
-
-	LLGLDisable test(GL_ALPHA_TEST);
-
-	gGL.setColorMask(true, true);
-	glClearColor(0, 0, 0, 0);
-
-	gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
-	gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
-	gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
-	gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
-	glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
-
-	tc2.setVec((F32)mRT->screen.getWidth(), (F32)mRT->screen.getHeight());
-
-	gGL.flush();
-
-	LLVertexBuffer::unbind();
-
-    
-}
-
-LLRenderTarget* LLPipeline::screenTarget() {
-
-	bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() &&
-		(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
-		RenderDepthOfField &&
-		!gCubeSnapshot;
+void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex) {
+	dst->bindTarget();
+	gDeferredBufferVisualProgram.bind();
+	gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_BILINEAR, bufferIndex);
 
-	bool multisample = RenderFSAASamples > 1 && mRT->fxaaBuffer.isComplete() && !gCubeSnapshot;
+	static LLStaticHashedString mipLevel("mipLevel");
+	if (RenderBufferVisualization != 4)
+		gDeferredBufferVisualProgram.uniform1f(mipLevel, 0);
+	else
+		gDeferredBufferVisualProgram.uniform1f(mipLevel, 8);
 
-	if (multisample || dof_enabled)
-		return &mRT->deferredLight;
-	
-	return &mRT->screen;
+	mScreenTriangleVB->setBuffer();
+	mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+	gDeferredBufferVisualProgram.unbind();
+	dst->flush();
 }
 
 void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) {
@@ -6970,9 +6936,6 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) {
 		mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
 		dst->flush();
 
-		dst->bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR);
-		glGenerateMipmap(GL_TEXTURE_2D);
-
 		// note -- unbind AFTER the glGenerateMipMap so time in generatemipmap can be profiled under "Luminance"
 		// also note -- keep an eye on the performance of glGenerateMipmap, might need to replace it with a mip generation shader
 		gLuminanceProgram.unbind();
@@ -7028,7 +6991,7 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst) {
 		mScreenTriangleVB->setBuffer();
 		mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
 
-		gGL.getTexUnit(channel)->unbind(screenTarget()->getUsage());
+		gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage());
 		gExposureProgram.unbind();
 		dst->flush();
 	}
@@ -7199,8 +7162,8 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) {
 		bool multisample = RenderFSAASamples > 1 && mRT->fxaaBuffer.isComplete();
 		LLGLSLShader* shader = &gGlowCombineProgram;
 
-		S32 width = screenTarget()->getWidth();
-		S32 height = screenTarget()->getHeight();
+		S32 width = dst->getWidth();
+		S32 height = dst->getHeight();
 
 		// Present everything.
 		if (multisample)
@@ -7562,13 +7525,30 @@ void LLPipeline::renderFinalize()
 	renderDoF(&mRT->screen, &mPostMap);
 
 	applyFXAA(&mPostMap, &mRT->screen);
+	LLRenderTarget* finalBuffer = &mRT->screen;
+	if (RenderBufferVisualization > -1) {
+		finalBuffer = &mPostMap;
+		switch (RenderBufferVisualization)
+		{
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			visualizeBuffers(&mRT->deferredScreen, finalBuffer, RenderBufferVisualization);
+			break;
+		case 4:
+			visualizeBuffers(&mLuminanceMap, finalBuffer, 0);
+		default:
+			break;
+		}
+	}
 
 	// Present the screen target.
 
 	gDeferredPostNoDoFProgram.bind();
 
 	// Whatever is last in the above post processing chain should _always_ be rendered directly here.  If not, expect problems.
-	gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->screen);
+	gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, finalBuffer);
 	gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
 
 	{
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index d9decaa1c5fe311db346cc4e349238cdf7d2a053..7b4f6d44c8d3c349959c373a78d1a381ad3e5131 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -144,8 +144,7 @@ class LLPipeline
 	void renderDoF(LLRenderTarget* src, LLRenderTarget* dst);
 	void copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst);
 	void combineGlow(LLRenderTarget* src, LLRenderTarget* dst);
-	void renderPostProcess();
-	LLRenderTarget* screenTarget();
+	void visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex);
 
 	void init();
 	void cleanup();
@@ -1024,6 +1023,7 @@ class LLPipeline
 	static F32 CameraDoFResScale;
 	static F32 RenderAutoHideSurfaceAreaLimit;
 	static bool RenderScreenSpaceReflections;
+	static S32 RenderBufferVisualization;
 };
 
 void render_bbox(const LLVector3 &min, const LLVector3 &max);
diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1
index 4712a03e8d6e42cbcffb697f6ff16eddac8b033f..1c0051fd9aafdf0514ac61332cd4f9f086398837 100755
--- a/scripts/messages/message_template.msg.sha1
+++ b/scripts/messages/message_template.msg.sha1
@@ -1 +1 @@
-dddb11f7e45f1779ff536819f36a20e63d572ba8
\ No newline at end of file
+dd15c52581b3fe99e072b26872deba2560893fc4
\ No newline at end of file