# HG changeset patch # User Steve Losh # Date 1260929688 18000 # Node ID 825cda6146fa19a01515d08a5bf15f19158bb316 # Parent 21ca59d31c70b5863d18db161f1009a06fe90d76 django-hoptoad: Update documentation. diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/.DS_Store Binary file django-hoptoad/.DS_Store has changed diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/config/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/config/index.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,134 @@ + + + + + + + + + django-hoptoad » Configuration + + + + + + + + + +
+ + + + + + +

Configuration

+

There are a few extra things you can configure if you'd like to tweak the notification process a bit.

+ +

Notify Hoptoad While in DEBUG Mode

+

By default the Middleware will not report errors to Hoptoad when your project is in DEBUG mode. The idea behind this is that if you can already see the error information right in the browser you probably don't need to see it in Hoptoad too. If you want to always notify Hoptoad of errors, even while in DEBUG mode, add the following setting:

+
HOPTOAD_NOTIFY_WHILE_DEBUG = True
+
+ + +

Specify a Default Timeout

+

By default, the amount of time the notifier will wait before giving up on contacting Hoptoad is Python's "global default timeout setting". I have no idea what that is because the documentation does not see fit to explain that to me.

+

If you'd like to change that amount you can use the HOPTOAD_TIMEOUT setting. You must be running Python 2.6+ to use this.

+
HOPTOAD_TIMEOUT = 5
+
+ + +

The number is the number of seconds the notifier will wait before timing out. Yes, you can use a float like 0.5 to specify fractions of a second.

+

Track 404 Errors

+

By default Hoptoad will not be notified of 404 (page not found) errors. If you'd like to change this you'll need to add the following setting:

+
HOPTOAD_NOTIFY_404 = True
+
+ + +

IMPORTANT: If you are using Django's flatpages app and want to track 404 errors, you need to make sure the FlatpageFallbackMiddleware comes after the HoptoadNotifierMiddleware. If you don't do this Hoptoad will be notified of 404 errors even if the user actually sees a Flatpage.

+

To track 404s while using the flatpages app your MIDDLEWARE_CLASSES setting should look like this:

+
MIDDLEWARE_CLASSES = (
+    # ... other middleware classes ...
+    'hoptoad.middleware.HoptoadNotifierMiddleware',
+    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
+)
+
+ + +

A couple of things to note:

+ +

Track 403 Errors

+

By default Hoptoad will not be notified of 403 (forbidden) errors. If you'd like to change this you'll need to add the following setting:

+
HOPTOAD_NOTIFY_403 = True
+
+ + +

Note:

+ +

Ignore Specific User Agents

+

If you'd like to ignore all errors from certain User Agents you can use the following setting:

+
HOPTOAD_IGNORE_AGENTS = ['MSIE 6.0', 'Trident']
+
+ + +

If any of the strings in the list appear anywhere in the User Agent string, Hoptoad will not be notified of the error.

+

The strings are actually regular expressions, so you can be more specific if you like:

+
HOPTOAD_IGNORE_AGENTS = [r'^Mozilla.*compatible; MSIE \d+\.\d+.*$']
+
+ + +

One thing this is useful for (aside from hating on IE) is ignoring errors from web crawlers. Often bots will mangle URLs and if you're tracking 404 errors you'll see a lot of errors that you probably don't care about.

+

This would probably be a good starting point for ignoring crawlers:

+
HOPTOAD_IGNORE_AGENTS = ['Googlebot', 'Yahoo! Slurp', 'YahooSeeker']
+
+ + +

Problems?

+

If you're having trouble you might want to take a look at the Troubleshooting Guide.

+ + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/config/list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/config/list.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,65 @@ + + + + + + + + + django-hoptoad » ls /config + + + + + + + + + +
+ + + + + + +

ls /config

+ + + + + + + + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/index.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,57 @@ + + + + + + + + + django-hoptoad » django-hoptoad + + + + + + + + + +
+ + + + + + +

django-hoptoad

+

django-hoptoad is some simple Middleware for letting Django-driven websites report their errors to Hoptoad. Now ponies can ride the toad too.

+

Installation

+

Quick Start

+

Configuration

+

Troubleshooting

+

Code

+ + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/installation/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/installation/index.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,89 @@ + + + + + + + + + django-hoptoad » Installation + + + + + + + + + +
+ + + + + + +

Installation

+

django-hoptoad requires:

+ +

Grab the the django-hoptoad code by cloning the Mercurial repository (or just download the latest version and unzip it somewhere):

