Backout f94f83c7f2df (bug 708075), 6bf51f18e69e (bug 717311) for test crashes
authorEd Morley <bmo@edmorley.co.uk>
Thu, 12 Jan 2012 13:30:39 +0000
changeset 84342 76fc8cdd2a31b8d0365fdfdac6a50f0db0906391
parent 84341 f94f83c7f2dfd510d5a68937d4263f999355b970
child 84343 9217303c2e5c983cb032315066bba0cabd0c85aa
push id21842
push usermak77@bonardo.net
push dateFri, 13 Jan 2012 08:56:37 +0000
treeherdermozilla-central@8d4638feec54 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs708075, 717311
milestone12.0a1
backs outf94f83c7f2dfd510d5a68937d4263f999355b970
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backout f94f83c7f2df (bug 708075), 6bf51f18e69e (bug 717311) for test crashes
gfx/thebes/genUnicodeScriptData.pl
gfx/thebes/gfxFont.cpp
gfx/thebes/gfxFont.h
gfx/thebes/gfxUnicodePropertyData.cpp
--- a/gfx/thebes/genUnicodeScriptData.pl
+++ b/gfx/thebes/genUnicodeScriptData.pl
@@ -327,17 +327,17 @@ sub sprintMirror
 }
 &genTables("Mirror", "PRInt8", 9, 7, \&sprintMirror, 0);
 
 sub sprintCatEAW
 {
   my $usv = shift;
   return sprintf("{%d,%d},", $eaw[$usv], $category[$usv]);
 }
-&genTables("CatEAW", "struct {\n  unsigned char mEAW:3;\n  unsigned char mCategory:5;\n}",
+&genTables("CatEAW", "struct {\n  unsigned int mEAW:3;\n  unsigned int mCategory:5;\n}",
            9, 7, \&sprintCatEAW, 1);
 
 sub sprintHangulType
 {
   my $usv = shift;
   return sprintf("%d,", $hangul[$usv]);
 }
 &genTables("Hangul", "PRUint8", 10, 6, \&sprintHangulType, 0);
--- a/gfx/thebes/gfxFont.cpp
+++ b/gfx/thebes/gfxFont.cpp
@@ -64,30 +64,28 @@
 #include "gfxScriptItemizer.h"
 #include "gfxUnicodeProperties.h"
 #include "nsMathUtils.h"
 #include "nsBidiUtils.h"
 #include "nsUnicodeRange.h"
 #include "nsCompressedCharMap.h"
 #include "nsStyleConsts.h"
 #include "mozilla/Preferences.h"
-#include "mozilla/Services.h"
 
 #include "cairo.h"
 #include "gfxFontTest.h"
 
 #include "harfbuzz/hb-blob.h"
 
 #include "nsCRT.h"
 
 #include <algorithm>
 
 using namespace mozilla;
 using namespace mozilla::gfx;
-using mozilla::services::GetObserverService;
 
 gfxFontCache *gfxFontCache::gGlobalCache = nsnull;
 
 #ifdef DEBUG_roc
 #define DEBUG_TEXT_RUN_STORAGE_METRICS
 #endif
 
 #ifdef DEBUG_TEXT_RUN_STORAGE_METRICS
@@ -951,25 +949,16 @@ gfxFontFamily::FindFont(const nsAString&
     for (PRUint32 i = 0; i < numFonts; i++) {
         gfxFontEntry *fe = mAvailableFonts[i].get();
         if (fe && fe->Name() == aPostscriptName)
             return fe;
     }
     return nsnull;
 }
 
-/*
- * gfxFontCache - global cache of gfxFont instances.
- * Expires unused fonts after a short interval;
- * notifies fonts to age their cached shaped-word records;
- * observes memory-pressure notification and tells fonts to clear their
- * shaped-word caches to free up memory.
- */
-
-NS_IMPL_ISUPPORTS1(gfxFontCache, nsIObserver)
 
 nsresult
 gfxFontCache::Init()
 {
     NS_ASSERTION(!gGlobalCache, "Where did this come from?");
     gGlobalCache = new gfxFontCache();
     return gGlobalCache ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
 }
@@ -992,43 +981,32 @@ gfxFontCache::Shutdown()
     printf("Number of simple glyph extent setups that fell back to tight=%d\n", gGlyphExtentsSetupFallBackToTight);
 #endif
 }
 
 gfxFontCache::gfxFontCache()
     : nsExpirationTracker<gfxFont,3>(FONT_TIMEOUT_SECONDS * 1000)
 {
     mFonts.Init();
-
-    nsCOMPtr<nsIObserverService> obs = GetObserverService();
-    if (obs) {
-        obs->AddObserver(this, "memory-pressure", false);
-    }
-
     mWordCacheExpirationTimer = do_CreateInstance("@mozilla.org/timer;1");
     if (mWordCacheExpirationTimer) {
         mWordCacheExpirationTimer->
             InitWithFuncCallback(WordCacheExpirationTimerCallback, this,
                                  SHAPED_WORD_TIMEOUT_SECONDS * 1000,
                                  nsITimer::TYPE_REPEATING_SLACK);
     }
 }
 
 gfxFontCache::~gfxFontCache()
 {
     if (mWordCacheExpirationTimer) {
         mWordCacheExpirationTimer->Cancel();
         mWordCacheExpirationTimer = nsnull;
     }
 
-    nsCOMPtr<nsIObserverService> obs = GetObserverService();
-    if (obs) {
-        obs->RemoveObserver(this, "memory-pressure");
-    }
-
     // Expire everything that has a zero refcount, so we don't leak them.
     AgeAllGenerations();
     // All fonts should be gone.
     NS_WARN_IF_FALSE(mFonts.Count() == 0,
                      "Fonts still alive while shutting down gfxFontCache");
     // Note that we have to delete everything through the expiration
     // tracker, since there might be fonts not in the hashtable but in
     // the tracker.
@@ -1119,33 +1097,16 @@ gfxFontCache::AgeCachedWordsForFont(Hash
 /*static*/
 void
 gfxFontCache::WordCacheExpirationTimerCallback(nsITimer* aTimer, void* aCache)
 {
     gfxFontCache* cache = static_cast<gfxFontCache*>(aCache);
     cache->mFonts.EnumerateEntries(AgeCachedWordsForFont, nsnull);
 }
 
-NS_IMETHODIMP
-gfxFontCache::Observe(nsISupports*, const char* aTopic, const PRUnichar*)
-{
-    if (!nsCRT::strcmp(aTopic, "memory-pressure")) {
-        mFonts.EnumerateEntries(ClearCachedWordsForFont, nsnull);
-    }
-    return NS_OK;
-}
-
-/*static*/
-PLDHashOperator
-gfxFontCache::ClearCachedWordsForFont(HashEntry* aHashEntry, void* aUserData)
-{
-    aHashEntry->mFont->ClearCachedWords();
-    return PL_DHASH_NEXT;
-}
-
 void
 gfxFont::RunMetrics::CombineWith(const RunMetrics& aOther, bool aOtherIsOnLeft)
 {
     mAscent = NS_MAX(mAscent, aOther.mAscent);
     mDescent = NS_MAX(mDescent, aOther.mDescent);
     if (aOtherIsOnLeft) {
         mBoundingBox =
             (mBoundingBox + gfxPoint(aOther.mAdvanceWidth, 0)).Union(aOther.mBoundingBox);
--- a/gfx/thebes/gfxFont.h
+++ b/gfx/thebes/gfxFont.h
@@ -52,17 +52,16 @@
 #include "nsHashKeys.h"
 #include "gfxSkipChars.h"
 #include "gfxRect.h"
 #include "nsExpirationTracker.h"
 #include "gfxFontConstants.h"
 #include "gfxPlatform.h"
 #include "nsIAtom.h"
 #include "nsISupportsImpl.h"
-#include "nsIObserver.h"
 
 typedef struct _cairo_scaled_font cairo_scaled_font_t;
 
 #ifdef DEBUG
 #include <stdio.h>
 #endif
 
 class gfxContext;
@@ -679,24 +678,18 @@ struct gfxTextRange {
  * by the fonts if they get aged three times without being re-used in the
  * meantime.
  *
  * Note that the ShapedWord timeout is much larger than the font timeout,
  * so that in the case of a short-lived font, we'll discard the gfxFont
  * completely, with all its words, and avoid the cost of aging the words
  * individually. That only happens with longer-lived fonts.
  */
-class THEBES_API gfxFontCache
-    : public nsExpirationTracker<gfxFont,3>
-    , public nsIObserver
-{
+class THEBES_API gfxFontCache : public nsExpirationTracker<gfxFont,3> {
 public:
-    NS_DECL_ISUPPORTS
-    NS_DECL_NSIOBSERVER
-
     enum {
         FONT_TIMEOUT_SECONDS = 10,
         SHAPED_WORD_TIMEOUT_SECONDS = 60
     };
 
     gfxFontCache();
     ~gfxFontCache();
 
@@ -769,18 +762,16 @@ protected:
         }
         enum { ALLOW_MEMMOVE = true };
 
         gfxFont* mFont;
     };
 
     nsTHashtable<HashEntry> mFonts;
 
-    static PLDHashOperator ClearCachedWordsForFont(HashEntry* aHashEntry, void*);
-
     static PLDHashOperator AgeCachedWordsForFont(HashEntry* aHashEntry, void*);
     static void WordCacheExpirationTimerCallback(nsITimer* aTimer, void* aCache);
     nsCOMPtr<nsITimer>      mWordCacheExpirationTimer;
 };
 
 class THEBES_API gfxTextRunFactory {
     NS_INLINE_DECL_REFCOUNTING(gfxTextRunFactory)
 
@@ -1409,23 +1400,16 @@ public:
     // Called by the gfxFontCache timer to increment the age of all the words,
     // so that they'll expire after a sufficient period of non-use
     void AgeCachedWords() {
         if (mWordCache.IsInitialized()) {
             (void)mWordCache.EnumerateEntries(AgeCacheEntry, this);
         }
     }
 
-    // Discard all cached word records; called on memory-pressure notification.
-    void ClearCachedWords() {
-        if (mWordCache.IsInitialized()) {
-            mWordCache.Clear();
-        }
-    }
-
 protected:
     // Call the appropriate shaper to generate glyphs for aText and store
     // them into aShapedWord.
     // The length of the text is aShapedWord->Length().
     virtual bool ShapeWord(gfxContext *aContext,
                            gfxShapedWord *aShapedWord,
                            const PRUnichar *aText,
                            bool aPreferPlatformShaping = false);
--- a/gfx/thebes/gfxUnicodePropertyData.cpp
+++ b/gfx/thebes/gfxUnicodePropertyData.cpp
@@ -35,17 +35,17 @@
  *
  * Derived from the Unicode Character Database by genUnicodeScriptData.pl
  *
  * For Unicode terms of use, see http://www.unicode.org/terms_of_use.html
  *
  * ***** END LICENSE BLOCK ***** */
 
 /*
- * Created on Wed Jan 11 23:35:54 2012.
+ * Created on Mon Nov 29 21:49:02 2010.
  *
  * * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * *
  */
 
 #define kScriptIndexBits 10
 #define kScriptCharBits  6
 static const PRUint8 sScriptPlanes[16] = {1,2,3,3,3,3,3,3,3,3,3,3,3,4,3,3};
 
@@ -462,18 +462,18 @@ static const PRUint8 sCatEAWPages[7][512
   {96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,175,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,176,96,177,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,96,96,96,96,177,178,178,178,178,178,178,178,178,178,178,179},
   {178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,179},
   {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
   {180,17,181,182,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
   {115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,183}
 };
 
 static const struct {
-  unsigned char mEAW:3;
-  unsigned char mCategory:5;
+  unsigned int mEAW:3;
+  unsigned int mCategory:5;
 } sCatEAWValues[184][128] = {
   {{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{4,29},{4,21},{4,21},{4,21},{4,23},{4,21},{4,21},{4,21},{4,22},{4,18},{4,21},{4,25},{4,21},{4,17},{4,21},{4,21},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,21},{4,21},{4,25},{4,25},{4,25},{4,21},{4,21},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,22},{4,21},{4,18},{4,24},{4,16},{4,24},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,22},{4,25},{4,18},{4,25},{3,0}},
   {{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,29},{0,21},{4,23},{4,23},{0,23},{4,23},{4,26},{0,26},{0,24},{3,26},{0,5},{3,20},{4,25},{0,1},{0,26},{4,24},{0,26},{0,25},{0,15},{0,15},{0,24},{3,5},{0,26},{0,21},{0,24},{0,15},{0,5},{3,19},{0,15},{0,15},{0,15},{0,21},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,25},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{0,5},{0,5},{0,5},{3,5},{3,5},{3,5},{3,5},{0,5},{3,5},{0,5},{0,5},{0,5},{3,5},{0,5},{0,5},{3,5},{3,5},{0,5},{3,5},{0,5},{0,5},{3,5},{3,5},{3,5},{0,25},{0,5},{0,5},{0,5},{3,5},{0,5},{3,5},{0,5},{3,5}},
   {{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{0,9},{0,5},{3,9},{3,5},{3,9},{3,5},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{0,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{0,5},{0,5},{0,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5}},
   {{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,5},{3,7},{3,9},{3,5},{3,5},{3,5},{3,7},{3,7},{3,7},{3,7},{3,9},{3,8},{3,5},{3,9},{3,8},{3,5},{3,9},{3,8},{3,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,8},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}},
   {{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}},
   {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,7},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,24},{3,24},{0,24},{3,24},{3,6},{0,6},{3,6},{0,6},{0,6},{0,6},{3,6},{0,6},{3,6},{3,6},{0,6},{3,6},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{0,24},{0,24},{0,24},{0,24},{3,24},{0,24},{3,24},{0,24},{3,6},{3,6},{3,6},{3,6},{3,6},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,6},{3,24},{3,6},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24}},
   {{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{3,9},{3,5},{3,9},{3,5},{3,6},{3,24},{3,9},{3,5},{0,2},{0,2},{3,6},{3,5},{3,5},{3,5},{3,21},{0,2}},