+
hg clone http://bitbucket.org/sjl/django-hoptoad/
+
+ + +

There's a git mirror too if you really want it.

+
git clone git://github.com/sjl/django-hoptoad.git
+
+ + +

Once you download it, you can install it in the usual manner:

+
cd django-hoptoad
+python setup.py install
+
+ + +

If you'd prefer to be able to update at any time by pulling down changes with Mercurial or git, you can symlink the module into your site-packages directory instead of using python setup.py install:

+
ln -s /full/path/to/django-hoptoad/hoptoad /full/path/to/site-packages/
+
+ + +

To make sure it works you can run:

+
python -c 'import hoptoad'
+
+ + +

Take a look at the Quick Start guide to learn how to report your Django project's errors to Hoptoad.

+ + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/installation/list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/installation/list.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,65 @@ + + + + + + + + + django-hoptoad » ls /installation + + + + + + + + + +
+ + + + + + +

ls /installation

+ + + + + + + + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/list.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,107 @@ + + + + + + + + + django-hoptoad » ls / + + + + + + + + + +
+ + + + + + +

ls /

+ + +

Directories

+ + + + + + + + + + + + + + + + + + + + + + + +
+ + config/ + +
+ + installation/ + +
+ + media/ + +
+ + quickstart/ + +
+ + troubleshooting/ + +
+ + + + + + + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/media/css/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/media/css/index.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,111 @@ + + + + + + + + + django-hoptoad » ls /media/css + + + + + + + + + +
+ + + + + + +

ls /media/css

+ + + + + + +

Files

+ + + + + + + + + + + + + + + + + + + + + + + +
3K + + layout.css + +
3K + + pygments.css + +
940B + + reset.css + +
1K + + typography.css + +
+ + + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/media/css/layout.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/media/css/layout.css Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,180 @@ +/* @override http://localhost:8008/media/css/layout.css */ +body, html { + background-color: #092E20; + margin: 0; + padding: 0; +} + +div#breadcrumbs { + border-bottom: 4px dashed #092E20; + padding: 0em 1.5em; + background-color: #fff; + width: 55em; + margin: 0em 0em 1em -1.5em; +} +div#breadcrumbs p { + margin: 0.5em auto; +} +div#content { + background-color: #fff; + height: 100%; + margin: 0 auto 3em; + overflow: hidden; + padding: 0em 1.5em 0em 1.5em; + width: 55em; +} + +h1 { + margin: 0.3em 0; + padding: 0.1em 0; +} +h2, h3, h4, h5, h6 { + margin-top: 1em; + margin-bottom: 0.4em; +} +p, ul, blockquote { + line-height: 1.8em; + margin-top: 0; + margin-bottom: 1em; +} +a { + color: #3E6B00; +} +a:hover { + color: #F14800; +} + +p#footer { + background-color: #fff; + border-top: 4px dashed #092E20; + width: 55em; + padding: 0.75em 1.5em; + text-align: center; + color: #666; + margin-top: 1.5em; + margin-left: -1.5em; + margin-bottom: 0em; +} + +ul { + padding-left: 1.5em; +} +ul li { + list-style-type: disc; + margin-left: 1.5em; + margin-top: 0.4em; +} + +div.toc ul { + padding: 0; +} +div.toc ul li { + list-style-type: none; + margin: 0; +} +div.toc > ul > li { + list-style-type: none; + margin: 0; +} +div.toc > ul ul { + margin: 0 3em; +} + +code { + background-color: #f6f6f6; + border: 1px solid #999; + padding: 2px; + white-space: nowrap; +} +pre code { + border: none; + padding: 0; + background: none; + white-space: pre-wrap; +} +a code { + background: none; + border: none; + margin: 0; + padding: 0; + text-decoration: inherit; +} +a.code { + background-color: #3f3f3f; +} + +dt { + font-weight: bold; + margin-top: 1em; +} +dd { + line-height: 1.8em; + margin-left: 1.5em; +} +blockquote p { + margin: 0; +} + +img { + background-color: #f6f6f6; + border: 1px solid #999; + padding: 1em; + display: block; + margin: 0 auto; +} + +table { + margin: 1em; +} +table thead { + background-color: #f6f6f6; +} +table thead th { + border: 1px solid #999; + padding: 0.5em 1em; +} +table tbody tr td { + border: 1px solid #999; + padding: 0.5em 1em; +} + +pre, blockquote, table.codehilitetable { + background-color: #f6f6f6; + border: 1px solid #999; + display: block; + line-height: 1.5em; + margin-left: 1.5em; + margin-right: 1.5em; + padding: 0.5em; + padding-left: 1em; +} +pre, table.codehilitetable { + margin-bottom: 1em; +} +table.codehilitetable div.linenodiv { + border-right: 1px solid #ccc; + margin-right: 1em; + padding-right: 1em; +} +table.codehilitetable pre { + background: none; + border: none; + margin: 0; + padding: 0; +} + +table#pages tr, table#subdirs tr, table#files tr { + border-top: 1px solid #999; + border-bottom: 1px solid #999; +} +table tr td.name a { + display: block; + padding: 0.5em 1em; +} +table tr td.name a:hover { + background-color: #f6f6f6; +} +table tr td.size { + padding: 0.5em 1em; + width: 40px; +} diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/media/css/list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/media/css/list.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,111 @@ + + + + + + + + + django-hoptoad » ls /media/css + + + + + + + + + +
+ + + + + + +

ls /media/css

+ + + + + + +

Files

+ + + + + + + + + + + + + + + + + + + + + + + +
3K + + layout.css + +
3K + + pygments.css + +
940B + + reset.css + +
1K + + typography.css + +
+ + + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/media/css/pygments.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/media/css/pygments.css Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,61 @@ +.hll { background-color: #ffffcc } +.c { color: #808080 } /* Comment */ +.err { color: #F00000; background-color: #F0A0A0 } /* Error */ +.k { color: #008000; font-weight: bold } /* Keyword */ +.o { color: #303030 } /* Operator */ +.cm { color: #808080 } /* Comment.Multiline */ +.cp { color: #507090 } /* Comment.Preproc */ +.c1 { color: #808080 } /* Comment.Single */ +.cs { color: #cc0000; font-weight: bold } /* Comment.Special */ +.gd { color: #A00000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.gi { color: #00A000 } /* Generic.Inserted */ +.go { color: #808080 } /* Generic.Output */ +.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.gt { color: #0040D0 } /* Generic.Traceback */ +.kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.kp { color: #003080; font-weight: bold } /* Keyword.Pseudo */ +.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.kt { color: #303090; font-weight: bold } /* Keyword.Type */ +.m { color: #6000E0; font-weight: bold } /* Literal.Number */ +.s { background-color: #fff0f0 } /* Literal.String */ +.na { color: #0000C0 } /* Name.Attribute */ +.nb { color: #007020 } /* Name.Builtin */ +.nc { color: #B00060; font-weight: bold } /* Name.Class */ +.no { color: #003060; font-weight: bold } /* Name.Constant */ +.nd { color: #505050; font-weight: bold } /* Name.Decorator */ +.ni { color: #800000; font-weight: bold } /* Name.Entity */ +.ne { color: #F00000; font-weight: bold } /* Name.Exception */ +.nf { color: #0060B0; font-weight: bold } /* Name.Function */ +.nl { color: #907000; font-weight: bold } /* Name.Label */ +.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.nt { color: #007000 } /* Name.Tag */ +.nv { color: #906030 } /* Name.Variable */ +.ow { color: #000000; font-weight: bold } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #6000E0; font-weight: bold } /* Literal.Number.Float */ +.mh { color: #005080; font-weight: bold } /* Literal.Number.Hex */ +.mi { color: #0000D0; font-weight: bold } /* Literal.Number.Integer */ +.mo { color: #4000E0; font-weight: bold } /* Literal.Number.Oct */ +.sb { background-color: #fff0f0 } /* Literal.String.Backtick */ +.sc { color: #0040D0 } /* Literal.String.Char */ +.sd { color: #D04020 } /* Literal.String.Doc */ +.s2 { background-color: #fff0f0 } /* Literal.String.Double */ +.se { color: #606060; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */ +.sh { background-color: #fff0f0 } /* Literal.String.Heredoc */ +.si { background-color: #e0e0e0 } /* Literal.String.Interpol */ +.sx { color: #D02000; background-color: #fff0f0 } /* Literal.String.Other */ +.sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */ +.s1 { background-color: #fff0f0 } /* Literal.String.Single */ +.ss { color: #A06000 } /* Literal.String.Symbol */ +.bp { color: #007020 } /* Name.Builtin.Pseudo */ +.vc { color: #306090 } /* Name.Variable.Class */ +.vg { color: #d07000; font-weight: bold } /* Name.Variable.Global */ +.vi { color: #3030B0 } /* Name.Variable.Instance */ +.il { color: #0000D0; font-weight: bold } /* Literal.Number.Integer.Long */ diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/media/css/reset.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/media/css/reset.css Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;}input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;}input,button,textarea,select{*font-size:100%;} \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/media/css/typography.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/media/css/typography.css Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,86 @@ +html { + font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif; + font-size: 10pt; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: bold; +} + +h1 { + font-size: 2em; +} + +h2 { + font-size: 1.6em; +} + +h3 { + font-size: 1.3em; +} + +h4 { + font-size: 1.1em; + font-weight: bold; +} + +em { + font-style: italic; +} + +strong { + font-weight: bold; +} + +a { + font-weight: bold; + text-decoration: none; +} + +table#files a:hover, table#subdirs a:hover, table#pages a:hover { + color: #a00000; +} + +p#footer a { + text-decoration: none; +} + +p code, ul code, ol code, dl code, blockquote code, tbody code, thead code { + font-size: 8pt; +} + +pre, code, tt, table#subdirs tr td.name, table#files tr td.name, table tr td.size { + font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", Menlo, Inconsolata, Consolas, Monaco, "Courier New", Courier; +} + +table#subdirs code, table#files code { + font-size: 10pt; +} + +table.codehilitetable div.linenodiv { + color: #777; +} + +blockquote { + color: #222; + font-style: italic; +} + +pre { + overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */ + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + /* width: 99%; */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +table thead th { + font-weight: bold; +} + +.list-crumb { + color: #777; + font-variant: italic; +} \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/media/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/media/index.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,79 @@ + + + + + + + + + django-hoptoad » ls /media + + + + + + + + + +
+ + + + + + +

ls /media

+ + +

Directories

+ + + + + + + +
+ + css/ + +
+ + + + + + + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/media/list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/media/list.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,79 @@ + + + + + + + + + django-hoptoad » ls /media + + + + + + + + + +
+ + + + + + +

ls /media

+ + +

Directories

+ + + + + + + +
+ + css/ + +
+ + + + + + + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/quickstart/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/quickstart/index.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,71 @@ + + + + + + + + + django-hoptoad » Quick Start + + + + + + + + + +
+ + + + + + +

Quick Start

+

To set up a Django project to notify Hoptoad of its errors, you need to do two things in its settings.py file.

+

First, add the HoptoadNotifierMiddleware as the last item in the MIDDLEWARE_CLASSES setting:

+
MIDDLEWARE_CLASSES = (
+    # ... other middleware classes ...
+    'hoptoad.middleware.HoptoadNotifierMiddleware',
+)
+
+ + +

Next, you'll need to add a HOPTOAD_API_KEY setting. You can get the key from the Hoptoad project page.

+
HOPTOAD_API_KEY = 'Your Hoptoad API key.'
+
+ + +

Restart the server and you're all set! django-hoptoad will begin reporting errors to Hoptoad right away.

+

There are a few options that you can configure to specify exactly what errors will be reported. Take a look at the Configuration guide to learn about them.

+ + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/quickstart/list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/quickstart/list.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,65 @@ + + + + + + + + + django-hoptoad » ls /quickstart + + + + + + + + + +
+ + + + + + +

ls /quickstart

+ + + + + + + + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/troubleshooting/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/troubleshooting/index.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,70 @@ + + + + + + + + + django-hoptoad » Troubleshooting + + + + + + + + + +
+ + + + + + +

Troubleshooting

+

If things don't go smoothly, the first thing to do is run the tests to see if they can determine what's wrong. To enable the tests you'll need to add django-hoptoad to your INSTALLED_APPS setting:

+
INSTALLED_APPS = (
+    # ... other apps ...
+    'hoptoad',
+    # ... other apps ...
+)
+
+ + +

Once you've done that you can run the unit tests:

+
python manage.py test hoptoad
+
+ + +

NOTE: The unit tests are very simple at the moment. I'm working on more, but please feel free to submit ideas (or better yet: patches).

+ + + + +
+ + \ No newline at end of file diff -r 21ca59d31c70 -r 825cda6146fa django-hoptoad/troubleshooting/list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/django-hoptoad/troubleshooting/list.html Tue Dec 15 21:14:48 2009 -0500 @@ -0,0 +1,65 @@ + + + + + + + + + django-hoptoad » ls /troubleshooting + + + + + + + + + +
+ + + + + + +

ls /troubleshooting

+ + + + + + + + + + +
+ + \ No newline at end of file