anki-2.0.20+dfsg/0000755000175000017500000000000012252567261013260 5ustar andreasandreasanki-2.0.20+dfsg/oldanki/0000755000175000017500000000000012256137063014676 5ustar andreasandreasanki-2.0.20+dfsg/oldanki/fonts.py0000644000175000017500000000274012072547733016411 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Fonts - mapping to/from platform-specific fonts ============================================================== """ import sys # set this to 'all', to get all fonts in a list policy="platform" mapping = [ [u"Mincho", u"MS Mincho", "win32"], [u"Mincho", u"MS 明朝", "win32"], [u"Mincho", u"ヒラギノ明朝 Pro W3", "mac"], [u"Mincho", u"Kochi Mincho", "linux"], [u"Mincho", u"東風明朝", "linux"], ] def platform(): if sys.platform == "win32": return "win32" elif sys.platform.startswith("darwin"): return "mac" else: return "linux" def toCanonicalFont(family): "Turn a platform-specific family into a canonical one." for (s, p, type) in mapping: if family == p: return s return family def toPlatformFont(family): "Turn a canonical font into a platform-specific one." if policy == "all": return allFonts(family) ltype = platform() for (s, p, type) in mapping: if family == s and type == ltype: return p return family def substitutions(): "Return a tuple mapping canonical fonts to platform ones." type = platform() return [(s, p) for (s, p, t) in mapping if t == type] def allFonts(family): ret = ", ".join([p for (s, p, t) in mapping if s == family]) return ret or family anki-2.0.20+dfsg/oldanki/models.py0000644000175000017500000002004612072547733016542 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Model - define the way in which facts are added and shown ========================================================== - Field models - Card models - Models """ import time, re from sqlalchemy.ext.orderinglist import ordering_list from oldanki.db import * from oldanki.utils import genID, canonifyTags from oldanki.fonts import toPlatformFont from oldanki.utils import parseTags, hexifyID, checksum, stripHTML from oldanki.lang import _ from oldanki.hooks import runFilter from oldanki.template import render from copy import copy def alignmentLabels(): return { 0: _("Center"), 1: _("Left"), 2: _("Right"), } # Field models ########################################################################## fieldModelsTable = Table( 'fieldModels', metadata, Column('id', Integer, primary_key=True), Column('ordinal', Integer, nullable=False), Column('modelId', Integer, ForeignKey('models.id'), nullable=False), Column('name', UnicodeText, nullable=False), Column('description', UnicodeText, nullable=False, default=u""), # obsolete # reused as RTL marker Column('features', UnicodeText, nullable=False, default=u""), Column('required', Boolean, nullable=False, default=True), Column('unique', Boolean, nullable=False, default=True), # sqlite keyword Column('numeric', Boolean, nullable=False, default=False), # display Column('quizFontFamily', UnicodeText, default=u"Arial"), Column('quizFontSize', Integer, default=20), Column('quizFontColour', String(7)), Column('editFontFamily', UnicodeText, default=u"1"), # reused as
 toggle
    Column('editFontSize', Integer, default=20))

class FieldModel(object):
    "The definition of one field in a fact."

    def __init__(self, name=u"", required=True, unique=True):
        self.name = name
        self.required = required
        self.unique = unique
        self.id = genID()

    def copy(self):
        new = FieldModel()
        for p in class_mapper(FieldModel).iterate_properties:
            setattr(new, p.key, getattr(self, p.key))
        new.id = genID()
        new.model = None
        return new

mapper(FieldModel, fieldModelsTable)

# Card models
##########################################################################

cardModelsTable = Table(
    'cardModels', metadata,
    Column('id', Integer, primary_key=True),
    Column('ordinal', Integer, nullable=False),
    Column('modelId', Integer, ForeignKey('models.id'), nullable=False),
    Column('name', UnicodeText, nullable=False),
    Column('description', UnicodeText, nullable=False, default=u""), # obsolete
    Column('active', Boolean, nullable=False, default=True),
    # formats: question/answer/last(not used)
    Column('qformat', UnicodeText, nullable=False),
    Column('aformat', UnicodeText, nullable=False),
    Column('lformat', UnicodeText),
    # question/answer editor format (not used yet)
    Column('qedformat', UnicodeText),
    Column('aedformat', UnicodeText),
    Column('questionInAnswer', Boolean, nullable=False, default=False),
    # unused
    Column('questionFontFamily', UnicodeText, default=u"Arial"),
    Column('questionFontSize', Integer, default=20),
    Column('questionFontColour', String(7), default=u"#000000"),
    # used for both question & answer
    Column('questionAlign', Integer, default=0),
    # ununsed
    Column('answerFontFamily', UnicodeText, default=u"Arial"),
    Column('answerFontSize', Integer, default=20),
    Column('answerFontColour', String(7), default=u"#000000"),
    Column('answerAlign', Integer, default=0),
    Column('lastFontFamily', UnicodeText, default=u"Arial"),
    Column('lastFontSize', Integer, default=20),
    # used as background colour
    Column('lastFontColour', String(7), default=u"#FFFFFF"),
    Column('editQuestionFontFamily', UnicodeText, default=None),
    Column('editQuestionFontSize', Integer, default=None),
    Column('editAnswerFontFamily', UnicodeText, default=None),
    Column('editAnswerFontSize', Integer, default=None),
    # empty answer
    Column('allowEmptyAnswer', Boolean, nullable=False, default=True),
    Column('typeAnswer', UnicodeText, nullable=False, default=u""))

class CardModel(object):
    """Represents how to generate the front and back of a card."""
    def __init__(self, name=u"", qformat=u"q", aformat=u"a", active=True):
        self.name = name
        self.qformat = qformat
        self.aformat = aformat
        self.active = active
        self.id = genID()

    def copy(self):
        new = CardModel()
        for p in class_mapper(CardModel).iterate_properties:
            setattr(new, p.key, getattr(self, p.key))
        new.id = genID()
        new.model = None
        return new

mapper(CardModel, cardModelsTable)

def formatQA(cid, mid, fact, tags, cm, deck):
    "Return a dict of {id, question, answer}"
    d = {'id': cid}
    fields = {}
    for (k, v) in fact.items():
        fields["text:"+k] = stripHTML(v[1])
        if v[1]:
            fields[k] = '%s' % (
                hexifyID(v[0]), v[1])
        else:
            fields[k] = u""
    fields['tags'] = tags[0]
    fields['Tags'] = tags[0]
    fields['modelTags'] = tags[1]
    fields['cardModel'] = tags[2]
    # render q & a
    ret = []
    for (type, format) in (("question", cm.qformat),
                           ("answer", cm.aformat)):
        # convert old style
        format = re.sub("%\((.+?)\)s", "{{\\1}}", format)
        # allow custom rendering functions & info
        fields = runFilter("prepareFields", fields, cid, mid, fact, tags, cm, deck)
        html = render(format, fields)
        d[type] = runFilter("formatQA", html, type, cid, mid, fact, tags, cm, deck)
    return d

# Model table
##########################################################################

modelsTable = Table(
    'models', metadata,
    Column('id', Integer, primary_key=True),
    Column('deckId', Integer, ForeignKey("decks.id", use_alter=True, name="deckIdfk")),
    Column('created', Float, nullable=False, default=time.time),
    Column('modified', Float, nullable=False, default=time.time),
    Column('tags', UnicodeText, nullable=False, default=u""),
    Column('name', UnicodeText, nullable=False),
    Column('description', UnicodeText, nullable=False, default=u""), # obsolete
    Column('features', UnicodeText, nullable=False, default=u""), # used as mediaURL
    Column('spacing', Float, nullable=False, default=0.1), # obsolete
    Column('initialSpacing', Float, nullable=False, default=60), # obsolete
    Column('source', Integer, nullable=False, default=0))

class Model(object):
    "Defines the way a fact behaves, what fields it can contain, etc."
    def __init__(self, name=u""):
        self.name = name
        self.id = genID()

    def setModified(self):
        self.modified = time.time()

    def addFieldModel(self, field):
        "Add a field model."
        self.fieldModels.append(field)
        s = object_session(self)
        if s:
            s.flush()

    def addCardModel(self, card):
        "Add a card model."
        self.cardModels.append(card)
        s = object_session(self)
        if s:
            s.flush()

mapper(Model, modelsTable, properties={
    'fieldModels': relation(FieldModel, backref='model',
                             collection_class=ordering_list('ordinal'),
                             order_by=[fieldModelsTable.c.ordinal],
                            cascade="all, delete-orphan"),
    'cardModels': relation(CardModel, backref='model',
                           collection_class=ordering_list('ordinal'),
                           order_by=[cardModelsTable.c.ordinal],
                           cascade="all, delete-orphan"),
       })

# Model deletions
##########################################################################

modelsDeletedTable = Table(
    'modelsDeleted', metadata,
    Column('modelId', Integer, ForeignKey("models.id"),
           nullable=False),
    Column('deletedTime', Float, nullable=False))
anki-2.0.20+dfsg/oldanki/cards.py0000644000175000017500000002452412225675305016355 0ustar  andreasandreas# -*- coding: utf-8 -*-
# Copyright: Damien Elmes 
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html

"""\
Cards
====================
"""
__docformat__ = 'restructuredtext'

import time, sys, math, random
from oldanki.db import *
from oldanki.models import CardModel, Model, FieldModel, formatQA
from oldanki.facts import Fact, factsTable, Field
from oldanki.utils import parseTags, findTag, stripHTML, genID, hexifyID
from oldanki.media import updateMediaCount, mediaFiles

MAX_TIMER = 60

# Cards
##########################################################################

cardsTable = Table(
    'cards', metadata,
    Column('id', Integer, primary_key=True),
    Column('factId', Integer, ForeignKey("facts.id"), nullable=False),
    Column('cardModelId', Integer, ForeignKey("cardModels.id"), nullable=False),
    Column('created', Float, nullable=False, default=time.time),
    Column('modified', Float, nullable=False, default=time.time),
    Column('tags', UnicodeText, nullable=False, default=u""),
    Column('ordinal', Integer, nullable=False),
    # cached - changed on fact update
    Column('question', UnicodeText, nullable=False, default=u""),
    Column('answer', UnicodeText, nullable=False, default=u""),
    # default to 'normal' priority;
    # this is indexed in deck.py as we need to create a reverse index
    Column('priority', Integer, nullable=False, default=2),
    Column('interval', Float, nullable=False, default=0),
    Column('lastInterval', Float, nullable=False, default=0),
    Column('due', Float, nullable=False, default=time.time),
    Column('lastDue', Float, nullable=False, default=0),
    Column('factor', Float, nullable=False, default=2.5),
    Column('lastFactor', Float, nullable=False, default=2.5),
    Column('firstAnswered', Float, nullable=False, default=0),
    # stats
    Column('reps', Integer, nullable=False, default=0),
    Column('successive', Integer, nullable=False, default=0),
    Column('averageTime', Float, nullable=False, default=0),
    Column('reviewTime', Float, nullable=False, default=0),
    Column('youngEase0', Integer, nullable=False, default=0),
    Column('youngEase1', Integer, nullable=False, default=0),
    Column('youngEase2', Integer, nullable=False, default=0),
    Column('youngEase3', Integer, nullable=False, default=0),
    Column('youngEase4', Integer, nullable=False, default=0),
    Column('matureEase0', Integer, nullable=False, default=0),
    Column('matureEase1', Integer, nullable=False, default=0),
    Column('matureEase2', Integer, nullable=False, default=0),
    Column('matureEase3', Integer, nullable=False, default=0),
    Column('matureEase4', Integer, nullable=False, default=0),
    # this duplicates the above data, because there's no way to map imported
    # data to the above
    Column('yesCount', Integer, nullable=False, default=0),
    Column('noCount', Integer, nullable=False, default=0),
    # obsolete
    Column('spaceUntil', Float, nullable=False, default=0),
    # relativeDelay is reused as type without scheduling (ie, it remains 0-2
    # even if card is suspended, etc)
    Column('relativeDelay', Float, nullable=False, default=0),
    Column('isDue', Boolean, nullable=False, default=0), # obsolete
    Column('type', Integer, nullable=False, default=2),
    Column('combinedDue', Integer, nullable=False, default=0))

class Card(object):
    "A card."

    def __init__(self, fact=None, cardModel=None, created=None):
        self.tags = u""
        self.id = genID()
        # new cards start as new & due
        self.type = 2
        self.relativeDelay = self.type
        self.timerStarted = False
        self.timerStopped = False
        self.modified = time.time()
        if created:
            self.created = created
            self.due = created
        else:
            self.due = self.modified
        self.combinedDue = self.due
        if fact:
            self.fact = fact
        if cardModel:
            self.cardModel = cardModel
            # for non-orm use
            self.cardModelId = cardModel.id
            self.ordinal = cardModel.ordinal

    def rebuildQA(self, deck, media=True):
        # format qa
        d = {}
        for f in self.fact.model.fieldModels:
            d[f.name] = (f.id, self.fact[f.name])
        qa = formatQA(None, self.fact.modelId, d, self.splitTags(),
                      self.cardModel, deck)
        # find old media references
        files = {}
        for type in ("question", "answer"):
            for f in mediaFiles(getattr(self, type) or ""):
                if f in files:
                    files[f] -= 1
                else:
                    files[f] = -1
        # update q/a
        self.question = qa['question']
        self.answer = qa['answer']
        # determine media delta
        for type in ("question", "answer"):
            for f in mediaFiles(getattr(self, type)):
                if f in files:
                    files[f] += 1
                else:
                    files[f] = 1
        # update media counts if we're attached to deck
        # if media:
        #     for (f, cnt) in files.items():
        #         updateMediaCount(deck, f, cnt)
        self.setModified()

    def setModified(self):
        self.modified = time.time()

    def startTimer(self):
        self.timerStarted = time.time()

    def stopTimer(self):
        self.timerStopped = time.time()

    def thinkingTime(self):
        return (self.timerStopped or time.time()) - self.timerStarted

    def totalTime(self):
        return time.time() - self.timerStarted

    def genFuzz(self):
        "Generate a random offset to spread intervals."
        self.fuzz = random.uniform(0.95, 1.05)

    def htmlQuestion(self, type="question", align=True):
        div = '''
%s
''' % ( type[0], type[0], hexifyID(self.cardModelId), getattr(self, type)) # add outer div & alignment (with tables due to qt's html handling) if not align: return div attr = type + 'Align' if getattr(self.cardModel, attr) == 0: align = "center" elif getattr(self.cardModel, attr) == 1: align = "left" else: align = "right" return (("
" % align) + div + "
") def htmlAnswer(self, align=True): return self.htmlQuestion(type="answer", align=align) def updateStats(self, ease, state): self.reps += 1 if ease > 1: self.successive += 1 else: self.successive = 0 delay = min(self.totalTime(), MAX_TIMER) self.reviewTime += delay if self.averageTime: self.averageTime = (self.averageTime + delay) / 2.0 else: self.averageTime = delay # we don't track first answer for cards if state == "new": state = "young" # update ease and yes/no count attr = state + "Ease%d" % ease setattr(self, attr, getattr(self, attr) + 1) if ease < 2: self.noCount += 1 else: self.yesCount += 1 if not self.firstAnswered: self.firstAnswered = time.time() self.setModified() def splitTags(self): return (self.fact.tags, self.fact.model.tags, self.cardModel.name) def allTags(self): "Non-canonified string of all tags." return (self.fact.tags + "," + self.fact.model.tags) def hasTag(self, tag): return findTag(tag, parseTags(self.allTags())) def fromDB(self, s, id): r = s.first("""select id, factId, cardModelId, created, modified, tags, ordinal, question, answer, priority, interval, lastInterval, due, lastDue, factor, lastFactor, firstAnswered, reps, successive, averageTime, reviewTime, youngEase0, youngEase1, youngEase2, youngEase3, youngEase4, matureEase0, matureEase1, matureEase2, matureEase3, matureEase4, yesCount, noCount, spaceUntil, isDue, type, combinedDue from cards where id = :id""", id=id) if not r: return (self.id, self.factId, self.cardModelId, self.created, self.modified, self.tags, self.ordinal, self.question, self.answer, self.priority, self.interval, self.lastInterval, self.due, self.lastDue, self.factor, self.lastFactor, self.firstAnswered, self.reps, self.successive, self.averageTime, self.reviewTime, self.youngEase0, self.youngEase1, self.youngEase2, self.youngEase3, self.youngEase4, self.matureEase0, self.matureEase1, self.matureEase2, self.matureEase3, self.matureEase4, self.yesCount, self.noCount, self.spaceUntil, self.isDue, self.type, self.combinedDue) = r return True def toDB(self, s): "Write card to DB." s.execute("""update cards set modified=:modified, tags=:tags, interval=:interval, lastInterval=:lastInterval, due=:due, lastDue=:lastDue, factor=:factor, lastFactor=:lastFactor, firstAnswered=:firstAnswered, reps=:reps, successive=:successive, averageTime=:averageTime, reviewTime=:reviewTime, youngEase0=:youngEase0, youngEase1=:youngEase1, youngEase2=:youngEase2, youngEase3=:youngEase3, youngEase4=:youngEase4, matureEase0=:matureEase0, matureEase1=:matureEase1, matureEase2=:matureEase2, matureEase3=:matureEase3, matureEase4=:matureEase4, yesCount=:yesCount, noCount=:noCount, spaceUntil = :spaceUntil, isDue = 0, type = :type, combinedDue = :combinedDue, relativeDelay = :relativeDelay, priority = :priority where id=:id""", self.__dict__) mapper(Card, cardsTable, properties={ 'cardModel': relation(CardModel), 'fact': relation(Fact, backref="cards", primaryjoin= cardsTable.c.factId == factsTable.c.id), }) mapper(Fact, factsTable, properties={ 'model': relation(Model), 'fields': relation(Field, backref="fact", order_by=Field.ordinal), }) # Card deletions ########################################################################## cardsDeletedTable = Table( 'cardsDeleted', metadata, Column('cardId', Integer, ForeignKey("cards.id"), nullable=False), Column('deletedTime', Float, nullable=False)) anki-2.0.20+dfsg/oldanki/stdmodels.py0000644000175000017500000000261612072547733017260 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Standard Models. ============================================================== Plugins can add to the 'models' dict to provide more standard models. """ from oldanki.models import Model, CardModel, FieldModel from oldanki.lang import _ models = {} def byName(name): fn = models.get(name) if fn: return fn() raise ValueError("No such model available!") def names(): return models.keys() # Basic ########################################################################## def BasicModel(): m = Model(_('Basic')) m.addFieldModel(FieldModel(u'Front', True, True)) m.addFieldModel(FieldModel(u'Back', False, False)) m.addCardModel(CardModel(u'Forward', u'%(Front)s', u'%(Back)s')) m.addCardModel(CardModel(u'Reverse', u'%(Back)s', u'%(Front)s', active=False)) m.tags = u"Basic" return m models['Basic'] = BasicModel # Recovery ########################################################################## def RecoveryModel(): m = Model(_('Recovery')) m.addFieldModel(FieldModel(u'Question', False, False)) m.addFieldModel(FieldModel(u'Answer', False, False)) m.addCardModel(CardModel(u'Single', u'{{{Question}}}', u'{{{Answer}}}')) m.tags = u"Recovery" return m anki-2.0.20+dfsg/oldanki/sync.py0000644000175000017500000012713312072661751016235 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Synchronisation ============================== Support for keeping two decks synchronized. Both local syncing and syncing over HTTP are supported. Server implements the following calls: getDecks(): return a list of deck names & modtimes summary(lastSync): a list of all objects changed after lastSync applyPayload(payload): apply any sent changes and return any changed remote objects finish(): save deck on server after payload applied and response received createDeck(name): create a deck on the server Full sync support is not documented yet. """ __docformat__ = 'restructuredtext' import zlib, re, urllib, urllib2, socket, time, shutil from anki.utils import json as simplejson import os, base64, httplib, sys, tempfile, httplib, types from datetime import date import oldanki, oldanki.deck, oldanki.cards from oldanki.db import sqlite from oldanki.errors import * from oldanki.models import Model, FieldModel, CardModel from oldanki.facts import Fact, Field from oldanki.cards import Card from oldanki.stats import Stats, globalStats from oldanki.history import CardHistoryEntry from oldanki.stats import globalStats from oldanki.utils import ids2str, hexifyID, checksum from oldanki.media import mediaFiles from oldanki.lang import _ from hooks import runHook if simplejson.__version__ < "1.7.3": raise Exception("SimpleJSON must be 1.7.3 or later.") CHUNK_SIZE = 32768 MIME_BOUNDARY = "Anki-sync-boundary" # live SYNC_URL = "http://ankiweb.net/sync/" SYNC_HOST = "ankiweb.net"; SYNC_PORT = 80 # testing #SYNC_URL = "http://localhost:8001/sync/" #SYNC_HOST = "localhost"; SYNC_PORT = 8001 KEYS = ("models", "facts", "cards", "media") ########################################################################## # Monkey-patch httplib to incrementally send instead of chewing up large # amounts of memory, and track progress. sendProgressHook = None def incrementalSend(self, strOrFile): if self.sock is None: if self.auto_open: self.connect() else: raise NotConnected() if self.debuglevel > 0: print "send:", repr(str) try: if (isinstance(strOrFile, str) or isinstance(strOrFile, unicode)): self.sock.sendall(strOrFile) else: cnt = 0 t = time.time() while 1: if sendProgressHook and time.time() - t > 1: sendProgressHook(cnt) t = time.time() data = strOrFile.read(CHUNK_SIZE) cnt += len(data) if not data: break self.sock.sendall(data) except socket.error, v: if v[0] == 32: # Broken pipe self.close() raise httplib.HTTPConnection.send = incrementalSend def fullSyncProgressHook(cnt): runHook("fullSyncProgress", "fromLocal", cnt) ########################################################################## class SyncTools(object): def __init__(self, deck=None): self.deck = deck self.diffs = {} self.serverExcludedTags = [] self.timediff = 0 # Control ########################################################################## def setServer(self, server): self.server = server def sync(self): "Sync two decks locally. Reimplement this for finer control." if not self.prepareSync(0): return sums = self.summaries() payload = self.genPayload(sums) res = self.server.applyPayload(payload) self.applyPayloadReply(res) self.deck.reset() def prepareSync(self, timediff): "Sync setup. True if sync needed." self.localTime = self.modified() self.remoteTime = self.server.modified() if self.localTime == self.remoteTime: return False l = self._lastSync(); r = self.server._lastSync() # set lastSync to the lower of the two sides, and account for slow # clocks & assume it took up to 10 seconds for the reply to arrive self.deck.lastSync = min(l, r) - timediff - 10 return True def summaries(self): return (self.summary(self.deck.lastSync), self.server.summary(self.deck.lastSync)) def genPayload(self, summaries): (lsum, rsum) = summaries self.preSyncRefresh() payload = {} # first, handle models, facts and cards for key in KEYS: diff = self.diffSummary(lsum, rsum, key) payload["added-" + key] = self.getObjsFromKey(diff[0], key) payload["deleted-" + key] = diff[1] payload["missing-" + key] = diff[2] self.deleteObjsFromKey(diff[3], key) # handle the remainder if self.localTime > self.remoteTime: payload['stats'] = self.bundleStats() payload['history'] = self.bundleHistory() payload['sources'] = self.bundleSources() # finally, set new lastSync and bundle the deck info payload['deck'] = self.bundleDeck() return payload def applyPayload(self, payload): reply = {} self.preSyncRefresh() # model, facts and cards for key in KEYS: k = 'added-' + key # send back any requested if k in payload: reply[k] = self.getObjsFromKey( payload['missing-' + key], key) self.updateObjsFromKey(payload['added-' + key], key) self.deleteObjsFromKey(payload['deleted-' + key], key) # send back deck-related stuff if it wasn't sent to us if not 'deck' in payload: reply['stats'] = self.bundleStats() reply['history'] = self.bundleHistory() reply['sources'] = self.bundleSources() # finally, set new lastSync and bundle the deck info reply['deck'] = self.bundleDeck() else: self.updateDeck(payload['deck']) self.updateStats(payload['stats']) self.updateHistory(payload['history']) if 'sources' in payload: self.updateSources(payload['sources']) self.postSyncRefresh() cardIds = [x[0] for x in payload['added-cards']] self.deck.updateCardTags(cardIds) # rebuild priorities on server self.rebuildPriorities(cardIds, self.serverExcludedTags) return reply def applyPayloadReply(self, reply): # model, facts and cards for key in KEYS: k = 'added-' + key # old version may not send media if k in reply: self.updateObjsFromKey(reply['added-' + key], key) # deck if 'deck' in reply: self.updateDeck(reply['deck']) self.updateStats(reply['stats']) self.updateHistory(reply['history']) if 'sources' in reply: self.updateSources(reply['sources']) self.postSyncRefresh() # rebuild priorities on client cardIds = [x[0] for x in reply['added-cards']] self.deck.updateCardTags(cardIds) self.rebuildPriorities(cardIds) if self.missingFacts() != 0: raise Exception( "Facts missing after sync. Please run Tools>Advanced>Check DB.") def missingFacts(self): return self.deck.s.scalar( "select count() from cards where factId "+ "not in (select id from facts)"); def rebuildPriorities(self, cardIds, suspend=[]): self.deck.updateAllPriorities(partial=True, dirty=False) self.deck.updatePriorities(cardIds, suspend=suspend, dirty=False) def postSyncRefresh(self): "Flush changes to DB, and reload object associations." self.deck.s.flush() self.deck.s.refresh(self.deck) self.deck.currentModel def preSyncRefresh(self): # ensure global stats are available (queue may not be built) self.deck._globalStats = globalStats(self.deck) def payloadChanges(self, payload): h = { 'lf': len(payload['added-facts']['facts']), 'rf': len(payload['missing-facts']), 'lc': len(payload['added-cards']), 'rc': len(payload['missing-cards']), 'lm': len(payload['added-models']), 'rm': len(payload['missing-models']), } if self.localTime > self.remoteTime: h['ls'] = _('all') h['rs'] = 0 else: h['ls'] = 0 h['rs'] = _('all') return h def payloadChangeReport(self, payload): p = self.payloadChanges(payload) return _("""\
Added/Changed    Here   Server
Cards%(lc)d%(rc)d
Facts%(lf)d%(rf)d
Models%(lm)d%(rm)d
Stats%(ls)s%(rs)s
""") % p # Summaries ########################################################################## def summary(self, lastSync): "Generate a full summary of modtimes for two-way syncing." # client may have selected an earlier sync time self.deck.lastSync = lastSync # ensure we're flushed first self.deck.s.flush() return { # cards "cards": self.realLists(self.deck.s.all( "select id, modified from cards where modified > :mod", mod=lastSync)), "delcards": self.realLists(self.deck.s.all( "select cardId, deletedTime from cardsDeleted " "where deletedTime > :mod", mod=lastSync)), # facts "facts": self.realLists(self.deck.s.all( "select id, modified from facts where modified > :mod", mod=lastSync)), "delfacts": self.realLists(self.deck.s.all( "select factId, deletedTime from factsDeleted " "where deletedTime > :mod", mod=lastSync)), # models "models": self.realLists(self.deck.s.all( "select id, modified from models where modified > :mod", mod=lastSync)), "delmodels": self.realLists(self.deck.s.all( "select modelId, deletedTime from modelsDeleted " "where deletedTime > :mod", mod=lastSync)), # media "media": self.realLists(self.deck.s.all( "select id, created from media where created > :mod", mod=lastSync)), "delmedia": self.realLists(self.deck.s.all( "select mediaId, deletedTime from mediaDeleted " "where deletedTime > :mod", mod=lastSync)), } # Diffing ########################################################################## def diffSummary(self, localSummary, remoteSummary, key): # list of ids on both ends lexists = localSummary[key] ldeleted = localSummary["del"+key] rexists = remoteSummary[key] rdeleted = remoteSummary["del"+key] ldeletedIds = dict(ldeleted) rdeletedIds = dict(rdeleted) # to store the results locallyEdited = [] locallyDeleted = [] remotelyEdited = [] remotelyDeleted = [] # build a hash of all ids, with value (localMod, remoteMod). # deleted/nonexisting cards are marked with a modtime of None. ids = {} for (id, mod) in rexists: ids[id] = [None, mod] for (id, mod) in rdeleted: ids[id] = [None, None] for (id, mod) in lexists: if id in ids: ids[id][0] = mod else: ids[id] = [mod, None] for (id, mod) in ldeleted: if id in ids: ids[id][0] = None else: ids[id] = [None, None] # loop through the hash, determining differences for (id, (localMod, remoteMod)) in ids.items(): if localMod and remoteMod: # changed/existing on both sides if localMod < remoteMod: remotelyEdited.append(id) elif localMod > remoteMod: locallyEdited.append(id) elif localMod and not remoteMod: # if it's missing on server or newer here, sync if (id not in rdeletedIds or rdeletedIds[id] < localMod): locallyEdited.append(id) else: remotelyDeleted.append(id) elif remoteMod and not localMod: # if it's missing locally or newer there, sync if (id not in ldeletedIds or ldeletedIds[id] < remoteMod): remotelyEdited.append(id) else: locallyDeleted.append(id) else: if id in ldeletedIds and id not in rdeletedIds: locallyDeleted.append(id) elif id in rdeletedIds and id not in ldeletedIds: remotelyDeleted.append(id) return (locallyEdited, locallyDeleted, remotelyEdited, remotelyDeleted) # Models ########################################################################## def getModels(self, ids, updateModified=False): return [self.bundleModel(id, updateModified) for id in ids] def bundleModel(self, id, updateModified): "Return a model representation suitable for transport." mod = self.deck.s.query(Model).get(id) # force load of lazy attributes mod.fieldModels; mod.cardModels m = self.dictFromObj(mod) m['fieldModels'] = [self.bundleFieldModel(fm) for fm in m['fieldModels']] m['cardModels'] = [self.bundleCardModel(fm) for fm in m['cardModels']] if updateModified: m['modified'] = time.time() return m def bundleFieldModel(self, fm): d = self.dictFromObj(fm) if 'model' in d: del d['model'] return d def bundleCardModel(self, cm): d = self.dictFromObj(cm) if 'model' in d: del d['model'] return d def updateModels(self, models): for model in models: local = self.getModel(model['id']) # avoid overwriting any existing card/field models fms = model['fieldModels']; del model['fieldModels'] cms = model['cardModels']; del model['cardModels'] self.applyDict(local, model) self.mergeFieldModels(local, fms) self.mergeCardModels(local, cms) self.deck.s.statement( "delete from modelsDeleted where modelId in %s" % ids2str([m['id'] for m in models])) def getModel(self, id, create=True): "Return a local model with same ID, or create." id = int(id) for l in self.deck.models: if l.id == id: return l if not create: return m = Model() self.deck.models.append(m) return m def mergeFieldModels(self, model, fms): ids = [] for fm in fms: local = self.getFieldModel(model, fm) self.applyDict(local, fm) ids.append(fm['id']) for fm in model.fieldModels: if fm.id not in ids: self.deck.deleteFieldModel(model, fm) def getFieldModel(self, model, remote): id = int(remote['id']) for fm in model.fieldModels: if fm.id == id: return fm fm = FieldModel() model.addFieldModel(fm) return fm def mergeCardModels(self, model, cms): ids = [] for cm in cms: local = self.getCardModel(model, cm) if not 'allowEmptyAnswer' in cm or cm['allowEmptyAnswer'] is None: cm['allowEmptyAnswer'] = True self.applyDict(local, cm) ids.append(cm['id']) for cm in model.cardModels: if cm.id not in ids: self.deck.deleteCardModel(model, cm) def getCardModel(self, model, remote): id = int(remote['id']) for cm in model.cardModels: if cm.id == id: return cm cm = CardModel() model.addCardModel(cm) return cm def deleteModels(self, ids): for id in ids: model = self.getModel(id, create=False) if model: self.deck.deleteModel(model) # Facts ########################################################################## def getFacts(self, ids, updateModified=False): if updateModified: modified = time.time() else: modified = "modified" factIds = ids2str(ids) return { 'facts': self.realLists(self.deck.s.all(""" select id, modelId, created, %s, tags, spaceUntil, lastCardId from facts where id in %s""" % (modified, factIds))), 'fields': self.realLists(self.deck.s.all(""" select id, factId, fieldModelId, ordinal, value from fields where factId in %s""" % factIds)) } def updateFacts(self, factsdict): facts = factsdict['facts'] fields = factsdict['fields'] if not facts: return # update facts first dlist = [{ 'id': f[0], 'modelId': f[1], 'created': f[2], 'modified': f[3], 'tags': f[4], 'spaceUntil': f[5] or "", 'lastCardId': f[6] } for f in facts] self.deck.s.execute(""" insert or replace into facts (id, modelId, created, modified, tags, spaceUntil, lastCardId) values (:id, :modelId, :created, :modified, :tags, :spaceUntil, :lastCardId)""", dlist) # now fields dlist = [{ 'id': f[0], 'factId': f[1], 'fieldModelId': f[2], 'ordinal': f[3], 'value': f[4] } for f in fields] # delete local fields since ids may have changed self.deck.s.execute( "delete from fields where factId in %s" % ids2str([f[0] for f in facts])) # then update self.deck.s.execute(""" insert into fields (id, factId, fieldModelId, ordinal, value) values (:id, :factId, :fieldModelId, :ordinal, :value)""", dlist) self.deck.s.statement( "delete from factsDeleted where factId in %s" % ids2str([f[0] for f in facts])) def deleteFacts(self, ids): self.deck.deleteFacts(ids) # Cards ########################################################################## def getCards(self, ids): return self.realLists(self.deck.s.all(""" select id, factId, cardModelId, created, modified, tags, ordinal, priority, interval, lastInterval, due, lastDue, factor, firstAnswered, reps, successive, averageTime, reviewTime, youngEase0, youngEase1, youngEase2, youngEase3, youngEase4, matureEase0, matureEase1, matureEase2, matureEase3, matureEase4, yesCount, noCount, question, answer, lastFactor, spaceUntil, type, combinedDue, relativeDelay from cards where id in %s""" % ids2str(ids))) def updateCards(self, cards): if not cards: return # FIXME: older clients won't send this, so this is temp compat code def getType(row): if len(row) > 36: return row[36] if row[15]: return 1 elif row[14]: return 0 return 2 dlist = [{'id': c[0], 'factId': c[1], 'cardModelId': c[2], 'created': c[3], 'modified': c[4], 'tags': c[5], 'ordinal': c[6], 'priority': c[7], 'interval': c[8], 'lastInterval': c[9], 'due': c[10], 'lastDue': c[11], 'factor': c[12], 'firstAnswered': c[13], 'reps': c[14], 'successive': c[15], 'averageTime': c[16], 'reviewTime': c[17], 'youngEase0': c[18], 'youngEase1': c[19], 'youngEase2': c[20], 'youngEase3': c[21], 'youngEase4': c[22], 'matureEase0': c[23], 'matureEase1': c[24], 'matureEase2': c[25], 'matureEase3': c[26], 'matureEase4': c[27], 'yesCount': c[28], 'noCount': c[29], 'question': c[30], 'answer': c[31], 'lastFactor': c[32], 'spaceUntil': c[33], 'type': c[34], 'combinedDue': c[35], 'rd': getType(c) } for c in cards] self.deck.s.execute(""" insert or replace into cards (id, factId, cardModelId, created, modified, tags, ordinal, priority, interval, lastInterval, due, lastDue, factor, firstAnswered, reps, successive, averageTime, reviewTime, youngEase0, youngEase1, youngEase2, youngEase3, youngEase4, matureEase0, matureEase1, matureEase2, matureEase3, matureEase4, yesCount, noCount, question, answer, lastFactor, spaceUntil, type, combinedDue, relativeDelay, isDue) values (:id, :factId, :cardModelId, :created, :modified, :tags, :ordinal, :priority, :interval, :lastInterval, :due, :lastDue, :factor, :firstAnswered, :reps, :successive, :averageTime, :reviewTime, :youngEase0, :youngEase1, :youngEase2, :youngEase3, :youngEase4, :matureEase0, :matureEase1, :matureEase2, :matureEase3, :matureEase4, :yesCount, :noCount, :question, :answer, :lastFactor, :spaceUntil, :type, :combinedDue, :rd, 0)""", dlist) self.deck.s.statement( "delete from cardsDeleted where cardId in %s" % ids2str([c[0] for c in cards])) def deleteCards(self, ids): self.deck.deleteCards(ids) # Deck/stats/history ########################################################################## def bundleDeck(self): # ensure modified is not greater than server time if getattr(self, "server", None) and getattr( self.server, "timestamp", None): self.deck.modified = min(self.deck.modified,self.server.timestamp) # and ensure lastSync is greater than modified self.deck.lastSync = max(time.time(), self.deck.modified+1) d = self.dictFromObj(self.deck) del d['Session'] del d['engine'] del d['s'] del d['path'] del d['syncName'] del d['version'] if 'newQueue' in d: del d['newQueue'] del d['failedQueue'] del d['revQueue'] # these may be deleted before bundling if 'css' in d: del d['css'] if 'models' in d: del d['models'] if 'currentModel' in d: del d['currentModel'] keys = d.keys() for k in keys: if isinstance(d[k], types.MethodType): del d[k] d['meta'] = self.realLists(self.deck.s.all("select * from deckVars")) return d def updateDeck(self, deck): if 'meta' in deck: meta = deck['meta'] for (k,v) in meta: self.deck.s.statement(""" insert or replace into deckVars (key, value) values (:k, :v)""", k=k, v=v) del deck['meta'] self.applyDict(self.deck, deck) def bundleStats(self): def bundleStat(stat): s = self.dictFromObj(stat) s['day'] = s['day'].toordinal() del s['id'] return s lastDay = date.fromtimestamp(max(0, self.deck.lastSync - 60*60*24)) ids = self.deck.s.column0( "select id from stats where type = 1 and day >= :day", day=lastDay) stat = Stats() def statFromId(id): stat.fromDB(self.deck.s, id) return stat stats = { 'global': bundleStat(self.deck._globalStats), 'daily': [bundleStat(statFromId(id)) for id in ids], } return stats def updateStats(self, stats): stats['global']['day'] = date.fromordinal(stats['global']['day']) self.applyDict(self.deck._globalStats, stats['global']) self.deck._globalStats.toDB(self.deck.s) for record in stats['daily']: record['day'] = date.fromordinal(record['day']) stat = Stats() id = self.deck.s.scalar("select id from stats where " "type = :type and day = :day", type=1, day=record['day']) if id: stat.fromDB(self.deck.s, id) else: stat.create(self.deck.s, 1, record['day']) self.applyDict(stat, record) stat.toDB(self.deck.s) def bundleHistory(self): return self.realLists(self.deck.s.all(""" select cardId, time, lastInterval, nextInterval, ease, delay, lastFactor, nextFactor, reps, thinkingTime, yesCount, noCount from reviewHistory where time > :ls""", ls=self.deck.lastSync)) def updateHistory(self, history): dlist = [{'cardId': h[0], 'time': h[1], 'lastInterval': h[2], 'nextInterval': h[3], 'ease': h[4], 'delay': h[5], 'lastFactor': h[6], 'nextFactor': h[7], 'reps': h[8], 'thinkingTime': h[9], 'yesCount': h[10], 'noCount': h[11]} for h in history] if not dlist: return self.deck.s.statements(""" insert or ignore into reviewHistory (cardId, time, lastInterval, nextInterval, ease, delay, lastFactor, nextFactor, reps, thinkingTime, yesCount, noCount) values (:cardId, :time, :lastInterval, :nextInterval, :ease, :delay, :lastFactor, :nextFactor, :reps, :thinkingTime, :yesCount, :noCount)""", dlist) def bundleSources(self): return self.realLists(self.deck.s.all("select * from sources")) def updateSources(self, sources): for s in sources: self.deck.s.statement(""" insert or replace into sources values (:id, :name, :created, :lastSync, :syncPeriod)""", id=s[0], name=s[1], created=s[2], lastSync=s[3], syncPeriod=s[4]) # Media metadata ########################################################################## def getMedia(self, ids): return [tuple(row) for row in self.deck.s.all(""" select id, filename, size, created, originalPath, description from media where id in %s""" % ids2str(ids))] def updateMedia(self, media): meta = [] for m in media: # build meta meta.append({ 'id': m[0], 'filename': m[1], 'size': m[2], 'created': m[3], 'originalPath': m[4], 'description': m[5]}) # apply metadata if meta: self.deck.s.statements(""" insert or replace into media (id, filename, size, created, originalPath, description) values (:id, :filename, :size, :created, :originalPath, :description)""", meta) self.deck.s.statement( "delete from mediaDeleted where mediaId in %s" % ids2str([m[0] for m in media])) def deleteMedia(self, ids): sids = ids2str(ids) files = self.deck.s.column0( "select filename from media where id in %s" % sids) self.deck.s.statement(""" insert into mediaDeleted select id, :now from media where media.id in %s""" % sids, now=time.time()) self.deck.s.execute( "delete from media where id in %s" % sids) # One-way syncing (sharing) ########################################################################## def syncOneWay(self, lastSync): "Sync two decks one way." payload = self.server.genOneWayPayload(lastSync) self.applyOneWayPayload(payload) self.deck.reset() def syncOneWayDeckName(self): return (self.deck.s.scalar("select name from sources where id = :id", id=self.server.deckName) or hexifyID(int(self.server.deckName))) def prepareOneWaySync(self): "Sync setup. True if sync needed. Not used for local sync." srcID = self.server.deckName (lastSync, syncPeriod) = self.deck.s.first( "select lastSync, syncPeriod from sources where id = :id", id=srcID) if self.server.modified() <= lastSync: return self.deck.lastSync = lastSync return True def genOneWayPayload(self, lastSync): "Bundle all added or changed objects since the last sync." p = {} # facts factIds = self.deck.s.column0( "select id from facts where modified > :l", l=lastSync) p['facts'] = self.getFacts(factIds, updateModified=True) # models modelIds = self.deck.s.column0( "select id from models where modified > :l", l=lastSync) p['models'] = self.getModels(modelIds, updateModified=True) # media mediaIds = self.deck.s.column0( "select id from media where created > :l", l=lastSync) p['media'] = self.getMedia(mediaIds) # cards cardIds = self.deck.s.column0( "select id from cards where modified > :l", l=lastSync) p['cards'] = self.realLists(self.getOneWayCards(cardIds)) return p def applyOneWayPayload(self, payload): keys = [k for k in KEYS if k != "cards"] # model, facts, media for key in keys: self.updateObjsFromKey(payload[key], key) # models need their source tagged for m in payload["models"]: self.deck.s.statement("update models set source = :s " "where id = :id", s=self.server.deckName, id=m['id']) # cards last, handled differently t = time.time() try: self.updateOneWayCards(payload['cards']) except KeyError: sys.stderr.write("Subscribed to a broken deck. " "Try removing your deck subscriptions.") t = 0 # update sync time self.deck.s.statement( "update sources set lastSync = :t where id = :id", id=self.server.deckName, t=t) self.deck.modified = time.time() def getOneWayCards(self, ids): "The minimum information necessary to generate one way cards." return self.deck.s.all( "select id, factId, cardModelId, ordinal, created from cards " "where id in %s" % ids2str(ids)) def updateOneWayCards(self, cards): if not cards: return t = time.time() dlist = [{'id': c[0], 'factId': c[1], 'cardModelId': c[2], 'ordinal': c[3], 'created': c[4], 't': t} for c in cards] # add any missing cards self.deck.s.statements(""" insert or ignore into cards (id, factId, cardModelId, created, modified, tags, ordinal, priority, interval, lastInterval, due, lastDue, factor, firstAnswered, reps, successive, averageTime, reviewTime, youngEase0, youngEase1, youngEase2, youngEase3, youngEase4, matureEase0, matureEase1, matureEase2, matureEase3, matureEase4, yesCount, noCount, question, answer, lastFactor, spaceUntil, isDue, type, combinedDue, relativeDelay) values (:id, :factId, :cardModelId, :created, :t, "", :ordinal, 1, 0, 0, :created, 0, 2.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 2.5, 0, 0, 2, :t, 2)""", dlist) # update q/as models = dict(self.deck.s.all(""" select cards.id, models.id from cards, facts, models where cards.factId = facts.id and facts.modelId = models.id and cards.id in %s""" % ids2str([c[0] for c in cards]))) self.deck.s.flush() self.deck.updateCardQACache( [(c[0], c[2], c[1], models[c[0]]) for c in cards]) # rebuild priorities on client cardIds = [c[0] for c in cards] self.deck.updateCardTags(cardIds) self.rebuildPriorities(cardIds) # Tools ########################################################################## def modified(self): return self.deck.modified def _lastSync(self): return self.deck.lastSync def unstuff(self, data): "Uncompress and convert to unicode." return simplejson.loads(unicode(zlib.decompress(data), "utf8")) def stuff(self, data): "Convert into UTF-8 and compress." return zlib.compress(simplejson.dumps(data)) def dictFromObj(self, obj): "Return a dict representing OBJ without any hidden db fields." return dict([(k,v) for (k,v) in obj.__dict__.items() if not k.startswith("_")]) def applyDict(self, obj, dict): "Apply each element in DICT to OBJ in a way the ORM notices." for (k,v) in dict.items(): setattr(obj, k, v) def realLists(self, result): "Convert an SQLAlchemy response into a list of real lists." return [list(x) for x in result] def getObjsFromKey(self, ids, key): return getattr(self, "get" + key.capitalize())(ids) def deleteObjsFromKey(self, ids, key): return getattr(self, "delete" + key.capitalize())(ids) def updateObjsFromKey(self, ids, key): return getattr(self, "update" + key.capitalize())(ids) # Full sync ########################################################################## def needFullSync(self, sums): if self.deck.lastSync <= 0: return True for sum in sums: for l in sum.values(): if len(l) > 1000: return True if self.deck.s.scalar( "select count() from reviewHistory where time > :ls", ls=self.deck.lastSync) > 1000: return True lastDay = date.fromtimestamp(max(0, self.deck.lastSync - 60*60*24)) if self.deck.s.scalar( "select count() from stats where day >= :day", day=lastDay) > 100: return True return False def prepareFullSync(self): t = time.time() # ensure modified is not greater than server time self.deck.modified = min(self.deck.modified, self.server.timestamp) self.deck.s.commit() self.deck.close() fields = { "p": self.server.password, "u": self.server.username, "d": self.server.deckName.encode("utf-8"), } if self.localTime > self.remoteTime: return ("fromLocal", fields, self.deck.path) else: return ("fromServer", fields, self.deck.path) def fullSync(self): ret = self.prepareFullSync() if ret[0] == "fromLocal": self.fullSyncFromLocal(ret[1], ret[2]) else: self.fullSyncFromServer(ret[1], ret[2]) def fullSyncFromLocal(self, fields, path): global sendProgressHook try: # write into a temporary file, since POST needs content-length src = open(path, "rb") (fd, name) = tempfile.mkstemp(prefix="oldanki") tmp = open(name, "w+b") # post vars for (key, value) in fields.items(): tmp.write('--' + MIME_BOUNDARY + "\r\n") tmp.write('Content-Disposition: form-data; name="%s"\r\n' % key) tmp.write('\r\n') tmp.write(value) tmp.write('\r\n') # file header tmp.write('--' + MIME_BOUNDARY + "\r\n") tmp.write( 'Content-Disposition: form-data; name="deck"; filename="deck"\r\n') tmp.write('Content-Type: application/octet-stream\r\n') tmp.write('\r\n') # data comp = zlib.compressobj() while 1: data = src.read(CHUNK_SIZE) if not data: tmp.write(comp.flush()) break tmp.write(comp.compress(data)) src.close() tmp.write('\r\n--' + MIME_BOUNDARY + '--\r\n\r\n') size = tmp.tell() tmp.seek(0) # open http connection runHook("fullSyncStarted", size) headers = { 'Content-type': 'multipart/form-data; boundary=%s' % MIME_BOUNDARY, 'Content-length': str(size), 'Host': SYNC_HOST, } req = urllib2.Request(SYNC_URL + "fullup?v=2", tmp, headers) try: sendProgressHook = fullSyncProgressHook res = urllib2.urlopen(req).read() assert res.startswith("OK") # update lastSync c = sqlite.connect(path) c.execute("update decks set lastSync = ?", (res[3:],)) c.commit() c.close() finally: sendProgressHook = None tmp.close() os.close(fd) os.unlink(name) finally: runHook("fullSyncFinished") def fullSyncFromServer(self, fields, path): try: runHook("fullSyncStarted", 0) fields = urllib.urlencode(fields) src = urllib.urlopen(SYNC_URL + "fulldown", fields) (fd, tmpname) = tempfile.mkstemp(dir=os.path.dirname(path), prefix="fullsync") tmp = open(tmpname, "wb") decomp = zlib.decompressobj() cnt = 0 while 1: data = src.read(CHUNK_SIZE) if not data: tmp.write(decomp.flush()) break tmp.write(decomp.decompress(data)) cnt += CHUNK_SIZE runHook("fullSyncProgress", "fromServer", cnt) src.close() tmp.close() os.close(fd) # if we were successful, overwrite old deck os.unlink(path) os.rename(tmpname, path) # reset the deck name c = sqlite.connect(path) c.execute("update decks set syncName = ?", [checksum(path.encode("utf-8"))]) c.commit() c.close() finally: runHook("fullSyncFinished") # Local syncing ########################################################################## class SyncServer(SyncTools): def __init__(self, deck=None): SyncTools.__init__(self, deck) class SyncClient(SyncTools): pass # HTTP proxy: act as a server and direct requests to the real server ########################################################################## class HttpSyncServerProxy(SyncServer): def __init__(self, user, passwd): SyncServer.__init__(self) self.decks = None self.deckName = None self.username = user self.password = passwd self.protocolVersion = 5 self.sourcesToCheck = [] def connect(self, clientVersion=""): "Check auth, protocol & grab deck list." if not self.decks: import socket socket.setdefaulttimeout(30) d = self.runCmd("getDecks", libanki=oldanki.version, client=clientVersion, sources=simplejson.dumps(self.sourcesToCheck), pversion=self.protocolVersion) socket.setdefaulttimeout(None) if d['status'] != "OK": raise SyncError(type="authFailed", status=d['status']) self.decks = d['decks'] self.timestamp = d['timestamp'] self.timediff = abs(self.timestamp - time.time()) def hasDeck(self, deckName): self.connect() return deckName in self.decks.keys() def availableDecks(self): self.connect() return self.decks.keys() def createDeck(self, deckName): ret = self.runCmd("createDeck", name=deckName.encode("utf-8")) if not ret or ret['status'] != "OK": raise SyncError(type="createFailed") self.decks[deckName] = [0, 0] def summary(self, lastSync): return self.runCmd("summary", lastSync=self.stuff(lastSync)) def genOneWayPayload(self, lastSync): return self.runCmd("genOneWayPayload", lastSync=self.stuff(lastSync)) def modified(self): self.connect() return self.decks[self.deckName][0] def _lastSync(self): self.connect() return self.decks[self.deckName][1] def applyPayload(self, payload): return self.runCmd("applyPayload", payload=self.stuff(payload)) def finish(self): assert self.runCmd("finish") == "OK" def runCmd(self, action, **args): data = {"p": self.password, "u": self.username, "v": 2} if self.deckName: data['d'] = self.deckName.encode("utf-8") else: data['d'] = None data.update(args) data = urllib.urlencode(data) try: f = urllib2.urlopen(SYNC_URL + action, data) except (urllib2.URLError, socket.error, socket.timeout, httplib.BadStatusLine), e: raise SyncError(type="connectionError", exc=`e`) ret = f.read() if not ret: raise SyncError(type="noResponse") try: return self.unstuff(ret) except Exception, e: raise SyncError(type="connectionError", exc=`e`) # HTTP server: respond to proxy requests and return data ########################################################################## class HttpSyncServer(SyncServer): def __init__(self): SyncServer.__init__(self) self.decks = {} self.deck = None def summary(self, lastSync): return self.stuff(SyncServer.summary( self, float(zlib.decompress(lastSync)))) def applyPayload(self, payload): return self.stuff(SyncServer.applyPayload(self, self.unstuff(payload))) def genOneWayPayload(self, lastSync): return self.stuff(SyncServer.genOneWayPayload( self, float(zlib.decompress(lastSync)))) def getDecks(self, libanki, client, sources, pversion): return self.stuff({ "status": "OK", "decks": self.decks, "timestamp": time.time(), }) def createDeck(self, name): "Create a deck on the server. Not implemented." return self.stuff("OK") # Local media copying ########################################################################## def copyLocalMedia(src, dst): srcDir = src.mediaDir() if not srcDir: return dstDir = dst.mediaDir(create=True) files = os.listdir(srcDir) # find media references used = {} for col in ("question", "answer"): txt = dst.s.column0(""" select %(c)s from cards where %(c)s like '%% # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Miscellaneous utilities ============================== """ __docformat__ = 'restructuredtext' import re, os, random, time, types, math, htmlentitydefs, subprocess try: import hashlib md5 = hashlib.md5 except ImportError: import md5 md5 = md5.new from oldanki.db import * from oldanki.lang import _, ngettext import locale, sys if sys.version_info[1] < 5: def format_string(a, b): return a % b locale.format_string = format_string # Time handling ############################################################################## timeTable = { "years": lambda n: ngettext("%s year", "%s years", n), "months": lambda n: ngettext("%s month", "%s months", n), "days": lambda n: ngettext("%s day", "%s days", n), "hours": lambda n: ngettext("%s hour", "%s hours", n), "minutes": lambda n: ngettext("%s minute", "%s minutes", n), "seconds": lambda n: ngettext("%s second", "%s seconds", n), } afterTimeTable = { "years": lambda n: ngettext("%s year", "%s years", n), "months": lambda n: ngettext("%s month", "%s months", n), "days": lambda n: ngettext("%s day", "%s days", n), "hours": lambda n: ngettext("%s hour", "%s hours", n), "minutes": lambda n: ngettext("%s minute", "%s minutes", n), "seconds": lambda n: ngettext("%s second", "%s seconds", n), } shortTimeTable = { "years": _("%sy"), "months": _("%sm"), "days": _("%sd"), "hours": _("%sh"), "minutes": _("%sm"), "seconds": _("%ss"), } def fmtTimeSpan(time, pad=0, point=0, short=False, after=False): "Return a string representing a time span (eg '2 days')." (type, point) = optimalPeriod(time, point) time = convertSecondsTo(time, type) if not point: time = math.floor(time) if short: fmt = shortTimeTable[type] else: if after: fmt = afterTimeTable[type](_pluralCount(time, point)) else: fmt = timeTable[type](_pluralCount(time, point)) timestr = "%(a)d.%(b)df" % {'a': pad, 'b': point} return locale.format_string("%" + (fmt % timestr), time) def optimalPeriod(time, point): if abs(time) < 60: type = "seconds" point -= 1 elif abs(time) < 3599: type = "minutes" elif abs(time) < 60 * 60 * 24: type = "hours" elif abs(time) < 60 * 60 * 24 * 30: type = "days" elif abs(time) < 60 * 60 * 24 * 365: type = "months" point += 1 else: type = "years" point += 1 return (type, max(point, 0)) def convertSecondsTo(seconds, type): if type == "seconds": return seconds elif type == "minutes": return seconds / 60.0 elif type == "hours": return seconds / 3600.0 elif type == "days": return seconds / 86400.0 elif type == "months": return seconds / 2592000.0 elif type == "years": return seconds / 31536000.0 assert False def _pluralCount(time, point): if point: return 2 return math.floor(time) # Locale ############################################################################## def fmtPercentage(float_value, point=1): "Return float with percentage sign" fmt = '%' + "0.%(b)df" % {'b': point} return locale.format_string(fmt, float_value) + "%" def fmtFloat(float_value, point=1): "Return a string with decimal separator according to current locale" fmt = '%' + "0.%(b)df" % {'b': point} return locale.format_string(fmt, float_value) # HTML ############################################################################## def stripHTML(s): s = re.sub("(?s).*?", "", s) s = re.sub("(?s).*?", "", s) s = re.sub("<.*?>", "", s) s = entsToTxt(s) return s def stripHTMLAlt(s): "Strip HTML, preserving img alt text." s = re.sub("]*alt=[\"']?([^\"'>]+)[\"']?[^>]*>", "\\1", s) return stripHTML(s) def stripHTMLMedia(s): "Strip HTML but keep media filenames" s = re.sub("]+)[\"']? ?/?>", " \\1 ", s) return stripHTML(s) def tidyHTML(html): "Remove cruft like body tags and return just the important part." # contents of body - no head or html tags html = re.sub(u".*(.*)", "\\1", html.replace("\n", u"")) # strip superfluous Qt formatting html = re.sub(u"(?:-qt-table-type: root; )?" "margin-top:\d+px; margin-bottom:\d+px; margin-left:\d+px; " "margin-right:\d+px;(?: -qt-block-indent:0; " "text-indent:0px;)?", u"", html) html = re.sub(u"-qt-paragraph-type:empty;", u"", html) # strip leading space in style statements, and remove if no contents html = re.sub(u'style=" ', u'style="', html) html = re.sub(u' style=""', u"", html) # convert P tags into SPAN and/or BR html = re.sub(u'(.*?)

', u'\\2
', html) html = re.sub(u'

(.*?)

', u'\\1
', html) html = re.sub(u'
$', u'', html) html = re.sub(u"^
(.*)
$", u"\\1", html) # this is being added by qt's html editor, and leads to unwanted spaces html = re.sub(u"^

(.*?)

$", u'\\1', html) html = re.sub(u"^
$", "", html) return html def entsToTxt(html): def fixup(m): text = m.group(0) if text[:2] == "&#": # character reference try: if text[:3] == "&#x": return unichr(int(text[3:-1], 16)) else: return unichr(int(text[2:-1])) except ValueError: pass else: # named entity try: text = unichr(htmlentitydefs.name2codepoint[text[1:-1]]) except KeyError: pass return text # leave as is return re.sub("&#?\w+;", fixup, html) # IDs ############################################################################## def genID(static=[]): "Generate a random, unique 64bit ID." # 23 bits of randomness, 41 bits of current time # random rather than a counter to ensure efficient btree t = long(time.time()*1000) if not static: static.extend([t, {}]) else: if static[0] != t: static[0] = t static[1] = {} while 1: rand = random.getrandbits(23) if rand not in static[1]: static[1][rand] = True break x = rand << 41 | t # turn into a signed long if x >= 9223372036854775808L: x -= 18446744073709551616L return x def hexifyID(id): if id < 0: id += 18446744073709551616L return "%x" % id def dehexifyID(id): id = int(id, 16) if id >= 9223372036854775808L: id -= 18446744073709551616L return id def ids2str(ids): """Given a list of integers, return a string '(int1,int2,.)' The caller is responsible for ensuring only integers are provided. This is safe if you use sqlite primary key columns, which are guaranteed to be integers.""" return "(%s)" % ",".join([str(i) for i in ids]) # Tags ############################################################################## def parseTags(tags): "Parse a string and return a list of tags." tags = re.split(" |, ?", tags) return [t.strip() for t in tags if t.strip()] def joinTags(tags): return u" ".join(tags) def canonifyTags(tags): "Strip leading/trailing/superfluous commas and duplicates." tags = [t.lstrip(":") for t in set(parseTags(tags))] return joinTags(sorted(tags)) def findTag(tag, tags): "True if TAG is in TAGS. Ignore case." if not isinstance(tags, types.ListType): tags = parseTags(tags) return tag.lower() in [t.lower() for t in tags] def addTags(tagstr, tags): "Add tags if they don't exist." currentTags = parseTags(tags) for tag in parseTags(tagstr): if not findTag(tag, currentTags): currentTags.append(tag) return joinTags(currentTags) def deleteTags(tagstr, tags): "Delete tags if they don't exists." currentTags = parseTags(tags) for tag in parseTags(tagstr): try: currentTags.remove(tag) except ValueError: pass return joinTags(currentTags) # Misc ############################################################################## def checksum(data): return md5(data).hexdigest() def call(argv, wait=True, **kwargs): try: o = subprocess.Popen(argv, **kwargs) except OSError: # command not found return -1 if wait: while 1: try: ret = o.wait() except OSError: # interrupted system call continue break else: ret = 0 return ret anki-2.0.20+dfsg/oldanki/tags.py0000644000175000017500000000276312072547733016223 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Tags ==================== """ __docformat__ = 'restructuredtext' from oldanki.db import * #src 0 = fact #src 1 = model #src 2 = card model # Tables ########################################################################## def initTagTables(s): try: s.statement(""" create table tags ( id integer not null, tag text not null collate nocase, priority integer not null default 2, primary key(id))""") s.statement(""" create table cardTags ( id integer not null, cardId integer not null, tagId integer not null, src integer not null, primary key(id))""") except: pass def tagId(s, tag, create=True): "Return ID for tag, creating if necessary." id = s.scalar("select id from tags where tag = :tag", tag=tag) if id or not create: return id s.statement(""" insert or ignore into tags (tag) values (:tag)""", tag=tag) return s.scalar("select id from tags where tag = :tag", tag=tag) def tagIds(s, tags, create=True): "Return an ID for all tags, creating if necessary." ids = {} if create: s.statements("insert or ignore into tags (tag) values (:tag)", [{'tag': t} for t in tags]) tagsD = dict([(x.lower(), y) for (x, y) in s.all(""" select tag, id from tags where tag in (%s)""" % ",".join([ "'%s'" % t.replace("'", "''") for t in tags]))]) return tagsD anki-2.0.20+dfsg/oldanki/db.py0000644000175000017500000001065112072547733015645 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ DB tools ==================== SessionHelper is a wrapper for the standard sqlalchemy session, which provides some convenience routines, and manages transactions itself. object_session() is a replacement for the standard object_session(), which provides the features of SessionHelper, and avoids taking out another transaction. """ __docformat__ = 'restructuredtext' try: from pysqlite2 import dbapi2 as sqlite except ImportError: try: from sqlite3 import dbapi2 as sqlite except: raise Exception("Please install pysqlite2 or python2.5") from sqlalchemy import (Table, Integer, Float, Column, MetaData, ForeignKey, Boolean, String, Date, UniqueConstraint, Index, PrimaryKeyConstraint) from sqlalchemy import create_engine from sqlalchemy.orm import mapper, sessionmaker as _sessionmaker, relation, backref, \ object_session as _object_session, class_mapper from sqlalchemy.sql import select, text, and_ from sqlalchemy.exc import DBAPIError, OperationalError from sqlalchemy.pool import NullPool import sqlalchemy # some users are still on 0.4.x.. import warnings warnings.filterwarnings('ignore', 'Use session.add()') warnings.filterwarnings('ignore', 'Use session.expunge_all()') # sqlalchemy didn't handle the move to unicodetext nicely try: from sqlalchemy import UnicodeText except ImportError: from sqlalchemy import Unicode UnicodeText = Unicode from oldanki.hooks import runHook # shared metadata metadata = MetaData() # this class assumes the provided session is called with transactional=False class SessionHelper(object): "Add some convenience routines to a session." def __init__(self, session, lock=False, transaction=True): self._session = session self._lock = lock self._transaction = transaction if self._transaction: self._session.begin() if self._lock: self._lockDB() self._seen = True def save(self, obj): # compat if sqlalchemy.__version__.startswith("0.4."): self._session.save(obj) else: self._session.add(obj) def clear(self): # compat if sqlalchemy.__version__.startswith("0.4."): self._session.clear() else: self._session.expunge_all() def update(self, obj): # compat if sqlalchemy.__version__.startswith("0.4."): self._session.update(obj) else: self._session.add(obj) def execute(self, *a, **ka): x = self._session.execute(*a, **ka) runHook("dbFinished") return x def __getattr__(self, k): return getattr(self.__dict__['_session'], k) def scalar(self, sql, **args): return self.execute(text(sql), args).scalar() def all(self, sql, **args): return self.execute(text(sql), args).fetchall() def first(self, sql, **args): c = self.execute(text(sql), args) r = c.fetchone() c.close() return r def column0(self, sql, **args): return [x[0] for x in self.execute(text(sql), args).fetchall()] def statement(self, sql, **kwargs): "Execute a statement without returning any results. Flush first." return self.execute(text(sql), kwargs) def statements(self, sql, data): "Execute a statement across data. Flush first." return self.execute(text(sql), data) def __repr__(self): return repr(self._session) def commit(self): self._session.commit() if self._transaction: self._session.begin() if self._lock: self._lockDB() def _lockDB(self): "Take out a write lock." self._session.execute(text("update decks set modified=modified")) def object_session(*args): s = _object_session(*args) if s: return SessionHelper(s, transaction=False) return None def sessionmaker(*args, **kwargs): if sqlalchemy.__version__ < "0.5": if 'autocommit' in kwargs: kwargs['transactional'] = not kwargs['autocommit'] del kwargs['autocommit'] else: if 'transactional' in kwargs: kwargs['autocommit'] = not kwargs['transactional'] del kwargs['transactional'] return _sessionmaker(*args, **kwargs) anki-2.0.20+dfsg/oldanki/README0000644000175000017500000000013012072556225015551 0ustar andreasandreasThis is libanki 1.2.11, for the purposes of fixing problems when upgrading 1.2.x decks. anki-2.0.20+dfsg/oldanki/sound.py0000644000175000017500000002467612072547733016424 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Sound support ============================== """ __docformat__ = 'restructuredtext' import re, sys, threading, time, subprocess, os, signal, errno, atexit import tempfile, shutil from oldanki.hooks import addHook, runHook # Shared utils ########################################################################## def playFromText(text): for match in re.findall("\[sound:(.*?)\]", text): play(match) def stripSounds(text): return re.sub("\[sound:.*?\]", "", text) def hasSound(text): return re.search("\[sound:.*?\]", text) is not None ########################################################################## # the amount of noise to cancel NOISE_AMOUNT = "0.1" # the amount of amplification NORM_AMOUNT = "-3" # the amount of bass BASS_AMOUNT = "+0" # the amount to fade at end FADE_AMOUNT = "0.25" noiseProfile = "" processingSrc = "rec.wav" processingDst = "rec.mp3" processingChain = [] recFiles = ["rec2.wav", "rec3.wav"] cmd = ["sox", processingSrc, "rec2.wav"] processingChain = [ None, # placeholder ["sox", "rec2.wav", "rec3.wav", "norm", NORM_AMOUNT, "bass", BASS_AMOUNT, "fade", FADE_AMOUNT], ["lame", "rec3.wav", processingDst, "--noreplaygain", "--quiet"], ] tmpdir = None # don't show box on windows if sys.platform == "win32": si = subprocess.STARTUPINFO() try: si.dwFlags |= subprocess.STARTF_USESHOWWINDOW except: # python2.7+ si.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW # tmp dir for non-hashed media tmpdir = unicode( tempfile.mkdtemp(prefix="oldanki"), sys.getfilesystemencoding()) else: si = None if sys.platform.startswith("darwin"): # make sure lame, which is installed in /usr/local/bin, is in the path os.environ['PATH'] += ":" + "/usr/local/bin" dir = os.path.dirname(os.path.abspath(__file__)) dir = os.path.abspath(dir + "/../../../..") os.environ['PATH'] += ":" + dir + "/audio" def retryWait(proc): # osx throws interrupted system call errors frequently while 1: try: return proc.wait() except OSError: continue # Noise profiles ########################################################################## def checkForNoiseProfile(): global processingChain if sys.platform.startswith("darwin"): # not currently supported processingChain = [ ["lame", "rec.wav", "rec.mp3", "--noreplaygain", "--quiet"]] else: cmd = ["sox", processingSrc, "rec2.wav"] if os.path.exists(noiseProfile): cmd = cmd + ["noisered", noiseProfile, NOISE_AMOUNT] processingChain[0] = cmd def generateNoiseProfile(): try: os.unlink(noiseProfile) except OSError: pass retryWait(subprocess.Popen( ["sox", processingSrc, recFiles[0], "trim", "1.5", "1.5"], startupinfo=si)) retryWait(subprocess.Popen(["sox", recFiles[0], recFiles[1], "noiseprof", noiseProfile], startupinfo=si)) processingChain[0] = ["sox", processingSrc, "rec2.wav", "noisered", noiseProfile, NOISE_AMOUNT] # Mplayer settings ########################################################################## if sys.platform.startswith("win32"): mplayerCmd = ["mplayer.exe", "-ao", "win32", "-really-quiet"] dir = os.path.dirname(os.path.abspath(sys.argv[0])) os.environ['PATH'] += ";" + dir os.environ['PATH'] += ";" + dir + "\\..\\win\\top" # for testing else: mplayerCmd = ["mplayer", "-really-quiet"] # Mplayer in slave mode ########################################################################## mplayerQueue = [] mplayerManager = None mplayerReader = None mplayerEvt = threading.Event() mplayerClear = False class MplayerReader(threading.Thread): "Read any debugging info to prevent mplayer from blocking." def run(self): while 1: mplayerEvt.wait() try: mplayerManager.mplayer.stdout.read() except: pass class MplayerMonitor(threading.Thread): def run(self): global mplayerClear self.mplayer = None self.deadPlayers = [] while 1: mplayerEvt.wait() if mplayerQueue: # ensure started if not self.mplayer: self.startProcess() # loop through files to play while mplayerQueue: item = mplayerQueue.pop(0) if mplayerClear: mplayerClear = False extra = "" else: extra = " 1" cmd = 'loadfile "%s"%s\n' % (item, extra) try: self.mplayer.stdin.write(cmd) except: # mplayer has quit and needs restarting self.deadPlayers.append(self.mplayer) self.mplayer = None self.startProcess() self.mplayer.stdin.write(cmd) # wait() on finished processes. we don't want to block on the # wait, so we keep trying each time we're reactivated def clean(pl): if pl.poll() is not None: pl.wait() return False else: return True self.deadPlayers = [pl for pl in self.deadPlayers if clean(pl)] mplayerEvt.clear() def kill(self): if not self.mplayer: return try: self.mplayer.stdin.write("quit\n") self.deadPlayers.append(self.mplayer) except: pass self.mplayer = None def startProcess(self): try: cmd = mplayerCmd + ["-slave", "-idle"] self.mplayer = subprocess.Popen( cmd, startupinfo=si, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) except OSError: mplayerEvt.clear() raise Exception("Audio player not found") def queueMplayer(path): ensureMplayerThreads() while mplayerEvt.isSet(): time.sleep(0.1) if tmpdir and os.path.exists(path): # mplayer on windows doesn't like the encoding, so we create a # temporary file instead. oddly, foreign characters in the dirname # don't seem to matter. (fd, name) = tempfile.mkstemp(suffix=os.path.splitext(path)[1], dir=tmpdir) f = os.fdopen(fd, "wb") f.write(open(path, "rb").read()) f.close() # it wants unix paths, too! path = name.replace("\\", "/") path = path.encode(sys.getfilesystemencoding()) else: path = path.encode("utf-8") mplayerQueue.append(path) mplayerEvt.set() runHook("soundQueued") def clearMplayerQueue(): global mplayerClear mplayerClear = True mplayerEvt.set() def ensureMplayerThreads(): global mplayerManager, mplayerReader if not mplayerManager: mplayerManager = MplayerMonitor() mplayerManager.daemon = True mplayerManager.start() mplayerReader = MplayerReader() mplayerReader.daemon = True mplayerReader.start() def stopMplayer(): if not mplayerManager: return mplayerManager.kill() def onExit(): if tmpdir: shutil.rmtree(tmpdir) addHook("deckClosed", stopMplayer) atexit.register(onExit) # PyAudio recording ########################################################################## try: import pyaudio import wave PYAU_FORMAT = pyaudio.paInt16 PYAU_CHANNELS = 1 PYAU_RATE = 44100 PYAU_INPUT_INDEX = None except: pass class _Recorder(object): def postprocess(self, encode=True): self.encode = encode for c in processingChain: #print c if not self.encode and c[0] == 'lame': continue ret = retryWait(subprocess.Popen(c, startupinfo=si)) if ret: raise Exception(_(""" Error processing audio. If you're on Linux and don't have sox 14.1+, you need to disable normalization. See the wiki. Command was:\n""") + u" ".join(c)) class PyAudioThreadedRecorder(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.finish = False def run(self): chunk = 1024 try: p = pyaudio.PyAudio() except NameError: raise Exception( "Pyaudio not installed (recording not supported on OSX10.3)") stream = p.open(format=PYAU_FORMAT, channels=PYAU_CHANNELS, rate=PYAU_RATE, input=True, input_device_index=PYAU_INPUT_INDEX, frames_per_buffer=chunk) all = [] while not self.finish: try: data = stream.read(chunk) except IOError, e: if e[1] == pyaudio.paInputOverflowed: data = None else: raise if data: all.append(data) stream.close() p.terminate() data = ''.join(all) wf = wave.open(processingSrc, 'wb') wf.setnchannels(PYAU_CHANNELS) wf.setsampwidth(p.get_sample_size(PYAU_FORMAT)) wf.setframerate(PYAU_RATE) wf.writeframes(data) wf.close() class PyAudioRecorder(_Recorder): def __init__(self): for t in recFiles + [processingSrc, processingDst]: try: os.unlink(t) except OSError: pass self.encode = False def start(self): self.thread = PyAudioThreadedRecorder() self.thread.start() def stop(self): self.thread.finish = True self.thread.join() def file(self): if self.encode: tgt = "rec%d.mp3" % time.time() os.rename(processingDst, tgt) return tgt else: return recFiles[1] # Audio interface ########################################################################## _player = queueMplayer _queueEraser = clearMplayerQueue def play(path): _player(path) def clearAudioQueue(): _queueEraser() Recorder = PyAudioRecorder anki-2.0.20+dfsg/oldanki/facts.py0000644000175000017500000001204512072547733016357 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Facts ======== """ __docformat__ = 'restructuredtext' import time from oldanki.db import * from oldanki.errors import * from oldanki.models import Model, FieldModel, fieldModelsTable from oldanki.utils import genID, stripHTMLMedia from oldanki.hooks import runHook # Fields in a fact ########################################################################## fieldsTable = Table( 'fields', metadata, Column('id', Integer, primary_key=True), Column('factId', Integer, ForeignKey("facts.id"), nullable=False), Column('fieldModelId', Integer, ForeignKey("fieldModels.id"), nullable=False), Column('ordinal', Integer, nullable=False), Column('value', UnicodeText, nullable=False)) class Field(object): "A field in a fact." def __init__(self, fieldModel=None): if fieldModel: self.fieldModel = fieldModel self.ordinal = fieldModel.ordinal self.value = u"" self.id = genID() def getName(self): return self.fieldModel.name name = property(getName) mapper(Field, fieldsTable, properties={ 'fieldModel': relation(FieldModel) }) # Facts: a set of fields and a model ########################################################################## # mapped in cards.py factsTable = Table( 'facts', metadata, Column('id', Integer, primary_key=True), Column('modelId', Integer, ForeignKey("models.id"), nullable=False), Column('created', Float, nullable=False, default=time.time), Column('modified', Float, nullable=False, default=time.time), Column('tags', UnicodeText, nullable=False, default=u""), # spaceUntil is reused as a html-stripped cache of the fields Column('spaceUntil', UnicodeText, nullable=False, default=u""), # obsolete Column('lastCardId', Integer, ForeignKey( "cards.id", use_alter=True, name="lastCardIdfk"))) class Fact(object): "A single fact. Fields exposed as dict interface." def __init__(self, model=None): self.model = model self.id = genID() if model: for fm in model.fieldModels: self.fields.append(Field(fm)) self.new = True def isNew(self): return getattr(self, 'new', False) def keys(self): return [field.name for field in self.fields] def values(self): return [field.value for field in self.fields] def __getitem__(self, key): try: return [f.value for f in self.fields if f.name == key][0] except IndexError: raise KeyError(key) def __setitem__(self, key, value): try: [f for f in self.fields if f.name == key][0].value = value except IndexError: raise KeyError def get(self, key, default): try: return self[key] except (IndexError, KeyError): return default def assertValid(self): "Raise an error if required fields are empty." for field in self.fields: if not self.fieldValid(field): raise FactInvalidError(type="fieldEmpty", field=field.name) def fieldValid(self, field): return not (field.fieldModel.required and not field.value.strip()) def assertUnique(self, s): "Raise an error if duplicate fields are found." for field in self.fields: if not self.fieldUnique(field, s): raise FactInvalidError(type="fieldNotUnique", field=field.name) def fieldUnique(self, field, s): if not field.fieldModel.unique: return True req = ("select value from fields " "where fieldModelId = :fmid and value = :val") if field.id: req += " and id != %s" % field.id return not s.scalar(req, val=field.value, fmid=field.fieldModel.id) def focusLost(self, field): runHook('fact.focusLost', self, field) def setModified(self, textChanged=False, deck=None, media=True): "Mark modified and update cards." self.modified = time.time() if textChanged: if not deck: # FIXME: compat code import ankiqt if not getattr(ankiqt, 'setModWarningShown', None): import sys; sys.stderr.write( "plugin needs to pass deck to fact.setModified()") ankiqt.setModWarningShown = True deck = ankiqt.mw.deck assert deck self.spaceUntil = stripHTMLMedia(u" ".join( self.values())) for card in self.cards: card.rebuildQA(deck) # Fact deletions ########################################################################## factsDeletedTable = Table( 'factsDeleted', metadata, Column('factId', Integer, ForeignKey("facts.id"), nullable=False), Column('deletedTime', Float, nullable=False)) anki-2.0.20+dfsg/oldanki/__init__.py0000644000175000017500000000173412221204444017002 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Anki (libanki) ==================== Open a deck: deck = oldanki.DeckStorage.Deck(path) Get a card: card = deck.getCard() if not card: # deck is finished Show the card: print card.question, card.answer Answer the card: deck.answerCard(card, ease) Edit the card: fields = card.fact.model.fieldModels for field in fields: card.fact[field.name] = "newvalue" card.fact.setModified(textChanged=True, deck=deck) deck.setModified() Get all cards via ORM (slow): from oldanki.cards import Card cards = deck.s.query(Card).all() Get all q/a/ids via SQL (fast): cards = deck.s.all("select id, question, answer from cards") Save & close: deck.save() deck.close() """ __docformat__ = 'restructuredtext' version = "1.2.11" from oldanki.deck import DeckStorage anki-2.0.20+dfsg/oldanki/errors.py0000644000175000017500000000216312072547733016573 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Errors ============================== """ __docformat__ = 'restructuredtext' class Error(Exception): def __init__(self, message="", **data): self.data = data self._message = message def __str__(self): m = self._message if self.data: m += ": %s" % repr(self.data) return m class DeckAccessError(Error): pass class ImportFileError(Error): "Unable to load file to import from." pass class ImportFormatError(Error): "Unable to determine pattern in text file." pass class ImportEncodingError(Error): "The file was not in utf-8." pass class ExportFileError(Error): "Unable to save file." pass class SyncError(Error): "A problem occurred during syncing." pass # facts, models class FactInvalidError(Error): """A fact was invalid/not unique according to the model. 'field' defines the problem field. 'type' defines the type of error ('fieldEmpty', 'fieldNotUnique')""" pass anki-2.0.20+dfsg/oldanki/deck.py0000644000175000017500000052230512221204444016153 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ The Deck ==================== """ __docformat__ = 'restructuredtext' import tempfile, time, os, random, sys, re, stat, shutil import types, traceback, datetime from anki.utils import json as simplejson from oldanki.db import * from oldanki.lang import _, ngettext from oldanki.errors import DeckAccessError from oldanki.stdmodels import BasicModel from oldanki.utils import parseTags, tidyHTML, genID, ids2str, hexifyID, \ canonifyTags, joinTags, addTags, checksum from oldanki.history import CardHistoryEntry from oldanki.models import Model, CardModel, formatQA from oldanki.stats import dailyStats, globalStats, genToday from oldanki.fonts import toPlatformFont from oldanki.tags import initTagTables, tagIds from operator import itemgetter from itertools import groupby from oldanki.hooks import runHook, hookEmpty from oldanki.template import render from oldanki.media import updateMediaCount, mediaFiles, \ rebuildMediaDir import oldanki.latex # sets up hook # ensure all the DB metadata in other files is loaded before proceeding import oldanki.models, oldanki.facts, oldanki.cards, oldanki.stats import oldanki.history, oldanki.media # the current code set type -= 3 for manually suspended cards, and += 3*n # for temporary suspends, (where n=1 for bury, n=2 for review/cram). # This way we don't need to recalculate priorities when enabling the cards # again, and paves the way for an arbitrary number of priorities in the # future. But until all clients are upgraded, we need to keep munging the # priorities to prevent older clients from getting confused # PRIORITY_REVEARLY = -1 # PRIORITY_BURIED = -2 # PRIORITY_SUSPENDED = -3 # priorities PRIORITY_HIGH = 4 PRIORITY_MED = 3 PRIORITY_NORM = 2 PRIORITY_LOW = 1 PRIORITY_NONE = 0 # rest MATURE_THRESHOLD = 21 NEW_CARDS_DISTRIBUTE = 0 NEW_CARDS_LAST = 1 NEW_CARDS_FIRST = 2 NEW_CARDS_RANDOM = 0 NEW_CARDS_OLD_FIRST = 1 NEW_CARDS_NEW_FIRST = 2 REV_CARDS_OLD_FIRST = 0 REV_CARDS_NEW_FIRST = 1 REV_CARDS_DUE_FIRST = 2 REV_CARDS_RANDOM = 3 SEARCH_TAG = 0 SEARCH_TYPE = 1 SEARCH_PHRASE = 2 SEARCH_FID = 3 SEARCH_CARD = 4 SEARCH_DISTINCT = 5 SEARCH_FIELD = 6 SEARCH_FIELD_EXISTS = 7 SEARCH_QA = 8 SEARCH_PHRASE_WB = 9 DECK_VERSION = 65 deckVarsTable = Table( 'deckVars', metadata, Column('key', UnicodeText, nullable=False, primary_key=True), Column('value', UnicodeText)) # parts of the code assume we only have one deck decksTable = Table( 'decks', metadata, Column('id', Integer, primary_key=True), Column('created', Float, nullable=False, default=time.time), Column('modified', Float, nullable=False, default=time.time), Column('description', UnicodeText, nullable=False, default=u""), Column('version', Integer, nullable=False, default=DECK_VERSION), Column('currentModelId', Integer, ForeignKey("models.id")), # syncName stores an md5sum of the deck path when syncing is enabled. If # it doesn't match the current deck path, the deck has been moved, # and syncing is disabled on load. Column('syncName', UnicodeText), Column('lastSync', Float, nullable=False, default=0), # scheduling ############## # initial intervals Column('hardIntervalMin', Float, nullable=False, default=1.0), Column('hardIntervalMax', Float, nullable=False, default=1.1), Column('midIntervalMin', Float, nullable=False, default=3.0), Column('midIntervalMax', Float, nullable=False, default=5.0), Column('easyIntervalMin', Float, nullable=False, default=7.0), Column('easyIntervalMax', Float, nullable=False, default=9.0), # delays on failure Column('delay0', Integer, nullable=False, default=600), # days to delay mature fails Column('delay1', Integer, nullable=False, default=0), Column('delay2', Float, nullable=False, default=0.0), # collapsing future cards Column('collapseTime', Integer, nullable=False, default=1), # priorities & postponing Column('highPriority', UnicodeText, nullable=False, default=u"PriorityVeryHigh"), Column('medPriority', UnicodeText, nullable=False, default=u"PriorityHigh"), Column('lowPriority', UnicodeText, nullable=False, default=u"PriorityLow"), Column('suspended', UnicodeText, nullable=False, default=u""), # obsolete # 0 is random, 1 is by input date Column('newCardOrder', Integer, nullable=False, default=1), # when to show new cards Column('newCardSpacing', Integer, nullable=False, default=NEW_CARDS_DISTRIBUTE), # limit the number of failed cards in play Column('failedCardMax', Integer, nullable=False, default=20), # number of new cards to show per day Column('newCardsPerDay', Integer, nullable=False, default=20), # currently unused Column('sessionRepLimit', Integer, nullable=False, default=0), Column('sessionTimeLimit', Integer, nullable=False, default=600), # stats offset Column('utcOffset', Float, nullable=False, default=-1), # count cache Column('cardCount', Integer, nullable=False, default=0), Column('factCount', Integer, nullable=False, default=0), Column('failedNowCount', Integer, nullable=False, default=0), # obsolete Column('failedSoonCount', Integer, nullable=False, default=0), Column('revCount', Integer, nullable=False, default=0), Column('newCount', Integer, nullable=False, default=0), # rev order Column('revCardOrder', Integer, nullable=False, default=0)) class Deck(object): "Top-level object. Manages facts, cards and scheduling information." factorFour = 1.3 initialFactor = 2.5 minimumAverage = 1.7 maxScheduleTime = 36500 def __init__(self, path=None): "Create a new deck." # a limit of 1 deck in the table self.id = 1 # db session factory and instance self.Session = None self.s = None def _initVars(self): self.tmpMediaDir = None self.mediaPrefix = "" self.lastTags = u"" self.lastLoaded = time.time() self.undoEnabled = False self.sessionStartReps = 0 self.sessionStartTime = 0 self.lastSessionStart = 0 self.queueLimit = 200 # if most recent deck var not defined, make sure defaults are set if not self.s.scalar("select 1 from deckVars where key = 'revSpacing'"): self.setVarDefault("suspendLeeches", True) self.setVarDefault("leechFails", 16) self.setVarDefault("perDay", True) self.setVarDefault("newActive", "") self.setVarDefault("revActive", "") self.setVarDefault("newInactive", self.suspended) self.setVarDefault("revInactive", self.suspended) self.setVarDefault("newSpacing", 60) self.setVarDefault("mediaURL", "") self.setVarDefault("latexPre", """\ \\documentclass[12pt]{article} \\special{papersize=3in,5in} \\usepackage[utf8]{inputenc} \\usepackage{amssymb,amsmath} \\pagestyle{empty} \\setlength{\\parindent}{0in} \\begin{document} """) self.setVarDefault("latexPost", "\\end{document}") self.setVarDefault("revSpacing", 0.1) self.updateCutoff() self.setupStandardScheduler() def modifiedSinceSave(self): return self.modified > self.lastLoaded # Queue management ########################################################################## def setupStandardScheduler(self): self.getCardId = self._getCardId self.fillFailedQueue = self._fillFailedQueue self.fillRevQueue = self._fillRevQueue self.fillNewQueue = self._fillNewQueue self.rebuildFailedCount = self._rebuildFailedCount self.rebuildRevCount = self._rebuildRevCount self.rebuildNewCount = self._rebuildNewCount self.requeueCard = self._requeueCard self.timeForNewCard = self._timeForNewCard self.updateNewCountToday = self._updateNewCountToday self.cardQueue = self._cardQueue self.finishScheduler = None self.answerCard = self._answerCard self.cardLimit = self._cardLimit self.answerPreSave = None self.spaceCards = self._spaceCards self.scheduler = "standard" # restore any cards temporarily suspended by alternate schedulers try: self.resetAfterReviewEarly() except OperationalError, e: # will fail if deck hasn't been upgraded yet pass def fillQueues(self): self.fillFailedQueue() self.fillRevQueue() self.fillNewQueue() def rebuildCounts(self): # global counts self.cardCount = self.s.scalar("select count(*) from cards") self.factCount = self.s.scalar("select count(*) from facts") # due counts self.rebuildFailedCount() self.rebuildRevCount() self.rebuildNewCount() def _cardLimit(self, active, inactive, sql): yes = parseTags(self.getVar(active)) no = parseTags(self.getVar(inactive)) if yes: yids = tagIds(self.s, yes).values() nids = tagIds(self.s, no).values() return sql.replace( "where", "where +c.id in (select cardId from cardTags where " "tagId in %s) and +c.id not in (select cardId from " "cardTags where tagId in %s) and" % ( ids2str(yids), ids2str(nids))) elif no: nids = tagIds(self.s, no).values() return sql.replace( "where", "where +c.id not in (select cardId from cardTags where " "tagId in %s) and" % ids2str(nids)) else: return sql def _rebuildFailedCount(self): # This is a count of all failed cards within the current day cutoff. # The cards may not be ready for review yet, but can still be # displayed if failedCardsMax is reached. self.failedSoonCount = self.s.scalar( self.cardLimit( "revActive", "revInactive", "select count(*) from cards c where type = 0 " "and combinedDue < :lim"), lim=self.failedCutoff) def _rebuildRevCount(self): self.revCount = self.s.scalar( self.cardLimit( "revActive", "revInactive", "select count(*) from cards c where type = 1 " "and combinedDue < :lim"), lim=self.dueCutoff) def _rebuildNewCount(self): self.newCount = self.s.scalar( self.cardLimit( "newActive", "newInactive", "select count(*) from cards c where type = 2 " "and combinedDue < :lim"), lim=self.dueCutoff) self.updateNewCountToday() self.spacedCards = [] def _updateNewCountToday(self): self.newCountToday = max(min( self.newCount, self.newCardsPerDay - self.newCardsDoneToday()), 0) def _fillFailedQueue(self): if self.failedSoonCount and not self.failedQueue: self.failedQueue = self.s.all( self.cardLimit( "revActive", "revInactive", """ select c.id, factId, combinedDue from cards c where type = 0 and combinedDue < :lim order by combinedDue limit %d""" % self.queueLimit), lim=self.failedCutoff) self.failedQueue.reverse() def _fillRevQueue(self): if self.revCount and not self.revQueue: self.revQueue = self.s.all( self.cardLimit( "revActive", "revInactive", """ select c.id, factId from cards c where type = 1 and combinedDue < :lim order by %s limit %d""" % (self.revOrder(), self.queueLimit)), lim=self.dueCutoff) self.revQueue.reverse() def _fillNewQueue(self): if self.newCountToday and not self.newQueue and not self.spacedCards: self.newQueue = self.s.all( self.cardLimit( "newActive", "newInactive", """ select c.id, factId from cards c where type = 2 and combinedDue < :lim order by %s limit %d""" % (self.newOrder(), self.queueLimit)), lim=self.dueCutoff) self.newQueue.reverse() def queueNotEmpty(self, queue, fillFunc, new=False): while True: self.removeSpaced(queue, new) if queue: return True fillFunc() if not queue: return False def removeSpaced(self, queue, new=False): popped = [] delay = None while queue: fid = queue[-1][1] if fid in self.spacedFacts: # still spaced id = queue.pop()[0] # assuming 10 cards/minute, track id if likely to expire # before queue refilled if new and self.newSpacing < self.queueLimit * 6: popped.append(id) delay = self.spacedFacts[fid] else: if popped: self.spacedCards.append((delay, popped)) return def revNoSpaced(self): return self.queueNotEmpty(self.revQueue, self.fillRevQueue) def newNoSpaced(self): return self.queueNotEmpty(self.newQueue, self.fillNewQueue, True) def _requeueCard(self, card, oldSuc): newType = None try: if card.reps == 1: if self.newFromCache: # fetched from spaced cache newType = 2 cards = self.spacedCards.pop(0)[1] # reschedule the siblings if len(cards) > 1: self.spacedCards.append( (time.time() + self.newSpacing, cards[1:])) else: # fetched from normal queue newType = 1 self.newQueue.pop() elif oldSuc == 0: self.failedQueue.pop() else: self.revQueue.pop() except: raise Exception("""\ requeueCard() failed. Please report this along with the steps you take to produce the problem. Counts %d %d %d Queue %d %d %d Card info: %d %d %d New type: %s""" % (self.failedSoonCount, self.revCount, self.newCountToday, len(self.failedQueue), len(self.revQueue), len(self.newQueue), card.reps, card.successive, oldSuc, `newType`)) def revOrder(self): return ("priority desc, interval desc", "priority desc, interval", "priority desc, combinedDue", "priority desc, factId, ordinal")[self.revCardOrder] def newOrder(self): return ("priority desc, due", "priority desc, due", "priority desc, due desc")[self.newCardOrder] def rebuildTypes(self): "Rebuild the type cache. Only necessary on upgrade." # set canonical type first self.s.statement(""" update cards set relativeDelay = (case when successive then 1 when reps then 0 else 2 end) """) # then current type based on that self.s.statement(""" update cards set type = (case when type >= 0 then relativeDelay else relativeDelay - 3 end) """) def _cardQueue(self, card): return self.cardType(card) def cardType(self, card): "Return the type of the current card (what queue it's in)" if card.successive: return 1 elif card.reps: return 0 else: return 2 def updateCutoff(self): d = datetime.datetime.utcfromtimestamp( time.time() - self.utcOffset) + datetime.timedelta(days=1) d = datetime.datetime(d.year, d.month, d.day) newday = self.utcOffset - time.timezone d += datetime.timedelta(seconds=newday) cutoff = time.mktime(d.timetuple()) # cutoff must not be in the past while cutoff < time.time(): cutoff += 86400 # cutoff must not be more than 24 hours in the future cutoff = min(time.time() + 86400, cutoff) self.failedCutoff = cutoff if self.getBool("perDay"): self.dueCutoff = cutoff else: self.dueCutoff = time.time() def reset(self): # setup global/daily stats self._globalStats = globalStats(self) self._dailyStats = dailyStats(self) # recheck counts self.rebuildCounts() # empty queues; will be refilled by getCard() self.failedQueue = [] self.revQueue = [] self.newQueue = [] self.spacedFacts = {} # determine new card distribution if self.newCardSpacing == NEW_CARDS_DISTRIBUTE: if self.newCountToday: self.newCardModulus = ( (self.newCountToday + self.revCount) / self.newCountToday) # if there are cards to review, ensure modulo >= 2 if self.revCount: self.newCardModulus = max(2, self.newCardModulus) else: self.newCardModulus = 0 else: self.newCardModulus = 0 # recache css self.rebuildCSS() # spacing for delayed cards - not to be confused with newCardSpacing # above self.newSpacing = self.getFloat('newSpacing') self.revSpacing = self.getFloat('revSpacing') def checkDay(self): # check if the day has rolled over if genToday(self) != self._dailyStats.day: self.updateCutoff() self.reset() # Review early ########################################################################## def setupReviewEarlyScheduler(self): self.fillRevQueue = self._fillRevEarlyQueue self.rebuildRevCount = self._rebuildRevEarlyCount self.finishScheduler = self._onReviewEarlyFinished self.answerPreSave = self._reviewEarlyPreSave self.scheduler = "reviewEarly" def _reviewEarlyPreSave(self, card, ease): if ease > 1: # prevent it from appearing in next queue fill card.type += 6 def resetAfterReviewEarly(self): "Put temporarily suspended cards back into play. Caller must .reset()" # FIXME: can ignore priorities in the future ids = self.s.column0( "select id from cards where type between 6 and 8 or priority = -1") if ids: self.updatePriorities(ids) self.s.statement( "update cards set type = type - 6 where type between 6 and 8") self.flushMod() def _onReviewEarlyFinished(self): # clean up buried cards self.resetAfterReviewEarly() # and go back to regular scheduler self.setupStandardScheduler() def _rebuildRevEarlyCount(self): # in the future it would be nice to skip the first x days of due cards self.revCount = self.s.scalar( self.cardLimit( "revActive", "revInactive", """ select count() from cards c where type = 1 and combinedDue > :now """), now=self.dueCutoff) def _fillRevEarlyQueue(self): if self.revCount and not self.revQueue: self.revQueue = self.s.all( self.cardLimit( "revActive", "revInactive", """ select id, factId from cards c where type = 1 and combinedDue > :lim order by combinedDue limit %d""" % self.queueLimit), lim=self.dueCutoff) self.revQueue.reverse() # Learn more ########################################################################## def setupLearnMoreScheduler(self): self.rebuildNewCount = self._rebuildLearnMoreCount self.updateNewCountToday = self._updateLearnMoreCountToday self.finishScheduler = self.setupStandardScheduler self.scheduler = "learnMore" def _rebuildLearnMoreCount(self): self.newCount = self.s.scalar( self.cardLimit( "newActive", "newInactive", "select count(*) from cards c where type = 2 " "and combinedDue < :lim"), lim=self.dueCutoff) self.spacedCards = [] def _updateLearnMoreCountToday(self): self.newCountToday = self.newCount # Cramming ########################################################################## def setupCramScheduler(self, active, order): self.getCardId = self._getCramCardId self.activeCramTags = active self.cramOrder = order self.rebuildNewCount = self._rebuildCramNewCount self.rebuildRevCount = self._rebuildCramCount self.rebuildFailedCount = self._rebuildFailedCramCount self.fillRevQueue = self._fillCramQueue self.fillFailedQueue = self._fillFailedCramQueue self.finishScheduler = self.setupStandardScheduler self.failedCramQueue = [] self.requeueCard = self._requeueCramCard self.cardQueue = self._cramCardQueue self.answerCard = self._answerCramCard self.spaceCards = self._spaceCramCards # reuse review early's code self.answerPreSave = self._cramPreSave self.cardLimit = self._cramCardLimit self.scheduler = "cram" def _cramPreSave(self, card, ease): # prevent it from appearing in next queue fill card.lastInterval = self.cramLastInterval card.type += 6 def _spaceCramCards(self, card): self.spacedFacts[card.factId] = time.time() + self.newSpacing def _answerCramCard(self, card, ease): self.cramLastInterval = card.lastInterval self._answerCard(card, ease) if ease == 1: self.failedCramQueue.insert(0, [card.id, card.factId]) def _getCramCardId(self, check=True): self.checkDay() self.fillQueues() if self.failedCardMax and self.failedSoonCount >= self.failedCardMax: return self.failedQueue[-1][0] # card due for review? if self.revNoSpaced(): return self.revQueue[-1][0] if self.failedQueue: return self.failedQueue[-1][0] if check: # collapse spaced cards before reverting back to old scheduler self.reset() return self.getCardId(False) # if we're in a custom scheduler, we may need to switch back if self.finishScheduler: self.finishScheduler() self.reset() return self.getCardId() def _cramCardQueue(self, card): if self.revQueue and self.revQueue[-1][0] == card.id: return 1 else: return 0 def _requeueCramCard(self, card, oldSuc): if self.cardQueue(card) == 1: self.revQueue.pop() else: self.failedCramQueue.pop() def _rebuildCramNewCount(self): self.newCount = 0 self.newCountToday = 0 def _cramCardLimit(self, active, inactive, sql): # inactive is (currently) ignored if isinstance(active, list): return sql.replace( "where", "where +c.id in " + ids2str(active) + " and") else: yes = parseTags(active) if yes: yids = tagIds(self.s, yes).values() return sql.replace( "where ", "where +c.id in (select cardId from cardTags where " "tagId in %s) and " % ids2str(yids)) else: return sql def _fillCramQueue(self): if self.revCount and not self.revQueue: self.revQueue = self.s.all(self.cardLimit( self.activeCramTags, "", """ select id, factId from cards c where type between 0 and 2 order by %s limit %s""" % (self.cramOrder, self.queueLimit))) self.revQueue.reverse() def _rebuildCramCount(self): self.revCount = self.s.scalar(self.cardLimit( self.activeCramTags, "", "select count(*) from cards c where type between 0 and 2")) def _rebuildFailedCramCount(self): self.failedSoonCount = len(self.failedCramQueue) def _fillFailedCramQueue(self): self.failedQueue = self.failedCramQueue # Getting the next card ########################################################################## def getCard(self, orm=True): "Return the next card object, or None." id = self.getCardId() if id: return self.cardFromId(id, orm) else: self.stopSession() def _getCardId(self, check=True): "Return the next due card id, or None." self.checkDay() self.fillQueues() self.updateNewCountToday() if self.failedQueue: # failed card due? if self.delay0: if self.failedQueue[-1][2] + self.delay0 < time.time(): return self.failedQueue[-1][0] # failed card queue too big? if (self.failedCardMax and self.failedSoonCount >= self.failedCardMax): return self.failedQueue[-1][0] # distribute new cards? if self.newNoSpaced() and self.timeForNewCard(): return self.getNewCard() # card due for review? if self.revNoSpaced(): return self.revQueue[-1][0] # new cards left? if self.newCountToday: id = self.getNewCard() if id: return id if check: # check for expired cards, or new day rollover self.updateCutoff() self.reset() return self.getCardId(check=False) # display failed cards early/last if not check and self.showFailedLast() and self.failedQueue: return self.failedQueue[-1][0] # if we're in a custom scheduler, we may need to switch back if self.finishScheduler: self.finishScheduler() self.reset() return self.getCardId() # Get card: helper functions ########################################################################## def _timeForNewCard(self): "True if it's time to display a new card when distributing." if not self.newCountToday: return False if self.newCardSpacing == NEW_CARDS_LAST: return False if self.newCardSpacing == NEW_CARDS_FIRST: return True # force review if there are very high priority cards if self.revQueue: if self.s.scalar( "select 1 from cards where id = :id and priority = 4", id = self.revQueue[-1][0]): return False if self.newCardModulus: return self._dailyStats.reps % self.newCardModulus == 0 else: return False def getNewCard(self): src = None if (self.spacedCards and self.spacedCards[0][0] < time.time()): # spaced card has expired src = 0 elif self.newQueue: # card left in new queue src = 1 elif self.spacedCards: # card left in spaced queue src = 0 else: # only cards spaced to another day left return if src == 0: cards = self.spacedCards[0][1] self.newFromCache = True return cards[0] else: self.newFromCache = False return self.newQueue[-1][0] def showFailedLast(self): return self.collapseTime or not self.delay0 def cardFromId(self, id, orm=False): "Given a card ID, return a card, and start the card timer." if orm: card = self.s.query(oldanki.cards.Card).get(id) if not card: return card.timerStopped = False else: card = oldanki.cards.Card() if not card.fromDB(self.s, id): return card.deck = self card.genFuzz() card.startTimer() return card # Answering a card ########################################################################## def _answerCard(self, card, ease): undoName = _("Answer Card") self.setUndoStart(undoName) now = time.time() # old state oldState = self.cardState(card) oldQueue = self.cardQueue(card) lastDelaySecs = time.time() - card.combinedDue lastDelay = lastDelaySecs / 86400.0 oldSuc = card.successive # update card details last = card.interval card.interval = self.nextInterval(card, ease) card.lastInterval = last if card.reps: # only update if card was not new card.lastDue = card.due card.due = self.nextDue(card, ease, oldState) card.isDue = 0 card.lastFactor = card.factor card.spaceUntil = 0 if not self.finishScheduler: # don't update factor in custom schedulers self.updateFactor(card, ease) # spacing self.spaceCards(card) # adjust counts for current card if ease == 1: if card.due < self.failedCutoff: self.failedSoonCount += 1 if oldQueue == 0: self.failedSoonCount -= 1 elif oldQueue == 1: self.revCount -= 1 else: self.newCount -= 1 # card stats oldanki.cards.Card.updateStats(card, ease, oldState) # update type & ensure past cutoff card.type = self.cardType(card) card.relativeDelay = card.type if ease != 1: card.due = max(card.due, self.dueCutoff+1) # allow custom schedulers to munge the card if self.answerPreSave: self.answerPreSave(card, ease) # save card.combinedDue = card.due card.toDB(self.s) # global/daily stats oldanki.stats.updateAllStats(self.s, self._globalStats, self._dailyStats, card, ease, oldState) # review history entry = CardHistoryEntry(card, ease, lastDelay) entry.writeSQL(self.s) self.modified = now # remove from queue self.requeueCard(card, oldSuc) # leech handling - we need to do this after the queue, as it may cause # a reset() isLeech = self.isLeech(card) if isLeech: self.handleLeech(card) runHook("cardAnswered", card.id, isLeech) self.setUndoEnd(undoName) def _spaceCards(self, card): new = time.time() + self.newSpacing self.s.statement(""" update cards set combinedDue = (case when type = 1 then combinedDue + 86400 * (case when interval*:rev < 1 then 0 else interval*:rev end) when type = 2 then :new end), modified = :now, isDue = 0 where id != :id and factId = :factId and combinedDue < :cut and type between 1 and 2""", id=card.id, now=time.time(), factId=card.factId, cut=self.dueCutoff, new=new, rev=self.revSpacing) # update local cache of seen facts self.spacedFacts[card.factId] = new def isLeech(self, card): no = card.noCount fmax = self.getInt('leechFails') if not fmax: return return ( # failed not card.successive and # greater than fail threshold no >= fmax and # at least threshold/2 reps since last time (fmax - no) % (max(fmax/2, 1)) == 0) def handleLeech(self, card): self.refreshSession() scard = self.cardFromId(card.id, True) tags = scard.fact.tags tags = addTags("Leech", tags) scard.fact.tags = canonifyTags(tags) scard.fact.setModified(textChanged=True, deck=self) self.updateFactTags([scard.fact.id]) self.s.flush() self.s.expunge(scard) if self.getBool('suspendLeeches'): self.suspendCards([card.id]) self.reset() self.refreshSession() # Interval management ########################################################################## def nextInterval(self, card, ease): "Return the next interval for CARD given EASE." delay = self._adjustedDelay(card, ease) return self._nextInterval(card, delay, ease) def _nextInterval(self, card, delay, ease): interval = card.interval factor = card.factor # if shown early if delay < 0: # FIXME: this should recreate lastInterval from interval / # lastFactor, or we lose delay information when reviewing early interval = max(card.lastInterval, card.interval + delay) if interval < self.midIntervalMin: interval = 0 delay = 0 # if interval is less than mid interval, use presets if ease == 1: interval *= self.delay2 if interval < self.hardIntervalMin: interval = 0 elif interval == 0: if ease == 2: interval = random.uniform(self.hardIntervalMin, self.hardIntervalMax) elif ease == 3: interval = random.uniform(self.midIntervalMin, self.midIntervalMax) elif ease == 4: interval = random.uniform(self.easyIntervalMin, self.easyIntervalMax) else: # if not cramming, boost initial 2 if (interval < self.hardIntervalMax and interval > 0.166): mid = (self.midIntervalMin + self.midIntervalMax) / 2.0 interval = mid / factor # multiply last interval by factor if ease == 2: interval = (interval + delay/4) * 1.2 elif ease == 3: interval = (interval + delay/2) * factor elif ease == 4: interval = (interval + delay) * factor * self.factorFour fuzz = random.uniform(0.95, 1.05) interval *= fuzz if self.maxScheduleTime: interval = min(interval, self.maxScheduleTime) return interval def nextIntervalStr(self, card, ease, short=False): "Return the next interval for CARD given EASE as a string." int = self.nextInterval(card, ease) return oldanki.utils.fmtTimeSpan(int*86400, short=short) def nextDue(self, card, ease, oldState): "Return time when CARD will expire given EASE." if ease == 1: # 600 is a magic value which means no bonus, and is used to ease # upgrades cram = self.scheduler == "cram" if (not cram and oldState == "mature" and self.delay1 and self.delay1 != 600): # user wants a bonus of 1+ days. put the failed cards at the # start of the future day, so that failures that day will come # after the waiting cards return self.failedCutoff + (self.delay1 - 1)*86400 else: due = 0 else: due = card.interval * 86400.0 return due + time.time() def updateFactor(self, card, ease): "Update CARD's factor based on EASE." card.lastFactor = card.factor if not card.reps: # card is new, inherit beginning factor card.factor = self.averageFactor if card.successive and not self.cardIsBeingLearnt(card): if ease == 1: card.factor -= 0.20 elif ease == 2: card.factor -= 0.15 if ease == 4: card.factor += 0.10 card.factor = max(1.3, card.factor) def _adjustedDelay(self, card, ease): "Return an adjusted delay value for CARD based on EASE." if self.cardIsNew(card): return 0 if card.reps and not card.successive: return 0 if card.combinedDue <= self.dueCutoff: return (self.dueCutoff - card.due) / 86400.0 else: return (self.dueCutoff - card.combinedDue) / 86400.0 def resetCards(self, ids): "Reset progress on cards in IDS." self.s.statement(""" update cards set interval = :new, lastInterval = 0, lastDue = 0, factor = 2.5, reps = 0, successive = 0, averageTime = 0, reviewTime = 0, youngEase0 = 0, youngEase1 = 0, youngEase2 = 0, youngEase3 = 0, youngEase4 = 0, matureEase0 = 0, matureEase1 = 0, matureEase2 = 0, matureEase3 = 0,matureEase4 = 0, yesCount = 0, noCount = 0, spaceUntil = 0, type = 2, relativeDelay = 2, combinedDue = created, modified = :now, due = created, isDue = 0 where id in %s""" % ids2str(ids), now=time.time(), new=0) if self.newCardOrder == NEW_CARDS_RANDOM: # we need to re-randomize now self.randomizeNewCards(ids) self.flushMod() self.refreshSession() def randomizeNewCards(self, cardIds=None): "Randomize 'due' on all new cards." now = time.time() query = "select distinct factId from cards where reps = 0" if cardIds: query += " and id in %s" % ids2str(cardIds) fids = self.s.column0(query) data = [{'fid': fid, 'rand': random.uniform(0, now), 'now': now} for fid in fids] self.s.statements(""" update cards set due = :rand + ordinal, combinedDue = :rand + ordinal, modified = :now where factId = :fid and relativeDelay = 2""", data) def orderNewCards(self): "Set 'due' to card creation time." self.s.statement(""" update cards set due = created, combinedDue = created, modified = :now where relativeDelay = 2""", now=time.time()) def rescheduleCards(self, ids, min, max): "Reset cards and schedule with new interval in days (min, max)." self.resetCards(ids) vals = [] for id in ids: r = random.uniform(min*86400, max*86400) vals.append({ 'id': id, 'due': r + time.time(), 'int': r / 86400.0, 't': time.time(), }) self.s.statements(""" update cards set interval = :int, due = :due, combinedDue = :due, reps = 1, successive = 1, yesCount = 1, firstAnswered = :t, type = 1, relativeDelay = 1, isDue = 0 where id = :id""", vals) self.flushMod() # Times ########################################################################## def nextDueMsg(self): next = self.earliestTime() if next: # all new cards except suspended newCount = self.newCardsDueBy(self.dueCutoff + 86400) newCardsTomorrow = min(newCount, self.newCardsPerDay) cards = self.cardsDueBy(self.dueCutoff + 86400) msg = _('''\ At this time tomorrow:
%(wait)s
%(new)s''') % { 'new': ngettext("There will be %d new card.", "There will be %d new cards.", newCardsTomorrow) % newCardsTomorrow, 'wait': ngettext("There will be %s review.", "There will be %s reviews.", cards) % cards, } if next > (self.dueCutoff+86400) and not newCardsTomorrow: msg = (_("The next review is in %s.") % self.earliestTimeStr()) else: msg = _("No cards are due.") return msg def earliestTime(self): """Return the time of the earliest card. This may be in the past if the deck is not finished. If the deck has no (enabled) cards, return None. Ignore new cards.""" earliestRev = self.s.scalar(self.cardLimit("revActive", "revInactive", """ select combinedDue from cards c where type = 1 order by combinedDue limit 1""")) earliestFail = self.s.scalar(self.cardLimit("revActive", "revInactive", """ select combinedDue+%d from cards c where type = 0 order by combinedDue limit 1""" % self.delay0)) if earliestRev and earliestFail: return min(earliestRev, earliestFail) elif earliestRev: return earliestRev else: return earliestFail def earliestTimeStr(self, next=None): """Return the relative time to the earliest card as a string.""" if next == None: next = self.earliestTime() if not next: return _("unknown") diff = next - time.time() return oldanki.utils.fmtTimeSpan(diff) def cardsDueBy(self, time): "Number of cards due at TIME. Ignore new cards" return self.s.scalar( self.cardLimit( "revActive", "revInactive", "select count(*) from cards c where type between 0 and 1 " "and combinedDue < :lim"), lim=time) def newCardsDueBy(self, time): "Number of new cards due at TIME." return self.s.scalar( self.cardLimit( "newActive", "newInactive", "select count(*) from cards c where type = 2 " "and combinedDue < :lim"), lim=time) def deckFinishedMsg(self): spaceSusp = "" c= self.spacedCardCount() if c: spaceSusp += ngettext( 'There is %d delayed card.', 'There are %d delayed cards.', c) % c c2 = self.hiddenCards() if c2: if spaceSusp: spaceSusp += "
" spaceSusp += _( "Some cards are inactive or suspended.") if spaceSusp: spaceSusp = "

" + spaceSusp return _('''\

Congratulations!

You have finished for now.

%(next)s %(spaceSusp)s
''') % { "next": self.nextDueMsg(), "spaceSusp": spaceSusp, } # Priorities ########################################################################## def updateAllPriorities(self, partial=False, dirty=True): "Update all card priorities if changed. Caller must .reset()" new = self.updateTagPriorities() if not partial: new = self.s.all("select id, priority as pri from tags") cids = self.s.column0( "select distinct cardId from cardTags where tagId in %s" % ids2str([x['id'] for x in new])) self.updatePriorities(cids, dirty=dirty) def updateTagPriorities(self): "Update priority setting on tags table." # make sure all priority tags exist for s in (self.lowPriority, self.medPriority, self.highPriority): tagIds(self.s, parseTags(s)) tags = self.s.all("select tag, id, priority from tags") tags = [(x[0].lower(), x[1], x[2]) for x in tags] up = {} for (type, pri) in ((self.lowPriority, 1), (self.medPriority, 3), (self.highPriority, 4)): for tag in parseTags(type.lower()): up[tag] = pri new = [] for (tag, id, pri) in tags: if tag in up and up[tag] != pri: new.append({'id': id, 'pri': up[tag]}) elif tag not in up and pri != 2: new.append({'id': id, 'pri': 2}) self.s.statements( "update tags set priority = :pri where id = :id", new) return new def updatePriorities(self, cardIds, suspend=[], dirty=True): "Update priorities for cardIds. Caller must .reset()." # any tags to suspend if suspend: ids = tagIds(self.s, suspend) self.s.statement( "update tags set priority = 0 where id in %s" % ids2str(ids.values())) if len(cardIds) > 1000: limit = "" else: limit = "and cardTags.cardId in %s" % ids2str(cardIds) cards = self.s.all(""" select cardTags.cardId, case when max(tags.priority) > 2 then max(tags.priority) when min(tags.priority) = 1 then 1 else 2 end from cardTags, tags where cardTags.tagId = tags.id %s group by cardTags.cardId""" % limit) if dirty: extra = ", modified = :m " else: extra = "" for pri in range(5): cs = [c[0] for c in cards if c[1] == pri] if cs: # catch review early & buried but not suspended self.s.statement(( "update cards set priority = :pri %s where id in %s " "and priority != :pri and priority >= -2") % ( extra, ids2str(cs)), pri=pri, m=time.time()) def updatePriority(self, card): "Update priority on a single card." self.s.flush() self.updatePriorities([card.id]) # Suspending ########################################################################## # when older clients are upgraded, we can remove the code which touches # priorities & isDue def suspendCards(self, ids): "Suspend cards. Caller must .reset()" self.startProgress() self.s.statement(""" update cards set type = relativeDelay - 3, priority = -3, modified = :t, isDue=0 where type >= 0 and id in %s""" % ids2str(ids), t=time.time()) self.flushMod() self.finishProgress() def unsuspendCards(self, ids): "Unsuspend cards. Caller must .reset()" self.startProgress() self.s.statement(""" update cards set type = relativeDelay, priority=0, modified=:t where type < 0 and id in %s""" % ids2str(ids), t=time.time()) self.updatePriorities(ids) self.flushMod() self.finishProgress() def buryFact(self, fact): "Bury all cards for fact until next session. Caller must .reset()" for card in fact.cards: if card.type in (0,1,2): card.priority = -2 card.type += 3 card.isDue = 0 self.flushMod() # Counts ########################################################################## def hiddenCards(self): "Assumes queue finished. True if some due cards have not been shown." return self.s.scalar(""" select 1 from cards where combinedDue < :now and type between 0 and 1 limit 1""", now=self.dueCutoff) def newCardsDoneToday(self): return (self._dailyStats.newEase0 + self._dailyStats.newEase1 + self._dailyStats.newEase2 + self._dailyStats.newEase3 + self._dailyStats.newEase4) def spacedCardCount(self): "Number of spaced cards." return self.s.scalar(""" select count(cards.id) from cards where combinedDue > :now and due < :now""", now=time.time()) def isEmpty(self): return not self.cardCount def matureCardCount(self): return self.s.scalar( "select count(id) from cards where interval >= :t ", t=MATURE_THRESHOLD) def youngCardCount(self): return self.s.scalar( "select count(id) from cards where interval < :t " "and reps != 0", t=MATURE_THRESHOLD) def newCountAll(self): "All new cards, including spaced." return self.s.scalar( "select count(id) from cards where relativeDelay = 2") def seenCardCount(self): return self.s.scalar( "select count(id) from cards where relativeDelay between 0 and 1") # Card predicates ########################################################################## def cardState(self, card): if self.cardIsNew(card): return "new" elif card.interval > MATURE_THRESHOLD: return "mature" return "young" def cardIsNew(self, card): "True if a card has never been seen before." return card.reps == 0 def cardIsBeingLearnt(self, card): "True if card should use present intervals." return card.lastInterval < 7 def cardIsYoung(self, card): "True if card is not new and not mature." return (not self.cardIsNew(card) and not self.cardIsMature(card)) def cardIsMature(self, card): return card.interval >= MATURE_THRESHOLD # Stats ########################################################################## def getStats(self, short=False): "Return some commonly needed stats." stats = oldanki.stats.getStats(self.s, self._globalStats, self._dailyStats) # add scheduling related stats stats['new'] = self.newCountToday stats['failed'] = self.failedSoonCount stats['rev'] = self.revCount if stats['dAverageTime']: stats['timeLeft'] = oldanki.utils.fmtTimeSpan( self.getETA(stats), pad=0, point=1, short=short) else: stats['timeLeft'] = _("Unknown") return stats def getETA(self, stats): # rev + new cards first, account for failures count = stats['rev'] + stats['new'] count *= 1 + stats['gYoungNo%'] / 100.0 left = count * stats['dAverageTime'] # failed - higher time per card for higher amount of cards failedBaseMulti = 1.5 failedMod = 0.07 failedBaseCount = 20 factor = (failedBaseMulti + (failedMod * (stats['failed'] - failedBaseCount))) left += stats['failed'] * stats['dAverageTime'] * factor return left # Facts ########################################################################## def newFact(self, model=None): "Return a new fact with the current model." if model is None: model = self.currentModel return oldanki.facts.Fact(model) def addFact(self, fact, reset=True): "Add a fact to the deck. Return list of new cards." if not fact.model: fact.model = self.currentModel # validate fact.assertValid() fact.assertUnique(self.s) # check we have card models available cms = self.availableCardModels(fact) if not cms: return None # proceed cards = [] self.s.save(fact) # update field cache self.factCount += 1 self.flushMod() isRandom = self.newCardOrder == NEW_CARDS_RANDOM if isRandom: due = random.uniform(0, time.time()) t = time.time() for cardModel in cms: created = fact.created + 0.00001*cardModel.ordinal card = oldanki.cards.Card(fact, cardModel, created) if isRandom: card.due = due card.combinedDue = due self.flushMod() cards.append(card) # update card q/a fact.setModified(True, self) self.updateFactTags([fact.id]) # this will call reset() which will update counts self.updatePriorities([c.id for c in cards]) # keep track of last used tags for convenience self.lastTags = fact.tags self.flushMod() if reset: self.reset() return fact def availableCardModels(self, fact, checkActive=True): "List of active card models that aren't empty for FACT." models = [] for cardModel in fact.model.cardModels: if cardModel.active or not checkActive: ok = True for (type, format) in [("q", cardModel.qformat), ("a", cardModel.aformat)]: # compat format = re.sub("%\((.+?)\)s", "{{\\1}}", format) empty = {} local = {}; local.update(fact) local['tags'] = u"" local['Tags'] = u"" local['cardModel'] = u"" local['modelName'] = u"" for k in local.keys(): empty[k] = u"" empty["text:"+k] = u"" local["text:"+k] = local[k] empty['tags'] = "" local['tags'] = fact.tags try: if (render(format, local) == render(format, empty)): ok = False break except (KeyError, TypeError, ValueError): ok = False break if ok or type == "a" and cardModel.allowEmptyAnswer: models.append(cardModel) return models def addCards(self, fact, cardModelIds): "Caller must flush first, flushMod after, rebuild priorities." ids = [] for cardModel in self.availableCardModels(fact, False): if cardModel.id not in cardModelIds: continue if self.s.scalar(""" select count(id) from cards where factId = :fid and cardModelId = :cmid""", fid=fact.id, cmid=cardModel.id) == 0: # enough for 10 card models assuming 0.00001 timer precision card = oldanki.cards.Card( fact, cardModel, fact.created+0.0001*cardModel.ordinal) self.updateCardTags([card.id]) self.updatePriority(card) self.cardCount += 1 self.newCount += 1 ids.append(card.id) if ids: fact.setModified(textChanged=True, deck=self) self.setModified() return ids def factIsInvalid(self, fact): "True if existing fact is invalid. Returns the error." try: fact.assertValid() fact.assertUnique(self.s) except FactInvalidError, e: return e def factUseCount(self, factId): "Return number of cards referencing a given fact id." return self.s.scalar("select count(id) from cards where factId = :id", id=factId) def deleteFact(self, factId): "Delete a fact. Removes any associated cards. Don't flush." self.s.flush() # remove any remaining cards self.s.statement("insert into cardsDeleted select id, :time " "from cards where factId = :factId", time=time.time(), factId=factId) self.s.statement( "delete from cards where factId = :id", id=factId) # and then the fact self.deleteFacts([factId]) self.setModified() def deleteFacts(self, ids): "Bulk delete facts by ID; don't touch cards. Caller must .reset()." if not ids: return self.s.flush() now = time.time() strids = ids2str(ids) self.s.statement("delete from facts where id in %s" % strids) self.s.statement("delete from fields where factId in %s" % strids) data = [{'id': id, 'time': now} for id in ids] self.s.statements("insert into factsDeleted values (:id, :time)", data) self.setModified() def deleteDanglingFacts(self): "Delete any facts without cards. Return deleted ids." ids = self.s.column0(""" select facts.id from facts where facts.id not in (select distinct factId from cards)""") self.deleteFacts(ids) return ids def previewFact(self, oldFact, cms=None): "Duplicate fact and generate cards for preview. Don't add to deck." # check we have card models available if cms is None: cms = self.availableCardModels(oldFact, checkActive=True) if not cms: return [] fact = self.cloneFact(oldFact) # proceed cards = [] for cardModel in cms: card = oldanki.cards.Card(fact, cardModel) cards.append(card) fact.setModified(textChanged=True, deck=self, media=False) return cards def cloneFact(self, oldFact): "Copy fact into new session." model = self.s.query(Model).get(oldFact.model.id) fact = self.newFact(model) for field in fact.fields: fact[field.name] = oldFact[field.name] fact.tags = oldFact.tags return fact # Cards ########################################################################## def deleteCard(self, id): "Delete a card given its id. Delete any unused facts. Don't flush." self.deleteCards([id]) def deleteCards(self, ids): "Bulk delete cards by ID. Caller must .reset()" if not ids: return self.s.flush() now = time.time() strids = ids2str(ids) self.startProgress() # grab fact ids factIds = self.s.column0("select factId from cards where id in %s" % strids) # drop from cards self.s.statement("delete from cards where id in %s" % strids) # note deleted data = [{'id': id, 'time': now} for id in ids] self.s.statements("insert into cardsDeleted values (:id, :time)", data) # gather affected tags tags = self.s.column0( "select tagId from cardTags where cardId in %s" % strids) # delete self.s.statement("delete from cardTags where cardId in %s" % strids) # find out if they're used by anything else unused = [] for tag in tags: if not self.s.scalar( "select 1 from cardTags where tagId = :d limit 1", d=tag): unused.append(tag) # delete unused self.s.statement("delete from tags where id in %s and priority = 2" % ids2str(unused)) # remove any dangling facts self.deleteDanglingFacts() self.refreshSession() self.flushMod() self.finishProgress() # Models ########################################################################## def addModel(self, model): if model not in self.models: self.models.append(model) self.currentModel = model self.flushMod() def deleteModel(self, model): "Delete MODEL, and all its cards/facts. Caller must .reset()." if self.s.scalar("select count(id) from models where id=:id", id=model.id): # delete facts/cards self.currentModel self.deleteCards(self.s.column0(""" select cards.id from cards, facts where facts.modelId = :id and facts.id = cards.factId""", id=model.id)) # then the model self.models.remove(model) self.s.delete(model) self.s.flush() if self.currentModel == model: self.currentModel = self.models[0] self.s.statement("insert into modelsDeleted values (:id, :time)", id=model.id, time=time.time()) self.flushMod() self.refreshSession() self.setModified() def modelUseCount(self, model): "Return number of facts using model." return self.s.scalar("select count(facts.modelId) from facts " "where facts.modelId = :id", id=model.id) def deleteEmptyModels(self): for model in self.models: if not self.modelUseCount(model): self.deleteModel(model) def rebuildCSS(self): # css for all fields def _genCSS(prefix, row): (id, fam, siz, col, align, rtl, pre) = row t = "" if fam: t += 'font-family:"%s";' % toPlatformFont(fam) if siz: t += 'font-size:%dpx;' % siz if col: t += 'color:%s;' % col if rtl == "rtl": t += "direction:rtl;unicode-bidi:embed;" if pre: t += "white-space:pre-wrap;" if align != -1: if align == 0: align = "center" elif align == 1: align = "left" else: align = "right" t += 'text-align:%s;' % align if t: t = "%s%s {%s}\n" % (prefix, hexifyID(id), t) return t css = "".join([_genCSS(".fm", row) for row in self.s.all(""" select id, quizFontFamily, quizFontSize, quizFontColour, -1, features, editFontFamily from fieldModels""")]) cardRows = self.s.all(""" select id, null, null, null, questionAlign, 0, 0 from cardModels""") css += "".join([_genCSS("#cmq", row) for row in cardRows]) css += "".join([_genCSS("#cma", row) for row in cardRows]) css += "".join([".cmb%s {background:%s;}\n" % (hexifyID(row[0]), row[1]) for row in self.s.all(""" select id, lastFontColour from cardModels""")]) self.css = css self.setVar("cssCache", css, mod=False) self.addHexCache() return css def addHexCache(self): ids = self.s.column0(""" select id from fieldModels union select id from cardModels union select id from models""") cache = {} for id in ids: cache[id] = hexifyID(id) self.setVar("hexCache", simplejson.dumps(cache), mod=False) def copyModel(self, oldModel): "Add a new model to DB based on MODEL." m = Model(_("%s copy") % oldModel.name) for f in oldModel.fieldModels: f = f.copy() m.addFieldModel(f) for c in oldModel.cardModels: c = c.copy() m.addCardModel(c) for attr in ("tags", "spacing", "initialSpacing"): setattr(m, attr, getattr(oldModel, attr)) self.addModel(m) return m def changeModel(self, factIds, newModel, fieldMap, cardMap): "Caller must .reset()" self.s.flush() fids = ids2str(factIds) changed = False # field remapping if fieldMap: changed = True self.startProgress(len(fieldMap)+2) seen = {} for (old, new) in fieldMap.items(): self.updateProgress(_("Changing fields...")) seen[new] = 1 if new: # can rename self.s.statement(""" update fields set fieldModelId = :new, ordinal = :ord where fieldModelId = :old and factId in %s""" % fids, new=new.id, ord=new.ordinal, old=old.id) else: # no longer used self.s.statement(""" delete from fields where factId in %s and fieldModelId = :id""" % fids, id=old.id) # new for field in newModel.fieldModels: self.updateProgress() if field not in seen: d = [{'id': genID(), 'fid': f, 'fmid': field.id, 'ord': field.ordinal} for f in factIds] self.s.statements(''' insert into fields (id, factId, fieldModelId, ordinal, value) values (:id, :fid, :fmid, :ord, "")''', d) # fact modtime self.updateProgress() self.s.statement(""" update facts set modified = :t, modelId = :id where id in %s""" % fids, t=time.time(), id=newModel.id) self.finishProgress() # template remapping self.startProgress(len(cardMap)+4) toChange = [] self.updateProgress(_("Changing cards...")) for (old, new) in cardMap.items(): if not new: # delete self.s.statement(""" delete from cards where cardModelId = :cid and factId in %s""" % fids, cid=old.id) elif old != new: # gather ids so we can rename x->y and y->x ids = self.s.column0(""" select id from cards where cardModelId = :id and factId in %s""" % fids, id=old.id) toChange.append((new, ids)) for (new, ids) in toChange: self.updateProgress() self.s.statement(""" update cards set cardModelId = :new, ordinal = :ord where id in %s""" % ids2str(ids), new=new.id, ord=new.ordinal) self.updateProgress() self.updateCardQACacheFromIds(factIds, type="facts") self.flushMod() self.updateProgress() cardIds = self.s.column0( "select id from cards where factId in %s" % ids2str(factIds)) self.updateCardTags(cardIds) self.updateProgress() self.updatePriorities(cardIds) self.updateProgress() self.refreshSession() self.finishProgress() # Fields ########################################################################## def allFields(self): "Return a list of all possible fields across all models." return self.s.column0("select distinct name from fieldmodels") def deleteFieldModel(self, model, field): self.startProgress() self.s.statement("delete from fields where fieldModelId = :id", id=field.id) self.s.statement("update facts set modified = :t where modelId = :id", id=model.id, t=time.time()) model.fieldModels.remove(field) # update q/a formats for cm in model.cardModels: types = ("%%(%s)s" % field.name, "%%(text:%s)s" % field.name, # new style "<<%s>>" % field.name, "<>" % field.name) for t in types: for fmt in ('qformat', 'aformat'): setattr(cm, fmt, getattr(cm, fmt).replace(t, "")) self.updateCardsFromModel(model) model.setModified() self.flushMod() self.finishProgress() def addFieldModel(self, model, field): "Add FIELD to MODEL and update cards." model.addFieldModel(field) # commit field to disk self.s.flush() self.s.statement(""" insert into fields (factId, fieldModelId, ordinal, value) select facts.id, :fmid, :ordinal, "" from facts where facts.modelId = :mid""", fmid=field.id, mid=model.id, ordinal=field.ordinal) # ensure facts are marked updated self.s.statement(""" update facts set modified = :t where modelId = :mid""" , t=time.time(), mid=model.id) model.setModified() self.flushMod() def renameFieldModel(self, model, field, newName): "Change FIELD's name in MODEL and update FIELD in all facts." for cm in model.cardModels: types = ("%%(%s)s", "%%(text:%s)s", # new styles "{{%s}}", "{{text:%s}}", "{{#%s}}", "{{^%s}}", "{{/%s}}") for t in types: for fmt in ('qformat', 'aformat'): setattr(cm, fmt, getattr(cm, fmt).replace(t%field.name, t%newName)) field.name = newName model.setModified() self.flushMod() def fieldModelUseCount(self, fieldModel): "Return the number of cards using fieldModel." return self.s.scalar(""" select count(id) from fields where fieldModelId = :id and value != "" """, id=fieldModel.id) def rebuildFieldOrdinals(self, modelId, ids): """Update field ordinal for all fields given field model IDS. Caller must update model modtime.""" self.s.flush() strids = ids2str(ids) self.s.statement(""" update fields set ordinal = (select ordinal from fieldModels where id = fieldModelId) where fields.fieldModelId in %s""" % strids) # dirty associated facts self.s.statement(""" update facts set modified = strftime("%s", "now") where modelId = :id""", id=modelId) self.flushMod() # Card models ########################################################################## def cardModelUseCount(self, cardModel): "Return the number of cards using cardModel." return self.s.scalar(""" select count(id) from cards where cardModelId = :id""", id=cardModel.id) def deleteCardModel(self, model, cardModel): "Delete all cards that use CARDMODEL from the deck." cards = self.s.column0("select id from cards where cardModelId = :id", id=cardModel.id) self.deleteCards(cards) model.cardModels.remove(cardModel) model.setModified() self.flushMod() def updateCardsFromModel(self, model, dirty=True): "Update all card question/answer when model changes." ids = self.s.all(""" select cards.id, cards.cardModelId, cards.factId, facts.modelId from cards, facts where cards.factId = facts.id and facts.modelId = :id""", id=model.id) if not ids: return self.updateCardQACache(ids, dirty) def updateCardsFromFactIds(self, ids, dirty=True): "Update all card question/answer when model changes." ids = self.s.all(""" select cards.id, cards.cardModelId, cards.factId, facts.modelId from cards, facts where cards.factId = facts.id and facts.id in %s""" % ids2str(ids)) if not ids: return self.updateCardQACache(ids, dirty) def updateCardQACacheFromIds(self, ids, type="cards"): "Given a list of card or fact ids, update q/a cache." if type == "facts": # convert to card ids ids = self.s.column0( "select id from cards where factId in %s" % ids2str(ids)) rows = self.s.all(""" select c.id, c.cardModelId, f.id, f.modelId from cards as c, facts as f where c.factId = f.id and c.id in %s""" % ids2str(ids)) self.updateCardQACache(rows) def updateCardQACache(self, ids, dirty=True): "Given a list of (cardId, cardModelId, factId, modId), update q/a cache." # we don't need the q/a cache for upgrading return if dirty: mod = ", modified = %f" % time.time() else: mod = "" # tags cids = ids2str([x[0] for x in ids]) tags = dict([(x[0], x[1:]) for x in self.splitTagsList( where="and cards.id in %s" % cids)]) facts = {} # fields for k, g in groupby(self.s.all(""" select fields.factId, fieldModels.name, fieldModels.id, fields.value from fields, fieldModels where fields.factId in %s and fields.fieldModelId = fieldModels.id order by fields.factId""" % ids2str([x[2] for x in ids])), itemgetter(0)): facts[k] = dict([(r[1], (r[2], r[3])) for r in g]) # card models cms = {} for c in self.s.query(CardModel).all(): cms[c.id] = c pend = [formatQA(cid, mid, facts[fid], tags[cid], cms[cmid], self) for (cid, cmid, fid, mid) in ids] if pend: # find existing media references files = {} for txt in self.s.column0( "select question || answer from cards where id in %s" % cids): for f in mediaFiles(txt): if f in files: files[f] -= 1 else: files[f] = -1 # determine ref count delta for p in pend: for type in ("question", "answer"): txt = p[type] for f in mediaFiles(txt): if f in files: files[f] += 1 else: files[f] = 1 # update references - this could be more efficient for (f, cnt) in files.items(): if not cnt: continue updateMediaCount(self, f, cnt) # update q/a self.s.execute(""" update cards set question = :question, answer = :answer %s where id = :id""" % mod, pend) # update fields cache self.updateFieldCache(facts.keys()) if dirty: self.flushMod() def updateFieldCache(self, fids): "Add stripped HTML cache for sorting/searching." try: all = self.s.all( ("select factId, group_concat(value, ' ') from fields " "where factId in %s group by factId") % ids2str(fids)) except: # older sqlite doesn't support group_concat. this code taken from # the wm port all=[] for factId in fids: values=self.s.all("select value from fields where value is not NULL and factId=%(factId)i" % {"factId": factId}) value_list=[] for row in values: value_list.append(row[0]) concatenated_values=' '.join(value_list) all.append([factId, concatenated_values]) r = [] from oldanki.utils import stripHTMLMedia for a in all: r.append({'id':a[0], 'v':stripHTMLMedia(a[1])}) self.s.statements( "update facts set spaceUntil=:v where id=:id", r) def rebuildCardOrdinals(self, ids): "Update all card models in IDS. Caller must update model modtime." self.s.flush() strids = ids2str(ids) self.s.statement(""" update cards set ordinal = (select ordinal from cardModels where id = cardModelId), modified = :now where cardModelId in %s""" % strids, now=time.time()) self.flushMod() def changeCardModel(self, cardIds, newCardModelId): self.s.statement(""" update cards set cardModelId = :newId where id in %s""" % ids2str(cardIds), newId=newCardModelId) self.updateCardQACacheFromIds(cardIds) self.flushMod() # Tags: querying ########################################################################## def tagsList(self, where="", priority=", cards.priority", kwargs={}): "Return a list of (cardId, allTags, priority)" return self.s.all(""" select cards.id, facts.tags || " " || models.tags || " " || cardModels.name %s from cards, facts, models, cardModels where cards.factId == facts.id and facts.modelId == models.id and cards.cardModelId = cardModels.id %s""" % (priority, where), **kwargs) return self.s.all(""" select cards.id, facts.tags || " " || models.tags || " " || cardModels.name %s from cards, facts, models, cardModels where cards.factId == facts.id and facts.modelId == models.id and cards.cardModelId = cardModels.id %s""" % (priority, where)) def splitTagsList(self, where=""): return self.s.all(""" select cards.id, facts.tags, models.tags, cardModels.name from cards, facts, models, cardModels where cards.factId == facts.id and facts.modelId == models.id and cards.cardModelId = cardModels.id %s""" % where) def cardsWithNoTags(self): return self.s.column0(""" select cards.id from cards, facts where facts.tags = "" and cards.factId = facts.id""") def cardsWithTags(self, tagStr, search="and"): tagIds = [] # get ids for tag in tagStr.split(" "): tag = tag.replace("*", "%") if "%" in tag: ids = self.s.column0( "select id from tags where tag like :tag", tag=tag) if search == "and" and not ids: return [] tagIds.append(ids) else: id = self.s.scalar( "select id from tags where tag = :tag", tag=tag) if search == "and" and not id: return [] tagIds.append(id) # search for any if search == "or": return self.s.column0( "select cardId from cardTags where tagId in %s" % ids2str(tagIds)) else: # search for all l = [] for ids in tagIds: if isinstance(ids, types.ListType): l.append("select cardId from cardTags where tagId in %s" % ids2str(ids)) else: l.append("select cardId from cardTags where tagId = %d" % ids) q = " intersect ".join(l) return self.s.column0(q) def allTags(self): return self.s.column0("select tag from tags order by tag") def allTags_(self, where=""): t = self.s.column0("select tags from facts %s" % where) t += self.s.column0("select tags from models") t += self.s.column0("select name from cardModels") return sorted(list(set(parseTags(joinTags(t))))) def allUserTags(self): return sorted(list(set(parseTags(joinTags(self.s.column0( "select tags from facts")))))) def factTags(self, ids): return self.s.all(""" select id, tags from facts where id in %s""" % ids2str(ids)) # Tags: caching ########################################################################## def updateFactTags(self, factIds): self.updateCardTags(self.s.column0( "select id from cards where factId in %s" % ids2str(factIds))) def updateModelTags(self, modelId): self.updateCardTags(self.s.column0(""" select cards.id from cards, facts where cards.factId = facts.id and facts.modelId = :id""", id=modelId)) def updateCardTags(self, cardIds=None): self.s.flush() if cardIds is None: self.s.statement("delete from cardTags") self.s.statement("delete from tags") tids = tagIds(self.s, self.allTags_()) rows = self.splitTagsList() else: self.s.statement("delete from cardTags where cardId in %s" % ids2str(cardIds)) fids = ids2str(self.s.column0( "select factId from cards where id in %s" % ids2str(cardIds))) tids = tagIds(self.s, self.allTags_( where="where id in %s" % fids)) rows = self.splitTagsList( where="and facts.id in %s" % fids) d = [] for (id, fact, model, templ) in rows: for tag in parseTags(fact): d.append({"cardId": id, "tagId": tids[tag.lower()], "src": 0}) for tag in parseTags(model): d.append({"cardId": id, "tagId": tids[tag.lower()], "src": 1}) for tag in parseTags(templ): d.append({"cardId": id, "tagId": tids[tag.lower()], "src": 2}) if d: self.s.statements(""" insert into cardTags (cardId, tagId, src) values (:cardId, :tagId, :src)""", d) self.s.execute( "delete from tags where priority = 2 and id not in "+ "(select distinct tagId from cardTags)") def updateTagsForModel(self, model): cards = self.s.all(""" select cards.id, cards.cardModelId from cards, facts where facts.modelId = :m and cards.factId = facts.id""", m=model.id) cardIds = [x[0] for x in cards] factIds = self.s.column0(""" select facts.id from facts where facts.modelId = :m""", m=model.id) cmtags = " ".join([cm.name for cm in model.cardModels]) tids = tagIds(self.s, parseTags(model.tags) + parseTags(cmtags)) self.s.statement(""" delete from cardTags where cardId in %s and src in (1, 2)""" % ids2str(cardIds)) d = [] for tag in parseTags(model.tags): for id in cardIds: d.append({"cardId": id, "tagId": tids[tag.lower()], "src": 1}) cmtags = {} for cm in model.cardModels: cmtags[cm.id] = parseTags(cm.name) for c in cards: for tag in cmtags[c[1]]: d.append({"cardId": c[0], "tagId": tids[tag.lower()], "src": 2}) if d: self.s.statements(""" insert into cardTags (cardId, tagId, src) values (:cardId, :tagId, :src)""", d) self.s.statement(""" delete from tags where id not in (select distinct tagId from cardTags) and priority = 2 """) # Tags: adding/removing in bulk ########################################################################## # these could be optimized to use the tag cache in the future def addTags(self, ids, tags): "Add tags in bulk. Caller must .reset()" self.startProgress() tlist = self.factTags(ids) newTags = parseTags(tags) now = time.time() pending = [] for (id, tags) in tlist: oldTags = parseTags(tags) tmpTags = list(set(oldTags + newTags)) if tmpTags != oldTags: pending.append( {'id': id, 'now': now, 'tags': " ".join(tmpTags)}) self.s.statements(""" update facts set tags = :tags, modified = :now where id = :id""", pending) factIds = [c['id'] for c in pending] cardIds = self.s.column0( "select id from cards where factId in %s" % ids2str(factIds)) self.updateCardQACacheFromIds(factIds, type="facts") self.updateCardTags(cardIds) self.updatePriorities(cardIds) self.flushMod() self.finishProgress() self.refreshSession() def deleteTags(self, ids, tags): "Delete tags in bulk. Caller must .reset()" self.startProgress() tlist = self.factTags(ids) newTags = parseTags(tags) now = time.time() pending = [] for (id, tags) in tlist: oldTags = parseTags(tags) tmpTags = oldTags[:] for tag in newTags: try: tmpTags.remove(tag) except ValueError: pass if tmpTags != oldTags: pending.append( {'id': id, 'now': now, 'tags': " ".join(tmpTags)}) self.s.statements(""" update facts set tags = :tags, modified = :now where id = :id""", pending) factIds = [c['id'] for c in pending] cardIds = self.s.column0( "select id from cards where factId in %s" % ids2str(factIds)) self.updateCardQACacheFromIds(factIds, type="facts") self.updateCardTags(cardIds) self.updatePriorities(cardIds) self.flushMod() self.finishProgress() self.refreshSession() # Find ########################################################################## def allFMFields(self, tolower=False): fields = [] try: fields = self.s.column0( "select distinct name from fieldmodels order by name") except: fields = [] if tolower is True: for i, v in enumerate(fields): fields[i] = v.lower() return fields def _parseQuery(self, query): tokens = [] res = [] allowedfields = self.allFMFields(True) def addSearchFieldToken(field, value, isNeg, filter): if field.lower() in allowedfields: res.append((field + ':' + value, isNeg, SEARCH_FIELD, filter)) elif field in ['question', 'answer']: res.append((field + ':' + value, isNeg, SEARCH_QA, filter)) else: for p in phraselog: res.append((p['value'], p['is_neg'], p['type'], p['filter'])) # break query into words or phraselog # an extra space is added so the loop never ends in the middle # completing a token for match in re.findall( r'(-)?\'(([^\'\\]|\\.)*)\'|(-)?"(([^"\\]|\\.)*)"|(-)?([^ ]+)|([ ]+)', query + ' '): type = ' ' if match[1]: type = "'" elif match[4]: type = '"' value = (match[1] or match[4] or match[7]) isNeg = (match[0] == '-' or match[3] == '-' or match[6] == '-') tokens.append({'type': type, 'value': value, 'is_neg': isNeg, 'filter': ('wb' if type == "'" else 'none')}) intoken = isNeg = False field = '' #name of the field for field related commands phraselog = [] #log of phrases in case potential command is not a commad for c, token in enumerate(tokens): doprocess = True # only look for commands when this is true #prevent cases such as "field" : value as being processed as a command if len(token['value']) == 0: if intoken is True and type == SEARCH_FIELD and field: #case: fieldname: any thing here check for existance of fieldname addSearchFieldToken(field, '*', isNeg, 'none') phraselog = [] # reset phrases since command is completed intoken = doprocess = False if intoken is True: if type == SEARCH_FIELD_EXISTS: #case: field:"value" res.append((token['value'], isNeg, type, 'none')) intoken = doprocess = False elif type == SEARCH_FIELD and field: #case: fieldname:"value" addSearchFieldToken( field, token['value'], isNeg, token['filter']) intoken = doprocess = False elif type == SEARCH_FIELD and not field: #case: "fieldname":"name" or "field" anything if token['value'].startswith(":") and len(phraselog) == 1: #we now know a colon is next, so mark it as field # and keep looking for the value field = phraselog[0]['value'] parts = token['value'].split(':', 1) phraselog.append( {'value': token['value'], 'is_neg': False, 'type': SEARCH_PHRASE, 'filter': token['filter']}) if parts[1]: #value is included with the :, so wrap it up addSearchFieldToken(field, parts[1], isNeg, 'none') intoken = doprocess = False doprocess = False else: #case: "fieldname"string/"fieldname"tag:name intoken = False if intoken is False and doprocess is False: #command has been fully processed phraselog = [] # reset phraselog, since we used it for a command if intoken is False: #include any non-command related phrases in the query for p in phraselog: res.append( (p['value'], p['is_neg'], p['type'], p['filter'])) phraselog = [] if intoken is False and doprocess is True: field = '' isNeg = token['is_neg'] if token['value'].startswith("tag:"): token['value'] = token['value'][4:] type = SEARCH_TAG elif token['value'].startswith("is:"): token['value'] = token['value'][3:].lower() type = SEARCH_TYPE elif token['value'].startswith("fid:") and len(token['value']) > 4: dec = token['value'][4:] try: int(dec) token['value'] = token['value'][4:] except: try: for d in dec.split(","): int(d) token['value'] = token['value'][4:] except: token['value'] = "0" type = SEARCH_FID elif token['value'].startswith("card:"): token['value'] = token['value'][5:] type = SEARCH_CARD elif token['value'].startswith("show:"): token['value'] = token['value'][5:].lower() type = SEARCH_DISTINCT elif token['value'].startswith("field:"): type = SEARCH_FIELD_EXISTS parts = token['value'][6:].split(':', 1) field = parts[0] if len(parts) == 1 and parts[0]: token['value'] = parts[0] elif len(parts) == 1 and not parts[0]: intoken = True else: type = SEARCH_FIELD intoken = True parts = token['value'].split(':', 1) phraselog.append( {'value': token['value'], 'is_neg': isNeg, 'type': SEARCH_PHRASE, 'filter': token['filter']}) if len(parts) == 2 and parts[0]: field = parts[0] if parts[1]: #simple fieldname:value case - no need to look for more data addSearchFieldToken(field, parts[1], isNeg, 'none') intoken = doprocess = False if intoken is False: phraselog = [] if intoken is False and doprocess is True: res.append((token['value'], isNeg, type, token['filter'])) return res def findCards(self, query): (q, cmquery, showdistinct, filters, args) = self.findCardsWhere(query) (factIdList, cardIdList) = self.findCardsMatchingFilters(filters) query = "select id from cards" hasWhere = False if q: query += " where " + q hasWhere = True if cmquery['pos'] or cmquery['neg']: if hasWhere is False: query += " where " hasWhere = True else: query += " and " if cmquery['pos']: query += (" factId in(select distinct factId from cards "+ "where id in (" + cmquery['pos'] + ")) ") query += " and id in(" + cmquery['pos'] + ") " if cmquery['neg']: query += (" factId not in(select distinct factId from "+ "cards where id in (" + cmquery['neg'] + ")) ") if factIdList is not None: if hasWhere is False: query += " where " hasWhere = True else: query += " and " query += " factId IN %s" % ids2str(factIdList) if cardIdList is not None: if hasWhere is False: query += " where " hasWhere = True else: query += " and " query += " id IN %s" % ids2str(cardIdList) if showdistinct: query += " group by factId" #print query, args return self.s.column0(query, **args) def findCardsWhere(self, query): (tquery, fquery, qquery, fidquery, cmquery, sfquery, qaquery, showdistinct, filters, args) = self._findCards(query) q = "" x = [] if tquery: x.append(" id in (%s)" % tquery) if fquery: x.append(" factId in (%s)" % fquery) if qquery: x.append(" id in (%s)" % qquery) if fidquery: x.append(" id in (%s)" % fidquery) if sfquery: x.append(" factId in (%s)" % sfquery) if qaquery: x.append(" id in (%s)" % qaquery) if x: q += " and ".join(x) return q, cmquery, showdistinct, filters, args def findCardsMatchingFilters(self, filters): factFilters = [] fieldFilters = {} cardFilters = {} factFilterMatches = [] fieldFilterMatches = [] cardFilterMatches = [] if (len(filters) > 0): for filter in filters: if filter['scope'] == 'fact': regexp = re.compile( r'\b' + re.escape(filter['value']) + r'\b', flags=re.I) factFilters.append( {'value': filter['value'], 'regexp': regexp, 'is_neg': filter['is_neg']}) if filter['scope'] == 'field': fieldName = filter['field'].lower() if (fieldName in fieldFilters) is False: fieldFilters[fieldName] = [] regexp = re.compile( r'\b' + re.escape(filter['value']) + r'\b', flags=re.I) fieldFilters[fieldName].append( {'value': filter['value'], 'regexp': regexp, 'is_neg': filter['is_neg']}) if filter['scope'] == 'card': fieldName = filter['field'].lower() if (fieldName in cardFilters) is False: cardFilters[fieldName] = [] regexp = re.compile(r'\b' + re.escape(filter['value']) + r'\b', flags=re.I) cardFilters[fieldName].append( {'value': filter['value'], 'regexp': regexp, 'is_neg': filter['is_neg']}) if len(factFilters) > 0: fquery = '' args = {} for filter in factFilters: c = len(args) if fquery: if filter['is_neg']: fquery += " except " else: fquery += " intersect " elif filter['is_neg']: fquery += "select id from fields except " value = filter['value'].replace("*", "%") args["_ff_%d" % c] = "%"+value+"%" fquery += ( "select id from fields where value like "+ ":_ff_%d escape '\\'" % c) rows = self.s.execute( 'select factId, value from fields where id in (' + fquery + ')', args) while (1): row = rows.fetchone() if row is None: break doesMatch = False for filter in factFilters: res = filter['regexp'].search(row[1]) if ((filter['is_neg'] is False and res) or (filter['is_neg'] is True and res is None)): factFilterMatches.append(row[0]) if len(fieldFilters) > 0: sfquery = '' args = {} for field, filters in fieldFilters.iteritems(): for filter in filters: c = len(args) if sfquery: if filter['is_neg']: sfquery += " except " else: sfquery += " intersect " elif filter['is_neg']: sfquery += "select id from fields except " field = field.replace("*", "%") value = filter['value'].replace("*", "%") args["_ff_%d" % c] = "%"+value+"%" ids = self.s.column0( "select id from fieldmodels where name like "+ ":field escape '\\'", field=field) sfquery += ("select id from fields where "+ "fieldModelId in %s and value like "+ ":_ff_%d escape '\\'") % (ids2str(ids), c) rows = self.s.execute( 'select f.factId, f.value, fm.name from fields as f '+ 'left join fieldmodels as fm ON (f.fieldModelId = '+ 'fm.id) where f.id in (' + sfquery + ')', args) while (1): row = rows.fetchone() if row is None: break field = row[2].lower() doesMatch = False if field in fieldFilters: for filter in fieldFilters[field]: res = filter['regexp'].search(row[1]) if ((filter['is_neg'] is False and res) or (filter['is_neg'] is True and res is None)): fieldFilterMatches.append(row[0]) if len(cardFilters) > 0: qaquery = '' args = {} for field, filters in cardFilters.iteritems(): for filter in filters: c = len(args) if qaquery: if filter['is_neg']: qaquery += " except " else: qaquery += " intersect " elif filter['is_neg']: qaquery += "select id from cards except " value = value.replace("*", "%") args["_ff_%d" % c] = "%"+value+"%" if field == 'question': qaquery += "select id from cards where question " qaquery += "like :_ff_%d escape '\\'" % c else: qaquery += "select id from cards where answer " qaquery += "like :_ff_%d escape '\\'" % c rows = self.s.execute( 'select id, question, answer from cards where id IN (' + qaquery + ')', args) while (1): row = rows.fetchone() if row is None: break doesMatch = False if field in cardFilters: rowValue = row[1] if field == 'question' else row[2] for filter in cardFilters[field]: res = filter['regexp'].search(rowValue) if ((filter['is_neg'] is False and res) or (filter['is_neg'] is True and res is None)): cardFilterMatches.append(row[0]) factIds = None if len(factFilters) > 0 or len(fieldFilters) > 0: factIds = [] factIds.extend(factFilterMatches) factIds.extend(fieldFilterMatches) cardIds = None if len(cardFilters) > 0: cardIds = [] cardIds.extend(cardFilterMatches) return (factIds, cardIds) def _findCards(self, query): "Find facts matching QUERY." tquery = "" fquery = "" qquery = "" fidquery = "" cmquery = { 'pos': '', 'neg': '' } sfquery = qaquery = "" showdistinct = False filters = [] args = {} for c, (token, isNeg, type, filter) in enumerate(self._parseQuery(query)): if type == SEARCH_TAG: # a tag if tquery: if isNeg: tquery += " except " else: tquery += " intersect " elif isNeg: tquery += "select id from cards except " if token == "none": tquery += """ select cards.id from cards, facts where facts.tags = '' and cards.factId = facts.id """ else: token = token.replace("*", "%") ids = self.s.column0(""" select id from tags where tag like :tag escape '\\'""", tag=token) tquery += """ select cardId from cardTags where cardTags.tagId in %s""" % ids2str(ids) elif type == SEARCH_TYPE: if qquery: if isNeg: qquery += " except " else: qquery += " intersect " elif isNeg: qquery += "select id from cards except " if token in ("rev", "new", "failed"): if token == "rev": n = 1 elif token == "new": n = 2 else: n = 0 qquery += "select id from cards where type = %d" % n elif token == "delayed": qquery += ("select id from cards where " "due < %d and combinedDue > %d and " "type in (0,1,2)") % ( self.dueCutoff, self.dueCutoff) elif token == "suspended": qquery += ("select id from cards where " "priority = -3") elif token == "leech": qquery += ( "select id from cards where noCount >= (select value " "from deckvars where key = 'leechFails')") else: # due qquery += ("select id from cards where " "type in (0,1) and combinedDue < %d") % self.dueCutoff elif type == SEARCH_FID: if fidquery: if isNeg: fidquery += " except " else: fidquery += " intersect " elif isNeg: fidquery += "select id from cards except " fidquery += "select id from cards where factId in (%s)" % token elif type == SEARCH_CARD: token = token.replace("*", "%") ids = self.s.column0(""" select id from tags where tag like :tag escape '\\'""", tag=token) if isNeg: if cmquery['neg']: cmquery['neg'] += " intersect " cmquery['neg'] += """ select cardId from cardTags where src = 2 and cardTags.tagId in %s""" % ids2str(ids) else: if cmquery['pos']: cmquery['pos'] += " intersect " cmquery['pos'] += """ select cardId from cardTags where src = 2 and cardTags.tagId in %s""" % ids2str(ids) elif type == SEARCH_FIELD or type == SEARCH_FIELD_EXISTS: field = value = '' if type == SEARCH_FIELD: parts = token.split(':', 1); if len(parts) == 2: field = parts[0] value = parts[1] elif type == SEARCH_FIELD_EXISTS: field = token value = '*' if (type == SEARCH_FIELD and filter != 'none'): if field and value: filters.append( {'scope': 'field', 'type': filter, 'field': field, 'value': value, 'is_neg': isNeg}) else: if field and value: if sfquery: if isNeg: sfquery += " except " else: sfquery += " intersect " elif isNeg: sfquery += "select id from facts except " field = field.replace("*", "%") value = value.replace("*", "%") args["_ff_%d" % c] = "%"+value+"%" ids = self.s.column0(""" select id from fieldmodels where name like :field escape '\\'""", field=field) sfquery += """ select factId from fields where fieldModelId in %s and value like :_ff_%d escape '\\'""" % (ids2str(ids), c) elif type == SEARCH_QA: field = value = '' parts = token.split(':', 1); if len(parts) == 2: field = parts[0] value = parts[1] if (filter != 'none'): if field and value: filters.append( {'scope': 'card', 'type': filter, 'field': field, 'value': value, 'is_neg': isNeg}) else: if field and value: if qaquery: if isNeg: qaquery += " except " else: qaquery += " intersect " elif isNeg: qaquery += "select id from cards except " value = value.replace("*", "%") args["_ff_%d" % c] = "%"+value+"%" if field == 'question': qaquery += """ select id from cards where question like :_ff_%d escape '\\'""" % c else: qaquery += """ select id from cards where answer like :_ff_%d escape '\\'""" % c elif type == SEARCH_DISTINCT: if isNeg is False: showdistinct = True if token == "one" else False else: showdistinct = False if token == "one" else True else: if (filter != 'none'): filters.append( {'scope': 'fact', 'type': filter, 'value': token, 'is_neg': isNeg}) else: if fquery: if isNeg: fquery += " except " else: fquery += " intersect " elif isNeg: fquery += "select id from facts except " token = token.replace("*", "%") args["_ff_%d" % c] = "%"+token+"%" fquery += """ select id from facts where spaceUntil like :_ff_%d escape '\\'""" % c return (tquery, fquery, qquery, fidquery, cmquery, sfquery, qaquery, showdistinct, filters, args) # Find and replace ########################################################################## def findReplace(self, factIds, src, dst, isRe=False, field=None): "Find and replace fields in a fact." # find s = "select id, factId, value from fields where factId in %s" if isRe: isRe = re.compile(src) else: s += " and value like :v" if field: s += " and fieldModelId = :fmid" rows = self.s.all(s % ids2str(factIds), v="%"+src.replace("%", "%%")+"%", fmid=field) modded = [] if isRe: modded = [ {'id': id, 'fid': fid, 'val': re.sub(isRe, dst, val)} for (id, fid, val) in rows if isRe.search(val)] else: modded = [ {'id': id, 'fid': fid, 'val': val.replace(src, dst)} for (id, fid, val) in rows if val.find(src) != -1] # update self.s.statements( 'update fields set value = :val where id = :id', modded) self.updateCardQACacheFromIds([f['fid'] for f in modded], type="facts") return len(set([f['fid'] for f in modded])) # Find duplicates ########################################################################## def findDuplicates(self, fmids): data = self.s.all( "select factId, value from fields where fieldModelId in %s" % ids2str(fmids)) vals = {} for (fid, val) in data: if not val.strip(): continue if val not in vals: vals[val] = [fid] else: vals[val].append(fid) return [(k,v) for (k,v) in vals.items() if len(v) > 1] # Progress info ########################################################################## def startProgress(self, max=0, min=0, title=None): self.enableProgressHandler() runHook("startProgress", max, min, title) self.s.flush() def updateProgress(self, label=None, value=None): runHook("updateProgress", label, value) def finishProgress(self): runHook("updateProgress") runHook("finishProgress") self.disableProgressHandler() def progressHandler(self): if (time.time() - self.progressHandlerCalled) < 0.2: return self.progressHandlerCalled = time.time() if self.progressHandlerEnabled: runHook("dbProgress") def enableProgressHandler(self): self.progressHandlerEnabled = True def disableProgressHandler(self): self.progressHandlerEnabled = False # Notifications ########################################################################## def notify(self, msg): "Send a notice to all listeners, or display on stdout." if hookEmpty("notify"): pass else: runHook("notify", msg) # File-related ########################################################################## def name(self): if not self.path: return u"untitled" n = os.path.splitext(os.path.basename(self.path))[0] assert '/' not in n assert '\\' not in n return n # Session handling ########################################################################## def startSession(self): self.lastSessionStart = self.sessionStartTime self.sessionStartTime = time.time() self.sessionStartReps = self.getStats()['dTotal'] def stopSession(self): self.sessionStartTime = 0 def sessionLimitReached(self): if not self.sessionStartTime: # not started return False if (self.sessionTimeLimit and time.time() > (self.sessionStartTime + self.sessionTimeLimit)): return True if (self.sessionRepLimit and self.sessionRepLimit <= self.getStats()['dTotal'] - self.sessionStartReps): return True return False # Meta vars ########################################################################## def getInt(self, key, type=int): ret = self.s.scalar("select value from deckVars where key = :k", k=key) if ret is not None: ret = type(ret) return ret def getFloat(self, key): return self.getInt(key, float) def getBool(self, key): ret = self.s.scalar("select value from deckVars where key = :k", k=key) if ret is not None: # hack to work around ankidroid bug if ret.lower() == "true": return True elif ret.lower() == "false": return False else: ret = not not int(ret) return ret def getVar(self, key): "Return value for key as string, or None." return self.s.scalar("select value from deckVars where key = :k", k=key) def setVar(self, key, value, mod=True): if self.s.scalar(""" select value = :value from deckVars where key = :key""", key=key, value=value): return # can't use insert or replace as it confuses the undo code if self.s.scalar("select 1 from deckVars where key = :key", key=key): self.s.statement("update deckVars set value=:value where key = :key", key=key, value=value) else: self.s.statement("insert into deckVars (key, value) " "values (:key, :value)", key=key, value=value) if mod: self.setModified() def setVarDefault(self, key, value): if not self.s.scalar( "select 1 from deckVars where key = :key", key=key): self.s.statement("insert into deckVars (key, value) " "values (:key, :value)", key=key, value=value) # Failed card handling ########################################################################## def setFailedCardPolicy(self, idx): if idx == 5: # custom return self.collapseTime = 0 self.failedCardMax = 0 if idx == 0: d = 600 self.collapseTime = 1 self.failedCardMax = 20 elif idx == 1: d = 0 elif idx == 2: d = 600 elif idx == 3: d = 28800 elif idx == 4: d = 259200 self.delay0 = d self.delay1 = 0 def getFailedCardPolicy(self): if self.delay1: return 5 d = self.delay0 if self.collapseTime == 1: if d == 600 and self.failedCardMax == 20: return 0 return 5 if d == 0 and self.failedCardMax == 0: return 1 elif d == 600: return 2 elif d == 28800: return 3 elif d == 259200: return 4 return 5 # Media ########################################################################## def mediaDir(self, create=False): "Return the media directory if exists. None if couldn't create." if self.path: if self.mediaPrefix: dir = os.path.join( self.mediaPrefix, os.path.basename(self.path)) else: dir = self.path dir = re.sub("(?i)\.(oldanki)$", ".media", dir) if create == None: # don't create, but return dir return dir if not os.path.exists(dir) and create: try: os.makedirs(dir) except OSError: # permission denied return None else: # memory-backed; need temp store if not self.tmpMediaDir and create: self.tmpMediaDir = tempfile.mkdtemp(prefix="oldanki") dir = self.tmpMediaDir if not dir or not os.path.exists(dir): return None # change to the current dir os.chdir(dir) return dir def addMedia(self, path): """Add PATH to the media directory. Return new path, relative to media dir.""" return oldanki.media.copyToMedia(self, path) def renameMediaDir(self, oldPath): "Copy oldPath to our current media dir. " assert os.path.exists(oldPath) newPath = self.mediaDir(create=None) # copytree doesn't want the dir to exist try: shutil.copytree(oldPath, newPath) except: # FIXME: should really remove everything in old dir instead of # giving up pass # DB helpers ########################################################################## def save(self): "Commit any pending changes to disk." if self.lastLoaded == self.modified: return self.lastLoaded = self.modified self.s.commit() def close(self): if self.s: self.s.rollback() self.s.clear() self.s.close() self.engine.dispose() runHook("deckClosed") def rollback(self): "Roll back the current transaction and reset session state." self.s.rollback() self.s.clear() self.s.update(self) self.s.refresh(self) def refreshSession(self): "Flush and expire all items from the session." self.s.flush() self.s.expire_all() def openSession(self): "Open a new session. Assumes old session is already closed." self.s = SessionHelper(self.Session(), lock=self.needLock) self.s.update(self) self.refreshSession() def closeSession(self): "Close the current session, saving any changes. Do nothing if no session." if self.s: self.save() try: self.s.expunge(self) except: import sys sys.stderr.write("ERROR expunging deck..\n") self.s.close() self.s = None def setModified(self, newTime=None): #import traceback; traceback.print_stack() self.modified = newTime or time.time() def flushMod(self): "Mark modified and flush to DB." self.setModified() self.s.flush() def saveAs(self, newPath): "Returns new deck. Old connection is closed without saving." oldMediaDir = self.mediaDir() self.s.flush() # remove new deck if it exists try: os.unlink(newPath) except OSError: pass self.startProgress() # copy tables, avoiding implicit commit on current db DeckStorage.Deck(newPath, backup=False).close() new = sqlite.connect(newPath) for table in self.s.column0( "select name from sqlite_master where type = 'table'"): if table.startswith("sqlite_"): continue new.execute("delete from %s" % table) cols = [str(x[1]) for x in new.execute( "pragma table_info('%s')" % table).fetchall()] q = "select 'insert into %(table)s values(" q += ",".join(["'||quote(\"" + col + "\")||'" for col in cols]) q += ")' from %(table)s" q = q % {'table': table} c = 0 for row in self.s.execute(q): new.execute(row[0]) if c % 1000: self.updateProgress() c += 1 # save new, close both new.commit() new.close() self.close() # open again in orm newDeck = DeckStorage.Deck(newPath, backup=False) # move media if oldMediaDir: newDeck.renameMediaDir(oldMediaDir) # forget sync name newDeck.syncName = None newDeck.s.commit() # and return the new deck self.finishProgress() return newDeck # Syncing ########################################################################## # toggling does not bump deck mod time, since it may happen on upgrade, # and the variable is not synced def enableSyncing(self): self.syncName = unicode(checksum(self.path.encode("utf-8"))) self.s.commit() def disableSyncing(self): self.syncName = None self.s.commit() def syncingEnabled(self): return self.syncName def checkSyncHash(self): if self.syncName and self.syncName != checksum(self.path.encode("utf-8")): self.notify(_("""\ Because '%s' has been moved or copied, automatic synchronisation \ has been disabled (ERR-0100). You can disable this check in Settings>Preferences>Network.""") % self.name()) self.disableSyncing() self.syncName = None # DB maintenance ########################################################################## def recoverCards(self, ids): "Put cards with damaged facts into new facts." # create a new model in case the user has modified a previous one from oldanki.stdmodels import RecoveryModel m = RecoveryModel() last = self.currentModel self.addModel(m) def repl(s): # strip field model text return re.sub("(.*?)", "\\1", s) # add new facts, pointing old card at new fact for (id, q, a) in self.s.all(""" select id, question, answer from cards where id in %s""" % ids2str(ids)): f = self.newFact() f['Question'] = repl(q) f['Answer'] = repl(a) try: f.tags = self.s.scalar(""" select group_concat(tag, " ") from tags t, cardTags ct where cardId = :cid and ct.tagId = t.id""", cid=id) or u"" except: raise Exception("Your sqlite is too old.") cards = self.addFact(f) # delete the freshly created card and point old card to this fact self.s.statement("delete from cards where id = :id", id=f.cards[0].id) self.s.statement(""" update cards set factId = :fid, cardModelId = :cmid, ordinal = 0 where id = :id""", fid=f.id, cmid=m.cardModels[0].id, id=id) # restore old model self.currentModel = last def fixIntegrity(self, quick=False): "Fix some problems and rebuild caches. Caller must .reset()" self.s.commit() self.resetUndo() problems = [] recover = False if quick: num = 4 else: num = 9 self.startProgress(num) self.updateProgress(_("Checking integrity...")) if self.s.scalar("pragma integrity_check") != "ok": self.finishProgress() return _("Database file is damaged.\n" "Please restore from automatic backup (see FAQ).") # ensure correct views and indexes are available self.updateProgress() DeckStorage._addViews(self) DeckStorage._addIndices(self) # does the user have a model? self.updateProgress(_("Checking schema...")) if not self.s.scalar("select count(id) from models"): self.addModel(BasicModel()) problems.append(_("Deck was missing a model")) # is currentModel pointing to a valid model? if not self.s.all(""" select decks.id from decks, models where decks.currentModelId = models.id"""): self.currentModelId = self.models[0].id problems.append(_("The current model didn't exist")) # fields missing a field model ids = self.s.column0(""" select id from fields where fieldModelId not in ( select distinct id from fieldModels)""") if ids: self.s.statement("delete from fields where id in %s" % ids2str(ids)) problems.append(ngettext("Deleted %d field with missing field model", "Deleted %d fields with missing field model", len(ids)) % len(ids)) # facts missing a field? ids = self.s.column0(""" select distinct facts.id from facts, fieldModels where facts.modelId = fieldModels.modelId and fieldModels.id not in (select fieldModelId from fields where factId = facts.id)""") if ids: self.deleteFacts(ids) problems.append(ngettext("Deleted %d fact with missing fields", "Deleted %d facts with missing fields", len(ids)) % len(ids)) # cards missing a fact? ids = self.s.column0(""" select id from cards where factId not in (select id from facts)""") if ids: recover = True self.recoverCards(ids) problems.append(ngettext("Recovered %d card with missing fact", "Recovered %d cards with missing fact", len(ids)) % len(ids)) # cards missing a card model? ids = self.s.column0(""" select id from cards where cardModelId not in (select id from cardModels)""") if ids: recover = True self.recoverCards(ids) problems.append(ngettext("Recovered %d card with no card template", "Recovered %d cards with no card template", len(ids)) % len(ids)) # cards with a card model from the wrong model ids = self.s.column0(""" select id from cards where cardModelId not in (select cm.id from cardModels cm, facts f where cm.modelId = f.modelId and f.id = cards.factId)""") if ids: recover = True self.recoverCards(ids) problems.append(ngettext("Recovered %d card with wrong card template", "Recovered %d cards with wrong card template", len(ids)) % len(ids)) # facts missing a card? ids = self.deleteDanglingFacts() if ids: problems.append(ngettext("Deleted %d fact with no cards", "Deleted %d facts with no cards", len(ids)) % len(ids)) # dangling fields? ids = self.s.column0(""" select id from fields where factId not in (select id from facts)""") if ids: self.s.statement( "delete from fields where id in %s" % ids2str(ids)) problems.append(ngettext("Deleted %d dangling field", "Deleted %d dangling fields", len(ids)) % len(ids)) self.s.flush() if not quick: self.updateProgress() # these sometimes end up null on upgrade self.s.statement("update models set source = 0 where source is null") self.s.statement( "update cardModels set allowEmptyAnswer = 1, typeAnswer = '' " "where allowEmptyAnswer is null or typeAnswer is null") # fix tags self.updateProgress(_("Rebuilding tag cache...")) self.updateCardTags() # fix any priorities self.updateProgress(_("Updating priorities...")) self.updateAllPriorities(dirty=False) # make sure self.updateProgress(_("Updating ordinals...")) self.s.statement(""" update fields set ordinal = (select ordinal from fieldModels where id = fieldModelId)""") # fix problems with stripping html self.updateProgress(_("Rebuilding QA cache...")) fields = self.s.all("select id, value from fields") newFields = [] for (id, value) in fields: newFields.append({'id': id, 'value': tidyHTML(value)}) self.s.statements( "update fields set value=:value where id=:id", newFields) # regenerate question/answer cache for m in self.models: self.updateCardsFromModel(m, dirty=False) # force a full sync self.s.flush() self.s.statement("update cards set modified = :t", t=time.time()) self.s.statement("update facts set modified = :t", t=time.time()) self.s.statement("update models set modified = :t", t=time.time()) self.lastSync = 0 # rebuild self.updateProgress(_("Rebuilding types...")) self.rebuildTypes() # update deck and save if not quick: self.flushMod() self.save() self.refreshSession() self.finishProgress() if problems: if recover: problems.append("\n" + _("""\ Cards with corrupt or missing facts have been placed into new facts. \ Your scheduling info and card content has been preserved, but the \ original layout of the facts has been lost.""")) return "\n".join(problems) return "ok" def optimize(self): oldSize = os.stat(self.path)[stat.ST_SIZE] self.s.commit() self.s.statement("vacuum") self.s.statement("analyze") newSize = os.stat(self.path)[stat.ST_SIZE] return oldSize - newSize # Undo/redo ########################################################################## def initUndo(self): # note this code ignores 'unique', as it's an sqlite reserved word self.undoStack = [] self.redoStack = [] self.undoEnabled = True self.s.statement( "create temporary table undoLog (seq integer primary key not null, sql text)") tables = self.s.column0( "select name from sqlite_master where type = 'table'") for table in tables: if table in ("undoLog", "sqlite_stat1"): continue columns = [r[1] for r in self.s.all("pragma table_info(%s)" % table)] # insert self.s.statement(""" create temp trigger _undo_%(t)s_it after insert on %(t)s begin insert into undoLog values (null, 'delete from %(t)s where rowid = ' || new.rowid); end""" % {'t': table}) # update sql = """ create temp trigger _undo_%(t)s_ut after update on %(t)s begin insert into undoLog values (null, 'update %(t)s """ % {'t': table} sep = "set " for c in columns: if c == "unique": continue sql += "%(s)s%(c)s=' || quote(old.%(c)s) || '" % { 's': sep, 'c': c} sep = "," sql += " where rowid = ' || old.rowid); end" self.s.statement(sql) # delete sql = """ create temp trigger _undo_%(t)s_dt before delete on %(t)s begin insert into undoLog values (null, 'insert into %(t)s (rowid""" % {'t': table} for c in columns: sql += ",\"%s\"" % c sql += ") values (' || old.rowid ||'" for c in columns: if c == "unique": sql += ",1" continue sql += ",' || quote(old.%s) ||'" % c sql += ")'); end" self.s.statement(sql) def undoName(self): for n in reversed(self.undoStack): if n: return n[0] def redoName(self): return self.redoStack[-1][0] def undoAvailable(self): if not self.undoEnabled: return for r in reversed(self.undoStack): if r: return True def redoAvailable(self): return self.undoEnabled and self.redoStack def resetUndo(self): try: self.s.statement("delete from undoLog") except: pass self.undoStack = [] self.redoStack = [] def setUndoBarrier(self): if not self.undoStack or self.undoStack[-1] is not None: self.undoStack.append(None) def setUndoStart(self, name, merge=False): if not self.undoEnabled: return self.s.flush() if merge and self.undoStack: if self.undoStack[-1] and self.undoStack[-1][0] == name: # merge with last entry? return start = self._latestUndoRow() self.undoStack.append([name, start, None]) def setUndoEnd(self, name): if not self.undoEnabled: return self.s.flush() end = self._latestUndoRow() while self.undoStack[-1] is None: # strip off barrier self.undoStack.pop() self.undoStack[-1][2] = end if self.undoStack[-1][1] == self.undoStack[-1][2]: self.undoStack.pop() else: self.redoStack = [] runHook("undoEnd") def _latestUndoRow(self): return self.s.scalar("select max(rowid) from undoLog") or 0 def _undoredo(self, src, dst): self.s.flush() while 1: u = src.pop() if u: break (start, end) = (u[1], u[2]) if end is None: end = self._latestUndoRow() sql = self.s.column0(""" select sql from undoLog where seq > :s and seq <= :e order by seq desc""", s=start, e=end) mod = len(sql) / 35 if mod: self.startProgress(36) self.updateProgress(_("Processing...")) newstart = self._latestUndoRow() for c, s in enumerate(sql): if mod and not c % mod: self.updateProgress() self.engine.execute(s) newend = self._latestUndoRow() dst.append([u[0], newstart, newend]) if mod: self.finishProgress() def undo(self): "Undo the last action(s). Caller must .reset()" self._undoredo(self.undoStack, self.redoStack) self.refreshSession() runHook("postUndoRedo") def redo(self): "Redo the last action(s). Caller must .reset()" self._undoredo(self.redoStack, self.undoStack) self.refreshSession() runHook("postUndoRedo") # Dynamic indices ########################################################################## def updateDynamicIndices(self): indices = { 'intervalDesc': '(type, priority desc, interval desc, factId, combinedDue)', 'intervalAsc': '(type, priority desc, interval, factId, combinedDue)', 'randomOrder': '(type, priority desc, factId, ordinal, combinedDue)', 'dueAsc': '(type, priority desc, due, factId, combinedDue)', 'dueDesc': '(type, priority desc, due desc, factId, combinedDue)', } # determine required required = [] if self.revCardOrder == REV_CARDS_OLD_FIRST: required.append("intervalDesc") if self.revCardOrder == REV_CARDS_NEW_FIRST: required.append("intervalAsc") if self.revCardOrder == REV_CARDS_RANDOM: required.append("randomOrder") if (self.revCardOrder == REV_CARDS_DUE_FIRST or self.newCardOrder == NEW_CARDS_OLD_FIRST or self.newCardOrder == NEW_CARDS_RANDOM): required.append("dueAsc") if (self.newCardOrder == NEW_CARDS_NEW_FIRST): required.append("dueDesc") # add/delete analyze = False for (k, v) in indices.items(): n = "ix_cards_%s2" % k if k in required: if not self.s.scalar( "select 1 from sqlite_master where name = :n", n=n): self.s.statement( "create index %s on cards %s" % (n, v)) analyze = True else: # leave old indices for older clients #self.s.statement("drop index if exists ix_cards_%s" % k) self.s.statement("drop index if exists %s" % n) if analyze: self.s.statement("analyze") # Shared decks ########################################################################## sourcesTable = Table( 'sources', metadata, Column('id', Integer, nullable=False, primary_key=True), Column('name', UnicodeText, nullable=False, default=u""), Column('created', Float, nullable=False, default=time.time), Column('lastSync', Float, nullable=False, default=0), # -1 = never check, 0 = always check, 1+ = number of seconds passed. # not currently exposed in the GUI Column('syncPeriod', Integer, nullable=False, default=0)) # Maps ########################################################################## mapper(Deck, decksTable, properties={ 'currentModel': relation(oldanki.models.Model, primaryjoin= decksTable.c.currentModelId == oldanki.models.modelsTable.c.id), 'models': relation(oldanki.models.Model, post_update=True, primaryjoin= decksTable.c.id == oldanki.models.modelsTable.c.deckId), }) # Deck storage ########################################################################## numBackups = 30 backupDir = os.path.expanduser("~/.oldanki/backups") class DeckStorage(object): def Deck(path=None, backup=True, lock=True, pool=True, rebuild=True): "Create a new deck or attach to an existing one." create = True if path is None: sqlpath = None else: path = os.path.abspath(path) # check if we need to init if os.path.exists(path): create = False # sqlite needs utf8 sqlpath = path.encode("utf-8") try: (engine, session) = DeckStorage._attach(sqlpath, create, pool) s = session() if create: ver = 999 metadata.create_all(engine) deck = DeckStorage._init(s) else: ver = s.scalar("select version from decks limit 1") if ver < 19: for st in ( "decks add column newCardsPerDay integer not null default 20", "decks add column sessionRepLimit integer not null default 100", "decks add column sessionTimeLimit integer not null default 1800", "decks add column utcOffset numeric(10, 2) not null default 0", "decks add column cardCount integer not null default 0", "decks add column factCount integer not null default 0", "decks add column failedNowCount integer not null default 0", "decks add column failedSoonCount integer not null default 0", "decks add column revCount integer not null default 0", "decks add column newCount integer not null default 0", "decks add column revCardOrder integer not null default 0", "cardModels add column allowEmptyAnswer boolean not null default 1", "cardModels add column typeAnswer text not null default ''"): try: s.execute("alter table " + st) except: pass if ver < DECK_VERSION: metadata.create_all(engine) deck = s.query(Deck).get(1) if not deck: raise DeckAccessError(_("Deck missing core table"), type="nocore") # attach db vars deck.path = path deck.engine = engine deck.Session = session deck.needLock = lock deck.progressHandlerCalled = 0 deck.progressHandlerEnabled = False if pool: try: deck.engine.raw_connection().set_progress_handler( deck.progressHandler, 100) except: print "please install pysqlite 2.4 for better progress dialogs" deck.engine.execute("pragma locking_mode = exclusive") deck.s = SessionHelper(s, lock=lock) # force a write lock deck.s.execute("update decks set modified = modified") needUnpack = False if deck.utcOffset in (-1, -2): # do the rest later needUnpack = deck.utcOffset == -1 # make sure we do this before initVars DeckStorage._setUTCOffset(deck) deck.created = time.time() if ver < 27: initTagTables(deck.s) if create: # new-style file format deck.s.commit() deck.s.execute("pragma legacy_file_format = off") deck.s.execute("pragma default_cache_size= 20000") deck.s.execute("vacuum") # add views/indices initTagTables(deck.s) DeckStorage._addViews(deck) DeckStorage._addIndices(deck) deck.s.statement("analyze") deck._initVars() deck.updateTagPriorities() else: if backup: DeckStorage.backup(deck, path) deck._initVars() try: deck = DeckStorage._upgradeDeck(deck, path) except: traceback.print_exc() deck.fixIntegrity() deck = DeckStorage._upgradeDeck(deck, path) except OperationalError, e: engine.dispose() if (str(e.orig).startswith("database table is locked") or str(e.orig).startswith("database is locked")): raise DeckAccessError(_("File is in use by another process"), type="inuse") else: raise e if not rebuild: # minimal startup deck._globalStats = globalStats(deck) deck._dailyStats = dailyStats(deck) return deck if needUnpack: deck.startProgress() DeckStorage._addIndices(deck) for m in deck.models: deck.updateCardsFromModel(m) deck.finishProgress() oldMod = deck.modified # fix a bug with current model being unset if not deck.currentModel and deck.models: deck.currentModel = deck.models[0] # ensure the necessary indices are available deck.updateDynamicIndices() # FIXME: temporary code for upgrade # - ensure cards suspended on older clients are recognized deck.s.statement(""" update cards set type = type - 3 where type between 0 and 2 and priority = -3""") # - new delay1 handling if deck.delay1 > 7: deck.delay1 = 0 # unsuspend buried/rev early - can remove priorities in the future ids = deck.s.column0( "select id from cards where type > 2 or priority between -2 and -1") if ids: deck.updatePriorities(ids) deck.s.statement( "update cards set type = relativeDelay where type > 2") deck.s.commit() # check if deck has been moved, and disable syncing deck.checkSyncHash() # determine starting factor for new cards deck.averageFactor = (deck.s.scalar( "select avg(factor) from cards where type = 1") or Deck.initialFactor) deck.averageFactor = max(deck.averageFactor, Deck.minimumAverage) # rebuild queue deck.reset() # make sure we haven't accidentally bumped the modification time assert deck.modified == oldMod return deck Deck = staticmethod(Deck) def _attach(path, create, pool=True): "Attach to a file, initializing DB" if path is None: path = "sqlite://" else: path = "sqlite:///" + path if pool: # open and lock connection for single use from sqlalchemy.pool import SingletonThreadPool # temporary tables are effectively useless with the default # settings in 0.7, so we need to force the pool class engine = create_engine(path, connect_args={'timeout': 0}, poolclass=SingletonThreadPool) else: # no pool & concurrent access w/ timeout engine = create_engine(path, poolclass=NullPool, connect_args={'timeout': 60}) session = sessionmaker(bind=engine, autoflush=False, autocommit=True) return (engine, session) _attach = staticmethod(_attach) def _init(s): "Add a new deck to the database. Return saved deck." deck = Deck() if sqlalchemy.__version__.startswith("0.4."): s.save(deck) else: s.add(deck) s.flush() return deck _init = staticmethod(_init) def _addIndices(deck): "Add indices to the DB." # counts, failed cards deck.s.statement(""" create index if not exists ix_cards_typeCombined on cards (type, combinedDue, factId)""") # scheduler-agnostic type deck.s.statement(""" create index if not exists ix_cards_relativeDelay on cards (relativeDelay)""") # index on modified, to speed up sync summaries deck.s.statement(""" create index if not exists ix_cards_modified on cards (modified)""") deck.s.statement(""" create index if not exists ix_facts_modified on facts (modified)""") # priority - temporary index to make compat code faster. this can be # removed when all clients are on 1.2, as can the ones below deck.s.statement(""" create index if not exists ix_cards_priority on cards (priority)""") # average factor deck.s.statement(""" create index if not exists ix_cards_factor on cards (type, factor)""") # card spacing deck.s.statement(""" create index if not exists ix_cards_factId on cards (factId)""") # stats deck.s.statement(""" create index if not exists ix_stats_typeDay on stats (type, day)""") # fields deck.s.statement(""" create index if not exists ix_fields_factId on fields (factId)""") deck.s.statement(""" create index if not exists ix_fields_fieldModelId on fields (fieldModelId)""") deck.s.statement(""" create index if not exists ix_fields_value on fields (value)""") # media deck.s.statement(""" create unique index if not exists ix_media_filename on media (filename)""") deck.s.statement(""" create index if not exists ix_media_originalPath on media (originalPath)""") # deletion tracking deck.s.statement(""" create index if not exists ix_cardsDeleted_cardId on cardsDeleted (cardId)""") deck.s.statement(""" create index if not exists ix_modelsDeleted_modelId on modelsDeleted (modelId)""") deck.s.statement(""" create index if not exists ix_factsDeleted_factId on factsDeleted (factId)""") deck.s.statement(""" create index if not exists ix_mediaDeleted_factId on mediaDeleted (mediaId)""") # tags txt = "create unique index if not exists ix_tags_tag on tags (tag)" try: deck.s.statement(txt) except: deck.s.statement(""" delete from tags where exists (select 1 from tags t2 where tags.tag = t2.tag and tags.rowid > t2.rowid)""") deck.s.statement(txt) deck.s.statement(""" create index if not exists ix_cardTags_tagCard on cardTags (tagId, cardId)""") deck.s.statement(""" create index if not exists ix_cardTags_cardId on cardTags (cardId)""") _addIndices = staticmethod(_addIndices) def _addViews(deck): "Add latest version of SQL views to DB." s = deck.s # old views s.statement("drop view if exists failedCards") s.statement("drop view if exists revCardsOld") s.statement("drop view if exists revCardsNew") s.statement("drop view if exists revCardsDue") s.statement("drop view if exists revCardsRandom") s.statement("drop view if exists acqCardsRandom") s.statement("drop view if exists acqCardsOld") s.statement("drop view if exists acqCardsNew") # failed cards s.statement(""" create view failedCards as select * from cards where type = 0 and isDue = 1 order by type, isDue, combinedDue """) # rev cards s.statement(""" create view revCardsOld as select * from cards where type = 1 and isDue = 1 order by priority desc, interval desc""") s.statement(""" create view revCardsNew as select * from cards where type = 1 and isDue = 1 order by priority desc, interval""") s.statement(""" create view revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, due""") s.statement(""" create view revCardsRandom as select * from cards where type = 1 and isDue = 1 order by priority desc, factId, ordinal""") # new cards s.statement(""" create view acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, due""") s.statement(""" create view acqCardsNew as select * from cards where type = 2 and isDue = 1 order by priority desc, due desc""") _addViews = staticmethod(_addViews) def _upgradeDeck(deck, path): "Upgrade deck to the latest version." if deck.version < DECK_VERSION: prog = True deck.startProgress() deck.updateProgress(_("Upgrading Deck...")) if deck.utcOffset == -1: # we're opening a shared deck with no indices - we'll need # them if we want to rebuild the queue DeckStorage._addIndices(deck) oldmod = deck.modified else: prog = False deck.path = path if deck.version == 0: # new columns try: deck.s.statement(""" alter table cards add column spaceUntil float not null default 0""") deck.s.statement(""" alter table cards add column relativeDelay float not null default 0.0""") deck.s.statement(""" alter table cards add column isDue boolean not null default 0""") deck.s.statement(""" alter table cards add column type integer not null default 0""") deck.s.statement(""" alter table cards add column combinedDue float not null default 0""") # update cards.spaceUntil based on old facts deck.s.statement(""" update cards set spaceUntil = (select (case when cards.id = facts.lastCardId then 0 else facts.spaceUntil end) from cards as c, facts where c.factId = facts.id and cards.id = c.id)""") deck.s.statement(""" update cards set combinedDue = max(due, spaceUntil) """) except: print "failed to upgrade" # rebuild with new file format deck.s.commit() deck.s.execute("pragma legacy_file_format = off") deck.s.execute("vacuum") # add views/indices DeckStorage._addViews(deck) DeckStorage._addIndices(deck) # rebuild type and delay cache deck.rebuildTypes() deck.reset() # bump version deck.version = 1 # optimize indices deck.s.statement("analyze") if deck.version == 1: # fix indexes and views deck.s.statement("drop index if exists ix_cards_newRandomOrder") deck.s.statement("drop index if exists ix_cards_newOrderedOrder") DeckStorage._addViews(deck) DeckStorage._addIndices(deck) deck.rebuildTypes() # optimize indices deck.s.statement("analyze") deck.version = 2 if deck.version == 2: # compensate for bug in 0.9.7 by rebuilding isDue and priorities deck.s.statement("update cards set isDue = 0") deck.updateAllPriorities(dirty=False) # compensate for bug in early 0.9.x where fieldId was not unique deck.s.statement("update fields set id = random()") deck.version = 3 if deck.version == 3: # remove conflicting and unused indexes deck.s.statement("drop index if exists ix_cards_isDueCombined") deck.s.statement("drop index if exists ix_facts_lastCardId") deck.s.statement("drop index if exists ix_cards_successive") deck.s.statement("drop index if exists ix_cards_priority") deck.s.statement("drop index if exists ix_cards_reps") deck.s.statement("drop index if exists ix_cards_due") deck.s.statement("drop index if exists ix_stats_type") deck.s.statement("drop index if exists ix_stats_day") deck.s.statement("drop index if exists ix_factsDeleted_cardId") deck.s.statement("drop index if exists ix_modelsDeleted_cardId") DeckStorage._addIndices(deck) deck.s.statement("analyze") deck.version = 4 if deck.version == 4: # decks field upgraded earlier deck.version = 5 if deck.version == 5: # new spacing deck.newCardSpacing = NEW_CARDS_DISTRIBUTE deck.version = 6 # low priority cards now stay in same queue deck.rebuildTypes() if deck.version == 6: # removed 'new cards first' option, so order has changed deck.newCardSpacing = NEW_CARDS_DISTRIBUTE deck.version = 7 # 8 upgrade code removed as obsolete> if deck.version < 9: # backup media media = deck.s.all(""" select filename, size, created, originalPath, description from media""") # fix mediaDeleted definition deck.s.execute("drop table mediaDeleted") deck.s.execute("drop table media") metadata.create_all(deck.engine) # restore h = [] for row in media: h.append({ 'id': genID(), 'filename': row[0], 'size': row[1], 'created': row[2], 'originalPath': row[3], 'description': row[4]}) if h: deck.s.statements(""" insert into media values ( :id, :filename, :size, :created, :originalPath, :description)""", h) deck.version = 9 if deck.version < 10: deck.s.statement(""" alter table models add column source integer not null default 0""") deck.version = 10 if deck.version < 11: DeckStorage._setUTCOffset(deck) deck.version = 11 deck.s.commit() if deck.version < 12: deck.s.statement("drop index if exists ix_cards_revisionOrder") deck.s.statement("drop index if exists ix_cards_newRandomOrder") deck.s.statement("drop index if exists ix_cards_newOrderedOrder") deck.s.statement("drop index if exists ix_cards_markExpired") deck.s.statement("drop index if exists ix_cards_failedIsDue") deck.s.statement("drop index if exists ix_cards_failedOrder") deck.s.statement("drop index if exists ix_cards_type") deck.s.statement("drop index if exists ix_cards_priority") DeckStorage._addViews(deck) DeckStorage._addIndices(deck) deck.s.statement("analyze") if deck.version < 13: deck.reset() deck.rebuildCounts() # regenerate question/answer cache for m in deck.models: deck.updateCardsFromModel(m, dirty=False) deck.version = 13 if deck.version < 14: deck.s.statement(""" update cards set interval = 0 where interval < 1""") deck.version = 14 if deck.version < 15: deck.delay1 = deck.delay0 deck.delay2 = 0.0 deck.version = 15 if deck.version < 16: deck.version = 16 if deck.version < 17: deck.s.statement("drop view if exists acqCards") deck.s.statement("drop view if exists futureCards") deck.s.statement("drop view if exists revCards") deck.s.statement("drop view if exists typedCards") deck.s.statement("drop view if exists failedCardsNow") deck.s.statement("drop view if exists failedCardsSoon") deck.s.statement("drop index if exists ix_cards_revisionOrder") deck.s.statement("drop index if exists ix_cards_newRandomOrder") deck.s.statement("drop index if exists ix_cards_newOrderedOrder") deck.s.statement("drop index if exists ix_cards_combinedDue") # add new views DeckStorage._addViews(deck) DeckStorage._addIndices(deck) deck.version = 17 if deck.version < 18: deck.s.statement( "create table undoLog (seq integer primary key, sql text)") deck.version = 18 deck.s.commit() DeckStorage._addIndices(deck) deck.s.statement("analyze") if deck.version < 19: # permanent undo log causes various problems, revert to temp deck.s.statement("drop table undoLog") deck.sessionTimeLimit = 600 deck.sessionRepLimit = 0 deck.version = 19 deck.s.commit() if deck.version < 20: DeckStorage._addViews(deck) DeckStorage._addIndices(deck) deck.version = 20 deck.s.commit() if deck.version < 21: deck.s.statement("vacuum") deck.s.statement("analyze") deck.version = 21 deck.s.commit() if deck.version < 22: deck.s.statement( 'update cardModels set typeAnswer = ""') deck.version = 22 deck.s.commit() if deck.version < 23: try: deck.s.execute("drop table undoLog") except: pass deck.version = 23 deck.s.commit() if deck.version < 24: deck.s.statement( "update cardModels set lastFontColour = '#ffffff'") deck.version = 24 deck.s.commit() if deck.version < 25: deck.s.statement("drop index if exists ix_cards_priorityDue") deck.s.statement("drop index if exists ix_cards_priorityDueReal") DeckStorage._addViews(deck) DeckStorage._addIndices(deck) deck.updateDynamicIndices() deck.version = 25 deck.s.commit() if deck.version < 26: # no spaces in tags anymore, as separated by space def munge(tags): tags = re.sub(", ?", "--tmp--", tags) tags = re.sub(" - ", "-", tags) tags = re.sub(" ", "-", tags) tags = re.sub("--tmp--", " ", tags) tags = canonifyTags(tags) return tags rows = deck.s.all('select id, tags from facts') d = [] for (id, tags) in rows: d.append({ 'i': id, 't': munge(tags), }) deck.s.statements( "update facts set tags = :t where id = :i", d) for k in ('highPriority', 'medPriority', 'lowPriority', 'suspended'): x = getattr(deck, k) setattr(deck, k, munge(x)) for m in deck.models: for cm in m.cardModels: cm.name = munge(cm.name) m.tags = munge(m.tags) deck.updateCardsFromModel(m, dirty=False) deck.version = 26 deck.s.commit() deck.s.statement("vacuum") if deck.version < 27: DeckStorage._addIndices(deck) deck.updateCardTags() deck.updateAllPriorities(dirty=False) deck.version = 27 deck.s.commit() if deck.version < 28: deck.s.statement("pragma default_cache_size= 20000") deck.version = 28 deck.s.commit() if deck.version < 30: # remove duplicates from review history deck.s.statement(""" delete from reviewHistory where id not in ( select min(id) from reviewHistory group by cardId, time);""") deck.version = 30 deck.s.commit() if deck.version < 31: # recreate review history table deck.s.statement("drop index if exists ix_reviewHistory_unique") schema = """ CREATE TABLE %s ( cardId INTEGER NOT NULL, time NUMERIC(10, 2) NOT NULL, lastInterval NUMERIC(10, 2) NOT NULL, nextInterval NUMERIC(10, 2) NOT NULL, ease INTEGER NOT NULL, delay NUMERIC(10, 2) NOT NULL, lastFactor NUMERIC(10, 2) NOT NULL, nextFactor NUMERIC(10, 2) NOT NULL, reps NUMERIC(10, 2) NOT NULL, thinkingTime NUMERIC(10, 2) NOT NULL, yesCount NUMERIC(10, 2) NOT NULL, noCount NUMERIC(10, 2) NOT NULL, PRIMARY KEY (cardId, time))""" deck.s.statement(schema % "revtmp") deck.s.statement(""" insert into revtmp select cardId, time, lastInterval, nextInterval, ease, delay, lastFactor, nextFactor, reps, thinkingTime, yesCount, noCount from reviewHistory""") deck.s.statement("drop table reviewHistory") metadata.create_all(deck.engine) deck.s.statement( "insert into reviewHistory select * from revtmp") deck.s.statement("drop table revtmp") deck.version = 31 deck.s.commit() deck.s.statement("vacuum") if deck.version < 32: deck.s.execute("drop index if exists ix_cardTags_tagId") deck.s.execute("drop index if exists ix_cardTags_cardId") DeckStorage._addIndices(deck) deck.s.execute("analyze") deck.version = 32 deck.s.commit() if deck.version < 33: deck.s.execute("drop index if exists ix_tags_tag") DeckStorage._addIndices(deck) deck.version = 33 deck.s.commit() if deck.version < 34: deck.s.execute("drop view if exists acqCardsRandom") deck.s.execute("drop index if exists ix_cards_factId") DeckStorage._addIndices(deck) deck.updateDynamicIndices() deck.version = 34 deck.s.commit() if deck.version < 36: deck.s.statement("drop index if exists ix_cards_priorityDue") DeckStorage._addIndices(deck) deck.s.execute("analyze") deck.version = 36 deck.s.commit() if deck.version < 37: if deck.getFailedCardPolicy() == 1: deck.failedCardMax = 0 deck.version = 37 deck.s.commit() if deck.version < 39: deck.reset() # manually suspend all suspended cards ids = deck.findCards("tag:suspended") if ids: # unrolled from suspendCards() to avoid marking dirty deck.s.statement( "update cards set isDue=0, priority=-3 " "where id in %s" % ids2str(ids)) deck.rebuildCounts() # suspended tag obsolete - don't do this yet deck.suspended = re.sub(u" ?Suspended ?", u"", deck.suspended) deck.updateTagPriorities() deck.version = 39 deck.s.commit() if deck.version < 40: # now stores media url deck.s.statement("update models set features = ''") deck.version = 40 deck.s.commit() if deck.version < 43: deck.s.statement("update fieldModels set features = ''") deck.version = 43 deck.s.commit() if deck.version < 44: # leaner indices deck.s.statement("drop index if exists ix_cards_factId") deck.version = 44 deck.s.commit() if deck.version < 48: deck.updateFieldCache(deck.s.column0("select id from facts")) deck.version = 48 deck.s.commit() if deck.version < 50: # more new type handling deck.rebuildTypes() deck.version = 50 deck.s.commit() if deck.version < 52: dname = deck.name() sname = deck.syncName if sname and dname != sname: deck.notify(_("""\ When syncing, Anki now uses the same deck name on the server as the deck \ name on your computer. Because you had '%(dname)s' set to sync to \ '%(sname)s' on the server, syncing has been temporarily disabled. If you want to keep your changes to the online version, please use \ File>Download>Personal Deck to download the online version. If you want to keep the version on your computer, please enable \ syncing again via Settings>Deck Properties>Synchronisation. If you have syncing disabled in the preferences, you can ignore \ this message. (ERR-0101)""") % { 'sname':sname, 'dname':dname}) deck.disableSyncing() elif sname: deck.enableSyncing() deck.version = 52 deck.s.commit() if deck.version < 53: if deck.getBool("perDay"): if deck.hardIntervalMin == 0.333: deck.hardIntervalMin = max(1.0, deck.hardIntervalMin) deck.hardIntervalMax = max(1.1, deck.hardIntervalMax) deck.version = 53 deck.s.commit() if deck.version < 54: # broken versions of the DB orm die if this is a bool with a # non-int value deck.s.statement("update fieldModels set editFontFamily = 1"); deck.version = 54 deck.s.commit() if deck.version < 57: deck.version = 57 deck.s.commit() if deck.version < 61: # do our best to upgrade templates to the new style txt = '''\ %s''' for m in deck.models: unstyled = [] for fm in m.fieldModels: # find which fields had explicit formatting if fm.quizFontFamily or fm.quizFontSize or fm.quizFontColour: pass else: unstyled.append(fm.name) # fill out missing info fm.quizFontFamily = fm.quizFontFamily or u"Arial" fm.quizFontSize = fm.quizFontSize or 20 fm.quizFontColour = fm.quizFontColour or "#000000" fm.editFontSize = fm.editFontSize or 20 unstyled = set(unstyled) for cm in m.cardModels: # embed the old font information into card templates cm.qformat = txt % ( cm.questionFontFamily, cm.questionFontSize, cm.questionFontColour, cm.qformat) cm.aformat = txt % ( cm.answerFontFamily, cm.answerFontSize, cm.answerFontColour, cm.aformat) # escape fields that had no previous styling for un in unstyled: cm.qformat = cm.qformat.replace("%("+un+")s", "{{{%s}}}"%un) cm.aformat = cm.aformat.replace("%("+un+")s", "{{{%s}}}"%un) # rebuild q/a for the above & because latex has changed for m in deck.models: deck.updateCardsFromModel(m, dirty=False) # rebuild the media db based on new format deck.version = 61 deck.s.commit() if deck.version < 62: # updated indices for d in ("intervalDesc", "intervalAsc", "randomOrder", "dueAsc", "dueDesc"): deck.s.statement("drop index if exists ix_cards_%s2" % d) deck.s.statement("drop index if exists ix_cards_typeCombined") DeckStorage._addIndices(deck) deck.updateDynamicIndices() deck.s.execute("vacuum") deck.version = 62 deck.s.commit() if deck.version < 64: # remove old static indices, as all clients should be libanki1.2+ for d in ("ix_cards_duePriority", "ix_cards_priorityDue"): deck.s.statement("drop index if exists %s" % d) # remove old dynamic indices for d in ("intervalDesc", "intervalAsc", "randomOrder", "dueAsc", "dueDesc"): deck.s.statement("drop index if exists ix_cards_%s" % d) deck.s.execute("analyze") deck.version = 64 deck.s.commit() # note: we keep the priority index for now if deck.version < 65: # we weren't correctly setting relativeDelay when answering cards # in previous versions, so ensure everything is set correctly deck.rebuildTypes() deck.version = 65 deck.s.commit() # executing a pragma here is very slow on large decks, so we store # our own record if not deck.getInt("pageSize") == 4096: deck.s.commit() deck.s.execute("pragma page_size = 4096") deck.s.execute("pragma legacy_file_format = 0") deck.s.execute("vacuum") deck.setVar("pageSize", 4096, mod=False) deck.s.commit() if prog: assert deck.modified == oldmod deck.finishProgress() return deck _upgradeDeck = staticmethod(_upgradeDeck) def _setUTCOffset(deck): # 4am deck.utcOffset = time.timezone + 60*60*4 _setUTCOffset = staticmethod(_setUTCOffset) def backup(deck, path): """Path must not be unicode.""" if not numBackups: return def escape(path): path = os.path.abspath(path) path = path.replace("\\", "!") path = path.replace("/", "!") path = path.replace(":", "") return path escp = escape(path) # make sure backup dir exists try: os.makedirs(backupDir) except (OSError, IOError): pass # find existing backups gen = re.sub("\.oldanki$", ".backup-(\d+).oldanki", re.escape(escp)) backups = [] for file in os.listdir(backupDir): m = re.match(gen, file) if m: backups.append((int(m.group(1)), file)) backups.sort() # check if last backup is the same if backups: latest = os.path.join(backupDir, backups[-1][1]) if int(deck.modified) == int( os.stat(latest)[stat.ST_MTIME]): return # check integrity if not deck.s.scalar("pragma integrity_check") == "ok": raise DeckAccessError(_("Deck is corrupt."), type="corrupt") # get next num if not backups: n = 1 else: n = backups[-1][0] + 1 # do backup newpath = os.path.join(backupDir, os.path.basename( re.sub("\.oldanki$", ".backup-%s.oldanki" % n, escp))) shutil.copy2(path, newpath) # set mtimes to be identical if deck.modified: os.utime(newpath, (deck.modified, deck.modified)) # remove if over if len(backups) + 1 > numBackups: delete = len(backups) + 1 - numBackups delete = backups[:delete] for file in delete: os.unlink(os.path.join(backupDir, file[1])) backup = staticmethod(backup) def newCardOrderLabels(): return { 0: _("Show new cards in random order"), 1: _("Show new cards in order added"), 2: _("Show new cards in reverse order added"), } def newCardSchedulingLabels(): return { 0: _("Spread new cards out through reviews"), 1: _("Show new cards after all other cards"), 2: _("Show new cards before reviews"), } def revCardOrderLabels(): return { 0: _("Review cards from largest interval"), 1: _("Review cards from smallest interval"), 2: _("Review cards in order due"), 3: _("Review cards in random order"), } def failedCardOptionLabels(): return { 0: _("Show failed cards soon"), 1: _("Show failed cards at end"), 2: _("Show failed cards in 10 minutes"), 3: _("Show failed cards in 8 hours"), 4: _("Show failed cards in 3 days"), 5: _("Custom failed cards handling"), } anki-2.0.20+dfsg/oldanki/exporting.py0000644000175000017500000002031612072547733017276 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Exporting support ============================== """ __docformat__ = 'restructuredtext' import itertools, time, re, os, HTMLParser from operator import itemgetter from oldanki import DeckStorage from oldanki.cards import Card from oldanki.sync import SyncClient, SyncServer, copyLocalMedia from oldanki.lang import _ from oldanki.utils import findTag, parseTags, stripHTML, ids2str from oldanki.tags import tagIds from oldanki.db import * class Exporter(object): def __init__(self, deck): self.deck = deck self.limitTags = [] self.limitCardIds = [] def exportInto(self, path): self._escapeCount = 0 file = open(path, "wb") self.doExport(file) file.close() def escapeText(self, text, removeFields=False): "Escape newlines and tabs, and strip Anki HTML." from BeautifulSoup import BeautifulSoup as BS text = text.replace("\n", "
") text = text.replace("\t", " " * 8) if removeFields: # beautifulsoup is slow self._escapeCount += 1 if self._escapeCount % 100 == 0: self.deck.updateProgress() try: s = BS(text) all = s('span', {'class': re.compile("fm.*")}) for e in all: e.replaceWith("".join([unicode(x) for x in e.contents])) text = unicode(s) except HTMLParser.HTMLParseError: pass return text def cardIds(self): "Return all cards, limited by tags or provided ids." if self.limitCardIds: return self.limitCardIds if not self.limitTags: cards = self.deck.s.column0("select id from cards") else: d = tagIds(self.deck.s, self.limitTags, create=False) cards = self.deck.s.column0( "select cardId from cardTags where tagid in %s" % ids2str(d.values())) self.count = len(cards) return cards class AnkiExporter(Exporter): key = _("Anki Deck (*.oldanki)") ext = ".oldanki" def __init__(self, deck): Exporter.__init__(self, deck) self.includeSchedulingInfo = False self.includeMedia = True def exportInto(self, path): n = 3 if not self.includeSchedulingInfo: n += 1 self.deck.startProgress(n) self.deck.updateProgress(_("Exporting...")) try: os.unlink(path) except (IOError, OSError): pass self.newDeck = DeckStorage.Deck(path) client = SyncClient(self.deck) server = SyncServer(self.newDeck) client.setServer(server) client.localTime = self.deck.modified client.remoteTime = 0 self.deck.s.flush() # set up a custom change list and sync lsum = self.localSummary() rsum = server.summary(0) self.deck.updateProgress() payload = client.genPayload((lsum, rsum)) self.deck.updateProgress() res = server.applyPayload(payload) if not self.includeSchedulingInfo: self.deck.updateProgress() self.newDeck.s.statement(""" delete from reviewHistory""") self.newDeck.s.statement(""" update cards set interval = 0, lastInterval = 0, due = created, lastDue = 0, factor = 2.5, firstAnswered = 0, reps = 0, successive = 0, averageTime = 0, reviewTime = 0, youngEase0 = 0, youngEase1 = 0, youngEase2 = 0, youngEase3 = 0, youngEase4 = 0, matureEase0 = 0, matureEase1 = 0, matureEase2 = 0, matureEase3 = 0, matureEase4 = 0, yesCount = 0, noCount = 0, spaceUntil = 0, type = 2, relativeDelay = 2, combinedDue = created, modified = :now """, now=time.time()) self.newDeck.s.statement(""" delete from stats""") # media if self.includeMedia: server.deck.mediaPrefix = "" copyLocalMedia(client.deck, server.deck) # need to save manually self.newDeck.rebuildCounts() self.newDeck.updateAllPriorities() self.exportedCards = self.newDeck.cardCount self.newDeck.utcOffset = -1 self.newDeck.s.commit() self.newDeck.close() self.deck.finishProgress() def localSummary(self): cardIds = self.cardIds() cStrIds = ids2str(cardIds) cards = self.deck.s.all(""" select id, modified from cards where id in %s""" % cStrIds) facts = self.deck.s.all(""" select facts.id, facts.modified from cards, facts where facts.id = cards.factId and cards.id in %s""" % cStrIds) models = self.deck.s.all(""" select models.id, models.modified from models, facts where facts.modelId = models.id and facts.id in %s""" % ids2str([f[0] for f in facts])) media = self.deck.s.all(""" select id, created from media""") return { # cards "cards": cards, "delcards": [], # facts "facts": facts, "delfacts": [], # models "models": models, "delmodels": [], # media "media": media, "delmedia": [], } class TextCardExporter(Exporter): key = _("Text files (*.txt)") ext = ".txt" def __init__(self, deck): Exporter.__init__(self, deck) self.includeTags = False def doExport(self, file): ids = self.cardIds() strids = ids2str(ids) self.deck.startProgress((len(ids) + 1) / 50) self.deck.updateProgress(_("Exporting...")) cards = self.deck.s.all(""" select cards.question, cards.answer, cards.id from cards where cards.id in %s order by cards.created""" % strids) self.deck.updateProgress() if self.includeTags: self.cardTags = dict(self.deck.s.all(""" select cards.id, facts.tags from cards, facts where cards.factId = facts.id and cards.id in %s order by cards.created""" % strids)) out = u"\n".join(["%s\t%s%s" % ( self.escapeText(c[0], removeFields=True), self.escapeText(c[1], removeFields=True), self.tags(c[2])) for c in cards]) if out: out += "\n" file.write(out.encode("utf-8")) self.deck.finishProgress() def tags(self, id): if self.includeTags: return "\t" + ", ".join(parseTags(self.cardTags[id])) return "" class TextFactExporter(Exporter): key = _("Text files (*.txt)") ext = ".txt" def __init__(self, deck): Exporter.__init__(self, deck) self.includeTags = False def doExport(self, file): cardIds = self.cardIds() self.deck.startProgress() self.deck.updateProgress(_("Exporting...")) facts = self.deck.s.all(""" select factId, value, facts.created from facts, fields where facts.id in (select distinct factId from cards where cards.id in %s) and facts.id = fields.factId order by factId, ordinal""" % ids2str(cardIds)) txt = "" self.deck.updateProgress() if self.includeTags: self.factTags = dict(self.deck.s.all( "select id, tags from facts where id in %s" % ids2str([fact[0] for fact in facts]))) groups = itertools.groupby(facts, itemgetter(0)) groups = [[x for x in y[1]] for y in groups] groups = [(group[0][2], "\t".join([self.escapeText(x[1]) for x in group]) + self.tags(group[0][0])) for group in groups] self.deck.updateProgress() groups.sort(key=itemgetter(0)) out = [ret[1] for ret in groups] self.count = len(out) out = "\n".join(out) file.write(out.encode("utf-8")) self.deck.finishProgress() def tags(self, id): if self.includeTags: return "\t" + self.factTags[id] return "" # Export modules ########################################################################## def exporters(): return ( (_("Anki Deck (*.oldanki)"), AnkiExporter), (_("Cards in tab-separated text file (*.txt)"), TextCardExporter), (_("Facts in tab-separated text file (*.txt)"), TextFactExporter)) anki-2.0.20+dfsg/oldanki/hooks.py0000644000175000017500000000350712072547733016405 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Hooks - hook management and tools for extending Anki ============================================================================== To find available hooks, grep for runHook in the source code. Instrumenting allows you to modify functions that don't have hooks available. If you call wrap() with pos='around', the original function will not be called automatically but can be called with _old(). """ # Hooks ############################################################################## _hooks = {} def runHook(hook, *args): "Run all functions on hook." hook = _hooks.get(hook, None) if hook: for func in hook: func(*args) def runFilter(hook, arg, *args): hook = _hooks.get(hook, None) if hook: for func in hook: arg = func(arg, *args) return arg def addHook(hook, func): "Add a function to hook. Ignore if already on hook." if not _hooks.get(hook, None): _hooks[hook] = [] if func not in _hooks[hook]: _hooks[hook].append(func) def removeHook(hook, func): "Remove a function if is on hook." hook = _hooks.get(hook, []) if func in hook: hook.remove(func) def hookEmpty(hook): return not _hooks.get(hook) # Instrumenting ############################################################################## def wrap(old, new, pos="after"): "Override an existing function." def repl(*args, **kwargs): if pos == "after": old(*args, **kwargs) return new(*args, **kwargs) elif pos == "before": new(*args, **kwargs) return old(*args, **kwargs) else: return new(_old=old, *args, **kwargs) return repl anki-2.0.20+dfsg/oldanki/graphs.py0000644000175000017500000003414612072547733016551 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Graphs of deck statistics ============================== """ __docformat__ = 'restructuredtext' import os, sys, time import oldanki.stats from oldanki.lang import _ import datetime #colours for graphs dueYoungC = "#ffb380" dueMatureC = "#ff5555" dueCumulC = "#ff8080" reviewNewC = "#80ccff" reviewYoungC = "#3377ff" reviewMatureC = "#0000ff" reviewTimeC = "#0fcaff" easesNewC = "#80b3ff" easesYoungC = "#5555ff" easesMatureC = "#0f5aff" addedC = "#b3ff80" firstC = "#b380ff" intervC = "#80e5ff" # support frozen distribs if sys.platform.startswith("darwin"): try: del os.environ['MATPLOTLIBDATA'] except: pass try: from matplotlib.figure import Figure except UnicodeEncodeError: # haven't tracked down the cause of this yet, but reloading fixes it try: from matplotlib.figure import Figure except ImportError: pass except ImportError: pass def graphsAvailable(): return 'matplotlib' in sys.modules class DeckGraphs(object): def __init__(self, deck, width=8, height=3, dpi=75, selective=True): self.deck = deck self.stats = None self.width = width self.height = height self.dpi = dpi self.selective = selective def calcStats (self): if not self.stats: days = {} daysYoung = {} daysMature = {} months = {} next = {} lowestInDay = 0 self.endOfDay = self.deck.failedCutoff t = time.time() young = """ select interval, combinedDue from cards c where relativeDelay between 0 and 1 and type >= 0 and interval <= 21""" mature = """ select interval, combinedDue from cards c where relativeDelay = 1 and type >= 0 and interval > 21""" if self.selective: young = self.deck._cardLimit("revActive", "revInactive", young) mature = self.deck._cardLimit("revActive", "revInactive", mature) young = self.deck.s.all(young) mature = self.deck.s.all(mature) for (src, dest) in [(young, daysYoung), (mature, daysMature)]: for (interval, due) in src: day=int(round(interval)) days[day] = days.get(day, 0) + 1 indays = int(((due - self.endOfDay) / 86400.0) + 1) next[indays] = next.get(indays, 0) + 1 # type-agnostic stats dest[indays] = dest.get(indays, 0) + 1 # type-specific stats if indays < lowestInDay: lowestInDay = indays self.stats = {} self.stats['next'] = next self.stats['days'] = days self.stats['daysByType'] = {'young': daysYoung, 'mature': daysMature} self.stats['months'] = months self.stats['lowestInDay'] = lowestInDay dayReps = self.deck.s.all(""" select day, matureEase0+matureEase1+matureEase2+matureEase3+matureEase4 as matureReps, reps-(newEase0+newEase1+newEase2+newEase3+newEase4) as combinedYoungReps, reps as combinedNewReps from stats where type = 1""") dayTimes = self.deck.s.all(""" select day, reviewTime as reviewTime from stats where type = 1""") todaydt = self.deck._dailyStats.day for dest, source in [("dayRepsNew", "combinedNewReps"), ("dayRepsYoung", "combinedYoungReps"), ("dayRepsMature", "matureReps")]: self.stats[dest] = dict( map(lambda dr: (-(todaydt -datetime.date( *(int(x)for x in dr["day"].split("-")))).days, dr[source]), dayReps)) self.stats['dayTimes'] = dict( map(lambda dr: (-(todaydt -datetime.date( *(int(x)for x in dr["day"].split("-")))).days, dr["reviewTime"]/60.0), dayTimes)) def nextDue(self, days=30): self.calcStats() fig = Figure(figsize=(self.width, self.height), dpi=self.dpi) graph = fig.add_subplot(111) dayslists = [self.stats['next'], self.stats['daysByType']['mature']] for dayslist in dayslists: self.addMissing(dayslist, self.stats['lowestInDay'], days) argl = [] for dayslist in dayslists: dl = [x for x in dayslist.items() if x[0] <= days] argl.extend(list(self.unzip(dl))) self.varGraph(graph, days, [dueYoungC, dueMatureC], *argl) cheat = fig.add_subplot(111) b1 = cheat.bar(0, 0, color = dueYoungC) b2 = cheat.bar(1, 0, color = dueMatureC) cheat.legend([b1, b2], [ "Young", "Mature"], loc='upper right') graph.set_xlim(xmin=self.stats['lowestInDay'], xmax=days+1) graph.set_xlabel("Day (0 = today)") graph.set_ylabel("Cards Due") return fig def workDone(self, days=30): self.calcStats() for type in ["dayRepsNew", "dayRepsYoung", "dayRepsMature"]: self.addMissing(self.stats[type], -days, 0) fig = Figure(figsize=(self.width, self.height), dpi=self.dpi) graph = fig.add_subplot(111) args = sum((self.unzip(self.stats[type].items(), limit=days, reverseLimit=True) for type in ["dayRepsMature", "dayRepsYoung", "dayRepsNew"][::-1]), []) self.varGraph(graph, days, [reviewNewC, reviewYoungC, reviewMatureC], *args) cheat = fig.add_subplot(111) b1 = cheat.bar(-3, 0, color = reviewNewC) b2 = cheat.bar(-4, 0, color = reviewYoungC) b3 = cheat.bar(-5, 0, color = reviewMatureC) cheat.legend([b1, b2, b3], [ "New", "Young", "Mature"], loc='upper left') graph.set_xlim(xmin=-days+1, xmax=1) graph.set_ylim(ymax=max(max(a for a in args[1::2])) + 10) graph.set_xlabel("Day (0 = today)") graph.set_ylabel("Cards Answered") return fig def timeSpent(self, days=30): self.calcStats() fig = Figure(figsize=(self.width, self.height), dpi=self.dpi) times = self.stats['dayTimes'] self.addMissing(times, -days+1, 0) times = self.unzip([(day,y) for (day,y) in times.items() if day + days >= 0]) graph = fig.add_subplot(111) self.varGraph(graph, days, reviewTimeC, *times) graph.set_xlim(xmin=-days+1, xmax=1) graph.set_ylim(ymax=max(a for a in times[1]) + 0.1) graph.set_xlabel("Day (0 = today)") graph.set_ylabel("Minutes") return fig def cumulativeDue(self, days=30): self.calcStats() fig = Figure(figsize=(self.width, self.height), dpi=self.dpi) graph = fig.add_subplot(111) self.addMissing(self.stats['next'], 0, days-1) dl = [x for x in self.stats['next'].items() if x[0] <= days] (x, y) = self.unzip(dl) count=0 y = list(y) for i in range(len(x)): count = count + y[i] if i == 0: continue y[i] = count if x[i] > days: break self._filledGraph(graph, days, dueCumulC, 1, x, y) graph.set_xlim(xmin=self.stats['lowestInDay'], xmax=days-1) graph.set_ylim(ymax=graph.get_ylim()[1]+10) graph.set_xlabel("Day (0 = today)") graph.set_ylabel("Cards Due") return fig def intervalPeriod(self, days=30): self.calcStats() fig = Figure(figsize=(self.width, self.height), dpi=self.dpi) ints = self.stats['days'] self.addMissing(ints, 0, days) intervals = self.unzip(ints.items(), limit=days) graph = fig.add_subplot(111) self.varGraph(graph, days, intervC, *intervals) graph.set_xlim(xmin=0, xmax=days+1) graph.set_xlabel("Card Interval") graph.set_ylabel("Number of Cards") return fig def addedRecently(self, numdays=30, attr='created'): self.calcStats() days = {} fig = Figure(figsize=(self.width, self.height), dpi=self.dpi) limit = self.endOfDay - (numdays) * 86400 res = self.deck.s.column0("select %s from cards where %s >= %f" % (attr, attr, limit)) for r in res: d = int((r - self.endOfDay) / 86400.0) days[d] = days.get(d, 0) + 1 self.addMissing(days, -numdays+1, 0) graph = fig.add_subplot(111) intervals = self.unzip(days.items()) if attr == 'created': colour = addedC else: colour = firstC self.varGraph(graph, numdays, colour, *intervals) graph.set_xlim(xmin=-numdays+1, xmax=1) graph.set_xlabel("Day (0 = today)") if attr == 'created': graph.set_ylabel("Cards Added") else: graph.set_ylabel("Cards First Answered") return fig def addMissing(self, dic, min, max): for i in range(min, max+1): if not i in dic: dic[i] = 0 def unzip(self, tuples, fillFix=True, limit=None, reverseLimit=False): tuples.sort(cmp=lambda x,y: cmp(x[0], y[0])) if limit: if reverseLimit: tuples = tuples[-limit:] else: tuples = tuples[:limit+1] new = zip(*tuples) return new def varGraph(self, graph, days, colours=["b"], *args): if len(args[0]) < 120: return self.barGraph(graph, days, colours, *args) else: return self.filledGraph(graph, days, colours, *args) def filledGraph(self, graph, days, colours=["b"], *args): self._filledGraph(graph, days, colours, 0, *args) def _filledGraph(self, graph, days, colours, lw, *args): if isinstance(colours, str): colours = [colours] for triplet in [(args[n], args[n + 1], colours[n / 2]) for n in range(0, len(args), 2)]: x = list(triplet[0]) y = list(triplet[1]) c = triplet[2] lowest = 99999 highest = -lowest for i in range(len(x)): if x[i] < lowest: lowest = x[i] if x[i] > highest: highest = x[i] # ensure the filled area reaches the bottom x.insert(0, lowest - 1) y.insert(0, 0) x.append(highest + 1) y.append(0) # plot graph.fill(x, y, c, lw=lw) graph.grid(True) graph.set_ylim(ymin=0, ymax=max(2, graph.get_ylim()[1])) def barGraph(self, graph, days, colours, *args): if isinstance(colours, str): colours = [colours] lim = None for triplet in [(args[n], args[n + 1], colours[n / 2]) for n in range(0, len(args), 2)]: x = list(triplet[0]) y = list(triplet[1]) c = triplet[2] lw = 0 if lim is None: lim = (x[0], x[-1]) length = (lim[1] - lim[0]) if len(args) > 4: if length <= 30: lw = 1 else: if length <= 90: lw = 1 lowest = 99999 highest = -lowest for i in range(len(x)): if x[i] < lowest: lowest = x[i] if x[i] > highest: highest = x[i] graph.bar(x, y, color=c, width=1, linewidth=lw) graph.grid(True) graph.set_ylim(ymin=0, ymax=max(2, graph.get_ylim()[1])) import numpy as np if length > 10: step = length / 10.0 # python's range() won't accept float step args, so we do it manually if lim[0] < 0: ticks = [int(lim[1] - step * x) for x in range(10)] else: ticks = [int(lim[0] + step * x) for x in range(10)] else: ticks = list(xrange(lim[0], lim[1]+1)) graph.set_xticks(np.array(ticks) + 0.5) graph.set_xticklabels([str(int(x)) for x in ticks]) for tick in graph.xaxis.get_major_ticks(): tick.tick1On = False tick.tick2On = False def easeBars(self): fig = Figure(figsize=(3, 3), dpi=self.dpi) graph = fig.add_subplot(111) types = ("new", "young", "mature") enum = 5 offset = 0 arrsize = 16 arr = [0] * arrsize n = 0 colours = [easesNewC, easesYoungC, easesMatureC] bars = [] gs = oldanki.stats.globalStats(self.deck) for type in types: total = (getattr(gs, type + "Ease0") + getattr(gs, type + "Ease1") + getattr(gs, type + "Ease2") + getattr(gs, type + "Ease3") + getattr(gs, type + "Ease4")) setattr(gs, type + "Ease1", getattr(gs, type + "Ease0") + getattr(gs, type + "Ease1")) setattr(gs, type + "Ease0", -1) for e in range(1, enum): try: arr[e+offset] = (getattr(gs, type + "Ease%d" % e) / float(total)) * 100 + 1 except ZeroDivisionError: arr[e+offset] = 0 bars.append(graph.bar(range(arrsize), arr, width=1.0, color=colours[n], align='center')) arr = [0] * arrsize offset += 5 n += 1 x = ([""] + [str(n) for n in range(1, enum)]) * 3 graph.legend([p[0] for p in bars], ("New", "Young", "Mature"), 'upper left') graph.set_ylim(ymax=100) graph.set_xlim(xmax=15) graph.set_xticks(range(arrsize)) graph.set_xticklabels(x) graph.set_ylabel("% of Answers") graph.set_xlabel("Answer Buttons") graph.grid(True) return fig anki-2.0.20+dfsg/oldanki/latex.py0000644000175000017500000001142512072547733016375 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Latex support ============================== """ __docformat__ = 'restructuredtext' import re, tempfile, os, sys, shutil, cgi, subprocess from oldanki.utils import genID, checksum, call from oldanki.hooks import addHook from htmlentitydefs import entitydefs from oldanki.lang import _ latexDviPngCmd = ["dvipng", "-D", "200", "-T", "tight"] regexps = { "standard": re.compile(r"\[latex\](.+?)\[/latex\]", re.DOTALL | re.IGNORECASE), "expression": re.compile(r"\[\$\](.+?)\[/\$\]", re.DOTALL | re.IGNORECASE), "math": re.compile(r"\[\$\$\](.+?)\[/\$\$\]", re.DOTALL | re.IGNORECASE), } tmpdir = tempfile.mkdtemp(prefix="oldanki") # add standard tex install location to osx if sys.platform == "darwin": os.environ['PATH'] += ":/usr/texbin" def renderLatex(deck, text, build=True): "Convert TEXT with embedded latex tags to image links." for match in regexps['standard'].finditer(text): text = text.replace(match.group(), imgLink(deck, match.group(1), build)) for match in regexps['expression'].finditer(text): text = text.replace(match.group(), imgLink( deck, "$" + match.group(1) + "$", build)) for match in regexps['math'].finditer(text): text = text.replace(match.group(), imgLink( deck, "\\begin{displaymath}" + match.group(1) + "\\end{displaymath}", build)) return text def stripLatex(text): for match in regexps['standard'].finditer(text): text = text.replace(match.group(), "") for match in regexps['expression'].finditer(text): text = text.replace(match.group(), "") for match in regexps['math'].finditer(text): text = text.replace(match.group(), "") return text def latexImgFile(deck, latexCode): key = checksum(latexCode) return "latex-%s.png" % key def mungeLatex(deck, latex): "Convert entities, fix newlines, convert to utf8, and wrap pre/postamble." for match in re.compile("&([a-z]+);", re.IGNORECASE).finditer(latex): if match.group(1) in entitydefs: latex = latex.replace(match.group(), entitydefs[match.group(1)]) latex = re.sub("", "\n", latex) latex = (deck.getVar("latexPre") + "\n" + latex + "\n" + deck.getVar("latexPost")) latex = latex.encode("utf-8") return latex def buildImg(deck, latex): log = open(os.path.join(tmpdir, "latex_log.txt"), "w+") texpath = os.path.join(tmpdir, "tmp.tex") texfile = file(texpath, "w") texfile.write(latex) texfile.close() # make sure we have a valid mediaDir mdir = deck.mediaDir(create=True) oldcwd = os.getcwd() if sys.platform == "win32": si = subprocess.STARTUPINFO() try: si.dwFlags |= subprocess.STARTF_USESHOWWINDOW except: si.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW else: si = None try: os.chdir(tmpdir) def errmsg(type): msg = _("Error executing %s.\n") % type try: log = open(os.path.join(tmpdir, "latex_log.txt")).read() msg += "
" + cgi.escape(log) + "
" except: msg += _("Have you installed latex and dvipng?") pass return msg if call(["latex", "-interaction=nonstopmode", "tmp.tex"], stdout=log, stderr=log, startupinfo=si): return (False, errmsg("latex")) if call(latexDviPngCmd + ["tmp.dvi", "-o", "tmp.png"], stdout=log, stderr=log, startupinfo=si): return (False, errmsg("dvipng")) # add to media target = latexImgFile(deck, latex) shutil.copy2(os.path.join(tmpdir, "tmp.png"), os.path.join(mdir, target)) return (True, target) finally: os.chdir(oldcwd) def imageForLatex(deck, latex, build=True): "Return an image that represents 'latex', building if necessary." imageFile = latexImgFile(deck, latex) ok = True if build and (not imageFile or not os.path.exists(imageFile)): (ok, imageFile) = buildImg(deck, latex) if not ok: return (False, imageFile) return (True, imageFile) def imgLink(deck, latex, build=True): "Parse LATEX and return a HTML image representing the output." munged = mungeLatex(deck, latex) (ok, img) = imageForLatex(deck, munged, build) if ok: return '%s' % (img, latex) else: return img def formatQA(html, type, cid, mid, fact, tags, cm, deck): return renderLatex(deck, html) # setup q/a filter addHook("formatQA", formatQA) anki-2.0.20+dfsg/oldanki/stats.py0000644000175000017500000005313612072547733016423 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Statistical tracking and reports ================================= """ __docformat__ = 'restructuredtext' # we track statistics over the life of the deck, and per-day STATS_LIFE = 0 STATS_DAY = 1 import unicodedata, time, sys, os, datetime import oldanki, oldanki.utils from datetime import date from oldanki.db import * from oldanki.lang import _, ngettext from oldanki.utils import canonifyTags, ids2str from oldanki.hooks import runFilter # Tracking stats on the DB ########################################################################## statsTable = Table( 'stats', metadata, Column('id', Integer, primary_key=True), Column('type', Integer, nullable=False), Column('day', Date, nullable=False), Column('reps', Integer, nullable=False, default=0), Column('averageTime', Float, nullable=False, default=0), Column('reviewTime', Float, nullable=False, default=0), # next two columns no longer used Column('distractedTime', Float, nullable=False, default=0), Column('distractedReps', Integer, nullable=False, default=0), Column('newEase0', Integer, nullable=False, default=0), Column('newEase1', Integer, nullable=False, default=0), Column('newEase2', Integer, nullable=False, default=0), Column('newEase3', Integer, nullable=False, default=0), Column('newEase4', Integer, nullable=False, default=0), Column('youngEase0', Integer, nullable=False, default=0), Column('youngEase1', Integer, nullable=False, default=0), Column('youngEase2', Integer, nullable=False, default=0), Column('youngEase3', Integer, nullable=False, default=0), Column('youngEase4', Integer, nullable=False, default=0), Column('matureEase0', Integer, nullable=False, default=0), Column('matureEase1', Integer, nullable=False, default=0), Column('matureEase2', Integer, nullable=False, default=0), Column('matureEase3', Integer, nullable=False, default=0), Column('matureEase4', Integer, nullable=False, default=0)) class Stats(object): def __init__(self): self.day = None self.reps = 0 self.averageTime = 0 self.reviewTime = 0 self.distractedTime = 0 self.distractedReps = 0 self.newEase0 = 0 self.newEase1 = 0 self.newEase2 = 0 self.newEase3 = 0 self.newEase4 = 0 self.youngEase0 = 0 self.youngEase1 = 0 self.youngEase2 = 0 self.youngEase3 = 0 self.youngEase4 = 0 self.matureEase0 = 0 self.matureEase1 = 0 self.matureEase2 = 0 self.matureEase3 = 0 self.matureEase4 = 0 def fromDB(self, s, id): r = s.first("select * from stats where id = :id", id=id) (self.id, self.type, self.day, self.reps, self.averageTime, self.reviewTime, self.distractedTime, self.distractedReps, self.newEase0, self.newEase1, self.newEase2, self.newEase3, self.newEase4, self.youngEase0, self.youngEase1, self.youngEase2, self.youngEase3, self.youngEase4, self.matureEase0, self.matureEase1, self.matureEase2, self.matureEase3, self.matureEase4) = r self.day = datetime.date(*[int(i) for i in self.day.split("-")]) def create(self, s, type, day): self.type = type self.day = day s.execute("""insert into stats (type, day, reps, averageTime, reviewTime, distractedTime, distractedReps, newEase0, newEase1, newEase2, newEase3, newEase4, youngEase0, youngEase1, youngEase2, youngEase3, youngEase4, matureEase0, matureEase1, matureEase2, matureEase3, matureEase4) values (:type, :day, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)""", self.__dict__) self.id = s.scalar( "select id from stats where type = :type and day = :day", type=type, day=day) def toDB(self, s): assert self.id s.execute("""update stats set type=:type, day=:day, reps=:reps, averageTime=:averageTime, reviewTime=:reviewTime, newEase0=:newEase0, newEase1=:newEase1, newEase2=:newEase2, newEase3=:newEase3, newEase4=:newEase4, youngEase0=:youngEase0, youngEase1=:youngEase1, youngEase2=:youngEase2, youngEase3=:youngEase3, youngEase4=:youngEase4, matureEase0=:matureEase0, matureEase1=:matureEase1, matureEase2=:matureEase2, matureEase3=:matureEase3, matureEase4=:matureEase4 where id = :id""", self.__dict__) mapper(Stats, statsTable) def genToday(deck): return datetime.datetime.utcfromtimestamp( time.time() - deck.utcOffset).date() def updateAllStats(s, gs, ds, card, ease, oldState): "Update global and daily statistics." updateStats(s, gs, card, ease, oldState) updateStats(s, ds, card, ease, oldState) def updateStats(s, stats, card, ease, oldState): stats.reps += 1 delay = card.totalTime() if delay >= 60: stats.reviewTime += 60 else: stats.reviewTime += delay stats.averageTime = ( stats.reviewTime / float(stats.reps)) # update eases attr = oldState + "Ease%d" % ease setattr(stats, attr, getattr(stats, attr) + 1) stats.toDB(s) def globalStats(deck): s = deck.s type = STATS_LIFE today = genToday(deck) id = s.scalar("select id from stats where type = :type", type=type) stats = Stats() if id: stats.fromDB(s, id) return stats else: stats.create(s, type, today) stats.type = type return stats def dailyStats(deck): s = deck.s type = STATS_DAY today = genToday(deck) id = s.scalar("select id from stats where type = :type and day = :day", type=type, day=today) stats = Stats() if id: stats.fromDB(s, id) return stats else: stats.create(s, type, today) return stats def summarizeStats(stats, pre=""): "Generate percentages and total counts for STATS. Optionally prefix." cardTypes = ("new", "young", "mature") h = {} # total counts ############### for type in cardTypes: # total yes/no for type, eg. gNewYes h[pre + type.capitalize() + "No"] = (getattr(stats, type + "Ease0") + getattr(stats, type + "Ease1")) h[pre + type.capitalize() + "Yes"] = (getattr(stats, type + "Ease2") + getattr(stats, type + "Ease3") + getattr(stats, type + "Ease4")) # total for type, eg. gNewTotal h[pre + type.capitalize() + "Total"] = ( h[pre + type.capitalize() + "No"] + h[pre + type.capitalize() + "Yes"]) # total yes/no, eg. gYesTotal for answer in ("yes", "no"): num = 0 for type in cardTypes: num += h[pre + type.capitalize() + answer.capitalize()] h[pre + answer.capitalize() + "Total"] = num # total over all, eg. gTotal num = 0 for type in cardTypes: num += h[pre + type.capitalize() + "Total"] h[pre + "Total"] = num # percentages ############## for type in cardTypes: # total yes/no % by type, eg. gNewYes% for answer in ("yes", "no"): setPercentage(h, pre + type.capitalize() + answer.capitalize(), pre + type.capitalize()) for answer in ("yes", "no"): # total yes/no, eg. gYesTotal% setPercentage(h, pre + answer.capitalize() + "Total", pre) h[pre + 'AverageTime'] = stats.averageTime h[pre + 'ReviewTime'] = stats.reviewTime return h def setPercentage(h, a, b): try: h[a + "%"] = (h[a] / float(h[b + "Total"])) * 100 except ZeroDivisionError: h[a + "%"] = 0 def getStats(s, gs, ds): "Return a handy dictionary exposing a number of internal stats." h = {} h.update(summarizeStats(gs, "g")) h.update(summarizeStats(ds, "d")) return h # Card stats ########################################################################## class CardStats(object): def __init__(self, deck, card): self.deck = deck self.card = card def report(self): c = self.card fmt = oldanki.utils.fmtTimeSpan fmtFloat = oldanki.utils.fmtFloat self.txt = "" self.addLine(_("Added"), self.strTime(c.created)) if c.firstAnswered: self.addLine(_("First Review"), self.strTime(c.firstAnswered)) self.addLine(_("Changed"), self.strTime(c.modified)) if c.reps: next = time.time() - c.combinedDue if next > 0: next = _("%s ago") % fmt(next) else: next = _("in %s") % fmt(abs(next)) self.addLine(_("Due"), next) self.addLine(_("Interval"), fmt(c.interval * 86400)) self.addLine(_("Ease"), fmtFloat(c.factor, point=2)) if c.lastDue: last = _("%s ago") % fmt(time.time() - c.lastDue) self.addLine(_("Last Due"), last) if c.interval != c.lastInterval: # don't show the last interval if it hasn't been updated yet self.addLine(_("Last Interval"), fmt(c.lastInterval * 86400)) self.addLine(_("Last Ease"), fmtFloat(c.lastFactor, point=2)) if c.reps: self.addLine(_("Reviews"), "%d/%d (s=%d)" % ( c.yesCount, c.reps, c.successive)) avg = fmt(c.averageTime, point=2) self.addLine(_("Average Time"),avg) total = fmt(c.reviewTime, point=2) self.addLine(_("Total Time"), total) self.addLine(_("Model Tags"), c.fact.model.tags) self.addLine(_("Card Template") + " "*5, c.cardModel.name) self.txt += "
" return self.txt def addLine(self, k, v): self.txt += "%s%s" % (k, v) def strTime(self, tm): s = oldanki.utils.fmtTimeSpan(time.time() - tm) return _("%s ago") % s # Deck stats (specific to the 'sched' scheduler) ########################################################################## class DeckStats(object): def __init__(self, deck): self.deck = deck def report(self): "Return an HTML string with a report." fmtPerc = oldanki.utils.fmtPercentage fmtFloat = oldanki.utils.fmtFloat if self.deck.isEmpty(): return _("Please add some cards first.") + "

" d = self.deck html="

" + _("Deck Statistics") + "

" html += _("Deck created: %s ago
") % self.createdTimeStr() total = d.cardCount new = d.newCountAll() young = d.youngCardCount() old = d.matureCardCount() newP = new / float(total) * 100 youngP = young / float(total) * 100 oldP = old / float(total) * 100 stats = d.getStats() (stats["new"], stats["newP"]) = (new, newP) (stats["old"], stats["oldP"]) = (old, oldP) (stats["young"], stats["youngP"]) = (young, youngP) html += _("Total number of cards:") + " %d
" % total html += _("Total number of facts:") + " %d

" % d.factCount html += "" + _("Card Maturity") + "
" html += _("Mature cards: ") + " %(old)d (%(oldP)s)
" % { 'old': stats['old'], 'oldP' : fmtPerc(stats['oldP'])} html += _("Young cards: ") + " %(young)d (%(youngP)s)
" % { 'young': stats['young'], 'youngP' : fmtPerc(stats['youngP'])} html += _("Unseen cards:") + " %(new)d (%(newP)s)
" % { 'new': stats['new'], 'newP' : fmtPerc(stats['newP'])} avgInt = self.getAverageInterval() if avgInt: html += _("Average interval: ") + ("%s ") % fmtFloat(avgInt) + _("days") html += "
" html += "
" html += "" + _("Correct Answers") + "
" html += _("Mature cards: ") + " " + fmtPerc(stats['gMatureYes%']) + ( " " + _("(%(partOf)d of %(totalSum)d)") % { 'partOf' : stats['gMatureYes'], 'totalSum' : stats['gMatureTotal'] } + "
") html += _("Young cards: ") + " " + fmtPerc(stats['gYoungYes%']) + ( " " + _("(%(partOf)d of %(totalSum)d)") % { 'partOf' : stats['gYoungYes'], 'totalSum' : stats['gYoungTotal'] } + "
") html += _("First-seen cards:") + " " + fmtPerc(stats['gNewYes%']) + ( " " + _("(%(partOf)d of %(totalSum)d)") % { 'partOf' : stats['gNewYes'], 'totalSum' : stats['gNewTotal'] } + "

") # average pending time existing = d.cardCount - d.newCountToday def tr(a, b): return "%s%s" % (a, b) def repsPerDay(reps,days): retval = ("%d " % reps) + ngettext("rep", "reps", reps) retval += ("/%d " % days) + ngettext("day", "days", days) return retval if existing and avgInt: html += "" + _("Recent Work") + "" if sys.platform.startswith("darwin"): html += "" else: html += "
" html += tr(_("In last week"), repsPerDay( self.getRepsDone(-7, 0), self.getDaysReviewed(-7, 0))) html += tr(_("In last month"), repsPerDay( self.getRepsDone(-30, 0), self.getDaysReviewed(-30, 0))) html += tr(_("In last 3 months"), repsPerDay( self.getRepsDone(-92, 0), self.getDaysReviewed(-92, 0))) html += tr(_("In last 6 months"), repsPerDay( self.getRepsDone(-182, 0), self.getDaysReviewed(-182, 0))) html += tr(_("In last year"), repsPerDay( self.getRepsDone(-365, 0), self.getDaysReviewed(-365, 0))) html += tr(_("Deck life"), repsPerDay( self.getRepsDone(-13000, 0), self.getDaysReviewed(-13000, 0))) html += "
" html += "

" + _("Average Daily Reviews") + "" if sys.platform.startswith("darwin"): html += "" else: html += "
" html += tr(_("Deck life"), ("%s ") % ( fmtFloat(self.getSumInverseRoundInterval())) + _("cards/day")) html += tr(_("In next week"), ("%s ") % ( fmtFloat(self.getWorkloadPeriod(7))) + _("cards/day")) html += tr(_("In next month"), ("%s ") % ( fmtFloat(self.getWorkloadPeriod(30))) + _("cards/day")) html += tr(_("In last week"), ("%s ") % ( fmtFloat(self.getPastWorkloadPeriod(7))) + _("cards/day")) html += tr(_("In last month"), ("%s ") % ( fmtFloat(self.getPastWorkloadPeriod(30))) + _("cards/day")) html += tr(_("In last 3 months"), ("%s ") % ( fmtFloat(self.getPastWorkloadPeriod(92))) + _("cards/day")) html += tr(_("In last 6 months"), ("%s ") % ( fmtFloat(self.getPastWorkloadPeriod(182))) + _("cards/day")) html += tr(_("In last year"), ("%s ") % ( fmtFloat(self.getPastWorkloadPeriod(365))) + _("cards/day")) html += "
" html += "

" + _("Average Added") + "" if sys.platform.startswith("darwin"): html += "" else: html += "
" html += tr(_("Deck life"), _("%(a)s/day, %(b)s/mon") % { 'a': fmtFloat(self.newAverage()), 'b': fmtFloat(self.newAverage()*30)}) np = self.getNewPeriod(7) html += tr(_("In last week"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(7))})) np = self.getNewPeriod(30) html += tr(_("In last month"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(30))})) np = self.getNewPeriod(92) html += tr(_("In last 3 months"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(92))})) np = self.getNewPeriod(182) html += tr(_("In last 6 months"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(182))})) np = self.getNewPeriod(365) html += tr(_("In last year"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(365))})) html += "
" html += "

" + _("Average New Seen") + "" if sys.platform.startswith("darwin"): html += "" else: html += "
" np = self.getFirstPeriod(7) html += tr(_("In last week"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(7))})) np = self.getFirstPeriod(30) html += tr(_("In last month"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(30))})) np = self.getFirstPeriod(92) html += tr(_("In last 3 months"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(92))})) np = self.getFirstPeriod(182) html += tr(_("In last 6 months"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(182))})) np = self.getFirstPeriod(365) html += tr(_("In last year"), _("%(a)d (%(b)s/day)") % ( {'a': np, 'b': fmtFloat(np / float(365))})) html += "
" html += "

" + _("Card Ease") + "
" html += _("Lowest factor: %.2f") % d.s.scalar( "select min(factor) from cards") + "
" html += _("Average factor: %.2f") % d.s.scalar( "select avg(factor) from cards") + "
" html += _("Highest factor: %.2f") % d.s.scalar( "select max(factor) from cards") + "
" html = runFilter("deckStats", html) return html def getDaysReviewed(self, start, finish): now = datetime.datetime.today() x = now + datetime.timedelta(start) y = now + datetime.timedelta(finish) return self.deck.s.scalar( "select count() from stats where " "day >= :x and day <= :y and reps > 0", x=x, y=y) def getRepsDone(self, start, finish): now = datetime.datetime.today() x = time.mktime((now + datetime.timedelta(start)).timetuple()) y = time.mktime((now + datetime.timedelta(finish)).timetuple()) return self.deck.s.scalar( "select count() from reviewHistory where time >= :x and time <= :y", x=x, y=y) def getAverageInterval(self): return self.deck.s.scalar( "select sum(interval) / count(interval) from cards " "where cards.reps > 0") or 0 def intervalReport(self, intervals, labels, total): boxes = self.splitIntoIntervals(intervals) keys = boxes.keys() keys.sort() html = "" for key in keys: html += ("%s" + "%d%s") % ( labels[key], boxes[key], fmtPerc(boxes[key] / float(total) * 100)) return html def splitIntoIntervals(self, intervals): boxes = {} n = 0 for i in range(len(intervals) - 1): (min, max) = (intervals[i], intervals[i+1]) for c in self.deck: if c.interval > min and c.interval <= max: boxes[n] = boxes.get(n, 0) + 1 n += 1 return boxes def newAverage(self): "Average number of new cards added each day." return self.deck.cardCount / max(1, self.ageInDays()) def createdTimeStr(self): return oldanki.utils.fmtTimeSpan(time.time() - self.deck.created) def ageInDays(self): return (time.time() - self.deck.created) / 86400.0 def getSumInverseRoundInterval(self): return self.deck.s.scalar( "select sum(1/round(max(interval, 1)+0.5)) from cards " "where cards.reps > 0 " "and priority > 0") or 0 def getWorkloadPeriod(self, period): cutoff = time.time() + 86400 * period return (self.deck.s.scalar(""" select count(id) from cards where combinedDue < :cutoff and priority > 0 and relativeDelay in (0,1)""", cutoff=cutoff) or 0) / float(period) def getPastWorkloadPeriod(self, period): cutoff = time.time() - 86400 * period return (self.deck.s.scalar(""" select count(*) from reviewHistory where time > :cutoff""", cutoff=cutoff) or 0) / float(period) def getNewPeriod(self, period): cutoff = time.time() - 86400 * period return (self.deck.s.scalar(""" select count(id) from cards where created > :cutoff""", cutoff=cutoff) or 0) def getFirstPeriod(self, period): cutoff = time.time() - 86400 * period return (self.deck.s.scalar(""" select count(*) from reviewHistory where reps = 1 and time > :cutoff""", cutoff=cutoff) or 0) anki-2.0.20+dfsg/oldanki/template/0000755000175000017500000000000012256137063016511 5ustar andreasandreasanki-2.0.20+dfsg/oldanki/template/README.anki0000644000175000017500000000042511540672341020311 0ustar andreasandreasAnki uses a modified version of Pystache to provide Mustache-like syntax. Behaviour is a little different from standard Mustache: - {{text}} returns text verbatim with no HTML escaping - {{{text}}} strips an outer span tag - partial rendering is disabled for security reasons anki-2.0.20+dfsg/oldanki/template/template.py0000644000175000017500000001146711544032511020676 0ustar andreasandreasimport re import cgi import collections modifiers = {} def modifier(symbol): """Decorator for associating a function with a Mustache tag modifier. @modifier('P') def render_tongue(self, tag_name=None, context=None): return ":P %s" % tag_name {{P yo }} => :P yo """ def set_modifier(func): modifiers[symbol] = func return func return set_modifier def get_or_attr(obj, name, default=None): try: return obj[name] except KeyError: return default except: try: return getattr(obj, name) except AttributeError: return default class Template(object): # The regular expression used to find a #section section_re = None # The regular expression used to find a tag. tag_re = None # Opening tag delimiter otag = '{{' # Closing tag delimiter ctag = '}}' def __init__(self, template, context=None): self.template = template self.context = context or {} self.compile_regexps() def render(self, template=None, context=None, encoding=None): """Turns a Mustache template into something wonderful.""" template = template or self.template context = context or self.context template = self.render_sections(template, context) result = self.render_tags(template, context) if encoding is not None: result = result.encode(encoding) return result def compile_regexps(self): """Compiles our section and tag regular expressions.""" tags = { 'otag': re.escape(self.otag), 'ctag': re.escape(self.ctag) } section = r"%(otag)s[\#|^]([^\}]*)%(ctag)s(.+?)%(otag)s/\1%(ctag)s" self.section_re = re.compile(section % tags, re.M|re.S) tag = r"%(otag)s(#|=|&|!|>|\{)?(.+?)\1?%(ctag)s+" self.tag_re = re.compile(tag % tags) def render_sections(self, template, context): """Expands sections.""" while 1: match = self.section_re.search(template) if match is None: break section, section_name, inner = match.group(0, 1, 2) section_name = section_name.strip() it = get_or_attr(context, section_name, None) replacer = '' # if it and isinstance(it, collections.Callable): # replacer = it(inner) if it and not hasattr(it, '__iter__'): if section[2] != '^': replacer = inner elif it and hasattr(it, 'keys') and hasattr(it, '__getitem__'): if section[2] != '^': replacer = self.render(inner, it) elif it: insides = [] for item in it: insides.append(self.render(inner, item)) replacer = ''.join(insides) elif not it and section[2] == '^': replacer = inner template = template.replace(section, replacer) return template def render_tags(self, template, context): """Renders all the tags in a template for a context.""" while 1: match = self.tag_re.search(template) if match is None: break tag, tag_type, tag_name = match.group(0, 1, 2) tag_name = tag_name.strip() try: func = modifiers[tag_type] replacement = func(self, tag_name, context) template = template.replace(tag, replacement) except: return u"{{invalid template}}" return template @modifier('{') def render_tag(self, tag_name, context): """Given a tag name and context, finds, escapes, and renders the tag.""" raw = get_or_attr(context, tag_name, '') if not raw and raw is not 0: return '' return re.sub("^(.*)", "\\1", raw) @modifier('!') def render_comment(self, tag_name=None, context=None): """Rendering a comment always returns nothing.""" return '' @modifier(None) def render_unescaped(self, tag_name=None, context=None): """Render a tag without escaping it.""" return unicode(get_or_attr(context, tag_name, '{unknown field %s}' % tag_name)) # @modifier('>') # def render_partial(self, tag_name=None, context=None): # """Renders a partial within the current context.""" # # Import view here to avoid import loop # from pystache.view import View # view = View(context=context) # view.template_name = tag_name # return view.render() @modifier('=') def render_delimiter(self, tag_name=None, context=None): """Changes the Mustache delimiter.""" self.otag, self.ctag = tag_name.split(' ') self.compile_regexps() return '' anki-2.0.20+dfsg/oldanki/template/view.py0000644000175000017500000000652212072547733020047 0ustar andreasandreasfrom oldanki.template import Template import os.path import re class View(object): # Path where this view's template(s) live template_path = '.' # Extension for templates template_extension = 'mustache' # The name of this template. If none is given the View will try # to infer it based on the class name. template_name = None # Absolute path to the template itself. Pystache will try to guess # if it's not provided. template_file = None # Contents of the template. template = None # Character encoding of the template file. If None, Pystache will not # do any decoding of the template. template_encoding = None def __init__(self, template=None, context=None, **kwargs): self.template = template self.context = context or {} # If the context we're handed is a View, we want to inherit # its settings. if isinstance(context, View): self.inherit_settings(context) if kwargs: self.context.update(kwargs) def inherit_settings(self, view): """Given another View, copies its settings.""" if view.template_path: self.template_path = view.template_path if view.template_name: self.template_name = view.template_name def load_template(self): if self.template: return self.template if self.template_file: return self._load_template() name = self.get_template_name() + '.' + self.template_extension if isinstance(self.template_path, basestring): self.template_file = os.path.join(self.template_path, name) return self._load_template() for path in self.template_path: self.template_file = os.path.join(path, name) if os.path.exists(self.template_file): return self._load_template() raise IOError('"%s" not found in "%s"' % (name, ':'.join(self.template_path),)) def _load_template(self): f = open(self.template_file, 'r') try: template = f.read() if self.template_encoding: template = unicode(template, self.template_encoding) finally: f.close() return template def get_template_name(self, name=None): """TemplatePartial => template_partial Takes a string but defaults to using the current class' name or the `template_name` attribute """ if self.template_name: return self.template_name if not name: name = self.__class__.__name__ def repl(match): return '_' + match.group(0).lower() return re.sub('[A-Z]', repl, name)[1:] def __contains__(self, needle): return needle in self.context or hasattr(self, needle) def __getitem__(self, attr): val = self.get(attr, None) if not val: raise KeyError("No such key.") return val def get(self, attr, default): attr = self.context.get(attr, getattr(self, attr, default)) if hasattr(attr, '__call__'): return attr() else: return attr def render(self, encoding=None): template = self.load_template() return Template(template, self).render(encoding=encoding) def __str__(self): return self.render() anki-2.0.20+dfsg/oldanki/template/__init__.py0000644000175000017500000000037712072547733020636 0ustar andreasandreasfrom oldanki.template.template import Template from oldanki.template.view import View def render(template, context=None, **kwargs): context = context and context.copy() or {} context.update(kwargs) return Template(template, context).render() anki-2.0.20+dfsg/oldanki/template/LICENSE0000644000175000017500000000204311540672341017513 0ustar andreasandreasCopyright (c) 2009 Chris Wanstrath Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. anki-2.0.20+dfsg/oldanki/template/README.rst0000644000175000017500000000276011540672341020203 0ustar andreasandreas======== Pystache ======== Inspired by ctemplate_ and et_, Mustache_ is a framework-agnostic way to render logic-free views. As ctemplates says, "It emphasizes separating logic from presentation: it is impossible to embed application logic in this template language." Pystache is a Python implementation of Mustache. Pystache requires Python 2.6. Documentation ============= The different Mustache tags are documented at `mustache(5)`_. Install It ========== :: pip install pystache Use It ====== :: >>> import pystache >>> pystache.render('Hi {{person}}!', {'person': 'Mom'}) 'Hi Mom!' You can also create dedicated view classes to hold your view logic. Here's your simple.py:: import pystache class Simple(pystache.View): def thing(self): return "pizza" Then your template, simple.mustache:: Hi {{thing}}! Pull it together:: >>> Simple().render() 'Hi pizza!' Test It ======= nose_ works great! :: pip install nose cd pystache nosetests Author ====== :: context = { 'author': 'Chris Wanstrath', 'email': 'chris@ozmm.org' } pystache.render("{{author}} :: {{email}}", context) .. _ctemplate: http://code.google.com/p/google-ctemplate/ .. _et: http://www.ivan.fomichev.name/2008/05/erlang-template-engine-prototype.html .. _Mustache: http://defunkt.github.com/mustache/ .. _mustache(5): http://defunkt.github.com/mustache/mustache.5.html .. _nose: http://somethingaboutorange.com/mrl/projects/nose/0.11.1/testing.htmlanki-2.0.20+dfsg/oldanki/lang.py0000644000175000017500000000317612072547733016205 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Internationalisation ===================== """ __docformat__ = 'restructuredtext' import os, sys import gettext import threading threadLocal = threading.local() # global defaults currentLang = None currentTranslation = None def localTranslation(): "Return the translation local to this thread, or the default." if getattr(threadLocal, 'currentTranslation', None): return threadLocal.currentTranslation else: return currentTranslation def _(str): return localTranslation().ugettext(str) def ngettext(single, plural, n): return localTranslation().ungettext(single, plural, n) def setLang(lang, local=True): base = os.path.dirname(os.path.abspath(__file__)) localeDir = os.path.join(base, "locale") if not os.path.exists(localeDir): localeDir = os.path.join( os.path.dirname(sys.argv[0]), "locale") trans = gettext.translation('libanki', localeDir, languages=[lang], fallback=True) if local: threadLocal.currentLang = lang threadLocal.currentTranslation = trans else: global currentLang, currentTranslation currentLang = lang currentTranslation = trans def getLang(): "Return the language local to this thread, or the default." if getattr(threadLocal, 'currentLang', None): return threadLocal.currentLang else: return currentLang if not currentTranslation: setLang("en_US", local=False) anki-2.0.20+dfsg/oldanki/media.py0000644000175000017500000002277012102744257016336 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ Media support ==================== """ __docformat__ = 'restructuredtext' import os, shutil, re, urllib2, time, tempfile, unicodedata, urllib from oldanki.db import * from oldanki.utils import checksum, genID from oldanki.lang import _ # other code depends on this order, so don't reorder regexps = ("(?i)(\[sound:([^]]+)\])", "(?i)(]+src=[\"']?([^\"'>]+)[\"']?[^>]*>)") # Tables ########################################################################## mediaTable = Table( 'media', metadata, Column('id', Integer, primary_key=True, nullable=False), Column('filename', UnicodeText, nullable=False), # reused as reference count Column('size', Integer, nullable=False), # treated as modification date, not creation date Column('created', Float, nullable=False), # reused as md5sum. empty string if file doesn't exist on disk Column('originalPath', UnicodeText, nullable=False, default=u""), # older versions stored original filename here, so we'll leave it for now # in case we add a feature to rename media back to its original name. in # the future we may want to zero this to save space Column('description', UnicodeText, nullable=False, default=u"")) class Media(object): pass mapper(Media, mediaTable) mediaDeletedTable = Table( 'mediaDeleted', metadata, Column('mediaId', Integer, ForeignKey("cards.id"), nullable=False), Column('deletedTime', Float, nullable=False)) # File handling ########################################################################## def copyToMedia(deck, path): """Copy PATH to MEDIADIR, and return new filename. If a file with the same md5sum exists in the DB, return that. If a file with the same name exists, return a unique name. This does not modify the media table.""" # see if have duplicate contents newpath = deck.s.scalar( "select filename from media where originalPath = :cs", cs=checksum(open(path, "rb").read())) # check if this filename already exists if not newpath: base = os.path.basename(path) mdir = deck.mediaDir(create=True) newpath = uniquePath(mdir, base) shutil.copy2(path, newpath) return os.path.basename(newpath) def uniquePath(dir, base): # remove any dangerous characters base = re.sub(r"[][<>:/\\&]", "", base) # find a unique name (root, ext) = os.path.splitext(base) def repl(match): n = int(match.group(1)) return " (%d)" % (n+1) while True: path = os.path.join(dir, root + ext) if not os.path.exists(path): break reg = " \((\d+)\)$" if not re.search(reg, root): root = root + " (1)" else: root = re.sub(reg, repl, root) return path # DB routines ########################################################################## def updateMediaCount(deck, file, count=1): mdir = deck.mediaDir() if deck.s.scalar( "select 1 from media where filename = :file", file=file): deck.s.statement( "update media set size = size + :c, created = :t where filename = :file", file=file, c=count, t=time.time()) elif count > 0: try: sum = unicode( checksum(open(os.path.join(mdir, file), "rb").read())) except: sum = u"" deck.s.statement(""" insert into media (id, filename, size, created, originalPath, description) values (:id, :file, :c, :mod, :sum, '')""", id=genID(), file=file, c=count, mod=time.time(), sum=sum) def removeUnusedMedia(deck): ids = deck.s.column0("select id from media where size = 0") for id in ids: deck.s.statement("insert into mediaDeleted values (:id, :t)", id=id, t=time.time()) deck.s.statement("delete from media where size = 0") # String manipulation ########################################################################## def mediaFiles(string, remote=False): l = [] for reg in regexps: for (full, fname) in re.findall(reg, string): isLocal = not re.match("(https?|ftp)://", fname.lower()) if not remote and isLocal: l.append(fname) elif remote and not isLocal: l.append(fname) return l def stripMedia(txt): for reg in regexps: txt = re.sub(reg, "", txt) return txt def escapeImages(string): def repl(match): tag = match.group(1) fname = match.group(2) if re.match("(https?|ftp)://", fname): return tag return tag.replace( fname, urllib.quote(fname.encode("utf-8"))) return re.sub(regexps[1], repl, string) # Rebuilding DB ########################################################################## def rebuildMediaDir(deck, delete=False, dirty=True): mdir = deck.mediaDir() if not mdir: return (0, 0) deck.startProgress(title=_("Check Media DB")) # set all ref counts to 0 deck.s.statement("update media set size = 0") # look through cards for media references refs = {} normrefs = {} def norm(s): if isinstance(s, unicode): return unicodedata.normalize('NFD', s) return s for (question, answer) in deck.s.all( "select question, answer from cards"): for txt in (question, answer): for f in mediaFiles(txt): if f in refs: refs[f] += 1 else: refs[f] = 1 normrefs[norm(f)] = True # update ref counts for (file, count) in refs.items(): updateMediaCount(deck, file, count) # find unused media unused = [] for file in os.listdir(mdir): path = os.path.join(mdir, file) if not os.path.isfile(path): # ignore directories continue nfile = norm(file) if nfile not in normrefs: unused.append(file) # optionally delete if delete: for f in unused: path = os.path.join(mdir, f) os.unlink(path) # remove entries in db for unused media removeUnusedMedia(deck) # check md5s are up to date update = [] for (file, created, md5) in deck.s.all( "select filename, created, originalPath from media"): path = os.path.join(mdir, file) if not os.path.exists(path): if md5: update.append({'f':file, 'sum':u"", 'c':time.time()}) else: sum = unicode( checksum(open(os.path.join(mdir, file), "rb").read())) if md5 != sum: update.append({'f':file, 'sum':sum, 'c':time.time()}) if update: deck.s.statements(""" update media set originalPath = :sum, created = :c where filename = :f""", update) # update deck and get return info if dirty: deck.flushMod() nohave = deck.s.column0("select filename from media where originalPath = ''") deck.finishProgress() return (nohave, unused) # Download missing ########################################################################## def downloadMissing(deck): urlbase = deck.getVar("mediaURL") if not urlbase: return None mdir = deck.mediaDir(create=True) deck.startProgress() missing = 0 grabbed = 0 for c, (f, sum) in enumerate(deck.s.all( "select filename, originalPath from media")): path = os.path.join(mdir, f) if not os.path.exists(path): try: rpath = urlbase + f url = urllib2.urlopen(rpath) open(f, "wb").write(url.read()) grabbed += 1 except: if sum: # the file is supposed to exist deck.finishProgress() return (False, rpath) else: # ignore and keep going missing += 1 deck.updateProgress(label=_("File %d...") % (grabbed+missing)) deck.finishProgress() return (True, grabbed, missing) # Convert remote links to local ones ########################################################################## def downloadRemote(deck): mdir = deck.mediaDir(create=True) refs = {} deck.startProgress() for (question, answer) in deck.s.all( "select question, answer from cards"): for txt in (question, answer): for f in mediaFiles(txt, remote=True): refs[f] = True tmpdir = tempfile.mkdtemp(prefix="oldanki") failed = [] passed = [] for c, link in enumerate(refs.keys()): try: path = os.path.join(tmpdir, os.path.basename(link)) url = urllib2.urlopen(link) open(path, "wb").write(url.read()) newpath = copyToMedia(deck, path) passed.append([link, newpath]) except: failed.append(link) deck.updateProgress(label=_("Download %d...") % c) for (url, name) in passed: deck.s.statement( "update fields set value = replace(value, :url, :name)", url=url, name=name) deck.updateProgress(label=_("Updating references...")) deck.updateProgress(label=_("Updating cards...")) # rebuild entire q/a cache for m in deck.models: deck.updateCardsFromModel(m, dirty=True) deck.finishProgress() deck.flushMod() return (passed, failed) anki-2.0.20+dfsg/oldanki/history.py0000644000175000017500000000517712072547733016770 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html """\ History - keeping a record of all reviews ========================================== If users run 'check db', duplicate records will be inserted into the DB - I really should have used the time stamp as the key. You can remove them by keeping the lowest id for any given timestamp. """ __docformat__ = 'restructuredtext' import time from oldanki.db import * reviewHistoryTable = Table( 'reviewHistory', metadata, Column('cardId', Integer, nullable=False), Column('time', Float, nullable=False, default=time.time), Column('lastInterval', Float, nullable=False), Column('nextInterval', Float, nullable=False), Column('ease', Integer, nullable=False), Column('delay', Float, nullable=False), Column('lastFactor', Float, nullable=False), Column('nextFactor', Float, nullable=False), Column('reps', Float, nullable=False), Column('thinkingTime', Float, nullable=False), Column('yesCount', Float, nullable=False), Column('noCount', Float, nullable=False), PrimaryKeyConstraint("cardId", "time")) class CardHistoryEntry(object): "Create after rescheduling card." def __init__(self, card=None, ease=None, delay=None): if not card: return self.cardId = card.id self.lastInterval = card.lastInterval self.nextInterval = card.interval self.lastFactor = card.lastFactor self.nextFactor = card.factor self.reps = card.reps self.yesCount = card.yesCount self.noCount = card.noCount self.ease = ease self.delay = delay self.thinkingTime = card.thinkingTime() def writeSQL(self, s): s.statement(""" insert into reviewHistory (cardId, lastInterval, nextInterval, ease, delay, lastFactor, nextFactor, reps, thinkingTime, yesCount, noCount, time) values ( :cardId, :lastInterval, :nextInterval, :ease, :delay, :lastFactor, :nextFactor, :reps, :thinkingTime, :yesCount, :noCount, :time)""", cardId=self.cardId, lastInterval=self.lastInterval, nextInterval=self.nextInterval, ease=self.ease, delay=self.delay, lastFactor=self.lastFactor, nextFactor=self.nextFactor, reps=self.reps, thinkingTime=self.thinkingTime, yesCount=self.yesCount, noCount=self.noCount, time=time.time()) mapper(CardHistoryEntry, reviewHistoryTable) anki-2.0.20+dfsg/aqt/0000755000175000017500000000000012256137063014042 5ustar andreasandreasanki-2.0.20+dfsg/aqt/deckchooser.py0000644000175000017500000000572412225675305016717 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * from anki.hooks import addHook, remHook from aqt.utils import shortcut class DeckChooser(QHBoxLayout): def __init__(self, mw, widget, label=True, start=None): QHBoxLayout.__init__(self) self.widget = widget self.mw = mw self.deck = mw.col self.label = label self.setMargin(0) self.setSpacing(8) self.setupDecks() self.widget.setLayout(self) addHook('currentModelChanged', self.onModelChange) def setupDecks(self): if self.label: self.deckLabel = QLabel(_("Deck")) self.addWidget(self.deckLabel) # decks box self.deck = QPushButton() self.deck.setToolTip(shortcut(_("Target Deck (Ctrl+D)"))) s = QShortcut(QKeySequence(_("Ctrl+D")), self.widget) s.connect(s, SIGNAL("activated()"), self.onDeckChange) self.addWidget(self.deck) self.connect(self.deck, SIGNAL("clicked()"), self.onDeckChange) # starting label if self.mw.col.conf.get("addToCur", True): col = self.mw.col did = col.conf['curDeck'] if col.decks.isDyn(did): # if they're reviewing, try default to current card c = self.mw.reviewer.card if self.mw.state == "review" and c: if not c.odid: did = c.did else: did = c.odid else: did = 1 self.deck.setText(self.mw.col.decks.nameOrNone( did) or _("Default")) else: self.deck.setText(self.mw.col.decks.nameOrNone( self.mw.col.models.current()['did']) or _("Default")) # layout sizePolicy = QSizePolicy( QSizePolicy.Policy(7), QSizePolicy.Policy(0)) self.deck.setSizePolicy(sizePolicy) def show(self): self.widget.show() def hide(self): self.widget.hide() def cleanup(self): remHook('currentModelChanged', self.onModelChange) def onModelChange(self): if not self.mw.col.conf.get("addToCur", True): self.deck.setText(self.mw.col.decks.nameOrNone( self.mw.col.models.current()['did']) or _("Default")) def onDeckChange(self): from aqt.studydeck import StudyDeck current = self.deck.text() ret = StudyDeck( self.mw, current=current, accept=_("Choose"), title=_("Choose Deck"), help="addingnotes", cancel=False, parent=self.widget, geomKey="selectDeck") self.deck.setText(ret.name) def selectedId(self): # save deck name name = self.deck.text() if not name.strip(): did = 1 else: did = self.mw.col.decks.id(name) return did anki-2.0.20+dfsg/aqt/models.py0000644000175000017500000001563112227223667015711 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * from operator import itemgetter from aqt.utils import showInfo, askUser, getText, maybeHideClose, openHelp import aqt.modelchooser, aqt.clayout from anki import stdmodels from aqt.utils import saveGeom, restoreGeom class Models(QDialog): def __init__(self, mw, parent=None, fromMain=False): self.mw = mw self.parent = parent or mw self.fromMain = fromMain QDialog.__init__(self, self.parent, Qt.Window) self.col = mw.col self.mm = self.col.models self.mw.checkpoint(_("Note Types")) self.form = aqt.forms.models.Ui_Dialog() self.form.setupUi(self) self.connect(self.form.buttonBox, SIGNAL("helpRequested()"), lambda: openHelp("notetypes")) self.setupModels() restoreGeom(self, "models") self.exec_() # Models ########################################################################## def setupModels(self): self.model = None c = self.connect; f = self.form; box = f.buttonBox s = SIGNAL("clicked()") t = QDialogButtonBox.ActionRole b = box.addButton(_("Add"), t) c(b, s, self.onAdd) b = box.addButton(_("Rename"), t) c(b, s, self.onRename) b = box.addButton(_("Delete"), t) c(b, s, self.onDelete) if self.fromMain: b = box.addButton(_("Fields..."), t) c(b, s, self.onFields) b = box.addButton(_("Cards..."), t) c(b, s, self.onCards) b = box.addButton(_("Options..."), t) c(b, s, self.onAdvanced) c(f.modelsList, SIGNAL("currentRowChanged(int)"), self.modelChanged) c(f.modelsList, SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self.onRename) self.updateModelsList() f.modelsList.setCurrentRow(0) maybeHideClose(box) def onRename(self): txt = getText(_("New name:"), default=self.model['name']) if txt[1] and txt[0]: self.model['name'] = txt[0] self.mm.save(self.model) self.updateModelsList() def updateModelsList(self): row = self.form.modelsList.currentRow() if row == -1: row = 0 self.models = self.col.models.all() self.models.sort(key=itemgetter("name")) self.form.modelsList.clear() for m in self.models: mUse = self.mm.useCount(m) mUse = ngettext("%d note", "%d notes", mUse) % mUse item = QListWidgetItem("%s [%s]" % (m['name'], mUse)) self.form.modelsList.addItem(item) self.form.modelsList.setCurrentRow(row) def modelChanged(self): if self.model: self.saveModel() idx = self.form.modelsList.currentRow() self.model = self.models[idx] def onAdd(self): m = AddModel(self.mw, self).get() if m: txt = getText(_("Name:"), default=m['name'])[0] if txt: m['name'] = txt self.mm.ensureNameUnique(m) self.mm.save(m) self.updateModelsList() def onDelete(self): if len(self.models) < 2: showInfo(_("Please add another note type first."), parent=self) return if self.mm.useCount(self.model): msg = _("Delete this note type and all its cards?") else: msg = _("Delete this unused note type?") if not askUser(msg, parent=self): return self.mm.rem(self.model) self.model = None self.updateModelsList() def onAdvanced(self): d = QDialog(self) frm = aqt.forms.modelopts.Ui_Dialog() frm.setupUi(d) frm.latexHeader.setText(self.model['latexPre']) frm.latexFooter.setText(self.model['latexPost']) d.setWindowTitle(_("Options for %s") % self.model['name']) self.connect( frm.buttonBox, SIGNAL("helpRequested()"), lambda: openHelp("latex")) d.exec_() self.model['latexPre'] = unicode(frm.latexHeader.toPlainText()) self.model['latexPost'] = unicode(frm.latexFooter.toPlainText()) def saveModel(self): self.mm.save(self.model) def _tmpNote(self): self.mm.setCurrent(self.model) n = self.col.newNote(forDeck=False) for name in n.keys(): n[name] = "("+name+")" try: if "{{cloze:Text}}" in self.model['tmpls'][0]['qfmt']: n['Text'] = _("This is a {{c1::sample}} cloze deletion.") except: # invalid cloze pass return n def onFields(self): from aqt.fields import FieldDialog n = self._tmpNote() FieldDialog(self.mw, n, parent=self) def onCards(self): from aqt.clayout import CardLayout n = self._tmpNote() CardLayout(self.mw, n, ord=0, parent=self, addMode=True) # Cleanup ########################################################################## # need to flush model on change or reject def reject(self): self.saveModel() self.mw.reset() saveGeom(self, "models") QDialog.reject(self) class AddModel(QDialog): def __init__(self, mw, parent=None): self.parent = parent or mw self.mw = mw self.col = mw.col QDialog.__init__(self, self.parent, Qt.Window) self.model = None self.dialog = aqt.forms.addmodel.Ui_Dialog() self.dialog.setupUi(self) # standard models self.models = [] for (name, func) in stdmodels.models: if callable(name): name = name() item = QListWidgetItem(_("Add: %s") % name) self.dialog.models.addItem(item) self.models.append((True, func)) # add copies for m in sorted(self.col.models.all(), key=itemgetter("name")): item = QListWidgetItem(_("Clone: %s") % m['name']) self.dialog.models.addItem(item) self.models.append((False, m)) self.dialog.models.setCurrentRow(0) # the list widget will swallow the enter key s = QShortcut(QKeySequence("Return"), self) self.connect(s, SIGNAL("activated()"), self.accept) # help self.connect(self.dialog.buttonBox, SIGNAL("helpRequested()"), self.onHelp) def get(self): self.exec_() return self.model def reject(self): QDialog.reject(self) def accept(self): (isStd, model) = self.models[self.dialog.models.currentRow()] if isStd: # create self.model = model(self.col) else: # add copy to deck self.model = self.mw.col.models.copy(model) self.mw.col.models.setCurrent(self.model) QDialog.accept(self) def onHelp(self): openHelp("notetypes") anki-2.0.20+dfsg/aqt/dyndeckconf.py0000644000175000017500000000671012065175361016710 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import aqt from aqt.utils import showWarning, openHelp, askUser class DeckConf(QDialog): def __init__(self, mw, first=False, search="", deck=None): QDialog.__init__(self, mw) self.mw = mw self.deck = deck or self.mw.col.decks.current() self.search = search self.form = aqt.forms.dyndconf.Ui_Dialog() self.form.setupUi(self) if first: label = _("Build") else: label = _("Rebuild") self.ok = self.form.buttonBox.addButton( label, QDialogButtonBox.AcceptRole) self.mw.checkpoint(_("Options")) self.setWindowModality(Qt.WindowModal) self.connect(self.form.buttonBox, SIGNAL("helpRequested()"), lambda: openHelp("filtered")) self.setWindowTitle(_("Options for %s") % self.deck['name']) self.setupOrder() self.loadConf() if search: self.form.search.setText(search) self.form.search.selectAll() self.show() self.exec_() def setupOrder(self): import anki.consts as cs self.form.order.addItems(cs.dynOrderLabels().values()) def loadConf(self): f = self.form d = self.deck search, limit, order = d['terms'][0] f.search.setText(search) if d['delays']: f.steps.setText(self.listToUser(d['delays'])) f.stepsOn.setChecked(True) else: f.steps.setText("1 10") f.stepsOn.setChecked(False) f.resched.setChecked(d['resched']) f.order.setCurrentIndex(order) f.limit.setValue(limit) def saveConf(self): f = self.form d = self.deck d['delays'] = None if f.stepsOn.isChecked(): steps = self.userToList(f.steps) if steps: d['delays'] = steps else: d['delays'] = None d['terms'][0] = [f.search.text(), f.limit.value(), f.order.currentIndex()] d['resched'] = f.resched.isChecked() self.mw.col.decks.save(d) return True def reject(self): self.ok = False QDialog.reject(self) def accept(self): if not self.saveConf(): return if not self.mw.col.sched.rebuildDyn(): if askUser(_("""\ The provided search did not match any cards. Would you like to revise \ it?""")): return self.mw.reset() QDialog.accept(self) # Step load/save - fixme: share with std options screen ######################################################## def listToUser(self, l): return " ".join([str(x) for x in l]) def userToList(self, w, minSize=1): items = unicode(w.text()).split(" ") ret = [] for i in items: if not i: continue try: i = float(i) assert i > 0 if i == int(i): i = int(i) ret.append(i) except: # invalid, don't update showWarning(_("Steps must be numbers.")) return if len(ret) < minSize: showWarning(_("At least one step is required.")) return return ret anki-2.0.20+dfsg/aqt/importing.py0000644000175000017500000003351512245063615016432 0ustar andreasandreas# coding=utf-8 # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import os import re import traceback import zipfile import json from aqt.qt import * import anki.importing as importing from aqt.utils import getOnlyText, getFile, showText, showWarning, openHelp,\ askUser, tooltip from anki.hooks import addHook, remHook import aqt.forms import aqt.modelchooser import aqt.deckchooser class ChangeMap(QDialog): def __init__(self, mw, model, current): QDialog.__init__(self, mw, Qt.Window) self.mw = mw self.model = model self.frm = aqt.forms.changemap.Ui_ChangeMap() self.frm.setupUi(self) n = 0 setCurrent = False for field in self.model['flds']: item = QListWidgetItem(_("Map to %s") % field['name']) self.frm.fields.addItem(item) if current == field['name']: setCurrent = True self.frm.fields.setCurrentRow(n) n += 1 self.frm.fields.addItem(QListWidgetItem(_("Map to Tags"))) self.frm.fields.addItem(QListWidgetItem(_("Discard field"))) if not setCurrent: if current == "_tags": self.frm.fields.setCurrentRow(n) else: self.frm.fields.setCurrentRow(n+1) self.field = None def getField(self): self.exec_() return self.field def accept(self): row = self.frm.fields.currentRow() if row < len(self.model['flds']): self.field = self.model['flds'][row]['name'] elif row == self.frm.fields.count() - 2: self.field = "_tags" else: self.field = None QDialog.accept(self) def reject(self): self.accept() class ImportDialog(QDialog): def __init__(self, mw, importer): QDialog.__init__(self, mw, Qt.Window) self.mw = mw self.importer = importer self.frm = aqt.forms.importing.Ui_ImportDialog() self.frm.setupUi(self) self.connect(self.frm.buttonBox.button(QDialogButtonBox.Help), SIGNAL("clicked()"), self.helpRequested) self.setupMappingFrame() self.setupOptions() self.modelChanged() self.frm.autoDetect.setVisible(self.importer.needDelimiter) addHook("currentModelChanged", self.modelChanged) self.connect(self.frm.autoDetect, SIGNAL("clicked()"), self.onDelimiter) self.updateDelimiterButtonText() self.frm.allowHTML.setChecked(self.mw.pm.profile.get('allowHTML', True)) self.frm.importMode.setCurrentIndex(self.mw.pm.profile.get('importMode', 1)) self.exec_() def setupOptions(self): self.model = self.mw.col.models.current() self.modelChooser = aqt.modelchooser.ModelChooser( self.mw, self.frm.modelArea, label=False) self.deck = aqt.deckchooser.DeckChooser( self.mw, self.frm.deckArea, label=False) self.connect(self.frm.importButton, SIGNAL("clicked()"), self.doImport) def modelChanged(self): self.importer.model = self.mw.col.models.current() self.importer.initMapping() self.showMapping() if self.mw.col.conf.get("addToCur", True): did = self.mw.col.conf['curDeck'] if self.mw.col.decks.isDyn(did): did = 1 else: did = self.importer.model['did'] #self.deck.setText(self.mw.col.decks.name(did)) def onDelimiter(self): str = getOnlyText(_("""\ By default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \\t to represent tab."""), self, help="importing") or "\t" str = str.replace("\\t", "\t") str = str.encode("ascii") self.hideMapping() def updateDelim(): self.importer.delimiter = str self.importer.updateDelimiter() self.showMapping(hook=updateDelim) self.updateDelimiterButtonText() def updateDelimiterButtonText(self): if not self.importer.needDelimiter: return if self.importer.delimiter: d = self.importer.delimiter else: d = self.importer.dialect.delimiter if d == "\t": d = _("Tab") elif d == ",": d = _("Comma") elif d == " ": d = _("Space") elif d == ";": d = _("Semicolon") elif d == ":": d = _("Colon") else: d = `d` txt = _("Fields separated by: %s") % d self.frm.autoDetect.setText(txt) def doImport(self, update=False): self.importer.mapping = self.mapping if not self.importer.mappingOk(): showWarning( _("The first field of the note type must be mapped.")) return self.importer.importMode = self.frm.importMode.currentIndex() self.mw.pm.profile['importMode'] = self.importer.importMode self.importer.allowHTML = self.frm.allowHTML.isChecked() self.mw.pm.profile['allowHTML'] = self.importer.allowHTML did = self.deck.selectedId() if did != self.importer.model['did']: self.importer.model['did'] = did self.mw.col.models.save(self.importer.model) self.mw.col.decks.select(did) self.mw.progress.start(immediate=True) self.mw.checkpoint(_("Import")) try: self.importer.run() except UnicodeDecodeError: showUnicodeWarning() return except Exception, e: msg = _("Import failed.\n") err = repr(str(e)) if "1-character string" in err: msg += err elif "invalidTempFolder" in err: msg += self.mw.errorHandler.tempFolderMsg() else: msg += unicode(traceback.format_exc(), "ascii", "replace") showText(msg) return finally: self.mw.progress.finish() txt = _("Importing complete.") + "\n" if self.importer.log: txt += "\n".join(self.importer.log) self.close() showText(txt) self.mw.reset() def setupMappingFrame(self): # qt seems to have a bug with adding/removing from a grid, so we add # to a separate object and add/remove that instead self.frame = QFrame(self.frm.mappingArea) self.frm.mappingArea.setWidget(self.frame) self.mapbox = QVBoxLayout(self.frame) self.mapbox.setContentsMargins(0,0,0,0) self.mapwidget = None def hideMapping(self): self.frm.mappingGroup.hide() def showMapping(self, keepMapping=False, hook=None): if hook: hook() if not keepMapping: self.mapping = self.importer.mapping self.frm.mappingGroup.show() assert self.importer.fields() # set up the mapping grid if self.mapwidget: self.mapbox.removeWidget(self.mapwidget) self.mapwidget.deleteLater() self.mapwidget = QWidget() self.mapbox.addWidget(self.mapwidget) self.grid = QGridLayout(self.mapwidget) self.mapwidget.setLayout(self.grid) self.grid.setMargin(3) self.grid.setSpacing(6) fields = self.importer.fields() for num in range(len(self.mapping)): text = _("Field %d of file is:") % (num + 1) self.grid.addWidget(QLabel(text), num, 0) if self.mapping[num] == "_tags": text = _("mapped to Tags") elif self.mapping[num]: text = _("mapped to %s") % self.mapping[num] else: text = _("") self.grid.addWidget(QLabel(text), num, 1) button = QPushButton(_("Change")) self.grid.addWidget(button, num, 2) self.connect(button, SIGNAL("clicked()"), lambda s=self,n=num: s.changeMappingNum(n)) def changeMappingNum(self, n): f = ChangeMap(self.mw, self.importer.model, self.mapping[n]).getField() try: # make sure we don't have it twice index = self.mapping.index(f) self.mapping[index] = None except ValueError: pass self.mapping[n] = f if getattr(self.importer, "delimiter", False): self.savedDelimiter = self.importer.delimiter def updateDelim(): self.importer.delimiter = self.savedDelimiter self.showMapping(hook=updateDelim, keepMapping=True) else: self.showMapping(keepMapping=True) def reject(self): self.modelChooser.cleanup() remHook("currentModelChanged", self.modelChanged) QDialog.reject(self) def helpRequested(self): openHelp("FileImport") def showUnicodeWarning(): """Shorthand to show a standard warning.""" showWarning(_( "Selected file was not in UTF-8 format. Please see the " "importing section of the manual.")) def onImport(mw): filt = ";;".join([x[0] for x in importing.Importers]) file = getFile(mw, _("Import"), None, key="import", filter=filt) if not file: return file = unicode(file) importFile(mw, file) def importFile(mw, file): importer = None done = False for i in importing.Importers: if done: break for mext in re.findall("[( ]?\*\.(.+?)[) ]", i[0]): if file.endswith("." + mext): importer = i[1] done = True break if not importer: # if no matches, assume TSV importer = importing.Importers[0][1] importer = importer(mw.col, file) # need to show import dialog? if importer.needMapper: # make sure we can load the file first mw.progress.start(immediate=True) try: importer.open() except UnicodeDecodeError: showUnicodeWarning() return except Exception, e: msg = repr(str(e)) if msg == "unknownFormat": if file.endswith(".anki2"): showWarning(_("""\ .anki2 files are not designed for importing. If you're trying to restore from a \ backup, please see the 'Backups' section of the user manual.""")) else: showWarning(_("Unknown file format.")) else: msg = _("Import failed. Debugging info:\n") msg += unicode(traceback.format_exc(), "ascii", "replace") showText(msg) return finally: mw.progress.finish() diag = ImportDialog(mw, importer) else: # if it's an apkg/zip, first test it's a valid file if importer.__class__.__name__ == "AnkiPackageImporter": z = zipfile.ZipFile(importer.file) try: z.getinfo("collection.anki2") except: showWarning(_("The provided file is not a valid .apkg file.")) return # we need to ask whether to import/replace if not setupApkgImport(mw, importer): return mw.progress.start(immediate=True) try: importer.run() except zipfile.BadZipfile: msg = _("""\ This file does not appear to be a valid .apkg file. If you're getting this \ error from a file downloaded from AnkiWeb, chances are that your download \ failed. Please try again, and if the problem persists, please try again \ with a different browser.""") showWarning(msg) except Exception, e: err = repr(str(e)) if "invalidFile" in err: msg = _("""\ Invalid file. Please restore from backup.""") showWarning(msg) elif "readonly" in err: showWarning(_("""\ Unable to import from a read-only file.""")) else: msg = _("Import failed.\n") msg += unicode(traceback.format_exc(), "ascii", "replace") showText(msg) else: log = "\n".join(importer.log) if "\n" not in log: tooltip(log) else: showText(log) finally: mw.progress.finish() mw.reset() def setupApkgImport(mw, importer): base = os.path.basename(importer.file).lower() full = (base == "collection.apkg") or re.match("backup-.*\\.apkg", base) if not full: # adding return True backup = re.match("backup-.*\\.apkg", base) if not askUser(_("""\ This will delete your existing collection and replace it with the data in \ the file you're importing. Are you sure?"""), msgfunc=QMessageBox.warning): return False # schedule replacement; don't do it immediately as we may have been # called as part of the startup routine mw.progress.start(immediate=True) mw.progress.timer( 100, lambda mw=mw, f=importer.file: replaceWithApkg(mw, f, backup), False) def replaceWithApkg(mw, file, backup): # unload collection, which will also trigger a backup mw.unloadCollection() # overwrite collection z = zipfile.ZipFile(file) z.extract("collection.anki2", mw.pm.profileFolder()) # because users don't have a backup of media, it's safer to import new # data and rely on them running a media db check to get rid of any # unwanted media. in the future we might also want to deduplicate this # step d = os.path.join(mw.pm.profileFolder(), "collection.media") for c, file in json.loads(z.read("media")).items(): open(os.path.join(d, file), "wb").write(z.read(str(c))) z.close() # reload mw.loadCollection() if backup: mw.col.modSchema(check=False) mw.progress.finish() anki-2.0.20+dfsg/aqt/main.py0000644000175000017500000011502412251263344015340 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import re import signal import zipfile from send2trash import send2trash from aqt.qt import * from anki import Collection from anki.utils import isWin, isMac, intTime, splitFields, ids2str from anki.hooks import runHook, addHook import aqt import aqt.progress import aqt.webview import aqt.toolbar import aqt.stats from aqt.utils import restoreGeom, showInfo, showWarning,\ restoreState, getOnlyText, askUser, applyStyles, showText, tooltip, \ openHelp, openLink, checkInvalidFilename import anki.db class AnkiQt(QMainWindow): def __init__(self, app, profileManager, args): QMainWindow.__init__(self) self.state = "startup" aqt.mw = self self.app = app if isWin: self._xpstyle = QStyleFactory.create("WindowsXP") self.app.setStyle(self._xpstyle) self.pm = profileManager # running 2.0 for the first time? if self.pm.meta['firstRun']: # load the new deck user profile self.pm.load(self.pm.profiles()[0]) # upgrade if necessary from aqt.upgrade import Upgrader u = Upgrader(self) u.maybeUpgrade() self.pm.meta['firstRun'] = False self.pm.save() # init rest of app if qtmajor == 4 and qtminor < 8: # can't get modifiers immediately on qt4.7, so no safe mode there self.safeMode = False else: self.safeMode = self.app.queryKeyboardModifiers() & Qt.ShiftModifier try: self.setupUI() self.setupAddons() except: showInfo(_("Error during startup:\n%s") % traceback.format_exc()) sys.exit(1) # must call this after ui set up if self.safeMode: tooltip(_("Shift key was held down. Skipping automatic " "syncing and add-on loading.")) # were we given a file to import? if args and args[0]: self.onAppMsg(unicode(args[0], sys.getfilesystemencoding(), "ignore")) # Load profile in a timer so we can let the window finish init and not # close on profile load error. self.progress.timer(10, self.setupProfile, False) def setupUI(self): self.col = None self.hideSchemaMsg = False self.setupAppMsg() self.setupKeys() self.setupThreads() self.setupFonts() self.setupMainWindow() self.setupSystemSpecific() self.setupStyle() self.setupMenus() self.setupProgress() self.setupErrorHandler() self.setupSignals() self.setupAutoUpdate() self.setupHooks() self.setupRefreshTimer() self.updateTitleBar() # screens self.setupDeckBrowser() self.setupOverview() self.setupReviewer() # Profiles ########################################################################## def setupProfile(self): self.pendingImport = None # profile not provided on command line? if not self.pm.name: # if there's a single profile, load it automatically profs = self.pm.profiles() if len(profs) == 1: try: self.pm.load(profs[0]) except: # password protected pass if not self.pm.name: self.showProfileManager() else: self.loadProfile() def showProfileManager(self): self.state = "profileManager" d = self.profileDiag = QDialog() f = self.profileForm = aqt.forms.profiles.Ui_Dialog() f.setupUi(d) d.connect(f.login, SIGNAL("clicked()"), self.onOpenProfile) d.connect(f.profiles, SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self.onOpenProfile) d.connect(f.quit, SIGNAL("clicked()"), lambda: sys.exit(0)) d.connect(f.add, SIGNAL("clicked()"), self.onAddProfile) d.connect(f.rename, SIGNAL("clicked()"), self.onRenameProfile) d.connect(f.delete_2, SIGNAL("clicked()"), self.onRemProfile) d.connect(d, SIGNAL("rejected()"), lambda: d.close()) d.connect(f.profiles, SIGNAL("currentRowChanged(int)"), self.onProfileRowChange) self.refreshProfilesList() # raise first, for osx testing d.show() d.activateWindow() d.raise_() d.exec_() def refreshProfilesList(self): f = self.profileForm f.profiles.clear() profs = self.pm.profiles() f.profiles.addItems(profs) try: idx = profs.index(self.pm.name) except: idx = 0 f.profiles.setCurrentRow(idx) def onProfileRowChange(self, n): if n < 0: # called on .clear() return name = self.pm.profiles()[n] f = self.profileForm passwd = not self.pm.load(name) f.passEdit.setVisible(passwd) f.passLabel.setVisible(passwd) def openProfile(self): name = self.pm.profiles()[self.profileForm.profiles.currentRow()] passwd = self.profileForm.passEdit.text() return self.pm.load(name, passwd) def onOpenProfile(self): if not self.openProfile(): showWarning(_("Invalid password.")) return self.profileDiag.close() self.loadProfile() return True def profileNameOk(self, str): return not checkInvalidFilename(str) def onAddProfile(self): name = getOnlyText(_("Name:")) if name: name = name.strip() if name in self.pm.profiles(): return showWarning(_("Name exists.")) if not self.profileNameOk(name): return self.pm.create(name) self.pm.name = name self.refreshProfilesList() def onRenameProfile(self): name = getOnlyText(_("New name:"), default=self.pm.name) if not self.openProfile(): return showWarning(_("Invalid password.")) if not name: return if name == self.pm.name: return if name in self.pm.profiles(): return showWarning(_("Name exists.")) if not self.profileNameOk(name): return self.pm.rename(name) self.refreshProfilesList() def onRemProfile(self): profs = self.pm.profiles() if len(profs) < 2: return showWarning(_("There must be at least one profile.")) # password correct? if not self.openProfile(): return # sure? if not askUser(_("""\ All cards, notes, and media for this profile will be deleted. \ Are you sure?""")): return self.pm.remove(self.pm.name) self.refreshProfilesList() def loadProfile(self): # show main window if self.pm.profile['mainWindowState']: restoreGeom(self, "mainWindow") restoreState(self, "mainWindow") else: self.resize(500, 400) # toolbar needs to be retranslated self.toolbar.draw() # titlebar self.setWindowTitle("Anki - " + self.pm.name) # show and raise window for osx self.show() self.activateWindow() self.raise_() # maybe sync (will load DB) if self.pendingImport and os.path.basename( self.pendingImport).startswith("backup-"): # skip sync when importing a backup self.loadCollection() else: self.onSync(auto=True) # import pending? if self.pendingImport: if self.pm.profile['key']: showInfo(_("""\ To import into a password protected profile, please open the profile before attempting to import.""")) else: self.handleImport(self.pendingImport) self.pendingImport = None runHook("profileLoaded") def unloadProfile(self, browser=True): if not self.pm.profile: # already unloaded return runHook("unloadProfile") if not self.unloadCollection(): return self.state = "profileManager" self.onSync(auto=True, reload=False) self.pm.profile['mainWindowGeom'] = self.saveGeometry() self.pm.profile['mainWindowState'] = self.saveState() self.pm.save() self.pm.profile = None self.hide() if browser: self.showProfileManager() # Collection load/unload ########################################################################## def loadCollection(self): self.hideSchemaMsg = True try: self.col = Collection(self.pm.collectionPath(), log=True) except anki.db.Error: # move back to profile manager showWarning("""\ Your collection is corrupt. Please see the manual for \ how to restore from a backup.""") self.unloadProfile() raise except Exception, e: # the custom exception handler won't catch this if we immediately # unload, so we have to manually handle it if "invalidTempFolder" in repr(str(e)): showWarning(self.errorHandler.tempFolderMsg()) self.unloadProfile() return self.unloadProfile() raise self.hideSchemaMsg = False self.progress.setupDB(self.col.db) self.maybeEnableUndo() self.moveToState("deckBrowser") def unloadCollection(self): """ Unload the collection. This unloads a collection if there is one and returns True if there is no collection after the call. (Because the unload worked or because there was no collection to start with.) """ if self.col: if not self.closeAllCollectionWindows(): return self.maybeOptimize() self.progress.start(immediate=True) if os.getenv("ANKIDEV", 0): corrupt = False else: corrupt = self.col.db.scalar("pragma integrity_check") != "ok" if corrupt: showWarning(_("Your collection file appears to be corrupt. \ This can happen when the file is copied or moved while Anki is open, or \ when the collection is stored on a network or cloud drive. Please see \ the manual for information on how to restore from an automatic backup.")) self.col.close() self.col = None if not corrupt: self.backup() self.progress.finish() return True # Backup and auto-optimize ########################################################################## def backup(self): nbacks = self.pm.profile['numBackups'] if self.pm.profile.get('compressBackups', True): zipStorage = zipfile.ZIP_DEFLATED else: zipStorage = zipfile.ZIP_STORED if not nbacks or os.getenv("ANKIDEV", 0): return dir = self.pm.backupFolder() path = self.pm.collectionPath() # find existing backups backups = [] for file in os.listdir(dir): m = re.search("backup-(\d+).apkg", file) if not m: # unknown file continue backups.append((int(m.group(1)), file)) backups.sort() # get next num if not backups: n = 1 else: n = backups[-1][0] + 1 # do backup newpath = os.path.join(dir, "backup-%d.apkg" % n) z = zipfile.ZipFile(newpath, "w", zipStorage) z.write(path, "collection.anki2") z.writestr("media", "{}") z.close() # remove if over if len(backups) + 1 > nbacks: delete = len(backups) + 1 - nbacks delete = backups[:delete] for file in delete: os.unlink(os.path.join(dir, file[1])) def maybeOptimize(self): # have two weeks passed? if (intTime() - self.pm.profile['lastOptimize']) < 86400*14: return self.progress.start(label=_("Optimizing..."), immediate=True) self.col.optimize() self.pm.profile['lastOptimize'] = intTime() self.pm.save() self.progress.finish() # State machine ########################################################################## def moveToState(self, state, *args): #print "-> move from", self.state, "to", state oldState = self.state or "dummy" cleanup = getattr(self, "_"+oldState+"Cleanup", None) if cleanup: cleanup(state) self.state = state getattr(self, "_"+state+"State")(oldState, *args) def _deckBrowserState(self, oldState): self.deckBrowser.show() def _colLoadingState(self, oldState): "Run once, when col is loaded." self.enableColMenuItems() # ensure cwd is set if media dir exists self.col.media.dir() runHook("colLoading", self.col) self.moveToState("overview") def _selectedDeck(self): did = self.col.decks.selected() if not self.col.decks.nameOrNone(did): showInfo(_("Please select a deck.")) return return self.col.decks.get(did) def _overviewState(self, oldState): if not self._selectedDeck(): return self.moveToState("deckBrowser") self.col.reset() self.overview.show() def _reviewState(self, oldState): self.reviewer.show() def _reviewCleanup(self, newState): if newState != "resetRequired" and newState != "review": self.reviewer.cleanup() def noteChanged(self, nid): "Called when a card or note is edited (but not deleted)." runHook("noteChanged", nid) # Resetting state ########################################################################## def reset(self, guiOnly=False): "Called for non-trivial edits. Rebuilds queue and updates UI." if self.col: if not guiOnly: self.col.reset() runHook("reset") self.maybeEnableUndo() self.moveToState(self.state) def requireReset(self, modal=False): "Signal queue needs to be rebuilt when edits are finished or by user." self.autosave() self.resetModal = modal if self.interactiveState(): self.moveToState("resetRequired") def interactiveState(self): "True if not in profile manager, syncing, etc." return self.state in ("overview", "review", "deckBrowser") def maybeReset(self): self.autosave() if self.state == "resetRequired": self.state = self.returnState self.reset() def delayedMaybeReset(self): # if we redraw the page in a button click event it will often crash on # windows self.progress.timer(100, self.maybeReset, False) def _resetRequiredState(self, oldState): if oldState != "resetRequired": self.returnState = oldState if self.resetModal: # we don't have to change the webview, as we have a covering window return self.web.setLinkHandler(lambda url: self.delayedMaybeReset()) i = _("Waiting for editing to finish.") b = self.button("refresh", _("Resume Now"), id="resume") self.web.stdHtml("""
%s
%s
""" % (i, b), css=self.sharedCSS) self.bottomWeb.hide() self.web.setFocus() self.web.eval("$('#resume').focus()") # HTML helpers ########################################################################## sharedCSS = """ body { background: #f3f3f3; margin: 2em; } h1 { margin-bottom: 0.2em; } """ def button(self, link, name, key=None, class_="", id=""): class_ = "but "+ class_ if key: key = _("Shortcut key: %s") % key else: key = "" return ''' ''' % ( id, class_, link, key, name) # Main window setup ########################################################################## def setupMainWindow(self): # main window self.form = aqt.forms.main.Ui_MainWindow() self.form.setupUi(self) # toolbar tweb = aqt.webview.AnkiWebView() tweb.setObjectName("toolbarWeb") tweb.setFocusPolicy(Qt.WheelFocus) tweb.setFixedHeight(32+self.fontHeightDelta) self.toolbar = aqt.toolbar.Toolbar(self, tweb) self.toolbar.draw() # main area self.web = aqt.webview.AnkiWebView() self.web.setObjectName("mainText") self.web.setFocusPolicy(Qt.WheelFocus) self.web.setMinimumWidth(400) # bottom area sweb = self.bottomWeb = aqt.webview.AnkiWebView() #sweb.hide() sweb.setFixedHeight(100) sweb.setObjectName("bottomWeb") sweb.setFocusPolicy(Qt.WheelFocus) # add in a layout self.mainLayout = QVBoxLayout() self.mainLayout.setContentsMargins(0,0,0,0) self.mainLayout.setSpacing(0) self.mainLayout.addWidget(tweb) self.mainLayout.addWidget(self.web) self.mainLayout.addWidget(sweb) self.form.centralwidget.setLayout(self.mainLayout) def closeAllCollectionWindows(self): return aqt.dialogs.closeAll() # Components ########################################################################## def setupSignals(self): signal.signal(signal.SIGINT, self.onSigInt) def onSigInt(self, signum, frame): # interrupt any current transaction and schedule a rollback & quit self.col.db.interrupt() def quit(): self.col.db.rollback() self.close() self.progress.timer(100, quit, False) def setupProgress(self): self.progress = aqt.progress.ProgressManager(self) def setupErrorHandler(self): import aqt.errors self.errorHandler = aqt.errors.ErrorHandler(self) def setupAddons(self): import aqt.addons self.addonManager = aqt.addons.AddonManager(self) def setupThreads(self): self._mainThread = QThread.currentThread() def inMainThread(self): return self._mainThread == QThread.currentThread() def setupDeckBrowser(self): from aqt.deckbrowser import DeckBrowser self.deckBrowser = DeckBrowser(self) def setupOverview(self): from aqt.overview import Overview self.overview = Overview(self) def setupReviewer(self): from aqt.reviewer import Reviewer self.reviewer = Reviewer(self) # Syncing ########################################################################## def onSync(self, auto=False, reload=True): if not auto or (self.pm.profile['syncKey'] and self.pm.profile['autoSync'] and not self.safeMode): from aqt.sync import SyncManager if not self.unloadCollection(): return # set a sync state so the refresh timer doesn't fire while deck # unloaded self.state = "sync" self.syncer = SyncManager(self, self.pm) self.syncer.sync() if reload: if not self.col: self.loadCollection() # Tools ########################################################################## def raiseMain(self): if not self.app.activeWindow(): # make sure window is shown self.setWindowState(self.windowState() & ~Qt.WindowMinimized) return True def setStatus(self, text, timeout=3000): self.form.statusbar.showMessage(text, timeout) def setupStyle(self): applyStyles(self) # Key handling ########################################################################## def setupKeys(self): self.keyHandler = None # debug shortcut self.debugShortcut = QShortcut(QKeySequence("Ctrl+:"), self) self.connect( self.debugShortcut, SIGNAL("activated()"), self.onDebug) def keyPressEvent(self, evt): # do we have a delegate? if self.keyHandler: # did it eat the key? if self.keyHandler(evt): return # run standard handler QMainWindow.keyPressEvent(self, evt) # check global keys key = unicode(evt.text()) if key == "d": self.moveToState("deckBrowser") elif key == "s": if self.state == "overview": self.col.startTimebox() self.moveToState("review") else: self.moveToState("overview") elif key == "a": self.onAddCard() elif key == "b": self.onBrowse() elif key == "S": self.onStats() elif key == "y": self.onSync() # App exit ########################################################################## def closeEvent(self, event): "User hit the X button, etc." event.accept() self.onClose(force=True) def onClose(self, force=False): "Called from a shortcut key. Close current active window." aw = self.app.activeWindow() if not aw or aw == self or force: self.unloadProfile(browser=False) self.app.closeAllWindows() else: aw.close() # Undo & autosave ########################################################################## def onUndo(self): n = self.col.undoName() cid = self.col.undo() if cid and self.state == "review": card = self.col.getCard(cid) self.reviewer.cardQueue.append(card) else: tooltip(_("Reverted to state prior to '%s'.") % n.lower()) self.reset() self.maybeEnableUndo() def maybeEnableUndo(self): if self.col and self.col.undoName(): self.form.actionUndo.setText(_("Undo %s") % self.col.undoName()) self.form.actionUndo.setEnabled(True) runHook("undoState", True) else: self.form.actionUndo.setText(_("Undo")) self.form.actionUndo.setEnabled(False) runHook("undoState", False) def checkpoint(self, name): self.col.save(name) self.maybeEnableUndo() def autosave(self): self.col.autosave() self.maybeEnableUndo() # Other menu operations ########################################################################## def onAddCard(self): aqt.dialogs.open("AddCards", self) def onBrowse(self): aqt.dialogs.open("Browser", self) def onEditCurrent(self): aqt.dialogs.open("EditCurrent", self) def onDeckConf(self, deck=None): if not deck: deck = self.col.decks.current() if deck['dyn']: import aqt.dyndeckconf aqt.dyndeckconf.DeckConf(self, deck=deck) else: import aqt.deckconf aqt.deckconf.DeckConf(self, deck) def onOverview(self): self.col.reset() self.moveToState("overview") def onStats(self): deck = self._selectedDeck() if not deck: return aqt.stats.DeckStats(self) def onPrefs(self): import aqt.preferences aqt.preferences.Preferences(self) def onNoteTypes(self): import aqt.models aqt.models.Models(self, self, fromMain=True) def onAbout(self): import aqt.about aqt.about.show(self) def onDonate(self): openLink(aqt.appDonate) def onDocumentation(self): openHelp("") # Importing & exporting ########################################################################## def handleImport(self, path): import aqt.importing if not os.path.exists(path): return showInfo(_("Please use File>Import to import this file.")) aqt.importing.importFile(self, path) def onImport(self): import aqt.importing aqt.importing.onImport(self) def onExport(self): import aqt.exporting aqt.exporting.ExportDialog(self) # Cramming ########################################################################## def onCram(self, search=""): import aqt.dyndeckconf n = 1 deck = self.col.decks.current() if not search: if not deck['dyn']: search = 'deck:"%s" ' % deck['name'] decks = self.col.decks.allNames() while _("Filtered Deck %d") % n in decks: n += 1 name = _("Filtered Deck %d") % n did = self.col.decks.newDyn(name) diag = aqt.dyndeckconf.DeckConf(self, first=True, search=search) if not diag.ok: # user cancelled first config self.col.decks.rem(did) self.col.decks.select(deck['id']) else: self.moveToState("overview") # Menu, title bar & status ########################################################################## def setupMenus(self): m = self.form s = SIGNAL("triggered()") #self.connect(m.actionDownloadSharedPlugin, s, self.onGetSharedPlugin) self.connect(m.actionSwitchProfile, s, self.unloadProfile) self.connect(m.actionImport, s, self.onImport) self.connect(m.actionExport, s, self.onExport) self.connect(m.actionExit, s, self, SLOT("close()")) self.connect(m.actionPreferences, s, self.onPrefs) self.connect(m.actionAbout, s, self.onAbout) self.connect(m.actionUndo, s, self.onUndo) self.connect(m.actionFullDatabaseCheck, s, self.onCheckDB) self.connect(m.actionCheckMediaDatabase, s, self.onCheckMediaDB) self.connect(m.actionDocumentation, s, self.onDocumentation) self.connect(m.actionDonate, s, self.onDonate) self.connect(m.actionStudyDeck, s, self.onStudyDeck) self.connect(m.actionCreateFiltered, s, self.onCram) self.connect(m.actionEmptyCards, s, self.onEmptyCards) self.connect(m.actionNoteTypes, s, self.onNoteTypes) def updateTitleBar(self): self.setWindowTitle("Anki") # Auto update ########################################################################## def setupAutoUpdate(self): import aqt.update self.autoUpdate = aqt.update.LatestVersionFinder(self) self.connect(self.autoUpdate, SIGNAL("newVerAvail"), self.newVerAvail) self.connect(self.autoUpdate, SIGNAL("newMsg"), self.newMsg) self.connect(self.autoUpdate, SIGNAL("clockIsOff"), self.clockIsOff) self.autoUpdate.start() def newVerAvail(self, ver): if self.pm.meta.get('suppressUpdate', None) != ver: aqt.update.askAndUpdate(self, ver) def newMsg(self, data): aqt.update.showMessages(self, data) def clockIsOff(self, diff): diffText = ngettext("%s second", "%s seconds", diff) % diff warn = _("""\ In order to ensure your collection works correctly when moved between \ devices, Anki requires your computer's internal clock to be set correctly. \ The internal clock can be wrong even if your system is showing the correct \ local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.""") % diffText showWarning(warn) self.app.closeAllWindows() # Count refreshing ########################################################################## def setupRefreshTimer(self): # every 10 minutes self.progress.timer(10*60*1000, self.onRefreshTimer, True) def onRefreshTimer(self): if self.state == "deckBrowser": self.deckBrowser.refresh() elif self.state == "overview": self.overview.refresh() # Permanent libanki hooks ########################################################################## def setupHooks(self): addHook("modSchema", self.onSchemaMod) addHook("remNotes", self.onRemNotes) addHook("odueInvalid", self.onOdueInvalid) def onOdueInvalid(self): showWarning(_("""\ Invalid property found on card. Please use Tools>Check Database, \ and if the problem comes up again, please ask on the support site.""")) # Log note deletion ########################################################################## def onRemNotes(self, col, nids): path = os.path.join(self.pm.profileFolder(), "deleted.txt") existed = os.path.exists(path) with open(path, "a") as f: if not existed: f.write("nid\tmid\tfields\n") for id, mid, flds in col.db.execute( "select id, mid, flds from notes where id in %s" % ids2str(nids)): fields = splitFields(flds) f.write(("\t".join([str(id), str(mid)] + fields)).encode("utf8")) f.write("\n") # Schema modifications ########################################################################## def onSchemaMod(self, arg): # if triggered in sync, make sure we don't use the gui if not self.inMainThread(): return True # if from the full sync menu, ignore if self.hideSchemaMsg: return True return askUser(_("""\ The requested change will require a full upload of the database when \ you next synchronize your collection. If you have reviews or other changes \ waiting on another device that haven't been synchronized here yet, they \ will be lost. Continue?""")) # Advanced features ########################################################################## def onCheckDB(self): "True if no problems" self.progress.start(immediate=True) ret, ok = self.col.fixIntegrity() self.progress.finish() if not ok: showText(ret) else: tooltip(ret) self.reset() return ret def onCheckMediaDB(self): self.progress.start(immediate=True) (nohave, unused, invalid) = self.col.media.check() self.progress.finish() # generate report report = "" if invalid: report += _("Invalid encoding; please rename:") report += "\n" + "\n".join(invalid) if unused: if report: report += "\n\n\n" report += _( "In media folder but not used by any cards:") report += "\n" + "\n".join(unused) if nohave: if report: report += "\n\n\n" report += _( "Used on cards but missing from media folder:") report += "\n" + "\n".join(nohave) if not report: tooltip(_("No unused or missing files found.")) return # show report and offer to delete diag = QDialog(self) diag.setWindowTitle("Anki") layout = QVBoxLayout(diag) diag.setLayout(layout) text = QTextEdit() text.setReadOnly(True) text.setPlainText(report) layout.addWidget(text) box = QDialogButtonBox(QDialogButtonBox.Close) layout.addWidget(box) b = QPushButton(_("Delete Unused")) b.setAutoDefault(False) box.addButton(b, QDialogButtonBox.ActionRole) b.connect( b, SIGNAL("clicked()"), lambda u=unused, d=diag: self.deleteUnused(u, d)) diag.connect(box, SIGNAL("rejected()"), diag, SLOT("reject()")) diag.setMinimumHeight(400) diag.setMinimumWidth(500) diag.exec_() def deleteUnused(self, unused, diag): if not askUser( _("Delete unused media?")): return mdir = self.col.media.dir() for f in unused: path = os.path.join(mdir, f) send2trash(path) tooltip(_("Deleted.")) diag.close() def onStudyDeck(self): from aqt.studydeck import StudyDeck ret = StudyDeck( self, dyn=True, current=self.col.decks.current()['name']) if ret.name: self.col.decks.select(self.col.decks.id(ret.name)) self.moveToState("overview") def onEmptyCards(self): self.progress.start(immediate=True) cids = self.col.emptyCids() if not cids: self.progress.finish() tooltip(_("No empty cards.")) return report = self.col.emptyCardReport(cids) self.progress.finish() part1 = ngettext("%d card", "%d cards", len(cids)) % len(cids) part1 = _("%s to delete:") % part1 diag, box = showText(part1 + "\n\n" + report, run=False) box.addButton(_("Delete Cards"), QDialogButtonBox.AcceptRole) box.button(QDialogButtonBox.Close).setDefault(True) def onDelete(): QDialog.accept(diag) self.checkpoint(_("Delete Empty")) self.col.remCards(cids) tooltip(ngettext("%d card deleted.", "%d cards deleted.", len(cids)) % len(cids)) self.reset() diag.connect(box, SIGNAL("accepted()"), onDelete) diag.show() # Debugging ###################################################################### def onDebug(self): d = self.debugDiag = QDialog() frm = aqt.forms.debug.Ui_Dialog() frm.setupUi(d) s = self.debugDiagShort = QShortcut(QKeySequence("ctrl+return"), d) self.connect(s, SIGNAL("activated()"), lambda: self.onDebugRet(frm)) s = self.debugDiagShort = QShortcut( QKeySequence("ctrl+shift+return"), d) self.connect(s, SIGNAL("activated()"), lambda: self.onDebugPrint(frm)) d.show() def _captureOutput(self, on): mw = self class Stream(object): def write(self, data): mw._output += data if on: self._output = "" self._oldStderr = sys.stderr self._oldStdout = sys.stdout s = Stream() sys.stderr = s sys.stdout = s else: sys.stderr = self._oldStderr sys.stdout = self._oldStdout def _debugCard(self): return self.reviewer.card.__dict__ def _debugBrowserCard(self): return aqt.dialogs._dialogs['Browser'][1].card.__dict__ def onDebugPrint(self, frm): frm.text.setPlainText("pp(%s)" % frm.text.toPlainText()) self.onDebugRet(frm) def onDebugRet(self, frm): import pprint, traceback text = frm.text.toPlainText() card = self._debugCard bcard = self._debugBrowserCard mw = self pp = pprint.pprint self._captureOutput(True) try: exec text except: self._output += traceback.format_exc() self._captureOutput(False) buf = "" for c, line in enumerate(text.strip().split("\n")): if c == 0: buf += ">>> %s\n" % line else: buf += "... %s\n" % line try: frm.log.appendPlainText(buf + (self._output or "")) except UnicodeDecodeError: frm.log.appendPlainText(_("")) frm.log.ensureCursorVisible() # System specific code ########################################################################## def setupFonts(self): f = QFontInfo(self.font()) ws = QWebSettings.globalSettings() self.fontHeight = f.pixelSize() self.fontFamily = f.family() self.fontHeightDelta = max(0, self.fontHeight - 13) ws.setFontFamily(QWebSettings.StandardFont, self.fontFamily) ws.setFontSize(QWebSettings.DefaultFontSize, self.fontHeight) def setupSystemSpecific(self): self.hideMenuAccels = False if isMac: # mac users expect a minimize option self.minimizeShortcut = QShortcut("Ctrl+M", self) self.connect(self.minimizeShortcut, SIGNAL("activated()"), self.onMacMinimize) self.hideMenuAccels = True self.maybeHideAccelerators() self.hideStatusTips() elif isWin: # make sure ctypes is bundled from ctypes import windll, wintypes _dummy = windll _dummy = wintypes def maybeHideAccelerators(self, tgt=None): if not self.hideMenuAccels: return tgt = tgt or self for action in tgt.findChildren(QAction): txt = unicode(action.text()) m = re.match("^(.+)\(&.+\)(.+)?", txt) if m: action.setText(m.group(1) + (m.group(2) or "")) def hideStatusTips(self): for action in self.findChildren(QAction): action.setStatusTip("") def onMacMinimize(self): self.setWindowState(self.windowState() | Qt.WindowMinimized) # Single instance support ########################################################################## def setupAppMsg(self): self.connect(self.app, SIGNAL("appMsg"), self.onAppMsg) def onAppMsg(self, buf): if self.state == "startup": # try again in a second return self.progress.timer(1000, lambda: self.onAppMsg(buf), False) elif self.state == "profileManager": # can't raise window while in profile manager if buf == "raise": return self.pendingImport = buf return tooltip(_("Deck will be imported when a profile is opened.")) if not self.interactiveState() or self.progress.busy(): # we can't raise the main window while in profile dialog, syncing, etc if buf != "raise": showInfo(_("""\ Please ensure a profile is open and Anki is not busy, then try again."""), parent=None) return # raise window if isWin: # on windows we can raise the window by minimizing and restoring self.showMinimized() self.setWindowState(Qt.WindowActive) self.showNormal() else: # on osx we can raise the window. on unity the icon in the tray will just flash. self.activateWindow() self.raise_() if buf == "raise": return # import if not isinstance(buf, unicode): buf = unicode(buf, "utf8", "ignore") self.handleImport(buf) anki-2.0.20+dfsg/aqt/sync.py0000644000175000017500000004302112245375416015374 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from __future__ import division import socket import time import traceback import gc from aqt.qt import * import aqt from anki import Collection from anki.sync import Syncer, RemoteServer, FullSyncer, MediaSyncer, \ RemoteMediaServer from anki.hooks import addHook, remHook from aqt.utils import tooltip, askUserDialog, showWarning, showText, showInfo # Sync manager ###################################################################### class SyncManager(QObject): def __init__(self, mw, pm): QObject.__init__(self, mw) self.mw = mw self.pm = pm def sync(self): if not self.pm.profile['syncKey']: auth = self._getUserPass() if not auth: return self.pm.profile['syncUser'] = auth[0] self._sync(auth) else: self._sync() def _sync(self, auth=None): # to avoid gui widgets being garbage collected in the worker thread, # run gc in advance self._didFullUp = False self._didError = False gc.collect() # create the thread, setup signals and start running t = self.thread = SyncThread( self.pm.collectionPath(), self.pm.profile['syncKey'], auth=auth, media=self.pm.profile['syncMedia']) self.connect(t, SIGNAL("event"), self.onEvent) self.label = _("Connecting...") self.mw.progress.start(immediate=True, label=self.label) self.sentBytes = self.recvBytes = 0 self._updateLabel() self.thread.start() while not self.thread.isFinished(): self.mw.app.processEvents() self.thread.wait(100) self.mw.progress.finish() if self.thread.syncMsg: showText(self.thread.syncMsg) if self.thread.uname: self.pm.profile['syncUser'] = self.thread.uname def delayedInfo(): if self._didFullUp and not self._didError: showInfo(_("""\ Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose \ to download the collection you have just uploaded from this computer. \ After doing so, future reviews and added cards will be merged \ automatically.""")) self.mw.progress.timer(1000, delayedInfo, False) def _updateLabel(self): self.mw.progress.update(label="%s\n%s" % ( self.label, _("%(a)dkB up, %(b)dkB down") % dict( a=self.sentBytes // 1024, b=self.recvBytes // 1024))) def onEvent(self, evt, *args): pu = self.mw.progress.update if evt == "badAuth": tooltip( _("AnkiWeb ID or password was incorrect; please try again."), parent=self.mw) # blank the key so we prompt user again self.pm.profile['syncKey'] = None self.pm.save() elif evt == "corrupt": pass elif evt == "newKey": self.pm.profile['syncKey'] = args[0] self.pm.save() elif evt == "offline": tooltip(_("Syncing failed; internet offline.")) elif evt == "upbad": self._didFullUp = False self._checkFailed() elif evt == "sync": m = None; t = args[0] if t == "login": m = _("Syncing...") elif t == "upload": self._didFullUp = True m = _("Uploading to AnkiWeb...") elif t == "download": m = _("Downloading from AnkiWeb...") elif t == "sanity": m = _("Checking...") elif t == "findMedia": m = _("Syncing Media...") elif t == "upgradeRequired": showText(_("""\ Please visit AnkiWeb, upgrade your deck, then try again.""")) if m: self.label = m self._updateLabel() elif evt == "error": self._didError = True showText(_("Syncing failed:\n%s")% self._rewriteError(args[0])) elif evt == "clockOff": self._clockOff() elif evt == "checkFailed": self._checkFailed() elif evt == "mediaSanity": showWarning(_("""\ A problem occurred while syncing media. Please use Tools>Check Media, then \ sync again to correct the issue.""")) elif evt == "noChanges": pass elif evt == "fullSync": self._confirmFullSync() elif evt == "send": # posted events not guaranteed to arrive in order self.sentBytes = max(self.sentBytes, args[0]) self._updateLabel() elif evt == "recv": self.recvBytes = max(self.recvBytes, args[0]) self._updateLabel() def _rewriteError(self, err): if "Errno 61" in err: return _("""\ Couldn't connect to AnkiWeb. Please check your network connection \ and try again.""") elif "timed out" in err or "10060" in err: return _("""\ The connection to AnkiWeb timed out. Please check your network \ connection and try again.""") elif "code: 500" in err: return _("""\ AnkiWeb encountered an error. Please try again in a few minutes, and if \ the problem persists, please file a bug report.""") elif "code: 501" in err: return _("""\ Please upgrade to the latest version of Anki.""") # 502 is technically due to the server restarting, but we reuse the # error message elif "code: 502" in err: return _("AnkiWeb is under maintenance. Please try again in a few minutes.") elif "code: 503" in err: return _("""\ AnkiWeb is too busy at the moment. Please try again in a few minutes.""") elif "code: 504" in err: return _("504 gateway timeout error received. Please try temporarily disabling your antivirus.") elif "code: 409" in err: return _("Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.") elif "10061" in err or "10013" in err or "10053" in err: return _( "Antivirus or firewall software is preventing Anki from connecting to the internet.") elif "Unable to find the server" in err: return _( "Server not found. Either your connection is down, or antivirus/firewall " "software is blocking Anki from connecting to the internet.") elif "code: 407" in err: return _("Proxy authentication required.") elif "code: 413" in err: return _("Your collection or a media file is too large to sync.") return err def _getUserPass(self): d = QDialog(self.mw) d.setWindowTitle("Anki") d.setWindowModality(Qt.WindowModal) vbox = QVBoxLayout() l = QLabel(_("""\

Account Required

A free account is required to keep your collection synchronized. Please \ sign up for an account, then \ enter your details below.""") % "https://ankiweb.net/account/login") l.setOpenExternalLinks(True) l.setWordWrap(True) vbox.addWidget(l) vbox.addSpacing(20) g = QGridLayout() l1 = QLabel(_("AnkiWeb ID:")) g.addWidget(l1, 0, 0) user = QLineEdit() g.addWidget(user, 0, 1) l2 = QLabel(_("Password:")) g.addWidget(l2, 1, 0) passwd = QLineEdit() passwd.setEchoMode(QLineEdit.Password) g.addWidget(passwd, 1, 1) vbox.addLayout(g) bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel) bb.button(QDialogButtonBox.Ok).setAutoDefault(True) self.connect(bb, SIGNAL("accepted()"), d.accept) self.connect(bb, SIGNAL("rejected()"), d.reject) vbox.addWidget(bb) d.setLayout(vbox) d.show() d.exec_() u = user.text() p = passwd.text() if not u or not p: return return (u, p) def _confirmFullSync(self): diag = askUserDialog(_("""\ Your decks here and on AnkiWeb differ in such a way that they can't \ be merged together, so it's necessary to overwrite the decks on one \ side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, \ and any changes you have made on your computer since the last sync will \ be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and \ any changes you have made on AnkiWeb or your other devices since the \ last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged \ automatically."""), [_("Upload to AnkiWeb"), _("Download from AnkiWeb"), _("Cancel")]) diag.setDefault(2) ret = diag.run() if ret == _("Upload to AnkiWeb"): self.thread.fullSyncChoice = "upload" elif ret == _("Download from AnkiWeb"): self.thread.fullSyncChoice = "download" else: self.thread.fullSyncChoice = "cancel" def _clockOff(self): showWarning(_("""\ Syncing requires the clock on your computer to be set correctly. Please \ fix the clock and try again.""")) def _checkFailed(self): showWarning(_("""\ Your collection is in an inconsistent state. Please run Tools>\ Check Database, then sync again.""")) def badUserPass(self): aqt.preferences.Preferences(self, self.pm.profile).dialog.tabWidget.\ setCurrentIndex(1) # Sync thread ###################################################################### class SyncThread(QThread): def __init__(self, path, hkey, auth=None, media=True): QThread.__init__(self) self.path = path self.hkey = hkey self.auth = auth self.media = media def run(self): # init this first so an early crash doesn't cause an error # in the main thread self.syncMsg = "" self.uname = "" try: self.col = Collection(self.path, log=True) except: self.fireEvent("corrupt") return self.server = RemoteServer(self.hkey) self.client = Syncer(self.col, self.server) self.sentTotal = 0 self.recvTotal = 0 # throttle updates; qt doesn't handle lots of posted events well self.byteUpdate = time.time() def syncEvent(type): self.fireEvent("sync", type) def canPost(): if (time.time() - self.byteUpdate) > 0.1: self.byteUpdate = time.time() return True def sendEvent(bytes): self.sentTotal += bytes if canPost(): self.fireEvent("send", self.sentTotal) def recvEvent(bytes): self.recvTotal += bytes if canPost(): self.fireEvent("recv", self.recvTotal) addHook("sync", syncEvent) addHook("httpSend", sendEvent) addHook("httpRecv", recvEvent) # run sync and catch any errors try: self._sync() except: err = traceback.format_exc() if not isinstance(err, unicode): err = unicode(err, "utf8", "replace") self.fireEvent("error", err) finally: # don't bump mod time unless we explicitly save self.col.close(save=False) remHook("sync", syncEvent) remHook("httpSend", sendEvent) remHook("httpRecv", recvEvent) def _sync(self): if self.auth: # need to authenticate and obtain host key self.hkey = self.server.hostKey(*self.auth) if not self.hkey: # provided details were invalid return self.fireEvent("badAuth") else: # write new details and tell calling thread to save self.fireEvent("newKey", self.hkey) # run sync and check state try: ret = self.client.sync() except Exception, e: log = traceback.format_exc() err = repr(str(e)) if ("Unable to find the server" in err or "Errno 2" in err): self.fireEvent("offline") else: if not err: err = log if not isinstance(err, unicode): err = unicode(err, "utf8", "replace") self.fireEvent("error", err) return if ret == "badAuth": return self.fireEvent("badAuth") elif ret == "clockOff": return self.fireEvent("clockOff") elif ret == "basicCheckFailed" or ret == "sanityCheckFailed": return self.fireEvent("checkFailed") # note mediaUSN for later self.mediaUsn = self.client.mediaUsn # full sync? if ret == "fullSync": return self._fullSync() # save and note success state if ret == "noChanges": self.fireEvent("noChanges") elif ret == "success": self.fireEvent("success") elif ret == "serverAbort": self.fireEvent("error", self.client.syncMsg) else: self.fireEvent("error", "Unknown sync return code.") self.syncMsg = self.client.syncMsg self.uname = self.client.uname # then move on to media sync self._syncMedia() def _fullSync(self): # if the local deck is empty, assume user is trying to download if self.col.isEmpty(): f = "download" else: # tell the calling thread we need a decision on sync direction, and # wait for a reply self.fullSyncChoice = False self.fireEvent("fullSync") while not self.fullSyncChoice: time.sleep(0.1) f = self.fullSyncChoice if f == "cancel": return self.client = FullSyncer(self.col, self.hkey, self.server.con) if f == "upload": if not self.client.upload(): self.fireEvent("upbad") else: self.client.download() # reopen db and move on to media sync self.col.reopen() self._syncMedia() def _syncMedia(self): if not self.media: return self.server = RemoteMediaServer(self.hkey, self.server.con) self.client = MediaSyncer(self.col, self.server) ret = self.client.sync(self.mediaUsn) if ret == "noChanges": self.fireEvent("noMediaChanges") elif ret == "sanityCheckFailed": self.fireEvent("mediaSanity") else: self.fireEvent("mediaSuccess") def fireEvent(self, *args): self.emit(SIGNAL("event"), *args) # Monkey-patch httplib & httplib2 so we can get progress info ###################################################################### CHUNK_SIZE = 65536 import httplib, httplib2 from cStringIO import StringIO from anki.hooks import runHook # sending in httplib def _incrementalSend(self, data): """Send `data' to the server.""" if self.sock is None: if self.auto_open: self.connect() else: raise httplib.NotConnected() # if it's not a file object, make it one if not hasattr(data, 'read'): if isinstance(data, unicode): data = data.encode("utf8") data = StringIO(data) while 1: block = data.read(CHUNK_SIZE) if not block: break self.sock.sendall(block) runHook("httpSend", len(block)) httplib.HTTPConnection.send = _incrementalSend # receiving in httplib2 # this is an augmented version of httplib's request routine that: # - doesn't assume requests will be tried more than once # - calls a hook for each chunk of data so we can update the gui # - retries only when keep-alive connection is closed def _conn_request(self, conn, request_uri, method, body, headers): for i in range(2): try: if conn.sock is None: conn.connect() conn.request(method, request_uri, body, headers) except socket.timeout: raise except socket.gaierror: conn.close() raise httplib2.ServerNotFoundError( "Unable to find the server at %s" % conn.host) except httplib2.ssl_SSLError: conn.close() raise except socket.error, e: conn.close() raise except httplib.HTTPException: conn.close() raise try: response = conn.getresponse() except httplib.BadStatusLine: print "retry bad line" conn.close() conn.connect() continue except (socket.error, httplib.HTTPException): raise else: content = "" if method == "HEAD": response.close() else: buf = StringIO() while 1: data = response.read(CHUNK_SIZE) if not data: break buf.write(data) runHook("httpRecv", len(data)) content = buf.getvalue() response = httplib2.Response(response) if method != "HEAD": content = httplib2._decompressContent(response, content) return (response, content) httplib2.Http._conn_request = _conn_request anki-2.0.20+dfsg/aqt/qt.py0000644000175000017500000000333712225675305015050 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # imports are all in this file to make moving to pyside easier in the future import sip, os from anki.utils import isWin, isMac sip.setapi('QString', 2) sip.setapi('QVariant', 2) sip.setapi('QUrl', 2) try: sip.setdestroyonexit(False) except: # missing in older versions pass from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtWebKit import QWebPage, QWebView, QWebSettings from PyQt4.QtNetwork import QLocalServer, QLocalSocket def debug(): from PyQt4.QtCore import pyqtRemoveInputHook from pdb import set_trace pyqtRemoveInputHook() set_trace() if os.environ.get("DEBUG"): import sys, traceback def info(type, value, tb): from PyQt4.QtCore import pyqtRemoveInputHook for line in traceback.format_exception(type, value, tb): sys.stdout.write(line) pyqtRemoveInputHook() from pdb import pm pm() sys.excepthook = info qtmajor = (QT_VERSION & 0xff0000) >> 16 qtminor = (QT_VERSION & 0x00ff00) >> 8 # qt4.6 doesn't support ruby tags if qtmajor <= 4 and qtminor <= 6: import anki.template.furigana anki.template.furigana.ruby = r'\2\1' if isWin or isMac: # we no longer use this, but want it included in the mac+win builds # so we don't break add-ons that use it. any new add-ons should use # the above variables instead from PyQt4 import pyqtconfig anki-2.0.20+dfsg/aqt/progress.py0000644000175000017500000001225512221204444016253 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import time from aqt.qt import * # fixme: if mw->subwindow opens a progress dialog with mw as the parent, mw # gets raised on finish on compiz. perhaps we should be using the progress # dialog as the parent? # Progress info ########################################################################## class ProgressManager(object): def __init__(self, mw): self.mw = mw self.app = QApplication.instance() self.inDB = False self.blockUpdates = False self._win = None self._levels = 0 # SQLite progress handler ########################################################################## def setupDB(self, db): "Install a handler in the current DB." self.lastDbProgress = 0 self.inDB = False try: db.set_progress_handler(self._dbProgress, 10000) except: print """\ Your pysqlite2 is too old. Anki will appear frozen during long operations.""" def _dbProgress(self): "Called from SQLite." # do nothing if we don't have a progress window if not self._win: return # make sure we're not executing too frequently if (time.time() - self.lastDbProgress) < 0.01: return self.lastDbProgress = time.time() # and we're in the main thread if not self.mw.inMainThread(): return # ensure timers don't fire self.inDB = True # handle GUI events if not self.blockUpdates: self._maybeShow() self.app.processEvents(QEventLoop.ExcludeUserInputEvents) self.inDB = False # DB-safe timers ########################################################################## # QTimer may fire in processEvents(). We provide a custom timer which # automatically defers until the DB is not busy. def timer(self, ms, func, repeat): def handler(): if self.inDB: # retry in 100ms self.timer(100, func, False) else: func() t = QTimer(self.mw) if not repeat: t.setSingleShot(True) t.connect(t, SIGNAL("timeout()"), handler) t.start(ms) return t # Creating progress dialogs ########################################################################## class ProgressNoCancel(QProgressDialog): def closeEvent(self, evt): evt.ignore() def keyPressEvent(self, evt): if evt.key() == Qt.Key_Escape: evt.ignore() def start(self, max=0, min=0, label=None, parent=None, immediate=False): self._levels += 1 if self._levels > 1: return # setup window parent = parent or self.app.activeWindow() or self.mw label = label or _("Processing...") self._win = self.ProgressNoCancel(label, "", min, max, parent) self._win.setWindowTitle("Anki") self._win.setCancelButton(None) self._win.setAutoClose(False) self._win.setAutoReset(False) self._win.setWindowModality(Qt.ApplicationModal) # we need to manually manage minimum time to show, as qt gets confused # by the db handler self._win.setMinimumDuration(100000) if immediate: self._shown = True self._win.show() self.app.processEvents() else: self._shown = False self._counter = min self._min = min self._max = max self._firstTime = time.time() self._lastTime = time.time() self._disabled = False def update(self, label=None, value=None, process=True, maybeShow=True): #print self._min, self._counter, self._max, label, time.time() - self._lastTime if maybeShow: self._maybeShow() self._lastTime = time.time() if label: self._win.setLabelText(label) if self._max and self._shown: self._counter = value or (self._counter+1) self._win.setValue(self._counter) if process: self.app.processEvents(QEventLoop.ExcludeUserInputEvents) def finish(self): self._levels -= 1 self._levels = max(0, self._levels) if self._levels == 0 and self._win: self._win.cancel() self._unsetBusy() def clear(self): "Restore the interface after an error." if self._levels: self._levels = 1 self.finish() def _maybeShow(self): if not self._levels: return if self._shown: self.update(maybeShow=False) return delta = time.time() - self._firstTime if delta > 0.5: self._shown = True self._win.show() self._setBusy() def _setBusy(self): self._disabled = True self.mw.app.setOverrideCursor(QCursor(Qt.WaitCursor)) def _unsetBusy(self): self._disabled = False self.app.restoreOverrideCursor() def busy(self): "True if processing." return self._levels anki-2.0.20+dfsg/aqt/utils.py0000644000175000017500000003065712221204444015555 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import re, os, sys, urllib, subprocess import aqt from anki.sound import stripSounds from anki.utils import isWin, isMac, invalidFilename def openHelp(section): link = aqt.appHelpSite if section: link += "#%s" % section openLink(link) def openLink(link): tooltip(_("Loading..."), period=1000) QDesktopServices.openUrl(QUrl(link)) def showWarning(text, parent=None, help=""): "Show a small warning with an OK button." return showInfo(text, parent, help, "warning") def showCritical(text, parent=None, help=""): "Show a small critical error with an OK button." return showInfo(text, parent, help, "critical") def showInfo(text, parent=False, help="", type="info"): "Show a small info window with an OK button." if parent is False: parent = aqt.mw.app.activeWindow() or aqt.mw if type == "warning": icon = QMessageBox.Warning elif type == "critical": icon = QMessageBox.Critical else: icon = QMessageBox.Information mb = QMessageBox(parent) mb.setText(text) mb.setIcon(icon) mb.setWindowModality(Qt.WindowModal) b = mb.addButton(QMessageBox.Ok) b.setDefault(True) if help: b = mb.addButton(QMessageBox.Help) b.connect(b, SIGNAL("clicked()"), lambda: openHelp(help)) b.setAutoDefault(False) return mb.exec_() def showText(txt, parent=None, type="text", run=True): if not parent: parent = aqt.mw.app.activeWindow() or aqt.mw diag = QDialog(parent) diag.setWindowTitle("Anki") layout = QVBoxLayout(diag) diag.setLayout(layout) text = QTextEdit() text.setReadOnly(True) if type == "text": text.setPlainText(txt) else: text.setHtml(txt) layout.addWidget(text) box = QDialogButtonBox(QDialogButtonBox.Close) layout.addWidget(box) diag.connect(box, SIGNAL("rejected()"), diag, SLOT("reject()")) diag.setMinimumHeight(400) diag.setMinimumWidth(500) if run: diag.exec_() else: return diag, box def askUser(text, parent=None, help="", defaultno=False, msgfunc=None): "Show a yes/no question. Return true if yes." if not parent: parent = aqt.mw.app.activeWindow() if not msgfunc: msgfunc = QMessageBox.question sb = QMessageBox.Yes | QMessageBox.No if help: sb |= QMessageBox.Help while 1: if defaultno: default = QMessageBox.No else: default = QMessageBox.Yes r = msgfunc(parent, "Anki", text, sb, default) if r == QMessageBox.Help: openHelp(help) else: break return r == QMessageBox.Yes class ButtonedDialog(QMessageBox): def __init__(self, text, buttons, parent=None, help=""): QDialog.__init__(self, parent) self.buttons = [] self.setWindowTitle("Anki") self.help = help self.setIcon(QMessageBox.Warning) self.setText(text) # v = QVBoxLayout() # v.addWidget(QLabel(text)) # box = QDialogButtonBox() # v.addWidget(box) for b in buttons: self.buttons.append( self.addButton(b, QMessageBox.AcceptRole)) if help: self.addButton(_("Help"), QMessageBox.HelpRole) buttons.append(_("Help")) #self.setLayout(v) def run(self): self.exec_() but = self.clickedButton().text() if but == "Help": # FIXME stop dialog closing? openHelp(self.help) return self.clickedButton().text() def setDefault(self, idx): self.setDefaultButton(self.buttons[idx]) def askUserDialog(text, buttons, parent=None, help=""): if not parent: parent = aqt.mw diag = ButtonedDialog(text, buttons, parent, help) return diag class GetTextDialog(QDialog): def __init__(self, parent, question, help=None, edit=None, default=u"", title="Anki"): QDialog.__init__(self, parent) self.setWindowTitle(title) self.question = question self.help = help self.qlabel = QLabel(question) self.setMinimumWidth(400) v = QVBoxLayout() v.addWidget(self.qlabel) if not edit: edit = QLineEdit() self.l = edit if default: self.l.setText(default) self.l.selectAll() v.addWidget(self.l) buts = QDialogButtonBox.Ok | QDialogButtonBox.Cancel if help: buts |= QDialogButtonBox.Help b = QDialogButtonBox(buts) v.addWidget(b) self.setLayout(v) self.connect(b.button(QDialogButtonBox.Ok), SIGNAL("clicked()"), self.accept) self.connect(b.button(QDialogButtonBox.Cancel), SIGNAL("clicked()"), self.reject) if help: self.connect(b.button(QDialogButtonBox.Help), SIGNAL("clicked()"), self.helpRequested) def accept(self): return QDialog.accept(self) def reject(self): return QDialog.reject(self) def helpRequested(self): openHelp(self.help) def getText(prompt, parent=None, help=None, edit=None, default=u"", title="Anki"): if not parent: parent = aqt.mw.app.activeWindow() or aqt.mw d = GetTextDialog(parent, prompt, help=help, edit=edit, default=default, title=title) d.setWindowModality(Qt.WindowModal) ret = d.exec_() return (unicode(d.l.text()), ret) def getOnlyText(*args, **kwargs): (s, r) = getText(*args, **kwargs) if r: return s else: return u"" # fixme: these utilities could be combined into a single base class def chooseList(prompt, choices, startrow=0, parent=None): if not parent: parent = aqt.mw.app.activeWindow() d = QDialog(parent) d.setWindowModality(Qt.WindowModal) l = QVBoxLayout() d.setLayout(l) t = QLabel(prompt) l.addWidget(t) c = QListWidget() c.addItems(choices) c.setCurrentRow(startrow) l.addWidget(c) bb = QDialogButtonBox(QDialogButtonBox.Ok) bb.connect(bb, SIGNAL("accepted()"), d, SLOT("accept()")) l.addWidget(bb) d.exec_() return c.currentRow() def getTag(parent, deck, question, tags="user", **kwargs): from aqt.tagedit import TagEdit te = TagEdit(parent) te.setCol(deck) ret = getText(question, parent, edit=te, **kwargs) te.hideCompleter() return ret # File handling ###################################################################### def getFile(parent, title, cb, filter="*.*", dir=None, key=None): "Ask the user for a file." assert not dir or not key if not dir: dirkey = key+"Directory" dir = aqt.mw.pm.profile.get(dirkey, "") else: dirkey = None d = QFileDialog(parent) # fix #233 crash if isMac: d.setOptions(QFileDialog.DontUseNativeDialog) d.setFileMode(QFileDialog.ExistingFile) d.setDirectory(dir) d.setWindowTitle(title) d.setNameFilter(filter) ret = [] def accept(): # work around an osx crash aqt.mw.app.processEvents() file = unicode(list(d.selectedFiles())[0]) if dirkey: dir = os.path.dirname(file) aqt.mw.pm.profile[dirkey] = dir if cb: cb(file) ret.append(file) d.connect(d, SIGNAL("accepted()"), accept) d.exec_() return ret and ret[0] def getSaveFile(parent, title, dir_description, key, ext, fname=None): """Ask the user for a file to save. Use DIR_DESCRIPTION as config variable. The file dialog will default to open with FNAME.""" config_key = dir_description + 'Directory' base = aqt.mw.pm.profile.get(config_key, aqt.mw.pm.base) path = os.path.join(base, fname) file = unicode(QFileDialog.getSaveFileName( parent, title, path, u"{0} (*{1})".format(key, ext), options=QFileDialog.DontConfirmOverwrite)) if file: # add extension if not file.lower().endswith(ext): file += ext # save new default dir = os.path.dirname(file) aqt.mw.pm.profile[config_key] = dir # check if it exists if os.path.exists(file): if not askUser( _("This file exists. Are you sure you want to overwrite it?"), parent): return None return file def saveGeom(widget, key): key += "Geom" aqt.mw.pm.profile[key] = widget.saveGeometry() def restoreGeom(widget, key, offset=None): key += "Geom" if aqt.mw.pm.profile.get(key): widget.restoreGeometry(aqt.mw.pm.profile[key]) if isMac and offset: if qtminor > 6: # bug in osx toolkit s = widget.size() widget.resize(s.width(), s.height()+offset*2) def saveState(widget, key): key += "State" aqt.mw.pm.profile[key] = widget.saveState() def restoreState(widget, key): key += "State" if aqt.mw.pm.profile.get(key): widget.restoreState(aqt.mw.pm.profile[key]) def saveSplitter(widget, key): key += "Splitter" aqt.mw.pm.profile[key] = widget.saveState() def restoreSplitter(widget, key): key += "Splitter" if aqt.mw.pm.profile.get(key): widget.restoreState(aqt.mw.pm.profile[key]) def saveHeader(widget, key): key += "Header" aqt.mw.pm.profile[key] = widget.saveState() def restoreHeader(widget, key): key += "Header" if aqt.mw.pm.profile.get(key): widget.restoreState(aqt.mw.pm.profile[key]) def mungeQA(col, txt): txt = col.media.escapeImages(txt) txt = stripSounds(txt) # osx webkit doesn't understand font weight 600 txt = re.sub("font-weight: *600", "font-weight:bold", txt) return txt def applyStyles(widget): p = os.path.join(aqt.mw.pm.base, "style.css") if os.path.exists(p): widget.setStyleSheet(open(p).read()) def getBase(col): base = None mdir = col.media.dir() if isWin and not mdir.startswith("\\\\"): prefix = u"file:///" else: prefix = u"file://" mdir = mdir.replace("\\", "/") base = prefix + unicode( urllib.quote(mdir.encode("utf-8")), "utf-8") + "/" return '' % base def openFolder(path): if isWin: if isinstance(path, unicode): path = path.encode(sys.getfilesystemencoding()) subprocess.Popen(["explorer", path]) else: QDesktopServices.openUrl(QUrl("file://" + path)) def shortcut(key): if isMac: return re.sub("(?i)ctrl", "Command", key) return key def maybeHideClose(bbox): if isMac: b = bbox.button(QDialogButtonBox.Close) if b: bbox.removeButton(b) def addCloseShortcut(widg): if not isMac: return widg._closeShortcut = QShortcut(QKeySequence("Ctrl+W"), widg) widg.connect(widg._closeShortcut, SIGNAL("activated()"), widg, SLOT("reject()")) # Tooltips ###################################################################### _tooltipTimer = None _tooltipLabel = None def tooltip(msg, period=3000, parent=None): global _tooltipTimer, _tooltipLabel class CustomLabel(QLabel): def mousePressEvent(self, evt): evt.accept() self.hide() closeTooltip() aw = parent or aqt.mw.app.activeWindow() or aqt.mw lab = CustomLabel("""\
%s
""" % msg, aw) lab.setFrameStyle(QFrame.Panel) lab.setLineWidth(2) lab.setWindowFlags(Qt.ToolTip) p = QPalette() p.setColor(QPalette.Window, QColor("#feffc4")) lab.setPalette(p) lab.move( aw.mapToGlobal(QPoint(0, -100 + aw.height()))) lab.show() _tooltipTimer = aqt.mw.progress.timer( period, closeTooltip, False) _tooltipLabel = lab def closeTooltip(): global _tooltipLabel, _tooltipTimer if _tooltipLabel: try: _tooltipLabel.deleteLater() except: # already deleted as parent window closed pass _tooltipLabel = None if _tooltipTimer: _tooltipTimer.stop() _tooltipTimer = None # true if invalid; print warning def checkInvalidFilename(str, dirsep=True): bad = invalidFilename(str, dirsep) if bad: showWarning(_("The following character can not be used: %s") % bad) return True return False anki-2.0.20+dfsg/aqt/forms/0000755000175000017500000000000012256137063015170 5ustar andreasandreasanki-2.0.20+dfsg/aqt/forms/editaddon.py0000644000175000017500000000316412167474725017513 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/editaddon.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(753, 475) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.text = QtGui.QPlainTextEdit(Dialog) font = QtGui.QFont() font.setFamily(_fromUtf8("Courier 10 Pitch")) self.text.setFont(font) self.text.setPlainText(_fromUtf8("")) self.text.setObjectName(_fromUtf8("text")) self.verticalLayout.addWidget(self.text) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Dialog")) anki-2.0.20+dfsg/aqt/forms/models.py0000644000175000017500000000507712167474726017051 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/models.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.setWindowModality(QtCore.Qt.ApplicationModal) Dialog.resize(396, 255) self.verticalLayout_5 = QtGui.QVBoxLayout(Dialog) self.verticalLayout_5.setSpacing(0) self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) self.gridLayout_2 = QtGui.QGridLayout() self.gridLayout_2.setSpacing(6) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.modelsList = QtGui.QListWidget(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.modelsList.sizePolicy().hasHeightForWidth()) self.modelsList.setSizePolicy(sizePolicy) self.modelsList.setObjectName(_fromUtf8("modelsList")) self.gridLayout_2.addWidget(self.modelsList, 1, 0, 1, 1) self.verticalLayout_3 = QtGui.QVBoxLayout() self.verticalLayout_3.setSpacing(12) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Vertical) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Help) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout_3.addWidget(self.buttonBox) self.gridLayout_2.addLayout(self.verticalLayout_3, 1, 1, 1, 1) self.verticalLayout_5.addLayout(self.gridLayout_2) spacerItem = QtGui.QSpacerItem(20, 6, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) self.verticalLayout_5.addItem(spacerItem) self.verticalLayout_5.setStretch(0, 100) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Note Types")) import icons_rc anki-2.0.20+dfsg/aqt/forms/finddupes.py0000644000175000017500000000572512167474725017546 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/finddupes.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(531, 345) self.verticalLayout_2 = QtGui.QVBoxLayout(Dialog) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.fields = QtGui.QComboBox(Dialog) self.fields.setObjectName(_fromUtf8("fields")) self.gridLayout.addWidget(self.fields, 1, 2, 1, 2) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 2, 1, 1, 1) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 1, 1, 1, 1) self.search = QtGui.QLineEdit(Dialog) self.search.setObjectName(_fromUtf8("search")) self.gridLayout.addWidget(self.search, 2, 2, 1, 2) self.verticalLayout_2.addLayout(self.gridLayout) self.frame = QtGui.QFrame(Dialog) self.frame.setFrameShape(QtGui.QFrame.StyledPanel) self.frame.setFrameShadow(QtGui.QFrame.Raised) self.frame.setObjectName(_fromUtf8("frame")) self.verticalLayout = QtGui.QVBoxLayout(self.frame) self.verticalLayout.setMargin(0) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.webView = QtWebKit.QWebView(self.frame) self.webView.setUrl(QtCore.QUrl(_fromUtf8("about:blank"))) self.webView.setObjectName(_fromUtf8("webView")) self.verticalLayout.addWidget(self.webView) self.verticalLayout_2.addWidget(self.frame) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout_2.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.fields, self.webView) Dialog.setTabOrder(self.webView, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Find Duplicates")) self.label_2.setText(_("Optional limit:")) self.label.setText(_("Look in field:")) from PyQt4 import QtWebKit anki-2.0.20+dfsg/aqt/forms/importing.py0000644000175000017500000001372612167474725017575 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/importing.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_ImportDialog(object): def setupUi(self, ImportDialog): ImportDialog.setObjectName(_fromUtf8("ImportDialog")) ImportDialog.resize(553, 466) self.vboxlayout = QtGui.QVBoxLayout(ImportDialog) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.groupBox = QtGui.QGroupBox(ImportDialog) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.toplayout = QtGui.QVBoxLayout(self.groupBox) self.toplayout.setObjectName(_fromUtf8("toplayout")) self.gridLayout_2 = QtGui.QGridLayout() self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.deckArea = QtGui.QWidget(self.groupBox) self.deckArea.setObjectName(_fromUtf8("deckArea")) self.gridLayout_2.addWidget(self.deckArea, 0, 3, 1, 1) self.modelArea = QtGui.QWidget(self.groupBox) self.modelArea.setObjectName(_fromUtf8("modelArea")) self.gridLayout_2.addWidget(self.modelArea, 0, 1, 1, 1) self.label = QtGui.QLabel(self.groupBox) self.label.setObjectName(_fromUtf8("label")) self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1) self.label_2 = QtGui.QLabel(self.groupBox) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout_2.addWidget(self.label_2, 0, 2, 1, 1) self.toplayout.addLayout(self.gridLayout_2) self.autoDetect = QtGui.QPushButton(self.groupBox) self.autoDetect.setText(_fromUtf8("")) self.autoDetect.setObjectName(_fromUtf8("autoDetect")) self.toplayout.addWidget(self.autoDetect) self.importMode = QtGui.QComboBox(self.groupBox) self.importMode.setObjectName(_fromUtf8("importMode")) self.importMode.addItem(_fromUtf8("")) self.importMode.addItem(_fromUtf8("")) self.importMode.addItem(_fromUtf8("")) self.toplayout.addWidget(self.importMode) self.allowHTML = QtGui.QCheckBox(self.groupBox) self.allowHTML.setObjectName(_fromUtf8("allowHTML")) self.toplayout.addWidget(self.allowHTML) self.vboxlayout.addWidget(self.groupBox) self.mappingGroup = QtGui.QGroupBox(ImportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.mappingGroup.sizePolicy().hasHeightForWidth()) self.mappingGroup.setSizePolicy(sizePolicy) self.mappingGroup.setObjectName(_fromUtf8("mappingGroup")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.mappingGroup) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.importButton = QtGui.QPushButton(self.mappingGroup) self.importButton.setDefault(True) self.importButton.setObjectName(_fromUtf8("importButton")) self.verticalLayout.addWidget(self.importButton) self.gridLayout.addLayout(self.verticalLayout, 0, 1, 1, 1) self.mappingArea = QtGui.QScrollArea(self.mappingGroup) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.mappingArea.sizePolicy().hasHeightForWidth()) self.mappingArea.setSizePolicy(sizePolicy) self.mappingArea.setMinimumSize(QtCore.QSize(400, 150)) self.mappingArea.setFrameShape(QtGui.QFrame.NoFrame) self.mappingArea.setWidgetResizable(True) self.mappingArea.setObjectName(_fromUtf8("mappingArea")) self.scrollAreaWidgetContents = QtGui.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 402, 206)) self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents")) self.mappingArea.setWidget(self.scrollAreaWidgetContents) self.gridLayout.addWidget(self.mappingArea, 0, 0, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout) self.vboxlayout.addWidget(self.mappingGroup) self.buttonBox = QtGui.QDialogButtonBox(ImportDialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Help) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.vboxlayout.addWidget(self.buttonBox) self.retranslateUi(ImportDialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), ImportDialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), ImportDialog.reject) QtCore.QMetaObject.connectSlotsByName(ImportDialog) ImportDialog.setTabOrder(self.importButton, self.buttonBox) def retranslateUi(self, ImportDialog): ImportDialog.setWindowTitle(_("Import")) self.groupBox.setTitle(_("Import options")) self.label.setText(_("Type")) self.label_2.setText(_("Deck")) self.importMode.setItemText(0, _("Update existing notes when first field matches")) self.importMode.setItemText(1, _("Ignore lines where first field matches existing note")) self.importMode.setItemText(2, _("Import even if existing note has same first field")) self.allowHTML.setText(_("Allow HTML in fields")) self.mappingGroup.setTitle(_("Field mapping")) self.importButton.setText(_("&Import")) anki-2.0.20+dfsg/aqt/forms/main.py0000644000175000017500000002105012226030434016453 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/main.ui' # # Created: Sat Oct 12 02:10:52 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(412, 301) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) MainWindow.setMinimumSize(QtCore.QSize(400, 0)) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/anki.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) self.centralwidget = QtGui.QWidget(MainWindow) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) self.centralwidget.setSizePolicy(sizePolicy) self.centralwidget.setAutoFillBackground(True) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 412, 22)) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuHelp = QtGui.QMenu(self.menubar) self.menuHelp.setObjectName(_fromUtf8("menuHelp")) self.menuEdit = QtGui.QMenu(self.menubar) self.menuEdit.setObjectName(_fromUtf8("menuEdit")) self.menuCol = QtGui.QMenu(self.menubar) self.menuCol.setObjectName(_fromUtf8("menuCol")) self.menuTools = QtGui.QMenu(self.menubar) self.menuTools.setObjectName(_fromUtf8("menuTools")) self.menuPlugins = QtGui.QMenu(self.menuTools) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/preferences-plugin.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.menuPlugins.setIcon(icon1) self.menuPlugins.setObjectName(_fromUtf8("menuPlugins")) MainWindow.setMenuBar(self.menubar) self.actionExit = QtGui.QAction(MainWindow) self.actionExit.setObjectName(_fromUtf8("actionExit")) self.actionPreferences = QtGui.QAction(MainWindow) self.actionPreferences.setMenuRole(QtGui.QAction.PreferencesRole) self.actionPreferences.setObjectName(_fromUtf8("actionPreferences")) self.actionAbout = QtGui.QAction(MainWindow) self.actionAbout.setMenuRole(QtGui.QAction.AboutRole) self.actionAbout.setObjectName(_fromUtf8("actionAbout")) self.actionUndo = QtGui.QAction(MainWindow) self.actionUndo.setEnabled(False) self.actionUndo.setObjectName(_fromUtf8("actionUndo")) self.actionCheckMediaDatabase = QtGui.QAction(MainWindow) self.actionCheckMediaDatabase.setObjectName(_fromUtf8("actionCheckMediaDatabase")) self.actionOpenPluginFolder = QtGui.QAction(MainWindow) self.actionOpenPluginFolder.setObjectName(_fromUtf8("actionOpenPluginFolder")) self.actionDonate = QtGui.QAction(MainWindow) self.actionDonate.setObjectName(_fromUtf8("actionDonate")) self.actionDownloadSharedPlugin = QtGui.QAction(MainWindow) self.actionDownloadSharedPlugin.setStatusTip(_fromUtf8("")) self.actionDownloadSharedPlugin.setObjectName(_fromUtf8("actionDownloadSharedPlugin")) self.actionFullDatabaseCheck = QtGui.QAction(MainWindow) self.actionFullDatabaseCheck.setObjectName(_fromUtf8("actionFullDatabaseCheck")) self.actionDocumentation = QtGui.QAction(MainWindow) self.actionDocumentation.setObjectName(_fromUtf8("actionDocumentation")) self.actionSwitchProfile = QtGui.QAction(MainWindow) self.actionSwitchProfile.setObjectName(_fromUtf8("actionSwitchProfile")) self.actionExport = QtGui.QAction(MainWindow) self.actionExport.setObjectName(_fromUtf8("actionExport")) self.actionImport = QtGui.QAction(MainWindow) self.actionImport.setObjectName(_fromUtf8("actionImport")) self.actionStudyDeck = QtGui.QAction(MainWindow) self.actionStudyDeck.setObjectName(_fromUtf8("actionStudyDeck")) self.actionEmptyCards = QtGui.QAction(MainWindow) self.actionEmptyCards.setObjectName(_fromUtf8("actionEmptyCards")) self.actionCreateFiltered = QtGui.QAction(MainWindow) self.actionCreateFiltered.setObjectName(_fromUtf8("actionCreateFiltered")) self.actionNoteTypes = QtGui.QAction(MainWindow) self.actionNoteTypes.setObjectName(_fromUtf8("actionNoteTypes")) self.menuHelp.addAction(self.actionDocumentation) self.menuHelp.addSeparator() self.menuHelp.addAction(self.actionDonate) self.menuHelp.addAction(self.actionAbout) self.menuEdit.addAction(self.actionUndo) self.menuCol.addAction(self.actionSwitchProfile) self.menuCol.addSeparator() self.menuCol.addAction(self.actionImport) self.menuCol.addAction(self.actionExport) self.menuCol.addSeparator() self.menuCol.addAction(self.actionExit) self.menuPlugins.addAction(self.actionDownloadSharedPlugin) self.menuPlugins.addAction(self.actionOpenPluginFolder) self.menuPlugins.addSeparator() self.menuTools.addAction(self.actionStudyDeck) self.menuTools.addAction(self.actionCreateFiltered) self.menuTools.addSeparator() self.menuTools.addAction(self.actionFullDatabaseCheck) self.menuTools.addAction(self.actionCheckMediaDatabase) self.menuTools.addAction(self.actionEmptyCards) self.menuTools.addSeparator() self.menuTools.addAction(self.menuPlugins.menuAction()) self.menuTools.addSeparator() self.menuTools.addAction(self.actionNoteTypes) self.menuTools.addAction(self.actionPreferences) self.menubar.addAction(self.menuCol.menuAction()) self.menubar.addAction(self.menuEdit.menuAction()) self.menubar.addAction(self.menuTools.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_("Anki")) self.menuHelp.setTitle(_("&Help")) self.menuEdit.setTitle(_("&Edit")) self.menuCol.setTitle(_("&File")) self.menuTools.setTitle(_("&Tools")) self.menuPlugins.setTitle(_("&Add-ons")) self.actionExit.setText(_("E&xit")) self.actionExit.setShortcut(_("Ctrl+Q")) self.actionPreferences.setText(_("&Preferences...")) self.actionPreferences.setStatusTip(_("Configure interface language and options")) self.actionPreferences.setShortcut(_("Ctrl+P")) self.actionAbout.setText(_("&About...")) self.actionUndo.setText(_("&Undo")) self.actionUndo.setShortcut(_("Ctrl+Z")) self.actionCheckMediaDatabase.setText(_("Check &Media...")) self.actionCheckMediaDatabase.setStatusTip(_("Check the files in the media directory")) self.actionOpenPluginFolder.setText(_("&Open Add-ons Folder...")) self.actionDonate.setText(_("&Support Anki...")) self.actionDownloadSharedPlugin.setText(_("Browse && Install...")) self.actionFullDatabaseCheck.setText(_("&Check Database...")) self.actionDocumentation.setText(_("&Guide...")) self.actionDocumentation.setShortcut(_("F1")) self.actionSwitchProfile.setText(_("&Switch Profile...")) self.actionSwitchProfile.setShortcut(_("Ctrl+Shift+P")) self.actionExport.setText(_("&Export...")) self.actionExport.setShortcut(_("Ctrl+E")) self.actionImport.setText(_("&Import...")) self.actionImport.setShortcut(_("Ctrl+I")) self.actionStudyDeck.setText(_("Study Deck...")) self.actionStudyDeck.setShortcut(_("/")) self.actionEmptyCards.setText(_("Empty Cards...")) self.actionCreateFiltered.setText(_("Create Filtered Deck...")) self.actionCreateFiltered.setShortcut(_("F")) self.actionNoteTypes.setText(_("Manage Note Types...")) import icons_rc anki-2.0.20+dfsg/aqt/forms/debug.py0000644000175000017500000000376712167474724016656 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/debug.ui' # # Created: Thu Jul 11 18:24:36 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(643, 580) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.text = QtGui.QPlainTextEdit(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.text.sizePolicy().hasHeightForWidth()) self.text.setSizePolicy(sizePolicy) self.text.setMaximumSize(QtCore.QSize(16777215, 100)) self.text.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) self.text.setObjectName(_fromUtf8("text")) self.verticalLayout.addWidget(self.text) self.log = QtGui.QPlainTextEdit(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(8) sizePolicy.setHeightForWidth(self.log.sizePolicy().hasHeightForWidth()) self.log.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setFamily(_fromUtf8("Courier")) self.log.setFont(font) self.log.setFocusPolicy(QtCore.Qt.ClickFocus) self.log.setReadOnly(True) self.log.setObjectName(_fromUtf8("log")) self.verticalLayout.addWidget(self.log) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Debug Console")) anki-2.0.20+dfsg/aqt/forms/dconf.py0000644000175000017500000005006512230107543016631 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/dconf.ui' # # Created: Fri Oct 18 10:31:15 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(494, 454) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label_31 = QtGui.QLabel(Dialog) self.label_31.setObjectName(_fromUtf8("label_31")) self.horizontalLayout_2.addWidget(self.label_31) self.dconf = QtGui.QComboBox(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(3) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.dconf.sizePolicy().hasHeightForWidth()) self.dconf.setSizePolicy(sizePolicy) self.dconf.setObjectName(_fromUtf8("dconf")) self.horizontalLayout_2.addWidget(self.dconf) self.confOpts = QtGui.QToolButton(Dialog) self.confOpts.setMaximumSize(QtCore.QSize(16777215, 32)) self.confOpts.setText(_fromUtf8("")) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/gears.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.confOpts.setIcon(icon) self.confOpts.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) self.confOpts.setArrowType(QtCore.Qt.NoArrow) self.confOpts.setObjectName(_fromUtf8("confOpts")) self.horizontalLayout_2.addWidget(self.confOpts) self.verticalLayout.addLayout(self.horizontalLayout_2) self.count = QtGui.QLabel(Dialog) self.count.setStyleSheet(_fromUtf8("* { color: red }")) self.count.setText(_fromUtf8("")) self.count.setAlignment(QtCore.Qt.AlignCenter) self.count.setWordWrap(True) self.count.setObjectName(_fromUtf8("count")) self.verticalLayout.addWidget(self.count) self.tabWidget = QtGui.QTabWidget(Dialog) self.tabWidget.setObjectName(_fromUtf8("tabWidget")) self.tab = QtGui.QWidget() self.tab.setObjectName(_fromUtf8("tab")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.tab) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label_27 = QtGui.QLabel(self.tab) self.label_27.setObjectName(_fromUtf8("label_27")) self.gridLayout.addWidget(self.label_27, 5, 2, 1, 1) self.label_24 = QtGui.QLabel(self.tab) self.label_24.setObjectName(_fromUtf8("label_24")) self.gridLayout.addWidget(self.label_24, 5, 0, 1, 1) self.lrnFactor = QtGui.QSpinBox(self.tab) self.lrnFactor.setMinimum(130) self.lrnFactor.setMaximum(999) self.lrnFactor.setObjectName(_fromUtf8("lrnFactor")) self.gridLayout.addWidget(self.lrnFactor, 5, 1, 1, 1) self.label_8 = QtGui.QLabel(self.tab) self.label_8.setObjectName(_fromUtf8("label_8")) self.gridLayout.addWidget(self.label_8, 1, 0, 1, 1) self.lrnEasyInt = QtGui.QSpinBox(self.tab) self.lrnEasyInt.setMinimum(1) self.lrnEasyInt.setObjectName(_fromUtf8("lrnEasyInt")) self.gridLayout.addWidget(self.lrnEasyInt, 4, 1, 1, 1) self.lrnGradInt = QtGui.QSpinBox(self.tab) self.lrnGradInt.setMinimum(1) self.lrnGradInt.setObjectName(_fromUtf8("lrnGradInt")) self.gridLayout.addWidget(self.lrnGradInt, 3, 1, 1, 1) self.newplim = QtGui.QLabel(self.tab) self.newplim.setText(_fromUtf8("")) self.newplim.setObjectName(_fromUtf8("newplim")) self.gridLayout.addWidget(self.newplim, 2, 2, 1, 1) self.label_5 = QtGui.QLabel(self.tab) self.label_5.setObjectName(_fromUtf8("label_5")) self.gridLayout.addWidget(self.label_5, 4, 0, 1, 1) self.label_4 = QtGui.QLabel(self.tab) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1) self.newPerDay = QtGui.QSpinBox(self.tab) self.newPerDay.setMaximum(9999) self.newPerDay.setObjectName(_fromUtf8("newPerDay")) self.gridLayout.addWidget(self.newPerDay, 2, 1, 1, 1) self.label_6 = QtGui.QLabel(self.tab) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridLayout.addWidget(self.label_6, 2, 0, 1, 1) self.lrnSteps = QtGui.QLineEdit(self.tab) self.lrnSteps.setObjectName(_fromUtf8("lrnSteps")) self.gridLayout.addWidget(self.lrnSteps, 0, 1, 1, 2) self.label_2 = QtGui.QLabel(self.tab) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.newOrder = QtGui.QComboBox(self.tab) self.newOrder.setObjectName(_fromUtf8("newOrder")) self.gridLayout.addWidget(self.newOrder, 1, 1, 1, 2) self.bury = QtGui.QCheckBox(self.tab) self.bury.setObjectName(_fromUtf8("bury")) self.gridLayout.addWidget(self.bury, 6, 0, 1, 3) self.label_9 = QtGui.QLabel(self.tab) self.label_9.setObjectName(_fromUtf8("label_9")) self.gridLayout.addWidget(self.label_9, 4, 2, 1, 1) self.label_7 = QtGui.QLabel(self.tab) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth()) self.label_7.setSizePolicy(sizePolicy) self.label_7.setObjectName(_fromUtf8("label_7")) self.gridLayout.addWidget(self.label_7, 3, 2, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem) self.tabWidget.addTab(self.tab, _fromUtf8("")) self.tab_3 = QtGui.QWidget() self.tab_3.setObjectName(_fromUtf8("tab_3")) self.verticalLayout_4 = QtGui.QVBoxLayout(self.tab_3) self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) self.gridLayout_3 = QtGui.QGridLayout() self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.label_20 = QtGui.QLabel(self.tab_3) self.label_20.setObjectName(_fromUtf8("label_20")) self.gridLayout_3.addWidget(self.label_20, 1, 0, 1, 1) self.easyBonus = QtGui.QSpinBox(self.tab_3) self.easyBonus.setMinimum(100) self.easyBonus.setMaximum(1000) self.easyBonus.setSingleStep(5) self.easyBonus.setObjectName(_fromUtf8("easyBonus")) self.gridLayout_3.addWidget(self.easyBonus, 1, 1, 1, 1) self.label_21 = QtGui.QLabel(self.tab_3) self.label_21.setObjectName(_fromUtf8("label_21")) self.gridLayout_3.addWidget(self.label_21, 1, 2, 1, 1) self.label_34 = QtGui.QLabel(self.tab_3) self.label_34.setObjectName(_fromUtf8("label_34")) self.gridLayout_3.addWidget(self.label_34, 2, 2, 1, 1) self.revPerDay = QtGui.QSpinBox(self.tab_3) self.revPerDay.setMinimum(0) self.revPerDay.setMaximum(9999) self.revPerDay.setObjectName(_fromUtf8("revPerDay")) self.gridLayout_3.addWidget(self.revPerDay, 0, 1, 1, 1) self.label_33 = QtGui.QLabel(self.tab_3) self.label_33.setObjectName(_fromUtf8("label_33")) self.gridLayout_3.addWidget(self.label_33, 2, 0, 1, 1) self.label_37 = QtGui.QLabel(self.tab_3) self.label_37.setObjectName(_fromUtf8("label_37")) self.gridLayout_3.addWidget(self.label_37, 0, 0, 1, 1) self.label_3 = QtGui.QLabel(self.tab_3) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout_3.addWidget(self.label_3, 3, 0, 1, 1) self.maxIvl = QtGui.QSpinBox(self.tab_3) self.maxIvl.setMinimum(1) self.maxIvl.setMaximum(99999) self.maxIvl.setObjectName(_fromUtf8("maxIvl")) self.gridLayout_3.addWidget(self.maxIvl, 3, 1, 1, 1) self.label_23 = QtGui.QLabel(self.tab_3) self.label_23.setObjectName(_fromUtf8("label_23")) self.gridLayout_3.addWidget(self.label_23, 3, 2, 1, 1) self.revplim = QtGui.QLabel(self.tab_3) self.revplim.setText(_fromUtf8("")) self.revplim.setObjectName(_fromUtf8("revplim")) self.gridLayout_3.addWidget(self.revplim, 0, 2, 1, 1) self.fi1 = QtGui.QDoubleSpinBox(self.tab_3) self.fi1.setDecimals(0) self.fi1.setMinimum(0.0) self.fi1.setMaximum(999.0) self.fi1.setSingleStep(1.0) self.fi1.setProperty("value", 100.0) self.fi1.setObjectName(_fromUtf8("fi1")) self.gridLayout_3.addWidget(self.fi1, 2, 1, 1, 1) self.buryRev = QtGui.QCheckBox(self.tab_3) self.buryRev.setObjectName(_fromUtf8("buryRev")) self.gridLayout_3.addWidget(self.buryRev, 4, 0, 1, 3) self.verticalLayout_4.addLayout(self.gridLayout_3) spacerItem1 = QtGui.QSpacerItem(20, 152, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_4.addItem(spacerItem1) self.tabWidget.addTab(self.tab_3, _fromUtf8("")) self.tab_2 = QtGui.QWidget() self.tab_2.setObjectName(_fromUtf8("tab_2")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.tab_2) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.gridLayout_2 = QtGui.QGridLayout() self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.label_17 = QtGui.QLabel(self.tab_2) self.label_17.setObjectName(_fromUtf8("label_17")) self.gridLayout_2.addWidget(self.label_17, 0, 0, 1, 1) self.lapSteps = QtGui.QLineEdit(self.tab_2) self.lapSteps.setObjectName(_fromUtf8("lapSteps")) self.gridLayout_2.addWidget(self.lapSteps, 0, 1, 1, 2) self.label = QtGui.QLabel(self.tab_2) self.label.setObjectName(_fromUtf8("label")) self.gridLayout_2.addWidget(self.label, 1, 0, 1, 1) self.label_10 = QtGui.QLabel(self.tab_2) self.label_10.setObjectName(_fromUtf8("label_10")) self.gridLayout_2.addWidget(self.label_10, 3, 0, 1, 1) self.leechThreshold = QtGui.QSpinBox(self.tab_2) self.leechThreshold.setObjectName(_fromUtf8("leechThreshold")) self.gridLayout_2.addWidget(self.leechThreshold, 3, 1, 1, 1) self.label_11 = QtGui.QLabel(self.tab_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_11.sizePolicy().hasHeightForWidth()) self.label_11.setSizePolicy(sizePolicy) self.label_11.setObjectName(_fromUtf8("label_11")) self.gridLayout_2.addWidget(self.label_11, 3, 2, 1, 1) self.label_12 = QtGui.QLabel(self.tab_2) self.label_12.setObjectName(_fromUtf8("label_12")) self.gridLayout_2.addWidget(self.label_12, 4, 0, 1, 1) self.lapMinInt = QtGui.QSpinBox(self.tab_2) self.lapMinInt.setMinimum(1) self.lapMinInt.setMaximum(99) self.lapMinInt.setObjectName(_fromUtf8("lapMinInt")) self.gridLayout_2.addWidget(self.lapMinInt, 2, 1, 1, 1) self.label_13 = QtGui.QLabel(self.tab_2) self.label_13.setObjectName(_fromUtf8("label_13")) self.gridLayout_2.addWidget(self.label_13, 2, 0, 1, 1) self.label_14 = QtGui.QLabel(self.tab_2) self.label_14.setObjectName(_fromUtf8("label_14")) self.gridLayout_2.addWidget(self.label_14, 2, 2, 1, 1) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.leechAction = QtGui.QComboBox(self.tab_2) self.leechAction.setObjectName(_fromUtf8("leechAction")) self.leechAction.addItem(_fromUtf8("")) self.leechAction.addItem(_fromUtf8("")) self.horizontalLayout.addWidget(self.leechAction) spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem2) self.gridLayout_2.addLayout(self.horizontalLayout, 4, 1, 1, 2) self.label_28 = QtGui.QLabel(self.tab_2) self.label_28.setObjectName(_fromUtf8("label_28")) self.gridLayout_2.addWidget(self.label_28, 1, 2, 1, 1) self.lapMult = QtGui.QSpinBox(self.tab_2) self.lapMult.setMaximum(100) self.lapMult.setSingleStep(5) self.lapMult.setObjectName(_fromUtf8("lapMult")) self.gridLayout_2.addWidget(self.lapMult, 1, 1, 1, 1) self.verticalLayout_3.addLayout(self.gridLayout_2) spacerItem3 = QtGui.QSpacerItem(20, 72, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem3) self.tabWidget.addTab(self.tab_2, _fromUtf8("")) self.tab_5 = QtGui.QWidget() self.tab_5.setObjectName(_fromUtf8("tab_5")) self.verticalLayout_6 = QtGui.QVBoxLayout(self.tab_5) self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6")) self.gridLayout_5 = QtGui.QGridLayout() self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) self.label_25 = QtGui.QLabel(self.tab_5) self.label_25.setObjectName(_fromUtf8("label_25")) self.gridLayout_5.addWidget(self.label_25, 0, 0, 1, 1) self.maxTaken = QtGui.QSpinBox(self.tab_5) self.maxTaken.setMinimum(30) self.maxTaken.setMaximum(3600) self.maxTaken.setSingleStep(10) self.maxTaken.setObjectName(_fromUtf8("maxTaken")) self.gridLayout_5.addWidget(self.maxTaken, 0, 1, 1, 1) self.label_26 = QtGui.QLabel(self.tab_5) self.label_26.setObjectName(_fromUtf8("label_26")) self.gridLayout_5.addWidget(self.label_26, 0, 2, 1, 1) self.verticalLayout_6.addLayout(self.gridLayout_5) self.showTimer = QtGui.QCheckBox(self.tab_5) self.showTimer.setObjectName(_fromUtf8("showTimer")) self.verticalLayout_6.addWidget(self.showTimer) self.autoplaySounds = QtGui.QCheckBox(self.tab_5) self.autoplaySounds.setObjectName(_fromUtf8("autoplaySounds")) self.verticalLayout_6.addWidget(self.autoplaySounds) self.replayQuestion = QtGui.QCheckBox(self.tab_5) self.replayQuestion.setChecked(False) self.replayQuestion.setObjectName(_fromUtf8("replayQuestion")) self.verticalLayout_6.addWidget(self.replayQuestion) spacerItem4 = QtGui.QSpacerItem(20, 199, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_6.addItem(spacerItem4) self.tabWidget.addTab(self.tab_5, _fromUtf8("")) self.tab_4 = QtGui.QWidget() self.tab_4.setObjectName(_fromUtf8("tab_4")) self.verticalLayout_5 = QtGui.QVBoxLayout(self.tab_4) self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) self.label_22 = QtGui.QLabel(self.tab_4) self.label_22.setObjectName(_fromUtf8("label_22")) self.verticalLayout_5.addWidget(self.label_22) self.desc = QtGui.QTextEdit(self.tab_4) self.desc.setObjectName(_fromUtf8("desc")) self.verticalLayout_5.addWidget(self.desc) self.tabWidget.addTab(self.tab_4, _fromUtf8("")) self.verticalLayout.addWidget(self.tabWidget) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Help|QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.RestoreDefaults) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) self.tabWidget.setCurrentIndex(0) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.dconf, self.confOpts) Dialog.setTabOrder(self.confOpts, self.tabWidget) Dialog.setTabOrder(self.tabWidget, self.lrnSteps) Dialog.setTabOrder(self.lrnSteps, self.newOrder) Dialog.setTabOrder(self.newOrder, self.newPerDay) Dialog.setTabOrder(self.newPerDay, self.lrnGradInt) Dialog.setTabOrder(self.lrnGradInt, self.lrnEasyInt) Dialog.setTabOrder(self.lrnEasyInt, self.lrnFactor) Dialog.setTabOrder(self.lrnFactor, self.bury) Dialog.setTabOrder(self.bury, self.revPerDay) Dialog.setTabOrder(self.revPerDay, self.easyBonus) Dialog.setTabOrder(self.easyBonus, self.fi1) Dialog.setTabOrder(self.fi1, self.maxIvl) Dialog.setTabOrder(self.maxIvl, self.buryRev) Dialog.setTabOrder(self.buryRev, self.lapSteps) Dialog.setTabOrder(self.lapSteps, self.lapMult) Dialog.setTabOrder(self.lapMult, self.lapMinInt) Dialog.setTabOrder(self.lapMinInt, self.leechThreshold) Dialog.setTabOrder(self.leechThreshold, self.leechAction) Dialog.setTabOrder(self.leechAction, self.maxTaken) Dialog.setTabOrder(self.maxTaken, self.showTimer) Dialog.setTabOrder(self.showTimer, self.autoplaySounds) Dialog.setTabOrder(self.autoplaySounds, self.replayQuestion) Dialog.setTabOrder(self.replayQuestion, self.buttonBox) Dialog.setTabOrder(self.buttonBox, self.desc) def retranslateUi(self, Dialog): self.label_31.setText(_("Options group:")) self.label_27.setText(_("%")) self.label_24.setText(_("Starting ease")) self.label_8.setText(_("Order")) self.label_5.setText(_("Easy interval")) self.label_4.setText(_("Graduating interval")) self.label_6.setText(_("New cards/day")) self.label_2.setText(_("Steps (in minutes)")) self.bury.setText(_("Bury related new cards until the next day")) self.label_9.setText(_("days")) self.label_7.setText(_("days")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _("New Cards")) self.label_20.setText(_("Easy bonus")) self.label_21.setText(_("%")) self.label_34.setText(_("%")) self.label_33.setText(_("Interval modifier")) self.label_37.setText(_("Maximum reviews/day")) self.label_3.setText(_("Maximum interval")) self.label_23.setText(_("days")) self.buryRev.setText(_("Bury related reviews until the next day")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _("Reviews")) self.label_17.setText(_("Steps (in minutes)")) self.label.setText(_("New interval")) self.label_10.setText(_("Leech threshold")) self.label_11.setText(_("lapses")) self.label_12.setText(_("Leech action")) self.label_13.setText(_("Minimum interval")) self.label_14.setText(_("days")) self.leechAction.setItemText(0, _("Suspend Card")) self.leechAction.setItemText(1, _("Tag Only")) self.label_28.setText(_("%")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _("Lapses")) self.label_25.setText(_("Ignore answer times longer than")) self.label_26.setText(_("seconds")) self.showTimer.setText(_("Show answer timer")) self.autoplaySounds.setText(_("Automatically play audio")) self.replayQuestion.setText(_("When answer shown, replay both question and answer audio")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), _("General")) self.label_22.setText(_("Description to show on study screen (current deck only):")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _("Description")) import icons_rc anki-2.0.20+dfsg/aqt/forms/browseropts.py0000644000175000017500000000712612167474724020152 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/browseropts.ui' # # Created: Thu Jul 11 18:24:36 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(288, 195) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout.addWidget(self.label) self.fontCombo = QtGui.QFontComboBox(Dialog) self.fontCombo.setObjectName(_fromUtf8("fontCombo")) self.horizontalLayout.addWidget(self.fontCombo) self.verticalLayout.addLayout(self.horizontalLayout) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.fontSize = QtGui.QSpinBox(Dialog) self.fontSize.setMinimumSize(QtCore.QSize(75, 0)) self.fontSize.setObjectName(_fromUtf8("fontSize")) self.gridLayout.addWidget(self.fontSize, 0, 1, 1, 1) self.label_3 = QtGui.QLabel(Dialog) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.lineSize = QtGui.QSpinBox(Dialog) self.lineSize.setObjectName(_fromUtf8("lineSize")) self.gridLayout.addWidget(self.lineSize, 1, 1, 1, 1) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 0, 2, 1, 1) self.verticalLayout.addLayout(self.gridLayout) self.fullSearch = QtGui.QCheckBox(Dialog) self.fullSearch.setObjectName(_fromUtf8("fullSearch")) self.verticalLayout.addWidget(self.fullSearch) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.fontCombo, self.fontSize) Dialog.setTabOrder(self.fontSize, self.lineSize) Dialog.setTabOrder(self.lineSize, self.fullSearch) Dialog.setTabOrder(self.fullSearch, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Browser Options")) self.label.setText(_("Font:")) self.label_2.setText(_("Font Size:")) self.label_3.setText(_("Line Size:")) self.fullSearch.setText(_("Search within formatting (slow)")) anki-2.0.20+dfsg/aqt/forms/setgroup.py0000644000175000017500000000324212167474726017426 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/setgroup.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(433, 143) self.verticalLayout_2 = QtGui.QVBoxLayout(Dialog) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout_2.addWidget(self.label) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout_2.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Anki")) self.label.setText(_("Move cards to deck:")) anki-2.0.20+dfsg/aqt/forms/changemap.py0000644000175000017500000000345012167474724017500 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/changemap.ui' # # Created: Thu Jul 11 18:24:36 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_ChangeMap(object): def setupUi(self, ChangeMap): ChangeMap.setObjectName(_fromUtf8("ChangeMap")) ChangeMap.resize(391, 360) self.vboxlayout = QtGui.QVBoxLayout(ChangeMap) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.label = QtGui.QLabel(ChangeMap) self.label.setWordWrap(True) self.label.setObjectName(_fromUtf8("label")) self.vboxlayout.addWidget(self.label) self.fields = QtGui.QListWidget(ChangeMap) self.fields.setObjectName(_fromUtf8("fields")) self.vboxlayout.addWidget(self.fields) self.buttonBox = QtGui.QDialogButtonBox(ChangeMap) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.vboxlayout.addWidget(self.buttonBox) self.retranslateUi(ChangeMap) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), ChangeMap.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), ChangeMap.reject) QtCore.QObject.connect(self.fields, QtCore.SIGNAL(_fromUtf8("doubleClicked(QModelIndex)")), ChangeMap.accept) QtCore.QMetaObject.connectSlotsByName(ChangeMap) def retranslateUi(self, ChangeMap): ChangeMap.setWindowTitle(_("Import")) self.label.setText(_("Target field:")) anki-2.0.20+dfsg/aqt/forms/addmodel.py0000644000175000017500000000365512167474724017335 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/addmodel.ui' # # Created: Thu Jul 11 18:24:36 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(285, 269) self.vboxlayout = QtGui.QVBoxLayout(Dialog) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.groupBox = QtGui.QGroupBox(Dialog) self.groupBox.setTitle(_fromUtf8("")) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.vboxlayout1 = QtGui.QVBoxLayout(self.groupBox) self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.models = QtGui.QListWidget(self.groupBox) self.models.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.models.setTabKeyNavigation(True) self.models.setObjectName(_fromUtf8("models")) self.vboxlayout1.addWidget(self.models) self.vboxlayout.addWidget(self.groupBox) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Help|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.vboxlayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Add Note Type")) anki-2.0.20+dfsg/aqt/forms/edithtml.py0000644000175000017500000000302012167474725017361 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/edithtml.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(400, 300) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.textEdit = QtGui.QTextEdit(Dialog) self.textEdit.setAcceptRichText(False) self.textEdit.setObjectName(_fromUtf8("textEdit")) self.verticalLayout.addWidget(self.textEdit) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Help) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("HTML Editor")) anki-2.0.20+dfsg/aqt/forms/template.py0000644000175000017500000001236112167474726017373 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/template.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Form(object): def setupUi(self, Form): Form.setObjectName(_fromUtf8("Form")) Form.resize(470, 569) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth()) Form.setSizePolicy(sizePolicy) self.verticalLayout_5 = QtGui.QVBoxLayout(Form) self.verticalLayout_5.setSpacing(0) self.verticalLayout_5.setMargin(0) self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setSpacing(0) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.groupBox = QtGui.QGroupBox(Form) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.tlayout1 = QtGui.QVBoxLayout(self.groupBox) self.tlayout1.setSpacing(0) self.tlayout1.setMargin(0) self.tlayout1.setObjectName(_fromUtf8("tlayout1")) self.front = QtGui.QTextEdit(self.groupBox) self.front.setObjectName(_fromUtf8("front")) self.tlayout1.addWidget(self.front) self.horizontalLayout_2.addWidget(self.groupBox) self.label1 = QtGui.QLabel(Form) self.label1.setText(_fromUtf8("")) self.label1.setObjectName(_fromUtf8("label1")) self.horizontalLayout_2.addWidget(self.label1) self.verticalLayout_5.addLayout(self.horizontalLayout_2) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setSpacing(0) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.groupBox_3 = QtGui.QGroupBox(Form) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.tlayout2 = QtGui.QVBoxLayout(self.groupBox_3) self.tlayout2.setSpacing(0) self.tlayout2.setMargin(0) self.tlayout2.setObjectName(_fromUtf8("tlayout2")) self.css = QtGui.QTextEdit(self.groupBox_3) self.css.setObjectName(_fromUtf8("css")) self.tlayout2.addWidget(self.css) self.horizontalLayout.addWidget(self.groupBox_3) self.verticalLayout_4 = QtGui.QVBoxLayout() self.verticalLayout_4.setSpacing(0) self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) spacerItem = QtGui.QSpacerItem(1, 15, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) self.verticalLayout_4.addItem(spacerItem) self.labelc1 = QtGui.QLabel(Form) self.labelc1.setText(_fromUtf8("")) self.labelc1.setObjectName(_fromUtf8("labelc1")) self.verticalLayout_4.addWidget(self.labelc1) spacerItem1 = QtGui.QSpacerItem(1, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_4.addItem(spacerItem1) self.labelc2 = QtGui.QLabel(Form) self.labelc2.setText(_fromUtf8("")) self.labelc2.setObjectName(_fromUtf8("labelc2")) self.verticalLayout_4.addWidget(self.labelc2) spacerItem2 = QtGui.QSpacerItem(1, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) self.verticalLayout_4.addItem(spacerItem2) self.horizontalLayout.addLayout(self.verticalLayout_4) self.verticalLayout_5.addLayout(self.horizontalLayout) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setSpacing(0) self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.groupBox_2 = QtGui.QGroupBox(Form) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(10) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) self.groupBox_2.setSizePolicy(sizePolicy) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.tlayout3 = QtGui.QVBoxLayout(self.groupBox_2) self.tlayout3.setSpacing(0) self.tlayout3.setMargin(0) self.tlayout3.setObjectName(_fromUtf8("tlayout3")) self.back = QtGui.QTextEdit(self.groupBox_2) self.back.setObjectName(_fromUtf8("back")) self.tlayout3.addWidget(self.back) self.horizontalLayout_3.addWidget(self.groupBox_2) self.label2 = QtGui.QLabel(Form) self.label2.setText(_fromUtf8("")) self.label2.setObjectName(_fromUtf8("label2")) self.horizontalLayout_3.addWidget(self.label2) self.verticalLayout_5.addLayout(self.horizontalLayout_3) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): Form.setWindowTitle(_("Form")) self.groupBox.setTitle(_("Front Template")) self.groupBox_3.setTitle(_("Styling")) self.groupBox_2.setTitle(_("Back Template")) import icons_rc anki-2.0.20+dfsg/aqt/forms/customstudy.py0000644000175000017500000001275512221205034020141 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/customstudy.ui' # # Created: Fri Sep 27 13:31:24 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(332, 380) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.radio4 = QtGui.QRadioButton(Dialog) self.radio4.setObjectName(_fromUtf8("radio4")) self.gridLayout.addWidget(self.radio4, 3, 0, 1, 1) self.radio3 = QtGui.QRadioButton(Dialog) self.radio3.setObjectName(_fromUtf8("radio3")) self.gridLayout.addWidget(self.radio3, 2, 0, 1, 1) self.radio1 = QtGui.QRadioButton(Dialog) self.radio1.setObjectName(_fromUtf8("radio1")) self.gridLayout.addWidget(self.radio1, 0, 0, 1, 1) self.radio2 = QtGui.QRadioButton(Dialog) self.radio2.setObjectName(_fromUtf8("radio2")) self.gridLayout.addWidget(self.radio2, 1, 0, 1, 1) self.radio6 = QtGui.QRadioButton(Dialog) self.radio6.setObjectName(_fromUtf8("radio6")) self.gridLayout.addWidget(self.radio6, 5, 0, 1, 1) self.radio5 = QtGui.QRadioButton(Dialog) self.radio5.setObjectName(_fromUtf8("radio5")) self.gridLayout.addWidget(self.radio5, 4, 0, 1, 1) self.verticalLayout.addLayout(self.gridLayout) self.groupBox = QtGui.QGroupBox(Dialog) self.groupBox.setTitle(_fromUtf8("")) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.title = QtGui.QLabel(self.groupBox) self.title.setObjectName(_fromUtf8("title")) self.verticalLayout_2.addWidget(self.title) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.preSpin = QtGui.QLabel(self.groupBox) self.preSpin.setObjectName(_fromUtf8("preSpin")) self.horizontalLayout.addWidget(self.preSpin) self.spin = QtGui.QSpinBox(self.groupBox) self.spin.setObjectName(_fromUtf8("spin")) self.horizontalLayout.addWidget(self.spin) self.postSpin = QtGui.QLabel(self.groupBox) self.postSpin.setObjectName(_fromUtf8("postSpin")) self.horizontalLayout.addWidget(self.postSpin) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout_2.addLayout(self.horizontalLayout) self.cardType = QtGui.QListWidget(self.groupBox) self.cardType.setObjectName(_fromUtf8("cardType")) item = QtGui.QListWidgetItem() self.cardType.addItem(item) item = QtGui.QListWidgetItem() self.cardType.addItem(item) item = QtGui.QListWidgetItem() self.cardType.addItem(item) self.verticalLayout_2.addWidget(self.cardType) self.verticalLayout.addWidget(self.groupBox) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) self.cardType.setCurrentRow(0) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.radio1, self.radio2) Dialog.setTabOrder(self.radio2, self.radio3) Dialog.setTabOrder(self.radio3, self.radio4) Dialog.setTabOrder(self.radio4, self.radio6) Dialog.setTabOrder(self.radio6, self.spin) Dialog.setTabOrder(self.spin, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Custom Study")) self.radio4.setText(_("Review ahead")) self.radio3.setText(_("Review forgotten cards")) self.radio1.setText(_("Increase today\'s new card limit")) self.radio2.setText(_("Increase today\'s review card limit")) self.radio6.setText(_("Study by card state or tag")) self.radio5.setText(_("Preview new cards")) self.title.setText(_("...")) self.preSpin.setText(_("...")) self.postSpin.setText(_("...")) __sortingEnabled = self.cardType.isSortingEnabled() self.cardType.setSortingEnabled(False) item = self.cardType.item(0) item.setText(_("New cards only")) item = self.cardType.item(1) item.setText(_("Due cards only")) item = self.cardType.item(2) item.setText(_("All cards in random order (cram mode)")) self.cardType.setSortingEnabled(__sortingEnabled) anki-2.0.20+dfsg/aqt/forms/dyndconf.py0000644000175000017500000001102112167474725017353 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/dyndconf.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(445, 301) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.groupBox = QtGui.QGroupBox(Dialog) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label_5 = QtGui.QLabel(self.groupBox) self.label_5.setObjectName(_fromUtf8("label_5")) self.gridLayout.addWidget(self.label_5, 1, 0, 1, 1) self.label_2 = QtGui.QLabel(self.groupBox) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.limit = QtGui.QSpinBox(self.groupBox) self.limit.setMaximumSize(QtCore.QSize(60, 16777215)) self.limit.setMinimum(1) self.limit.setMaximum(9999) self.limit.setObjectName(_fromUtf8("limit")) self.gridLayout.addWidget(self.limit, 1, 1, 1, 1) self.label = QtGui.QLabel(self.groupBox) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 1, 2, 1, 1) self.search = QtGui.QLineEdit(self.groupBox) self.search.setObjectName(_fromUtf8("search")) self.gridLayout.addWidget(self.search, 0, 1, 1, 4) self.order = QtGui.QComboBox(self.groupBox) self.order.setObjectName(_fromUtf8("order")) self.gridLayout.addWidget(self.order, 1, 3, 1, 2) self.verticalLayout.addWidget(self.groupBox) self.groupBox_2 = QtGui.QGroupBox(Dialog) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_2) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.resched = QtGui.QCheckBox(self.groupBox_2) self.resched.setChecked(True) self.resched.setObjectName(_fromUtf8("resched")) self.gridLayout_2.addWidget(self.resched, 0, 0, 1, 2) self.stepsOn = QtGui.QCheckBox(self.groupBox_2) self.stepsOn.setObjectName(_fromUtf8("stepsOn")) self.gridLayout_2.addWidget(self.stepsOn, 1, 0, 1, 1) self.steps = QtGui.QLineEdit(self.groupBox_2) self.steps.setEnabled(False) self.steps.setObjectName(_fromUtf8("steps")) self.gridLayout_2.addWidget(self.steps, 1, 1, 1, 1) self.verticalLayout.addWidget(self.groupBox_2) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Help) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QObject.connect(self.stepsOn, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.steps.setEnabled) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.search, self.limit) Dialog.setTabOrder(self.limit, self.order) Dialog.setTabOrder(self.order, self.resched) Dialog.setTabOrder(self.resched, self.stepsOn) Dialog.setTabOrder(self.stepsOn, self.steps) Dialog.setTabOrder(self.steps, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Dialog")) self.groupBox.setTitle(_("Filter")) self.label_5.setText(_("Limit to")) self.label_2.setText(_("Search")) self.label.setText(_("cards selected by")) self.groupBox_2.setTitle(_("Options")) self.resched.setText(_("Reschedule cards based on my answers in this deck")) self.stepsOn.setText(_("Custom steps (in minutes)")) self.steps.setText(_("1 10")) anki-2.0.20+dfsg/aqt/forms/preferences.py0000644000175000017500000003204412250251740020037 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/preferences.ui' # # Created: Fri Dec 6 13:34:40 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Preferences(object): def setupUi(self, Preferences): Preferences.setObjectName(_fromUtf8("Preferences")) Preferences.resize(405, 450) self.verticalLayout_2 = QtGui.QVBoxLayout(Preferences) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.tabWidget = QtGui.QTabWidget(Preferences) self.tabWidget.setFocusPolicy(QtCore.Qt.StrongFocus) self.tabWidget.setObjectName(_fromUtf8("tabWidget")) self.tab_1 = QtGui.QWidget() self.tab_1.setObjectName(_fromUtf8("tab_1")) self.verticalLayout = QtGui.QVBoxLayout(self.tab_1) self.verticalLayout.setSpacing(12) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.showEstimates = QtGui.QCheckBox(self.tab_1) self.showEstimates.setObjectName(_fromUtf8("showEstimates")) self.verticalLayout.addWidget(self.showEstimates) self.showProgress = QtGui.QCheckBox(self.tab_1) self.showProgress.setObjectName(_fromUtf8("showProgress")) self.verticalLayout.addWidget(self.showProgress) self.stripHTML = QtGui.QCheckBox(self.tab_1) self.stripHTML.setObjectName(_fromUtf8("stripHTML")) self.verticalLayout.addWidget(self.stripHTML) self.pastePNG = QtGui.QCheckBox(self.tab_1) self.pastePNG.setObjectName(_fromUtf8("pastePNG")) self.verticalLayout.addWidget(self.pastePNG) self.useCurrent = QtGui.QComboBox(self.tab_1) self.useCurrent.setObjectName(_fromUtf8("useCurrent")) self.useCurrent.addItem(_fromUtf8("")) self.useCurrent.addItem(_fromUtf8("")) self.verticalLayout.addWidget(self.useCurrent) self.newSpread = QtGui.QComboBox(self.tab_1) self.newSpread.setObjectName(_fromUtf8("newSpread")) self.verticalLayout.addWidget(self.newSpread) self.gridLayout_4 = QtGui.QGridLayout() self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) self.label_23 = QtGui.QLabel(self.tab_1) self.label_23.setObjectName(_fromUtf8("label_23")) self.gridLayout_4.addWidget(self.label_23, 0, 0, 1, 1) self.dayOffset = QtGui.QSpinBox(self.tab_1) self.dayOffset.setMaximumSize(QtCore.QSize(60, 16777215)) self.dayOffset.setMaximum(23) self.dayOffset.setObjectName(_fromUtf8("dayOffset")) self.gridLayout_4.addWidget(self.dayOffset, 0, 1, 1, 1) self.label_24 = QtGui.QLabel(self.tab_1) self.label_24.setObjectName(_fromUtf8("label_24")) self.gridLayout_4.addWidget(self.label_24, 1, 0, 1, 1) self.lrnCutoff = QtGui.QSpinBox(self.tab_1) self.lrnCutoff.setMaximumSize(QtCore.QSize(60, 16777215)) self.lrnCutoff.setMaximum(999) self.lrnCutoff.setObjectName(_fromUtf8("lrnCutoff")) self.gridLayout_4.addWidget(self.lrnCutoff, 1, 1, 1, 1) self.label_29 = QtGui.QLabel(self.tab_1) self.label_29.setObjectName(_fromUtf8("label_29")) self.gridLayout_4.addWidget(self.label_29, 1, 2, 1, 1) self.label_30 = QtGui.QLabel(self.tab_1) self.label_30.setObjectName(_fromUtf8("label_30")) self.gridLayout_4.addWidget(self.label_30, 2, 0, 1, 1) self.timeLimit = QtGui.QSpinBox(self.tab_1) self.timeLimit.setMaximum(9999) self.timeLimit.setObjectName(_fromUtf8("timeLimit")) self.gridLayout_4.addWidget(self.timeLimit, 2, 1, 1, 1) self.label_39 = QtGui.QLabel(self.tab_1) self.label_39.setObjectName(_fromUtf8("label_39")) self.gridLayout_4.addWidget(self.label_39, 2, 2, 1, 1) self.label_40 = QtGui.QLabel(self.tab_1) self.label_40.setObjectName(_fromUtf8("label_40")) self.gridLayout_4.addWidget(self.label_40, 0, 2, 1, 1) self.verticalLayout.addLayout(self.gridLayout_4) spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) self.verticalLayout.addItem(spacerItem) self.profilePass = QtGui.QPushButton(self.tab_1) self.profilePass.setAutoDefault(False) self.profilePass.setObjectName(_fromUtf8("profilePass")) self.verticalLayout.addWidget(self.profilePass) self.tabWidget.addTab(self.tab_1, _fromUtf8("")) self.tab_2 = QtGui.QWidget() self.tab_2.setObjectName(_fromUtf8("tab_2")) self.verticalLayout_4 = QtGui.QVBoxLayout(self.tab_2) self.verticalLayout_4.setSpacing(10) self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) self.hboxlayout = QtGui.QHBoxLayout() self.hboxlayout.setSpacing(10) self.hboxlayout.setObjectName(_fromUtf8("hboxlayout")) self.vboxlayout = QtGui.QVBoxLayout() self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.syncLabel = QtGui.QLabel(self.tab_2) self.syncLabel.setWordWrap(True) self.syncLabel.setOpenExternalLinks(True) self.syncLabel.setObjectName(_fromUtf8("syncLabel")) self.vboxlayout.addWidget(self.syncLabel) self.syncMedia = QtGui.QCheckBox(self.tab_2) self.syncMedia.setObjectName(_fromUtf8("syncMedia")) self.vboxlayout.addWidget(self.syncMedia) self.syncOnProgramOpen = QtGui.QCheckBox(self.tab_2) self.syncOnProgramOpen.setObjectName(_fromUtf8("syncOnProgramOpen")) self.vboxlayout.addWidget(self.syncOnProgramOpen) self.fullSync = QtGui.QCheckBox(self.tab_2) self.fullSync.setObjectName(_fromUtf8("fullSync")) self.vboxlayout.addWidget(self.fullSync) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.syncDeauth = QtGui.QPushButton(self.tab_2) self.syncDeauth.setAutoDefault(False) self.syncDeauth.setObjectName(_fromUtf8("syncDeauth")) self.horizontalLayout.addWidget(self.syncDeauth) self.syncUser = QtGui.QLabel(self.tab_2) self.syncUser.setText(_fromUtf8("")) self.syncUser.setObjectName(_fromUtf8("syncUser")) self.horizontalLayout.addWidget(self.syncUser) spacerItem1 = QtGui.QSpacerItem(40, 1, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.vboxlayout.addLayout(self.horizontalLayout) self.hboxlayout.addLayout(self.vboxlayout) self.verticalLayout_4.addLayout(self.hboxlayout) spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_4.addItem(spacerItem2) self.tabWidget.addTab(self.tab_2, _fromUtf8("")) self.tab = QtGui.QWidget() self.tab.setObjectName(_fromUtf8("tab")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.tab) self.verticalLayout_3.setSpacing(10) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.label_9 = QtGui.QLabel(self.tab) self.label_9.setWordWrap(True) self.label_9.setObjectName(_fromUtf8("label_9")) self.verticalLayout_3.addWidget(self.label_9) self.gridLayout_2 = QtGui.QGridLayout() self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.label_10 = QtGui.QLabel(self.tab) self.label_10.setObjectName(_fromUtf8("label_10")) self.gridLayout_2.addWidget(self.label_10, 0, 0, 1, 1) self.numBackups = QtGui.QSpinBox(self.tab) self.numBackups.setMinimumSize(QtCore.QSize(60, 0)) self.numBackups.setMaximumSize(QtCore.QSize(60, 16777215)) self.numBackups.setObjectName(_fromUtf8("numBackups")) self.gridLayout_2.addWidget(self.numBackups, 0, 1, 1, 1) self.label_11 = QtGui.QLabel(self.tab) self.label_11.setObjectName(_fromUtf8("label_11")) self.gridLayout_2.addWidget(self.label_11, 0, 2, 1, 1) spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout_2.addItem(spacerItem3, 0, 3, 1, 1) self.verticalLayout_3.addLayout(self.gridLayout_2) self.compressBackups = QtGui.QCheckBox(self.tab) self.compressBackups.setObjectName(_fromUtf8("compressBackups")) self.verticalLayout_3.addWidget(self.compressBackups) self.openBackupFolder = QtGui.QLabel(self.tab) self.openBackupFolder.setObjectName(_fromUtf8("openBackupFolder")) self.verticalLayout_3.addWidget(self.openBackupFolder) self.label_4 = QtGui.QLabel(self.tab) self.label_4.setWordWrap(True) self.label_4.setObjectName(_fromUtf8("label_4")) self.verticalLayout_3.addWidget(self.label_4) spacerItem4 = QtGui.QSpacerItem(20, 59, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem4) self.label_21 = QtGui.QLabel(self.tab) self.label_21.setAlignment(QtCore.Qt.AlignCenter) self.label_21.setObjectName(_fromUtf8("label_21")) self.verticalLayout_3.addWidget(self.label_21) self.tabWidget.addTab(self.tab, _fromUtf8("")) self.verticalLayout_2.addWidget(self.tabWidget) self.buttonBox = QtGui.QDialogButtonBox(Preferences) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Help) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout_2.addWidget(self.buttonBox) self.retranslateUi(Preferences) self.tabWidget.setCurrentIndex(0) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Preferences.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Preferences.reject) QtCore.QMetaObject.connectSlotsByName(Preferences) Preferences.setTabOrder(self.showEstimates, self.showProgress) Preferences.setTabOrder(self.showProgress, self.stripHTML) Preferences.setTabOrder(self.stripHTML, self.pastePNG) Preferences.setTabOrder(self.pastePNG, self.useCurrent) Preferences.setTabOrder(self.useCurrent, self.newSpread) Preferences.setTabOrder(self.newSpread, self.dayOffset) Preferences.setTabOrder(self.dayOffset, self.lrnCutoff) Preferences.setTabOrder(self.lrnCutoff, self.timeLimit) Preferences.setTabOrder(self.timeLimit, self.profilePass) Preferences.setTabOrder(self.profilePass, self.syncMedia) Preferences.setTabOrder(self.syncMedia, self.syncOnProgramOpen) Preferences.setTabOrder(self.syncOnProgramOpen, self.syncDeauth) Preferences.setTabOrder(self.syncDeauth, self.numBackups) Preferences.setTabOrder(self.numBackups, self.buttonBox) Preferences.setTabOrder(self.buttonBox, self.tabWidget) def retranslateUi(self, Preferences): Preferences.setWindowTitle(_("Preferences")) self.showEstimates.setText(_("Show next review time above answer buttons")) self.showProgress.setText(_("Show remaining card count during review")) self.stripHTML.setText(_("Strip HTML when pasting text")) self.pastePNG.setText(_("Paste clipboard images as PNG")) self.useCurrent.setItemText(0, _("When adding, default to current deck")) self.useCurrent.setItemText(1, _("Change deck depending on note type")) self.label_23.setText(_("Next day starts at")) self.label_24.setText(_("Learn ahead limit")) self.label_29.setText(_("mins")) self.label_30.setText(_("Timebox time limit")) self.label_39.setText(_("mins")) self.label_40.setText(_("hours past midnight")) self.profilePass.setText(_("Profile Password...")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), _("Basic")) self.syncLabel.setText(_("Synchronisation")) self.syncMedia.setText(_("Synchronize audio and images too")) self.syncOnProgramOpen.setText(_("Automatically sync on profile open/close")) self.fullSync.setText(_("On next sync, force changes in one direction")) self.syncDeauth.setText(_("Deauthorize")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _("Network")) self.label_9.setText(_("Backups
Anki will create a backup of your collection each time it is closed or synchronized.")) self.label_10.setText(_("Keep")) self.label_11.setText(_("backups")) self.compressBackups.setText(_("Compress backups (slower)")) self.openBackupFolder.setText(_("Open backup folder")) self.label_4.setText(_("Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.")) self.label_21.setText(_("Some settings will take effect after you restart Anki.")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _("Backups")) anki-2.0.20+dfsg/aqt/forms/icons_rc.py0000644000175000017500000330747312252273051017354 0ustar andreasandreas# -*- coding: utf-8 -*- # Resource object code # # Created: Thu Dec 12 17:39:05 2013 # by: The Resource Compiler for PyQt (Qt v4.8.2) # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore qt_resource_data = "\ \x00\x00\x03\xee\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x03\x6b\x49\x44\ \x41\x54\x78\xda\xed\x97\xdd\x6b\x1c\x55\x18\xc6\x9f\x73\xce\xee\ \x26\x69\x53\x13\x0b\x29\x45\xaf\xea\x85\x78\xe1\x95\x1f\xf4\x4f\ \x10\x04\xb1\x48\xdb\x9b\x22\x94\xa2\xe8\x7f\xe0\x85\xa8\xb5\x94\ \x36\xd4\x42\xaf\x6c\xf0\xda\x1b\x49\xfa\x41\x1b\xa1\x1f\xb4\x08\ \xc5\x8f\x40\xb1\x59\x08\xb1\x1f\x9a\x94\x18\xd2\x26\x4d\xb2\x3b\ \x99\x9d\x33\x33\x67\xce\x39\xf3\x7a\x32\x67\xb1\x5b\xa3\xa5\x66\ \x49\xbd\x70\xf7\xe5\x07\xef\x0c\xbb\xf3\x3c\x73\xe6\x99\x73\xce\ \x32\x22\xc2\x7f\xf9\xe1\x8e\x8e\x81\x8e\x81\xff\xb7\x81\x52\xeb\ \x01\xfb\x80\x09\x3c\xc0\x33\x1b\xaa\xb8\x0d\x21\x7d\x45\x76\x8d\ \x01\xb6\x97\x71\xa4\xa8\x02\x78\xf9\xa1\x23\x47\xd7\xa3\xb0\x0a\ \x07\x2b\x31\xdf\x0b\xdf\x33\xee\x28\x71\x40\x00\x8c\x31\x7f\x1e\ \xcc\xf7\xdc\xf5\xc4\x0a\xe0\x88\xf2\xc6\xaf\x00\x5e\x5c\x3b\x02\ \x8b\x8e\x2d\xe8\x3f\xfc\xde\x61\x0c\xec\x18\x40\x14\x47\x88\x55\ \x8c\x28\x8d\xd0\xc8\x1a\x88\x6d\x8c\xc4\x24\x88\x5d\x49\x57\x11\ \x45\x10\xdd\x02\xd7\x1b\xd7\x81\xcd\x0c\xd8\x44\x0e\x34\xfb\x1c\ \x30\x0c\x68\xb4\x10\x32\xbc\x54\x79\x01\x52\x2d\x6d\xfd\xdb\x0c\ \xd0\x77\x94\x83\xf0\xfe\x91\xaf\x8f\xa4\xcb\xf3\xcb\x30\x64\x90\ \xe5\x19\x54\xae\x90\xd9\x0c\xa9\x49\x11\xe9\x08\x61\x16\x22\x48\ \x03\xd4\xb3\x3a\xea\xaa\x0e\x63\x0d\xb4\xd5\xab\xdf\x29\x50\x46\ \x21\x55\x29\x92\xcc\x99\xd5\xce\xac\x96\xc5\xef\x2a\xd4\x85\x89\ \x7b\xd3\xfa\x97\x99\xf9\x0f\xff\x31\x84\x34\x4a\x17\xe3\x24\x3e\ \x34\xf4\xcd\x10\xe5\x59\x0e\xce\x39\x04\x13\x10\x5c\x80\xaf\x16\ \x77\x34\x4b\xb8\x02\x01\xc8\x1d\xd6\x61\x1c\xda\x91\x3a\x64\x13\ \xe5\xcf\xf5\xe6\xbd\xd0\x01\x51\x2a\x93\x13\xf4\xa9\x39\xf5\xd8\ \xb7\x80\xbe\xa5\xa3\xb3\x8b\xb3\x23\xc3\xe7\x87\x51\x46\xd9\x8b\ \x32\x4f\xab\xb8\xc8\x05\x98\x65\x5e\x38\x2b\xf0\xe2\x71\x8b\x81\ \x04\x28\x67\x65\x74\xd7\x7a\x11\xca\x95\x2b\xf4\x89\xfe\xe8\xc9\ \x5e\xc3\xdf\xf1\xee\xf8\x9d\xf1\xea\xb5\x1f\xae\xf9\xbb\xf7\x06\ \xbc\x30\xb9\x63\xe2\x05\x2c\x67\x8f\x8a\x27\x4d\x03\x91\x43\xfa\ \x7e\xeb\xca\x00\x96\x6a\xcb\x53\x18\x33\x6f\x3d\xf1\x3c\x40\x55\ \xca\xd0\x85\x5d\x97\x7f\xba\xbc\x70\xf7\xb7\xbb\x5e\x9c\x0a\x79\ \x70\xf2\x3d\xb7\x1c\x5c\x73\x40\xfd\x45\x5c\x3e\x34\xb0\x4d\x6e\ \xc7\x83\xf9\x45\x17\x18\xfd\x06\x9d\x27\xf5\xaf\x26\x22\x1a\xa1\ \x19\x10\xf6\x9f\xb9\x74\x26\x0d\x97\x43\x3f\xf8\xd4\xc4\x7a\x48\ \x53\x31\xc4\x48\x5a\x0d\x78\xfa\x92\x7e\x04\xf7\x42\x4d\x41\x7e\ \x80\x8e\xd3\xd4\x3a\x66\x42\x1f\x4a\xad\xf5\xe7\xa3\x97\x46\xc9\ \x2a\x0b\x9e\x73\x87\x17\x17\x46\x80\x14\x81\x2b\xbe\x46\xbc\x27\ \xed\x81\x59\x22\xca\xc2\xf4\x0b\x3a\x66\xce\xb6\x35\x15\x3b\x13\ \x83\xb5\xb0\x36\x72\xf5\xfb\xab\xab\xe2\x45\xf8\x84\x15\xe0\x86\ \x83\x65\xcc\x1b\x68\x11\x2f\xc5\x25\x54\x64\x0f\xe4\x4a\x74\x81\ \x06\xed\xc7\xed\xaf\x05\xcd\x50\xce\xce\xcd\x56\xab\x13\x55\x70\ \xcb\x3d\xda\x43\x31\x79\x03\x4d\x13\x5b\xa8\x0f\x2b\x8d\xf0\x36\ \x26\xed\x3b\xed\x2f\x46\xad\xa1\x2c\x63\xd7\xe4\xf4\xe4\xc2\xdc\ \xfd\x39\x70\xc3\x3d\x9a\xc3\x4a\xfb\xa7\x78\x5f\xb9\x1f\xf5\x28\ \xa8\x21\x30\x6f\xfa\xd0\xb5\x67\x60\x6d\x28\x35\xf6\xff\x7c\xfb\ \x46\x2a\x1b\xb2\x78\x0c\x42\x0b\xd8\xc8\x16\xe2\x9b\xf8\x66\x48\ \x9d\x64\x08\x70\x80\xbe\xa4\xe9\x0d\x59\x8e\xe9\x2c\x5d\xb4\xca\ \x1c\xba\x31\x35\x4e\xa4\xa8\xc8\x00\x45\x84\x4a\x5e\x81\xed\x26\ \x32\xa1\x1e\xa4\x21\x73\x6e\x43\xf7\x03\x34\x4c\x47\x63\x19\x9f\ \xbe\x79\xff\x56\x31\x02\x25\x55\x82\x78\xb6\x0c\x25\x93\x51\x3a\ \x69\x3f\x7b\x3a\x1b\x92\x5b\xb4\xaf\x16\xd5\x26\x22\x92\x78\xe5\ \xb5\x57\x61\xc9\xde\xc4\x8f\xb4\xe7\x29\xed\x88\x7c\x28\xbb\x78\ \xe5\xed\x40\x07\x33\xcf\x6d\x7f\x7e\x61\xe7\x8e\xd7\x77\x17\x41\ \x5d\xd7\xc5\x88\xd6\xcd\xc1\xe1\x83\xa5\xb1\x3b\x63\x3d\xed\x5c\ \xa3\xf3\xcf\xa8\x63\xa0\x63\xe0\x0f\xf9\x43\x59\x51\xbd\x44\x74\ \x67\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x11\xcb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\ \x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\ \x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\ \x0b\x1c\x0c\x0f\x35\x01\x03\xbe\xf2\x00\x00\x07\x09\x49\x44\x41\ \x54\x58\xc3\xc5\x97\xcf\x53\x14\xe9\x19\xc7\xbf\x6f\xff\x98\xee\ \x9e\xee\xe9\xf9\xc1\xcc\x00\x43\x3b\x30\xcc\x94\xe2\x10\x1c\x0a\ \x70\xc5\x5d\x89\xab\xb1\x92\x52\x2e\x1e\x73\x80\x2a\x25\x87\x24\ \x55\x7b\x49\x4e\xc9\xcd\xdc\xf6\x42\x2e\x26\xff\x80\xc7\xbd\xe4\ \x1c\xab\x2c\xa5\x4a\x0a\x34\xe5\xa0\x8b\x4b\x24\x80\xa8\x8b\x83\ \xc8\x4e\xf7\xfc\xea\x99\xee\x79\xbb\xa7\x73\xd0\x75\x45\x70\x77\ \x85\x4d\xa5\xef\x6f\x7d\x3e\xdf\xf7\x7d\x9f\xe7\x7d\x1a\xf8\x3f\ \x7f\xe4\x43\x17\x64\x32\x19\x21\x18\x0c\x6a\xc3\xc3\xc3\x10\x04\ \x61\xe3\xea\xd5\xab\xf6\x41\x04\x98\x7d\xac\xd1\x08\x21\xd3\x3c\ \x2f\xfc\x8d\x52\x7a\xf2\xfc\xf9\xf3\xc2\x41\x04\xd8\x0f\x49\x2e\ \xcb\x72\x4f\xa3\xd1\xc8\xb6\xb5\xb5\x4d\x0c\x0d\x0d\xe7\x28\x6d\ \x66\x9a\xcd\xe6\x86\xa6\x69\xe4\xf0\xe1\xc3\xe6\xea\xea\xaa\xfb\ \x3f\x13\x88\x44\x22\x3d\x3e\x1f\x37\x1d\x54\xd5\x49\x45\x09\x24\ \xc7\xc7\x2f\x88\xd9\x6c\xb6\xa3\x54\x2a\x9d\xe2\x38\xee\x24\xc3\ \x30\x9b\xfb\x11\x61\x3f\x24\x79\x6f\x6f\xef\xc4\xef\x7f\xfb\x9b\ \x8c\x24\xf9\xb9\x80\x1a\x44\x2c\x16\xe5\xb2\xd9\x6c\x38\x93\xc9\ \x68\x86\x61\x8c\xed\x47\xe4\x07\x05\x64\x59\xee\xf1\xf9\x7c\xd3\ \xc1\x60\x60\x52\x14\xa5\xe4\xcf\x4f\x9f\xe1\x72\xb9\x41\x34\x1a\ \x36\x56\x56\xfe\x83\x50\x28\x44\x02\x81\x00\xd7\xd7\xd7\xb7\x43\ \x84\x52\xba\x59\x28\x14\x88\x6d\xdb\x26\x00\xf7\x83\x05\x32\x99\ \x8c\x90\x4a\xa5\x7a\x42\xa1\x50\x36\x1c\x0a\x4e\x4c\x5d\x9a\xcc\ \xb0\x9c\x8f\x33\xcd\x3a\x7a\x7b\xd3\x88\x46\xa3\x10\x45\x01\xf9\ \x7c\x1e\x1b\x1b\x1b\x48\x26\xbb\x49\x38\x1c\xe6\x34\x4d\x0b\xb7\ \xb7\xb7\x6b\x9b\x9b\x9b\x63\x4f\x9f\xac\x9d\x1c\xeb\x6f\xdf\x9c\ \xf8\xf5\xa4\x70\xea\x17\xbf\x54\x73\xb9\x5c\xfd\xee\xdd\xbb\x3b\ \x64\xb8\xbd\xc0\x00\x34\x00\x69\x86\x61\xfe\x38\x34\x34\x98\xa6\ \xd4\x39\x24\xab\x61\xf2\xe9\xa7\x67\x00\x00\xa5\x52\x19\x80\x07\ \x80\x41\x36\x9b\x05\x00\xe8\xba\x01\x5d\xd7\x61\x9a\x75\xb2\xba\ \xba\x2a\x0e\x0c\x0c\xa4\x17\xff\x75\x5b\xeb\xd7\xfc\xe9\x88\xca\ \xda\x4d\xe2\x6e\x3c\x5c\x5f\xf9\x1c\xc0\x1c\x00\xfb\xbd\x02\x00\ \x34\x41\x10\xa6\x63\xb1\x58\x56\x14\x85\x43\x67\x4e\x9f\x12\x3a\ \xbb\xba\x89\xe3\xb8\x98\x9b\x9b\x83\xe3\x38\x38\x76\x2c\x87\x78\ \x3c\x06\x4a\x1d\xcc\xce\xde\x86\xe3\x38\xc8\x66\xfb\x21\x8a\x22\ \x7c\x3e\x1e\xf3\xf3\xf3\xc8\x66\x07\x48\xd3\xb6\x44\xbb\x5c\x4b\ \x0f\xb5\x53\x78\x82\x3f\xfd\xc5\x17\x2b\x10\x80\xcf\x6c\x60\xed\ \x75\x82\xef\x8e\x20\x93\xc9\x08\x91\x48\xa4\x07\x40\x36\x99\x4c\ \x4e\x4c\x4d\x4d\x65\x00\xc2\x97\xca\x15\x12\x8f\xc5\x21\x4a\x12\ \xba\xbb\xbb\x11\x8b\xc5\xf0\xe8\xd1\xbf\x41\x29\x85\xa2\x04\x90\ \x4a\xa5\x10\x8d\x46\x31\x3b\x3b\x8b\xeb\xd7\xaf\x23\x1e\x8f\x21\ \x9f\x5f\x40\x5b\xa4\x0d\xeb\x2b\x5f\x21\x42\x0c\x12\xe0\x5b\x44\ \x94\xfc\xdc\x3f\xe7\x97\xed\x6d\xbd\xf2\x0f\x17\xd8\xde\xab\x11\ \x69\x82\x20\x4c\x6b\x9a\xf6\x57\x8e\xe3\x92\xaa\xaa\x92\xcb\x97\ \x2f\xe3\xc2\x85\x71\x7c\xb5\xb4\x84\xd9\xd9\x59\x98\xa6\x09\x45\ \x51\x30\x32\x32\x02\x86\xe1\x90\xcf\xdf\x43\xa5\x52\x01\xcf\xf3\ \xe8\xef\xef\x87\xae\xeb\x58\x5f\x7f\x0a\xdb\xb6\xe1\x38\x14\x2c\ \xcb\xa2\x2b\xd1\x85\x54\x2a\x85\xb5\xd5\x35\x54\xab\x15\xd2\x7c\ \x67\xbb\xdf\x3e\x02\x41\xd3\xb4\xf4\xd4\xd4\x54\x7a\x61\x61\x81\ \x2c\x2e\x2e\x42\x51\x14\x04\x83\x41\x8c\x8f\x8f\xa3\x56\xab\x61\ \x66\x66\x06\x8e\xe3\x60\x70\x70\x10\xa9\x54\x37\x22\x91\x10\x6e\ \xde\xbc\x89\xe5\xe5\x65\x9c\x3b\x77\x0e\x9e\x07\xd8\xb6\x0d\xdb\ \xb6\x61\xd6\xca\x38\x9c\x4a\xe0\xe4\x68\x2f\x0c\x43\x87\xae\xeb\ \x70\x9c\xdd\xc5\xf0\xad\x80\x50\xa9\x54\x34\x9e\xe7\xc5\x81\x81\ \x01\x8c\x8e\x8e\x62\x7b\x7b\x1b\x33\x33\x33\x70\x5d\x17\x23\x23\ \x23\x3b\x44\xe6\xe7\xe7\x11\x0c\x86\x10\x8d\xb6\xa1\xbf\xbf\x1f\ \x73\x73\x73\x6f\x25\x77\xc0\x12\x0f\xe9\x0e\x05\x1f\x1d\x1f\x42\ \xfd\xe5\x3a\xca\x25\x1d\xae\xeb\xbe\xf7\x2d\x10\xb4\x8e\xd0\x68\ \x7b\x58\xfa\x73\xcb\xa5\x1a\x00\x22\x08\x02\xe2\xf1\x38\x2e\x5e\ \xbc\x88\xb3\x67\xcf\x62\x61\x61\x01\x37\x6e\xdc\x40\xa1\x50\x00\ \x21\x04\x63\x63\x63\x70\x1d\x07\xd7\xae\x5d\x43\xa5\x52\xdd\x99\ \xbc\x5a\x42\xba\x43\xc1\x48\x82\xc0\x2a\x3e\x43\xc9\x28\xbe\x49\ \xce\xb2\xac\x30\x34\x94\xd3\x2e\x5d\xba\xf4\xe6\xfd\xe0\x12\xf1\ \xe0\xe9\xe1\x23\xc9\x3f\x9d\x1e\x4a\x8f\xde\x2f\x78\xa2\x69\x9a\ \x90\x24\x09\xad\x56\x0b\x3c\xcf\xbf\x11\x31\x0c\x03\x33\x33\x33\ \x68\xb9\x2e\x46\x8e\x8f\x20\x1c\x92\xf1\x62\x73\x13\xeb\xeb\x4f\ \x76\x25\x3f\x71\x3c\x07\xf3\xe5\x3a\x4a\x46\x71\x47\x72\x49\x56\ \xb4\xa3\x47\x7f\xf6\x87\x70\x38\xbc\x86\xd7\x95\xc0\x05\x65\xe9\ \xef\x93\xbf\x1a\xd2\x9e\x3d\x59\x15\x8d\x22\x90\xcf\x2f\x20\x9b\ \xcd\x42\x92\x44\x28\x4a\x00\x3c\xcf\xed\x21\x72\x0b\xab\x2b\x2b\ \xd0\x0d\x03\x96\xb5\x77\xf2\x72\xa9\x88\xd6\x6b\xb8\xe3\x7a\xa8\ \x5a\x2d\xc8\x01\x55\x90\x24\x49\xf3\xf9\x7c\xc2\xdb\x77\x20\x7d\ \xa8\x23\x4a\xb4\x78\x08\xeb\xd6\x63\x54\xb6\xbf\xc6\xea\x0a\x0f\ \xc9\xaf\x20\x91\xe8\x80\xdf\x2f\xed\x12\xf9\xf8\xe3\x4f\xb0\xb8\ \xf8\x10\xb6\xdd\x84\xeb\xd2\x5d\xc9\xcb\xa5\x22\x5c\xc7\x85\xf7\ \x1a\xfe\xac\x68\xe1\xc1\x36\x83\x23\x03\xc7\x6c\x55\x0d\x3c\x27\ \x84\x7c\xd7\x88\x68\x93\x92\xad\xad\x2d\xf4\x76\x45\xf1\xbb\xf1\ \x1c\x5c\x4e\xc6\xfd\xc2\x26\x4a\x15\x1e\x56\xbd\x06\xf1\x1d\x11\ \x8e\x63\xc1\xb2\x2c\x3c\xcf\x83\x43\x29\x6a\x95\xdd\xc9\xdf\x85\ \xe7\x5f\x10\x74\x66\x8e\xd9\xb1\x78\xe7\x3c\xc7\x71\x9f\x8b\xa2\ \xb8\xf1\x6d\x23\xe2\x5a\x5e\x0b\x96\x6d\xc1\xb6\xea\xf0\xb5\x1c\ \xf0\x7c\x1d\xa7\x7a\xda\x50\x77\x3c\xe4\x37\xf6\x12\xf1\xbf\x39\ \x73\x86\xf1\x90\xe9\x0c\xe0\xc4\x47\xef\x4f\x7e\x6f\x27\xfc\x2f\ \x7e\xbf\x7f\xee\xca\x95\x2b\xd6\xae\x3e\xe0\x38\x0e\x2a\xe5\x32\ \x08\x43\x10\xb6\x1a\xf0\x89\xd2\x9e\x22\x92\x1c\x80\x28\xfa\x50\ \xaf\x55\x91\xe9\x08\x7c\x6f\xf2\x1f\x82\xef\x10\x30\x4d\x13\x77\ \xee\xdc\x01\xc3\x30\x38\x7a\xb4\x0f\xaa\xaa\xee\x29\xa2\x57\xb6\ \x61\xbb\x1c\x3a\x54\x11\x67\x8f\x0f\xc2\x2a\x3e\x7d\x55\xe7\xdf\ \xbf\xed\x7b\xc2\x77\x08\xb8\xae\x0b\xab\xd1\x80\x24\x49\x78\xf0\ \xe0\x4b\x08\x82\x80\xa3\x7d\x47\xa0\xaa\x2a\x42\xb6\x05\x9f\x28\ \xe1\x93\x64\x18\xdf\xd4\x2c\xdc\x5a\x2a\xa3\x4f\x15\x61\xe9\x05\ \x34\xad\xd2\x9e\xf0\x8e\x1f\x01\xdf\x21\xc0\x12\x02\x55\x12\xa1\ \x84\x42\xa0\xae\x0b\xda\x6c\xe2\xfe\x83\x2f\xa1\xc8\x32\x4e\x8c\ \x8e\xc2\xf3\x5a\xa8\xd7\xaa\x78\xf6\xfc\x1b\xf8\x49\x14\x89\x98\ \x83\x6a\xb1\x06\xd7\xdd\x3f\x7c\x87\x80\x2c\x8a\x18\xee\x4d\xc3\ \x0b\x85\x50\x32\x4d\x34\x2c\x0b\x42\xa9\x04\x45\x51\x90\xe8\xec\ \x44\xad\x56\x83\x69\x96\xe1\x36\x4a\xd0\x64\xc0\x2c\xeb\xa0\x94\ \xc2\xf3\xf6\x0f\x7f\x55\x05\x2d\x6f\xed\x85\x5e\xd3\x7c\x2c\x11\ \xda\x3b\x13\xf0\x07\x14\xa4\xdb\xda\xd0\x6c\x36\xb1\xbc\xfc\x08\ \x1c\xc7\x41\xf2\xfb\x51\xaf\x9b\x80\x07\x38\xcd\x26\xac\x7a\x01\ \x8e\xe3\xc0\x6b\xb5\x0e\x04\x07\x00\xd6\xc7\xb0\xcb\x0f\x9f\x6c\ \x25\x96\x9e\x15\xbd\x68\x24\x20\xbb\x9e\xc7\xf1\x0c\xc0\x30\x04\ \xc9\x43\x49\x74\x75\x69\xe0\x39\x0e\x95\x4a\x15\xb6\x6d\x43\x37\ \x0c\xd8\xb6\x0d\xcf\xf3\x40\x0f\x08\x07\x00\xd6\xb4\xe9\xf3\x6a\ \xb9\x71\xdb\x34\xe9\xfc\xfd\xc7\x2f\x12\x4b\x4f\xb6\xbd\x90\x2c\ \xc8\x4d\x4a\x39\x8e\x78\x68\x5a\x16\xaa\xb5\x1a\x28\xa5\xa0\x94\ \xc2\x30\x0c\x50\xc7\x39\x70\xf2\xb7\x87\x52\xc7\x05\x8c\x9a\x4d\ \x37\xaa\xe5\xc6\xac\x69\xd2\xb9\x57\x22\x2f\x11\x92\x05\xa5\x49\ \x29\xcb\xb3\x00\x21\x04\xae\xe3\xc0\x30\x0c\x58\x36\xfd\x49\xe0\ \xef\x4e\xc5\x7b\x89\x74\x2e\x3d\xdd\x46\x34\x28\x2b\x2d\xcf\x63\ \x39\x16\x28\xea\x06\x1e\x6f\xd5\x7e\x12\xf8\xfb\xc6\xf2\xf7\x8a\ \x04\x15\x51\xf9\x7a\xab\xcc\xde\x2b\xb4\xd0\x99\xc9\x1d\x18\xfe\ \x63\xfe\x8e\x09\x00\x41\x00\xb4\x40\xc0\x9f\x95\xfd\xfc\xb4\x28\ \xf9\xd3\x23\x27\x4f\x93\x8e\x44\xd7\x1a\xc3\x30\x9f\xc9\xb2\x7c\ \x6b\xbf\x70\x00\xf8\x2f\xd1\xad\x31\x57\xad\xac\x48\xa5\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xdf\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\x71\x49\x44\x41\x54\x28\xcf\x63\ \xf8\xcf\x80\x1f\x32\x50\x5b\x41\x76\x43\xea\x87\x84\xff\x91\x1f\ \x82\x0f\xe0\x34\x21\xee\x41\xe4\xff\xc0\x04\x9c\x26\xc4\x18\x84\ \xff\xf7\xff\x80\xc7\x8a\x90\x09\x41\xff\xdd\x16\xe0\x51\xe0\xf3\ \xc0\xf3\xbf\x6d\x00\x4e\x05\x5e\x06\xae\xff\x6d\x3e\xe0\xf1\x85\ \xe3\x04\x97\xff\x46\x0b\xf0\x28\xb0\x78\x60\xf1\x5f\x2b\x00\xa7\ \x02\x33\x07\xd3\xff\x1a\xff\x71\x06\x94\x49\x83\xee\x01\xb5\x03\ \xf2\x07\x24\x37\xd0\x38\x2e\x30\x21\x00\x0b\x60\xff\x3b\x63\xab\ \xa7\x12\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xcd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x02\x03\x00\x00\x00\x0e\x14\x92\x67\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ \x00\x00\x00\x0c\x50\x4c\x54\x45\xff\xff\xff\x00\x00\x00\xff\xff\ \xff\x80\x80\x80\x3f\x27\x68\x17\x00\x00\x00\x01\x74\x52\x4e\x53\ \x00\x40\xe6\xd8\x66\x00\x00\x00\x01\x62\x4b\x47\x44\x00\x88\x05\ \x1d\x48\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x10\x00\x00\ \x0b\x10\x01\xad\x23\xbd\x75\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd1\x03\x05\x15\x00\x33\xc0\xf5\xef\x45\x00\x00\x00\x2a\x49\x44\ \x41\x54\x78\x9c\x63\x60\x20\x05\x30\x86\x82\x81\x03\x03\xfb\x7f\ \x30\xb8\xc0\x20\xb7\x0a\x0c\xb6\x60\x63\x2c\xa5\x23\x03\xb7\x33\ \xe0\x4e\x85\x3b\x9e\x14\x00\x00\x8d\xce\x68\x61\x1e\x8d\x82\x4d\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x7d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x11\x00\x00\x0b\x11\ \x01\x7f\x64\x5f\x91\x00\x00\x02\x1f\x49\x44\x41\x54\x78\x9c\xcd\ \x97\x31\x68\x14\x41\x14\x86\xbf\x3d\x0f\x39\xb0\x31\x56\x62\xeb\ \x21\x16\x41\x36\xd5\x89\xd5\x34\xe2\x75\x06\x65\x21\xa5\x9d\x67\ \x97\xf2\x48\xa1\x6b\xa1\xa4\xb0\x12\x84\x54\x36\x96\x2b\x18\x0b\ \xe1\x10\x21\x63\x65\x8e\x14\xd9\xb3\xb2\xb8\xce\x22\x55\x10\x94\ \xc0\x11\x30\x6b\xf1\xde\xe4\xb8\xf5\x76\x97\xe0\xe1\xec\x6b\xde\ \xec\x9b\xff\xcd\xee\xfc\xf3\xe6\x9f\xd9\x00\x2c\x00\xab\xed\x2e\ \x00\xdb\xe3\x09\x00\xdf\x7a\x09\x00\x61\xf8\x00\x80\x93\xf5\xdf\ \x00\x1c\x4f\xa4\xdf\xe5\x81\xd1\xfc\xd6\x4c\xbe\x7b\xee\x1f\xbc\ \x02\xe0\x60\xf9\x0d\x00\x99\x66\xad\x8d\x76\x01\x68\xe0\xd9\x02\ \xa3\x0d\x43\x9c\x95\x01\x63\x4c\x20\xde\x56\xe0\x62\xc5\x95\x8f\ \xf7\x5e\x71\xde\x19\x68\x5a\x64\xad\x8c\x06\xbe\xe8\x97\xfd\xd4\ \x4f\xbb\x73\x32\x7f\x26\x8e\x11\x97\x59\x34\xe3\xe5\x6b\x9b\x01\ \xc0\xb9\xa5\x9b\x00\x8c\x86\x26\x03\x38\x92\xd7\xd6\x80\x81\xdd\ \x0b\x52\xa5\x83\xa3\xef\x00\x3c\xec\x18\x00\xfa\x23\x2b\x08\x2d\ \xfa\x77\x9d\x18\x80\xd1\x50\xfa\xcf\xb7\x64\xd7\xdc\x72\x9b\x42\ \x6d\x25\xf7\x82\x4f\xcf\xc4\x6f\x45\x52\xf5\xb1\x32\x76\xe5\xba\ \x78\xef\x0c\x04\xbd\x44\x16\xe3\x72\xd4\x2f\xad\xda\x1b\x1d\x1b\ \x00\x7c\xd5\x35\xfc\x57\x9c\xab\x21\xff\x0c\xb8\x46\x91\x92\x6d\ \x8f\x07\x73\x13\x9d\x72\x76\x15\xff\x48\xe3\x6f\xb5\x86\xdc\xc0\ \xf7\x5e\x7e\x96\x46\x67\x67\xee\x38\xfe\x19\x68\xe9\xa7\xf6\xb3\ \x0a\x25\x4c\x9e\x8b\xc2\x45\x1b\x0b\x52\xcc\x9a\xd4\x40\xb3\x7b\ \x55\x25\x69\x2c\x6e\xaa\x70\xee\x59\x67\x12\x7d\xd4\x88\x2d\xc7\ \xe5\xac\x0a\xe7\x9f\x01\x57\xe5\xe1\xe9\xf9\xfe\x7f\xcd\x3f\x03\ \x1f\x54\x9b\xf7\x88\x81\xea\xea\x75\xb6\x28\x9c\x77\x06\x82\x34\ \x95\x46\x18\x8a\x77\x67\xc3\x56\x24\xb5\x91\xb4\x96\x00\x88\x26\ \x3f\x4a\x07\x9a\xde\x29\x07\x73\xe3\xce\xf2\xfd\xfe\x19\x98\xee\ \xeb\xf2\xb5\x7a\xaa\x37\xa5\x27\x0b\xba\x3b\xa6\xed\xcd\x9a\x28\ \x61\x3e\x50\xa4\x5c\xd9\xa9\x4e\xd8\x52\x5c\xd1\x78\x2b\xba\xdb\ \xee\x2a\x83\xee\xd4\xf5\xce\x40\x23\x4d\x0d\x69\x6a\x2a\x81\xab\ \xed\xee\x5f\x15\x7d\x16\xdb\xa7\xc1\xfe\xcc\x7c\x2d\x60\xfd\x33\ \xd0\x7c\xad\xfb\xff\x92\x06\x8a\xd6\x32\x7f\x66\x9c\x5d\x09\x1f\ \xe7\x7a\x0c\x50\x83\x1a\x08\xc8\x9f\x82\xe1\xa1\xf8\xf4\x17\x00\ \xbd\xa4\x07\xc0\xed\x17\xf2\x67\x73\x7f\x18\xcf\xc0\x8d\xce\xe4\ \x62\xc1\x1d\xb2\xf6\x4a\xf8\x07\xeb\x6d\xc3\x12\xb8\xf2\x10\x22\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x00\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x02\x06\ \x0d\x04\x39\x95\xff\x35\xa4\x00\x00\x05\x80\x49\x44\x41\x54\x58\ \xc3\xad\x97\x5d\x88\x5d\x57\x15\xc7\x7f\x6b\xef\xb3\xcf\xc7\xbd\ \x67\x3e\x6e\x32\x24\x75\xaa\x29\xb6\xa8\xa4\x48\xa5\xb4\x81\x62\ \x15\x1f\xb4\x81\x5a\x53\x0d\x51\x8a\x16\xb4\x0f\x55\xd1\x97\xf4\ \xa5\x7e\x32\xa1\xd1\x8a\xa5\x3e\x18\x7d\xd0\x87\xf6\x41\x05\x03\ \x3e\xd4\x52\x0c\x16\xa9\xed\xcb\x50\x69\x4b\x20\x60\x4b\x93\x08\ \x19\x65\x8a\x21\x1f\x93\x99\x9b\xf9\xb8\x9f\xe7\xec\xe5\xc3\x3d\ \xe7\xce\xbd\x33\x89\xf7\x8a\x73\x60\x73\xf6\xe1\xec\xb3\xd7\xef\ \xfc\xd7\xda\x6b\xaf\x2d\xaa\xca\xa8\xcb\xab\xa7\xbe\x51\x67\x9c\ \xb1\x00\x22\xc2\x74\x75\x1a\x23\x66\xe4\xd8\x60\x9c\x09\x7f\x77\ \xfa\x39\x3d\xbd\x7c\x06\x23\x02\x32\x62\xb0\x82\x57\xe5\xde\x5d\ \x77\xf3\xd8\x81\x6f\xca\xff\x0d\xa0\xaa\xcc\xbf\xf3\x16\xaf\x2e\ \xbc\x8e\xb1\x80\xc8\xa8\x0f\xf0\x39\x34\x6f\xcf\xf8\xda\xbd\xdf\ \x40\x46\x8c\x1f\x4b\x81\xa5\xfa\x3a\x49\x2a\xec\xdf\xf7\x01\x6e\ \xad\xcd\x60\xc4\x14\xf2\x0a\x02\x28\x8a\x57\xc5\xab\xe7\xdf\x2b\ \x4b\x9c\x5d\x5c\x64\xa9\xbe\x36\x96\xbb\xc6\x02\x68\x75\xba\x24\ \xa9\xa1\x52\x71\xa4\x95\x18\x6b\x7a\x00\x52\xf8\xa3\x04\xc8\x35\ \xa7\xda\x0e\x48\x52\x43\x6b\xbd\xbb\x73\x00\x41\x20\x24\x55\x41\ \x4d\x46\x2b\x6b\x61\x8d\x45\x44\x86\x00\xb4\x50\xc0\x9b\x8c\xa4\ \x2a\x04\x2d\xd9\x49\x00\x43\x1a\x87\x28\x9e\x56\xde\xc6\x78\x83\ \xc1\xf4\xfd\xab\xaa\x28\x4a\xae\x1e\xc5\x93\xc6\x11\xce\x99\x9d\ \x03\x70\x4e\x08\xe2\x04\x50\x5a\x59\xbb\x17\x03\xc8\x66\x40\xaa\ \xe2\x0b\x37\x20\x4a\x1a\xc7\x48\xb0\x83\x0a\x58\x6b\x88\xa3\x98\ \x6e\xbe\x09\x20\x48\x61\x5f\x86\x5c\x20\xa2\xa4\x51\x44\xcb\xee\ \x20\x00\x0a\x55\x17\x51\xcf\x9b\xb4\xb2\x2e\xa6\xf4\xff\x80\x02\ \x65\x20\x26\x2e\xa0\xea\x62\x5a\xba\x83\x00\xde\x43\x1c\x84\x28\ \x0d\x9a\x59\x6b\x53\x81\x4d\xbe\x42\x05\x4f\xec\x2a\xc4\x41\x88\ \xf7\xec\xa4\x02\x86\xc4\x44\x03\x31\x20\x08\x5b\x56\x41\xe1\x06\ \x48\x48\x4c\x84\xfa\x1d\x0c\x42\x51\x4b\x1c\x58\x9c\x35\x78\xcd\ \xf1\xda\xfb\xeb\x41\x05\xca\xbe\xb3\x86\xd8\x86\x8c\x67\x7e\xdc\ \x55\x60\x42\x62\x03\x89\x73\xbd\xe5\xa5\xa0\xda\xfb\x73\x8a\x7c\ \x28\xd2\xa3\x88\x9d\x23\x32\x21\x63\xae\xc2\x31\x00\x04\xd2\xa8\ \x42\x64\x72\xe2\xd0\x11\x3a\xdb\xb3\x0e\x78\x2d\x77\xbf\x52\x01\ \x21\x09\x1d\xb1\x8d\x48\x23\x3b\x7a\xe3\x1a\x04\x68\xb4\x1b\x5c\ \xa9\x5f\xc1\xab\xdf\xb2\x00\x94\xbd\xd3\x35\x92\xf0\x3a\x71\xee\ \x08\x03\xdb\xfb\x73\x2d\xb4\x2f\x20\x29\x20\x62\xe7\x48\x42\xc7\ \xde\xda\x14\x0b\x97\x16\x06\x42\xb5\x77\x19\x31\xec\x99\xde\x43\ \x25\xaa\x0c\x03\xcc\x2f\xbc\xc6\xa9\xb7\xff\xa8\xb1\x73\xb4\xdb\ \x9e\x2c\xd3\xbe\xac\xeb\xed\x75\x3e\x14\xcf\x62\x3a\x10\x3a\x53\ \x08\xa0\xdb\xa4\x12\xc0\x58\x88\x63\xcb\xe2\xf5\x7f\xf0\xf3\xd7\ \x7e\xaa\x5a\xb8\xcb\x5a\x21\x8a\x0c\xcd\x4e\x97\xcf\x7f\xec\x88\ \x1c\xdc\xff\xd0\x30\x40\x18\x54\xf9\xfb\xe2\x05\xbe\xfa\xe0\x5d\ \xcc\xd4\x2a\x64\x3e\x2f\x52\x2c\xc0\x14\x8d\xac\xc5\x72\xfb\x7a\ \x5f\x01\xdd\x6e\x1f\x83\xb0\xdc\xbe\x8e\x8f\x3a\x3c\xf4\x99\x5b\ \x37\xc5\x11\x21\x30\x96\xa5\x95\x06\xbf\xfd\xf3\x59\xbe\x78\x4f\ \x75\x20\xc0\x8b\x99\x14\xe5\xe4\x5b\x7f\xd0\x67\x4e\xfd\x8c\xa3\ \x5f\xbe\x8f\xa6\x5d\xe3\xec\xca\x22\x59\xee\x8b\x2c\xd7\x33\xaa\ \xe5\x1d\x86\x7c\x20\x65\xa9\x20\x82\x91\x9e\x51\x23\x82\x35\x86\ \x3b\x77\xed\x23\xf1\x13\xfc\xf2\xe4\x1b\x7c\xf7\xd0\x93\x7c\xe5\ \xc0\x23\x52\xba\x46\x06\xcb\x2c\xaf\xca\xf3\xaf\xff\x46\x9f\x9b\ \xff\x35\x5f\x3f\x72\x37\x0d\x59\xe7\x42\xfd\x22\xb9\xd7\xc2\x70\ \x4f\x91\x3e\xc0\xc0\xb7\x22\xd2\x4f\x8c\x46\x04\x11\xc1\x1a\xe1\ \x8e\xe9\x59\x2a\x9a\xf2\xfc\x0b\x67\x78\xfc\x93\xdf\xe2\xf1\xfb\ \x1f\x13\x33\x50\xa4\xc8\xd6\x3a\xcf\xab\xe7\x17\xaf\xfe\x4a\x5f\ \x3a\xf7\x7b\x1e\xfd\xec\x47\x59\xf3\xeb\xbc\xb7\x7a\xa5\x07\x51\ \x4a\x5f\x82\x0c\xc7\x20\x14\x10\x82\x60\x8c\xb0\x6f\x62\x0f\x13\ \x36\xe5\xe4\xcb\xef\xf0\xf0\x47\x1e\xe5\xe8\xa7\xbf\x2d\x5b\xeb\ \x44\xb9\x51\xa1\x99\xfb\x9c\x67\xff\x72\x42\xe7\x97\x5e\xe0\xc8\ \xa7\xee\x64\xa5\xb3\xca\xe5\xc6\x0a\xbe\x80\x28\xd5\x1f\x04\x28\ \x3b\x82\x20\x46\xb8\xa5\x52\xa3\x16\x4e\xf2\xe2\xfc\xbb\xdc\xbf\ \xfb\x08\xdf\x39\xf8\x84\x58\x63\x6f\x90\xe4\x6e\x52\xe9\x66\x79\ \xc6\x4f\x5e\x7e\x56\xcf\x65\xaf\x70\xf0\xc0\x1d\x2c\xb5\xea\x2c\ \xb7\x56\x29\xa3\xfa\x46\xab\x00\x01\x23\xb0\x2b\x9e\x64\x26\x9e\ \xe6\xaf\xa7\x17\xf8\xb0\x7d\x80\x1f\x3e\xf8\xa4\x04\x36\xb8\x49\ \x96\xfd\x2f\xa5\x76\x96\x67\x1c\x3f\xf5\x8c\xae\xa6\xa7\xb9\x6b\ \x7f\x8d\x95\xf6\x1a\xab\x9d\x8d\xcd\x3c\xb0\xcd\xbe\x30\x19\x56\ \xa9\x45\x13\xbc\x7d\xb6\xce\xe4\xfa\x3d\x1c\xfb\xdc\xf7\x6e\x6a\ \x7c\x24\x00\x40\x37\xef\x32\xf7\xe2\x8f\xb5\xfa\xfe\x7f\x71\xcb\ \x6d\xc2\x6a\x67\x8d\x46\xd6\xde\xb6\x0c\x45\xa0\x12\x44\x4c\x86\ \x13\x5c\x5e\x84\x8d\xf7\x6e\xe3\x47\x87\xe7\xc4\x59\x37\x62\x9f\ \x19\xe3\xb0\xd1\xec\xb4\x78\xea\xa5\xa7\x75\xf7\xed\x17\x99\x9c\ \x6d\xd3\xc8\x9b\x74\x7c\x77\xcb\x7e\xe1\xa8\xda\x84\xd5\x8b\x11\ \xd7\x2e\xbc\x8f\xa7\xbe\x30\x27\x49\x18\x8f\x9c\x7b\xac\x2d\x23\ \x09\x63\xe6\x0e\x7d\x5f\x2e\x9d\x9f\xa1\x79\x35\x21\x71\x11\x71\ \x10\xe2\xac\xc5\x59\x4b\x1c\x84\x54\x5c\x44\xf3\x6a\xc2\xa5\xf3\ \x33\xcc\x3d\xfc\x83\xb1\x8c\x8f\x0d\x00\x90\xc6\x55\x8e\x1f\x3e\ \x26\x0b\x67\x26\x91\x6b\x53\x38\x1b\xf4\x01\x9c\x0d\x90\xe5\x29\ \x16\xce\x4c\x72\xfc\xf0\x31\x49\xe3\xea\xb8\xd3\x8e\x0f\x00\x30\ \x91\xa4\x3c\xfd\xa5\xe3\x72\xee\xcd\x94\xa9\x8d\xd9\xfe\x01\x65\ \x6a\x63\x96\xf3\x6f\xf4\xde\x4d\x24\xe9\xff\x32\xe5\x70\x0c\x94\ \xd9\x6e\xb0\xbf\xb5\x01\x5c\x5b\x5d\xe1\xc4\x9f\x4e\xe8\x7d\x0f\ \xf4\x52\xd0\x9b\xaf\x78\x8e\x1e\x7a\x42\x76\x4f\xd6\x06\xb2\xe2\ \xf6\x36\xf8\xae\x0f\xd0\x6e\xb7\x69\xb5\x5a\x74\xbb\x5d\xb2\x2c\ \xa3\xdb\xed\x0e\xf5\xb3\x2c\x1b\x6a\x79\x9e\x93\x65\x19\x97\x57\ \xae\x32\xff\xcf\xbf\x29\xc0\x27\x3e\xf8\x71\xd9\x3b\x3d\x83\xb5\ \x96\x20\x08\x08\x82\xa0\xdf\x77\xce\xf5\xef\x65\x0b\x82\x80\x30\ \x0c\x89\xe3\x18\xf1\xde\xf7\x27\xcd\xf3\x9c\x6e\xb7\x3b\xf4\x5c\ \xde\xf3\x3c\xa7\x1c\xab\xaa\xbd\xbe\xcf\x7b\x65\x7b\x71\x52\x32\ \xc6\xf4\x9b\xb5\xf6\x86\x40\x5b\x9f\xff\x03\xba\x31\xa7\x62\xc9\ \x07\xf2\x86\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\x33\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x06\xb0\x49\x44\ \x41\x54\x78\xda\x9d\x57\x5f\x4c\x93\x57\x14\x3f\xfd\x5a\x28\x14\ \x0a\x0a\x8e\x51\xf9\x63\x66\xa6\xb3\xd9\x66\x02\x88\x7d\xc1\x6e\ \xe2\x9e\xe6\xe6\x78\xd1\x68\x40\x92\x6d\x64\x99\xbc\x2c\xee\xc9\ \xe8\x44\x41\x21\x64\xd9\xd4\x2d\x59\xb6\x07\x04\x91\x11\x88\x21\ \x64\x23\x99\xba\x2c\xc0\xf4\x41\x66\x90\x98\x28\x06\x4d\x48\x34\ \xdb\xa4\x35\x36\x41\xfe\x95\x16\x68\xbb\xf3\xbb\xe9\xf9\x72\xa9\ \x71\x10\x6f\x7a\x72\xef\x77\x7b\xef\xf9\xfd\xce\xb9\xe7\xde\x7b\ \xae\x25\x16\x8b\xd1\x6a\x4a\x73\x73\xb3\x3d\x1a\x8d\xee\xb2\x58\ \x2c\x7b\xf8\xd3\xcd\xe2\x8a\x0b\x8a\x2f\x2e\x63\xac\xaf\xcf\x30\ \x8c\xfe\x23\x47\x8e\x84\x57\xa3\x77\x45\x02\x4d\x4d\x4d\x2e\x1e\ \x53\xc7\xcd\x4a\x26\xe0\xc4\x78\xae\x29\x71\x1e\x13\x23\x06\x96\ \x7a\x86\xbb\x3a\xb9\xdd\x70\xf4\xe8\x51\xdf\x4b\x11\x68\x6c\x6c\ \x4c\xe1\xff\xbe\xe2\xe6\x61\x06\x74\x2c\x2d\x2d\xd1\xe2\xe2\x22\ \x85\x42\x21\x55\xe3\x1b\x44\x50\x00\x6c\xb3\xd9\x28\x29\x29\x89\ \x52\x52\x52\x50\xe3\x1b\xfd\x41\x22\x3a\xcb\x44\x4e\x1f\x3b\x76\ \x2c\xb4\x6a\x02\xa7\x4e\x9d\xca\xe5\xfe\x5f\x58\x3c\x91\x48\x44\ \x81\xce\xce\xce\x2a\xeb\x5c\x2e\x17\xad\x5f\xbf\x9e\x9c\x4e\x27\ \xa5\xa5\xa5\x11\xca\xdc\xdc\x1c\xcd\xcc\xcc\xd0\xc4\xc4\x04\xf9\ \x7c\x3e\xe5\x9d\xf4\xf4\x74\x45\xc6\x6a\xb5\x62\xde\x4d\x96\x8a\ \xe3\xc7\x8f\xfb\x57\x24\x50\x5f\x5f\xff\x36\xf7\x5d\x66\xeb\xf2\ \x17\x16\x16\x94\xf2\xf9\xf9\x79\x2a\x29\x29\xa1\xcd\x9b\x37\x53\ \x66\x66\xe6\x32\x2b\x51\x40\x12\x63\x21\x18\x7b\xe7\xce\x1d\x1a\ \x19\x19\xa1\xd4\xd4\x54\x45\x32\x39\x39\x19\xde\xf8\x97\x49\xbc\ \x7f\xe2\xc4\x89\xbb\x2f\x24\x70\xf2\xe4\x49\x58\x3e\x0c\x70\x28\ \x9a\x9e\x9e\x56\x80\x5e\xaf\x97\x0a\x0b\x0b\x69\xcd\x9a\x35\x64\ \xb7\xdb\x61\x91\x29\x28\xd0\x01\x12\x10\x2c\x0d\x48\xfb\xfd\x7e\ \xba\x7a\xf5\x2a\x4d\x4d\x4d\x51\x46\x46\x06\xc8\x08\x89\x52\xc6\ \xf1\x3f\x47\xa0\xae\xae\x0e\x6b\xfe\x27\x83\x7b\x00\x0e\x97\x6f\ \xdd\xba\x95\xb6\x6d\xdb\x46\xb9\xb9\xb9\x50\x00\x8b\xe1\x52\x88\ \x49\x40\xe6\xf3\x3c\x08\xe2\x43\x79\x22\x1c\x0e\x2b\x03\x86\x86\ \x86\xe8\xf6\xed\xdb\x58\x12\x21\x81\xe5\x78\xb7\xa1\xa1\x41\xc5\ \x04\x7c\x28\x0a\x10\x70\x1e\x4c\x06\xeb\xa2\xa2\x22\xda\xbe\x7d\ \x3b\xe5\xe5\xe5\xc1\x6a\xb8\x5c\xc0\xa1\x44\x09\x8a\x90\x10\x2f\ \x48\x30\x0a\x59\x78\x0f\x63\x86\x87\x87\xf1\x0d\x5d\x9e\x78\x70\ \xb3\xc4\x3d\xc0\x11\x8a\xad\x36\xce\xee\x73\x80\x35\xd6\x6d\xef\ \xde\xbd\x70\xbb\xbe\xde\x02\x6e\x5a\xaf\x17\xe8\x11\x91\x1d\x23\ \x31\x01\x9d\x6d\x6d\x6d\xf0\x2a\x96\x03\xba\x82\x3c\xff\x75\xde\ \x69\x3e\x23\x1e\x44\x75\x00\xc7\x60\x44\xfc\xce\x9d\x3b\x29\x3f\ \x3f\x1f\xe0\x08\x20\x9d\x80\x90\x48\x14\xf4\x8b\x60\x3c\x2c\x85\ \xc0\xed\xca\xfd\x15\x15\x15\x4a\x37\x30\x80\x05\x4c\x60\x5b\xb9\ \xd3\xce\xac\x3b\xb8\xd3\x0e\xa6\xa5\xa5\xa5\xca\xfd\x6b\xd7\xae\ \x05\xb8\xb8\xd4\x04\x86\xdd\x53\x97\xaf\x50\xa0\xa5\x95\xfc\x67\ \xce\x51\xa0\xed\x02\xcd\xf1\x3a\x47\x66\x66\xc9\xf1\xd6\x9b\x64\ \xd1\x3c\x04\x91\x02\x63\x10\x23\xe3\xe3\xe3\x20\x06\x5d\x6f\xf4\ \xf7\xf7\x9f\xb1\x71\x67\x39\x8b\x13\x41\x03\x90\x2d\x5b\xb6\x50\ \x56\x56\x96\x6e\x91\xa9\x2c\x3a\xf9\x8c\x7c\x5f\x7f\x43\x41\x5e\ \x4f\x0b\xbb\xd7\x08\x2f\x50\x8c\xe7\x85\x27\x7c\x34\xf7\xfb\x1f\ \xf4\xac\xa7\x97\x0a\x7f\xf8\x9e\x92\x72\x5f\x05\x80\x78\x03\x1e\ \x56\x4b\xe2\xf1\x78\x54\x50\x32\x16\xfe\x77\xb2\x94\x1b\x0c\xfe\ \x11\x0f\x40\x27\x02\x4e\xb6\x9a\x9c\x64\xcb\x2c\xf7\x9f\xfd\x8e\ \x42\xbc\xc7\x6d\x4c\x26\x09\x62\x58\x28\xd9\x8a\x36\xd7\xdc\x5e\ \xf8\x6b\x88\xfe\xfe\xec\x10\x02\x02\x84\xe5\x84\x84\x28\x6f\x3a\ \x1c\x0e\xda\xb0\x61\x83\xc2\x02\x26\xb0\x41\xc0\x2d\x04\x0a\x0a\ \x0a\x10\x44\xd8\xc7\xa8\xcd\x80\x43\x99\x1e\x18\xa4\xd0\xe8\xa8\ \x02\xb7\x19\x06\xc0\x59\x0c\x88\x90\x50\xed\xf0\x8d\x1b\x14\xb8\ \xd0\x2e\x3b\x04\x02\x23\xcc\x18\xda\xb4\x69\x93\x4e\xc0\x0d\x02\ \x2e\x71\x11\x22\x14\x2e\xc3\x24\xf4\x81\x84\x28\x0a\xde\x1a\x21\ \xf8\xc1\x0a\x02\xd8\xbf\xe2\x01\x10\x51\x22\xfd\x44\x33\xbf\x5d\ \x49\x24\x60\x7a\x73\xdd\xba\x75\xc0\x12\x02\x2e\x1b\x83\xb8\xe4\ \x86\x43\xb4\x8a\xeb\xc5\x7a\x29\x81\xf6\x0e\xb2\xc1\x33\x38\x4c\ \x52\x39\x88\x98\x68\x92\x8d\x15\xc7\xa2\xb4\xc4\xf1\x10\xe5\xe8\ \xb6\xcc\x87\x88\x42\x61\x0a\x0d\xdf\x22\x29\x42\x42\x74\x22\xbe\ \xe4\x36\x05\xb6\x4d\x4e\x30\xe9\xd4\xa3\x57\x27\x10\xe1\xc3\x29\ \xf6\xe4\x09\x19\x56\xb6\xc4\x80\x55\xbc\xbe\x5c\x63\x39\x22\xb8\ \x15\xa3\x31\x1e\xc4\x82\x36\x44\x2b\x89\xfa\x74\x4c\x83\x41\x7d\ \x02\x2c\x6b\x2f\xae\x47\x2d\x25\xad\xa4\x18\x2a\x08\x5d\x3c\xda\ \xc4\x0b\xb3\x12\xd4\xf8\xe6\x9f\xfa\x3f\xb5\xb8\x48\xc7\xd7\xf5\ \xe1\x94\xd5\x4f\x4f\x1f\x62\xc0\x27\x01\x87\x3f\xe5\x9e\x87\xe8\ \x64\x32\x3f\xfc\x80\x22\x58\x2a\x16\x58\xbc\xc4\xb2\xc0\xa8\x61\ \x16\xd4\xf8\x46\x3f\xfe\x77\xf2\x58\x1d\x1c\x22\x3a\x03\x81\x00\ \xb0\xa4\x4f\x11\x18\xc3\x40\x04\xc8\xa3\x47\x8f\xf4\x00\x41\x6d\ \x2a\x78\xa5\xe6\x13\x72\xbc\xe3\xa5\x25\x6e\x2f\x32\xa7\xc5\x38\ \x70\x38\xa2\x88\xe0\x5b\xf5\xdb\xbd\x3b\x28\xfb\xd3\x8f\x75\xf0\ \x65\xfa\xee\xdf\xbf\xaf\xb0\x50\x80\x6d\x70\xfd\x2b\x0b\x82\x0f\ \x04\x64\x8b\xc0\x13\x3a\x01\x2c\x20\xbd\xf6\x73\x3b\xa5\x78\xbd\ \x0c\x16\x35\xc1\xc3\x1a\x89\xe4\x1d\x65\x54\xd0\xd1\xae\xc6\xea\ \x04\x74\x7d\x0f\x1e\x3c\x30\xf3\x08\x60\x5b\x8b\x8b\x8b\xff\xe1\ \x41\x5f\x10\x93\x47\x0c\xe0\xc0\xc0\x3d\x80\xed\x98\xb8\x23\xac\ \x19\x4e\xca\xae\xae\x22\x83\x33\x22\xb5\x0c\x7c\xfc\xc6\xd2\x38\ \xf3\x61\xab\xb3\xbe\x3c\x4c\x79\xe7\xbe\x55\x63\x50\xc4\xed\x00\ \xc6\xa5\x84\x7b\xe0\xda\xb5\x6b\x34\x3a\x3a\x8a\xfb\x41\xf2\xc6\ \x5a\x75\x1b\xd6\xd4\xd4\xfc\xc8\xf5\xe7\x72\x59\xd4\xd6\xd6\xd2\ \xc6\x8d\x1b\x71\x2b\x62\xb0\x9c\x8c\x26\x91\x15\x8a\x0e\x0e\x8f\ \x42\x27\x52\x35\xa4\x7a\xb8\x13\x20\xd0\xf3\x53\x4b\x4b\xcb\x21\ \x23\x3e\xa1\x81\x25\x28\x20\x3d\x3d\x3d\xb8\x42\xc1\x5a\x52\x2d\ \x71\xa1\x04\xe7\xff\x02\x63\x9c\x58\x2e\xd6\xb7\xb6\xb6\x2a\xf2\ \xc0\x00\x16\x30\x31\x47\x11\x38\x7f\xfe\xbc\x8f\x27\x22\x7b\x55\ \xd6\x3e\x7e\xfc\x98\xae\x5f\xbf\x8e\xfb\x1b\xec\x61\x05\x44\x02\ \x54\x44\xdf\xcf\x7a\x3f\xc6\xc9\x1c\x35\x7f\x60\x60\x80\x1e\x3e\ \x7c\x68\xa6\x73\xc0\x02\xa6\x64\x44\x52\x4e\xb3\xbc\xc7\x11\xea\ \xc1\xa5\x31\x38\x38\xa8\x06\x97\x97\x97\xeb\x00\x2f\x4c\xcb\x12\ \xf3\x42\xb1\x1c\xe0\x7d\x7d\x7d\xb8\x88\x24\xfa\x6f\xc6\xb1\x9e\ \x4f\x4a\xab\xab\xab\xcd\xa4\x14\x0a\x82\xc1\xa0\x0a\xc8\xaa\xaa\ \x2a\xdc\x94\x08\x50\x25\x7a\x70\x4a\x11\x4f\x08\x38\xf6\x3b\xaf\ \x31\x2c\x07\xb8\x9e\x19\x97\x5e\xbc\x78\xd1\xff\xc2\xb4\xfc\xe0\ \xc1\x83\x2a\x2d\x67\xc9\x87\x32\x58\x01\xc5\xbb\x77\xef\xa6\xb2\ \xb2\x32\xb1\x44\x4f\xcf\xf4\xb5\x87\xa8\xe5\xeb\xed\xed\xc5\x7f\ \x08\x38\x10\x46\x5b\xa5\xe5\x1d\x1d\x1d\x77\x57\x7c\x98\x54\x56\ \x56\xe6\x72\x25\x0f\x13\x79\x11\x61\x47\xa8\x84\xc5\xed\x76\x53\ \x4e\x4e\x0e\x65\x67\x67\x2b\x90\xc9\xc9\x49\x7a\xfa\xf4\x29\x8d\ \x8d\x8d\xd1\xbd\x7b\xf7\xe0\x39\xc9\x25\x65\xa9\xe0\xf6\x8a\xce\ \xce\x4e\xff\xaa\x9f\x66\x07\x0e\x1c\x30\x9f\x66\x5c\x3b\xf4\x00\ \xd3\x8f\x6b\x14\x59\x0e\x2d\x7d\x13\x60\xf3\x69\xd6\xd5\xd5\x15\ \x7a\xa9\xc7\xe9\xfe\xfd\xfb\xcd\xc7\x29\xd7\xce\x84\xcb\x2a\xf1\ \xb6\x13\x31\x1f\xa7\xdd\xdd\xdd\x2f\xf7\x38\x4d\x2c\xfb\xf6\xed\ \x43\xf2\xba\x8b\x9b\x7b\x58\xb1\x9b\xdb\xcb\x9e\xe7\xdc\x87\x4b\ \x0d\xf7\x4a\x1f\xb7\xfb\x2f\x5d\xba\xb4\xaa\xe7\xf9\x7f\x21\x91\ \x30\x46\x9d\xed\xfa\xdc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x07\x33\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x06\xb0\x49\x44\ \x41\x54\x78\xda\x9d\x57\x5f\x4c\x93\x57\x14\x3f\xfd\x5a\x28\x14\ \x0a\x0a\x8e\x51\xf9\x63\x66\xa6\xb3\xd9\x66\x02\x88\x7d\xc1\x6e\ \xe2\x9e\xe6\xe6\x78\xd1\x68\x40\x92\x6d\x64\x99\xbc\x2c\xee\xc9\ \xe8\x44\x41\x21\x64\xd9\xd4\x2d\x59\xb6\x07\x04\x91\x11\x88\x21\ \x64\x23\x99\xba\x2c\xc0\xf4\x41\x66\x90\x98\x28\x06\x4d\x48\x34\ \xdb\xa4\x35\x36\x41\xfe\x95\x16\x68\xbb\xf3\xbb\xe9\xf9\x72\xa9\ \x71\x10\x6f\x7a\x72\xef\x77\x7b\xef\xf9\xfd\xce\xb9\xe7\xde\x7b\ \xae\x25\x16\x8b\xd1\x6a\x4a\x73\x73\xb3\x3d\x1a\x8d\xee\xb2\x58\ \x2c\x7b\xf8\xd3\xcd\xe2\x8a\x0b\x8a\x2f\x2e\x63\xac\xaf\xcf\x30\ \x8c\xfe\x23\x47\x8e\x84\x57\xa3\x77\x45\x02\x4d\x4d\x4d\x2e\x1e\ \x53\xc7\xcd\x4a\x26\xe0\xc4\x78\xae\x29\x71\x1e\x13\x23\x06\x96\ \x7a\x86\xbb\x3a\xb9\xdd\x70\xf4\xe8\x51\xdf\x4b\x11\x68\x6c\x6c\ \x4c\xe1\xff\xbe\xe2\xe6\x61\x06\x74\x2c\x2d\x2d\xd1\xe2\xe2\x22\ \x85\x42\x21\x55\xe3\x1b\x44\x50\x00\x6c\xb3\xd9\x28\x29\x29\x89\ \x52\x52\x52\x50\xe3\x1b\xfd\x41\x22\x3a\xcb\x44\x4e\x1f\x3b\x76\ \x2c\xb4\x6a\x02\xa7\x4e\x9d\xca\xe5\xfe\x5f\x58\x3c\x91\x48\x44\ \x81\xce\xce\xce\x2a\xeb\x5c\x2e\x17\xad\x5f\xbf\x9e\x9c\x4e\x27\ \xa5\xa5\xa5\x11\xca\xdc\xdc\x1c\xcd\xcc\xcc\xd0\xc4\xc4\x04\xf9\ \x7c\x3e\xe5\x9d\xf4\xf4\x74\x45\xc6\x6a\xb5\x62\xde\x4d\x96\x8a\ \xe3\xc7\x8f\xfb\x57\x24\x50\x5f\x5f\xff\x36\xf7\x5d\x66\xeb\xf2\ \x17\x16\x16\x94\xf2\xf9\xf9\x79\x2a\x29\x29\xa1\xcd\x9b\x37\x53\ \x66\x66\xe6\x32\x2b\x51\x40\x12\x63\x21\x18\x7b\xe7\xce\x1d\x1a\ \x19\x19\xa1\xd4\xd4\x54\x45\x32\x39\x39\x19\xde\xf8\x97\x49\xbc\ \x7f\xe2\xc4\x89\xbb\x2f\x24\x70\xf2\xe4\x49\x58\x3e\x0c\x70\x28\ \x9a\x9e\x9e\x56\x80\x5e\xaf\x97\x0a\x0b\x0b\x69\xcd\x9a\x35\x64\ \xb7\xdb\x61\x91\x29\x28\xd0\x01\x12\x10\x2c\x0d\x48\xfb\xfd\x7e\ \xba\x7a\xf5\x2a\x4d\x4d\x4d\x51\x46\x46\x06\xc8\x08\x89\x52\xc6\ \xf1\x3f\x47\xa0\xae\xae\x0e\x6b\xfe\x27\x83\x7b\x00\x0e\x97\x6f\ \xdd\xba\x95\xb6\x6d\xdb\x46\xb9\xb9\xb9\x50\x00\x8b\xe1\x52\x88\ \x49\x40\xe6\xf3\x3c\x08\xe2\x43\x79\x22\x1c\x0e\x2b\x03\x86\x86\ \x86\xe8\xf6\xed\xdb\x58\x12\x21\x81\xe5\x78\xb7\xa1\xa1\x41\xc5\ \x04\x7c\x28\x0a\x10\x70\x1e\x4c\x06\xeb\xa2\xa2\x22\xda\xbe\x7d\ \x3b\xe5\xe5\xe5\xc1\x6a\xb8\x5c\xc0\xa1\x44\x09\x8a\x90\x10\x2f\ \x48\x30\x0a\x59\x78\x0f\x63\x86\x87\x87\xf1\x0d\x5d\x9e\x78\x70\ \xb3\xc4\x3d\xc0\x11\x8a\xad\x36\xce\xee\x73\x80\x35\xd6\x6d\xef\ \xde\xbd\x70\xbb\xbe\xde\x02\x6e\x5a\xaf\x17\xe8\x11\x91\x1d\x23\ \x31\x01\x9d\x6d\x6d\x6d\xf0\x2a\x96\x03\xba\x82\x3c\xff\x75\xde\ \x69\x3e\x23\x1e\x44\x75\x00\xc7\x60\x44\xfc\xce\x9d\x3b\x29\x3f\ \x3f\x1f\xe0\x08\x20\x9d\x80\x90\x48\x14\xf4\x8b\x60\x3c\x2c\x85\ \xc0\xed\xca\xfd\x15\x15\x15\x4a\x37\x30\x80\x05\x4c\x60\x5b\xb9\ \xd3\xce\xac\x3b\xb8\xd3\x0e\xa6\xa5\xa5\xa5\xca\xfd\x6b\xd7\xae\ \x05\xb8\xb8\xd4\x04\x86\xdd\x53\x97\xaf\x50\xa0\xa5\x95\xfc\x67\ \xce\x51\xa0\xed\x02\xcd\xf1\x3a\x47\x66\x66\xc9\xf1\xd6\x9b\x64\ \xd1\x3c\x04\x91\x02\x63\x10\x23\xe3\xe3\xe3\x20\x06\x5d\x6f\xf4\ \xf7\xf7\x9f\xb1\x71\x67\x39\x8b\x13\x41\x03\x90\x2d\x5b\xb6\x50\ \x56\x56\x96\x6e\x91\xa9\x2c\x3a\xf9\x8c\x7c\x5f\x7f\x43\x41\x5e\ \x4f\x0b\xbb\xd7\x08\x2f\x50\x8c\xe7\x85\x27\x7c\x34\xf7\xfb\x1f\ \xf4\xac\xa7\x97\x0a\x7f\xf8\x9e\x92\x72\x5f\x05\x80\x78\x03\x1e\ \x56\x4b\xe2\xf1\x78\x54\x50\x32\x16\xfe\x77\xb2\x94\x1b\x0c\xfe\ \x11\x0f\x40\x27\x02\x4e\xb6\x9a\x9c\x64\xcb\x2c\xf7\x9f\xfd\x8e\ \x42\xbc\xc7\x6d\x4c\x26\x09\x62\x58\x28\xd9\x8a\x36\xd7\xdc\x5e\ \xf8\x6b\x88\xfe\xfe\xec\x10\x02\x02\x84\xe5\x84\x84\x28\x6f\x3a\ \x1c\x0e\xda\xb0\x61\x83\xc2\x02\x26\xb0\x41\xc0\x2d\x04\x0a\x0a\ \x0a\x10\x44\xd8\xc7\xa8\xcd\x80\x43\x99\x1e\x18\xa4\xd0\xe8\xa8\ \x02\xb7\x19\x06\xc0\x59\x0c\x88\x90\x50\xed\xf0\x8d\x1b\x14\xb8\ \xd0\x2e\x3b\x04\x02\x23\xcc\x18\xda\xb4\x69\x93\x4e\xc0\x0d\x02\ \x2e\x71\x11\x22\x14\x2e\xc3\x24\xf4\x81\x84\x28\x0a\xde\x1a\x21\ \xf8\xc1\x0a\x02\xd8\xbf\xe2\x01\x10\x51\x22\xfd\x44\x33\xbf\x5d\ \x49\x24\x60\x7a\x73\xdd\xba\x75\xc0\x12\x02\x2e\x1b\x83\xb8\xe4\ \x86\x43\xb4\x8a\xeb\xc5\x7a\x29\x81\xf6\x0e\xb2\xc1\x33\x38\x4c\ \x52\x39\x88\x98\x68\x92\x8d\x15\xc7\xa2\xb4\xc4\xf1\x10\xe5\xe8\ \xb6\xcc\x87\x88\x42\x61\x0a\x0d\xdf\x22\x29\x42\x42\x74\x22\xbe\ \xe4\x36\x05\xb6\x4d\x4e\x30\xe9\xd4\xa3\x57\x27\x10\xe1\xc3\x29\ \xf6\xe4\x09\x19\x56\xb6\xc4\x80\x55\xbc\xbe\x5c\x63\x39\x22\xb8\ \x15\xa3\x31\x1e\xc4\x82\x36\x44\x2b\x89\xfa\x74\x4c\x83\x41\x7d\ \x02\x2c\x6b\x2f\xae\x47\x2d\x25\xad\xa4\x18\x2a\x08\x5d\x3c\xda\ \xc4\x0b\xb3\x12\xd4\xf8\xe6\x9f\xfa\x3f\xb5\xb8\x48\xc7\xd7\xf5\ \xe1\x94\xd5\x4f\x4f\x1f\x62\xc0\x27\x01\x87\x3f\xe5\x9e\x87\xe8\ \x64\x32\x3f\xfc\x80\x22\x58\x2a\x16\x58\xbc\xc4\xb2\xc0\xa8\x61\ \x16\xd4\xf8\x46\x3f\xfe\x77\xf2\x58\x1d\x1c\x22\x3a\x03\x81\x00\ \xb0\xa4\x4f\x11\x18\xc3\x40\x04\xc8\xa3\x47\x8f\xf4\x00\x41\x6d\ \x2a\x78\xa5\xe6\x13\x72\xbc\xe3\xa5\x25\x6e\x2f\x32\xa7\xc5\x38\ \x70\x38\xa2\x88\xe0\x5b\xf5\xdb\xbd\x3b\x28\xfb\xd3\x8f\x75\xf0\ \x65\xfa\xee\xdf\xbf\xaf\xb0\x50\x80\x6d\x70\xfd\x2b\x0b\x82\x0f\ \x04\x64\x8b\xc0\x13\x3a\x01\x2c\x20\xbd\xf6\x73\x3b\xa5\x78\xbd\ \x0c\x16\x35\xc1\xc3\x1a\x89\xe4\x1d\x65\x54\xd0\xd1\xae\xc6\xea\ \x04\x74\x7d\x0f\x1e\x3c\x30\xf3\x08\x60\x5b\x8b\x8b\x8b\xff\xe1\ \x41\x5f\x10\x93\x47\x0c\xe0\xc0\xc0\x3d\x80\xed\x98\xb8\x23\xac\ \x19\x4e\xca\xae\xae\x22\x83\x33\x22\xb5\x0c\x7c\xfc\xc6\xd2\x38\ \xf3\x61\xab\xb3\xbe\x3c\x4c\x79\xe7\xbe\x55\x63\x50\xc4\xed\x00\ \xc6\xa5\x84\x7b\xe0\xda\xb5\x6b\x34\x3a\x3a\x8a\xfb\x41\xf2\xc6\ \x5a\x75\x1b\xd6\xd4\xd4\xfc\xc8\xf5\xe7\x72\x59\xd4\xd6\xd6\xd2\ \xc6\x8d\x1b\x71\x2b\x62\xb0\x9c\x8c\x26\x91\x15\x8a\x0e\x0e\x8f\ \x42\x27\x52\x35\xa4\x7a\xb8\x13\x20\xd0\xf3\x53\x4b\x4b\xcb\x21\ \x23\x3e\xa1\x81\x25\x28\x20\x3d\x3d\x3d\xb8\x42\xc1\x5a\x52\x2d\ \x71\xa1\x04\xe7\xff\x02\x63\x9c\x58\x2e\xd6\xb7\xb6\xb6\x2a\xf2\ \xc0\x00\x16\x30\x31\x47\x11\x38\x7f\xfe\xbc\x8f\x27\x22\x7b\x55\ \xd6\x3e\x7e\xfc\x98\xae\x5f\xbf\x8e\xfb\x1b\xec\x61\x05\x44\x02\ \x54\x44\xdf\xcf\x7a\x3f\xc6\xc9\x1c\x35\x7f\x60\x60\x80\x1e\x3e\ \x7c\x68\xa6\x73\xc0\x02\xa6\x64\x44\x52\x4e\xb3\xbc\xc7\x11\xea\ \xc1\xa5\x31\x38\x38\xa8\x06\x97\x97\x97\xeb\x00\x2f\x4c\xcb\x12\ \xf3\x42\xb1\x1c\xe0\x7d\x7d\x7d\xb8\x88\x24\xfa\x6f\xc6\xb1\x9e\ \x4f\x4a\xab\xab\xab\xcd\xa4\x14\x0a\x82\xc1\xa0\x0a\xc8\xaa\xaa\ \x2a\xdc\x94\x08\x50\x25\x7a\x70\x4a\x11\x4f\x08\x38\xf6\x3b\xaf\ \x31\x2c\x07\xb8\x9e\x19\x97\x5e\xbc\x78\xd1\xff\xc2\xb4\xfc\xe0\ \xc1\x83\x2a\x2d\x67\xc9\x87\x32\x58\x01\xc5\xbb\x77\xef\xa6\xb2\ \xb2\x32\xb1\x44\x4f\xcf\xf4\xb5\x87\xa8\xe5\xeb\xed\xed\xc5\x7f\ \x08\x38\x10\x46\x5b\xa5\xe5\x1d\x1d\x1d\x77\x57\x7c\x98\x54\x56\ \x56\xe6\x72\x25\x0f\x13\x79\x11\x61\x47\xa8\x84\xc5\xed\x76\x53\ \x4e\x4e\x0e\x65\x67\x67\x2b\x90\xc9\xc9\x49\x7a\xfa\xf4\x29\x8d\ \x8d\x8d\xd1\xbd\x7b\xf7\xe0\x39\xc9\x25\x65\xa9\xe0\xf6\x8a\xce\ \xce\x4e\xff\xaa\x9f\x66\x07\x0e\x1c\x30\x9f\x66\x5c\x3b\xf4\x00\ \xd3\x8f\x6b\x14\x59\x0e\x2d\x7d\x13\x60\xf3\x69\xd6\xd5\xd5\x15\ \x7a\xa9\xc7\xe9\xfe\xfd\xfb\xcd\xc7\x29\xd7\xce\x84\xcb\x2a\xf1\ \xb6\x13\x31\x1f\xa7\xdd\xdd\xdd\x2f\xf7\x38\x4d\x2c\xfb\xf6\xed\ \x43\xf2\xba\x8b\x9b\x7b\x58\xb1\x9b\xdb\xcb\x9e\xe7\xdc\x87\x4b\ \x0d\xf7\x4a\x1f\xb7\xfb\x2f\x5d\xba\xb4\xaa\xe7\xf9\x7f\x21\x91\ \x30\x46\x9d\xed\xfa\xdc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x16\x62\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x10\x06\x00\x00\x00\x23\xea\xa6\xb7\ \x00\x00\x00\x06\x62\x4b\x47\x44\xff\xff\xff\xff\xff\xff\x09\x58\ \xf7\xdc\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x37\x5c\x00\x00\ \x37\x5c\x01\xcb\xc7\xa4\xb9\x00\x00\x00\x09\x76\x70\x41\x67\x00\ \x00\x00\x20\x00\x00\x00\x20\x00\x87\xfa\x9c\x9d\x00\x00\x15\xbf\ \x49\x44\x41\x54\x78\xda\x95\xd8\x79\x74\x54\x55\xba\x36\xf0\xe7\ \xdd\xe7\x54\x55\x46\x32\x02\x81\x84\x31\x04\x21\xa0\x42\x0b\xc6\ \x00\x51\x04\x62\x33\xc6\x00\x22\xcd\x20\xd2\x2d\x2a\x83\x80\x8a\ \xa8\x80\x68\x8b\x0d\x28\x73\xd3\x51\x44\x05\x5a\x86\x96\xa6\x25\ \x20\x46\x40\x92\x30\x05\x02\xa8\xd0\x4c\x01\xc3\x8c\x80\x81\x10\ \xc8\x04\x49\xd5\x19\xf6\xfe\xf6\x3e\xa7\xd6\x5d\xeb\x73\xdd\xdb\ \xeb\xde\xe7\xf9\xe3\xb7\xde\x62\x05\x6a\xef\x73\x6a\x9f\x0a\x40\ \x30\x97\xb7\x65\x0d\xce\x1a\x0c\x5f\x69\xc7\x81\x7f\x1b\xf8\x37\ \x20\xc7\x68\xea\x69\xea\x61\xaf\x1e\x79\x77\x6c\xe9\xd8\x52\xda\ \x94\xbf\x30\x73\x71\xe6\x62\x60\xfb\x96\xcc\xfd\x99\xfb\x11\xd9\ \x3d\xbe\x49\x4d\x93\x1a\x20\x98\xc8\xa0\x5e\xe1\x04\x9e\xea\x98\ \xd2\xf9\xa5\xf3\x81\x9a\x0e\x17\x17\x5c\x5c\x80\xdc\x7f\x95\x0c\ \x37\x87\x9b\x6c\x1b\xdc\x84\x05\xc5\xc2\x7d\x4c\x30\x01\xcf\xc6\ \x5e\x2d\xcf\xb4\x3c\x03\xbc\xf7\xa0\xb7\xbd\xb7\x3d\x5b\xf8\xc5\ \x13\x09\x46\x82\x01\xff\x8a\xde\x0d\xbd\x0d\xbd\xc0\x97\x76\xe3\ \xb4\xc6\x69\x08\x81\x1b\x16\x54\x9f\x7e\xf6\xe5\x45\x2f\x2f\x02\ \x2e\x67\x7f\x1f\xfe\x7d\x38\xc2\x7f\xb1\xf2\x47\xe6\x8f\x04\x6e\ \x96\x1f\x9e\x75\x78\x16\x3d\xfb\x75\xcf\x67\x47\x3e\x3b\x92\xe5\ \x0a\x27\x40\x50\x0d\x6e\x88\x82\x2f\xfc\x57\x16\xbf\x16\x3f\x39\ \x7e\x32\x6b\xfd\xc6\xb2\x3b\x39\x77\x72\xf8\xa5\xe0\xbf\x97\xf3\ \x41\x7e\x6c\x5e\x6c\x5e\x7a\x5c\x6a\xd7\x4e\xf9\x9d\xf2\x07\xdd\ \x8e\x3b\xd7\xb4\x4f\xd3\x3e\xbf\x5b\x17\xb2\x31\xa2\x4d\x44\x9b\ \x86\x37\xb1\x4d\xdf\xa2\x6f\xb1\x43\xeb\x9f\x34\xbf\x31\xbf\xf9\ \xa5\xfa\xc6\xc9\x73\xc5\xe7\x8a\x77\xd1\xd6\x8d\x7b\xb4\x3d\xda\ \xa6\x7a\xef\x0c\xc8\xdc\xad\xce\xf8\x43\xa7\xc2\x4e\x85\xec\xad\ \xb9\x65\xc7\x7b\x1f\xef\xcd\xd7\x3c\xb8\x0b\x2a\xe5\x29\x3f\x69\ \x7f\xd7\xfe\xce\x46\x15\x9f\xb6\xc7\xda\x63\xf9\x86\x48\x0b\x32\ \x11\xab\x7b\xb7\xd6\xce\x6a\x67\x87\xce\x6a\xf5\x4e\x58\x69\x58\ \x69\xbf\xd3\x91\xe4\x79\xc5\xf3\x4a\xeb\x0e\x6c\x37\xbb\xc8\x2e\ \x7a\x4c\xea\x9b\xf0\x6a\xc2\xab\x77\xb2\xf1\x71\xab\x37\x5a\xbd\ \x71\x62\xe0\xed\xd1\xe2\x3b\xf1\xdd\xf6\x59\x6f\x75\xcb\x9b\x92\ \x37\x65\x7f\xf9\xad\xde\x90\x31\x2b\xd6\xe8\x7d\x65\xd8\x13\x6f\ \xdc\xdc\x29\xc3\xcf\xc5\xfe\x0b\x2a\x65\xf4\xcf\x35\xf1\x17\xe2\ \x2f\x00\x55\x23\xcc\xee\x66\x77\xf6\x27\xdf\xb0\xea\x5b\xd5\xb7\ \xf8\xea\xf3\xcb\xd8\x46\xb6\x31\xbd\xcd\x63\xd9\xe9\xc7\xd2\x8f\ \x2d\x0b\x6d\x75\xbf\x7d\x44\xfb\x88\x47\x4f\x46\xb5\x8b\x2a\x8f\ \x2a\xc7\x47\xfa\x1f\x58\x33\xd6\x0c\x93\xe8\x57\xb6\x84\x2d\x41\ \x04\x9a\xeb\x0f\xe9\x0f\x01\x58\x1a\xba\x32\x74\x25\xfa\x98\xdd\ \xa2\xe6\x45\xcd\x43\xc1\xad\xa1\x35\xbd\x6b\x7a\x97\x9f\xff\x69\ \x66\x5e\xdb\xbc\xb6\x53\xa7\xbe\x5c\x34\x35\x6b\x6a\xd6\xc6\x1d\ \x87\x4f\x6e\x5f\xb7\x7d\x1d\x1b\xb8\x29\x6d\x6d\xaf\xb5\xbd\xd0\ \x35\x64\x26\x64\xf8\x7b\x75\xb5\x18\x80\x01\x7d\xf3\x3a\x7a\x1a\ \x8c\x68\x30\x62\x65\x76\xea\xf8\xc8\xac\xc8\xac\xe6\x66\x5c\x89\ \xd7\xf6\xda\x48\xd5\x3a\xb1\x17\xd9\x8b\x38\x43\xa3\xa8\x9c\xca\ \x01\xf1\x82\x37\xd9\x9b\x0c\x2e\xb6\xc7\x14\xc4\x14\x60\x92\xe8\ \xd4\x61\x58\x87\x61\x58\x51\xb3\x2c\xa1\x2a\xa1\xea\x74\xea\x11\ \xbe\xf3\xe8\xce\xa3\xaf\xaf\x18\xfd\xd5\x88\x53\x23\x4e\xe5\xf7\ \xfc\xd1\x3a\x98\x74\x30\x89\x8d\xee\xd3\xbb\x57\x7d\xaf\x7a\xbe\ \x9e\x36\x3d\xdf\x34\xb9\x69\x32\x9b\x20\x96\x05\x86\x04\x86\xf0\ \x15\x57\x45\xfd\xa1\xfa\x43\x63\x9e\xe9\x96\x91\xfe\x66\xfa\x9b\ \xab\x67\x25\x5f\x69\x77\xaa\xdd\x29\xad\x93\xb8\xc9\x9b\xf1\x66\ \x22\xd6\x7a\xc9\x6a\x6c\x35\xe6\x23\xf8\x21\x1a\x25\x7b\x8f\xef\ \xc7\x2e\xec\xa2\x8d\xd8\x42\x69\x94\x26\x2a\x50\x2d\x7a\xc8\x0a\ \x76\x95\x55\xb1\x2a\xfc\x1a\x7a\xb5\xc5\xac\x16\xb3\x98\x59\x59\ \x15\x92\x16\x92\x46\x0f\x16\x47\x7f\xbd\xf9\xeb\xcd\xd3\xe7\xfc\ \x31\x7f\xe9\x0b\x4b\x5f\x58\xf4\xde\x80\xf2\x47\x23\x1f\x8d\x04\ \xda\xbc\x48\x13\x68\xc2\xd8\xef\x3a\xff\x3d\xe6\x6c\xcc\xd9\x35\ \xfd\xd3\xde\x88\xaa\x88\xaa\xc0\x21\xcf\x79\x7c\x81\x2f\xec\xb6\ \xe6\x68\xb1\x45\x6c\xc1\x35\x31\x00\xb3\x30\x8b\x62\x31\x50\xc4\ \x8a\x58\x4a\xc1\x09\x3e\x97\xcf\x15\x13\xd9\xe9\xf0\xca\xf0\x4a\ \x11\x08\xe9\xd0\x7c\x72\xf3\xc9\x34\x3f\x32\x3e\xb3\x4b\x66\x17\ \xb6\xa5\x7a\x4a\x93\x07\x9b\x3c\x88\xb1\x07\xdb\x7c\xa5\x7f\xa5\ \xbf\xde\x69\x48\xe6\x6b\xef\xbf\xf6\xfe\xd2\x13\x37\x5f\x3a\x93\ \x71\x26\x83\x65\xd1\x8c\xd9\x70\x73\x11\x32\xdd\xea\xfb\x3e\xdc\ \xa3\xa2\x47\xc5\xfe\x7f\x3c\x70\xa7\x3d\xb5\x27\xed\xfd\xfa\xba\ \xc0\x3f\x02\xff\xe0\x36\x4f\x62\xb3\x65\x2f\x8b\xa7\xa8\x94\x4a\ \xe1\x11\x9c\x8a\xa9\x18\x1c\xf3\xe9\x14\x9d\x02\x13\x4f\xd0\x6d\ \xba\x0d\xe0\x2f\xd4\x9b\x7a\x23\x20\x3e\x20\x9d\x74\xf8\xf8\x8e\ \xc0\xda\xc0\x5a\xf1\x74\xd8\x37\x31\xd3\x62\xa6\x89\xa3\xb7\xd6\ \x06\x36\x07\x36\xb3\xeb\x07\x3b\x6e\xe2\x9b\xf8\x53\x7f\x3e\xe0\ \xbd\xb3\xe8\xce\xa2\xdb\xfe\xde\x27\xa2\xcf\x47\x9f\x3f\x1a\x95\ \xb1\x3a\x3a\x23\x3a\x83\xfa\x89\x85\xbc\x33\xef\x2c\x6a\x44\x47\ \xdc\xc0\x0d\xf6\x38\x11\x5d\xa3\x6b\x08\x20\xc2\xae\xb4\x2b\xe1\ \xa3\x0d\x21\x45\x21\x45\x80\x27\x3a\x71\x75\xe2\x6a\x08\xef\xf3\ \x49\x1f\x26\x7d\x08\xe8\xdd\x1b\x45\x36\x8a\x04\x89\x7c\x23\xd7\ \xc8\xe5\x2b\xc3\x1f\x69\x76\xa2\xd9\x09\x9c\xba\xbb\xac\xd1\x33\ \x8d\x9e\x61\x39\x79\x77\x17\xce\x5a\x38\x2b\x6b\x55\x64\x8b\xb8\ \x51\x71\xa3\xbe\x1d\xf7\x5f\x67\xc0\xbf\x9a\xa5\xe4\xa6\xe4\xe6\ \xf7\xe9\xfa\x45\xd7\x73\x5d\xcf\xf5\xc9\xe7\xe3\x45\xb6\xc8\xb6\ \x4f\xf3\xb9\xd4\x96\xda\x6a\x1d\x79\x14\x55\x52\x25\x0c\xfe\x18\ \x1d\xa3\x63\xf0\x62\x22\xd5\x50\x0d\xc0\xdf\xa5\x4b\x74\x09\x10\ \xff\x26\x59\x00\x7b\xe8\x08\x1d\x81\xca\x7e\x59\x0b\xef\x69\x03\ \xb5\x81\xd0\xc5\x69\x7e\x89\x5f\x12\xf1\x9e\xab\xda\xe7\xda\xe7\ \x54\x71\xb2\xd7\xe1\xae\x87\xbb\x9e\x7e\xe8\xe7\x91\xa5\x59\xa5\ \x59\x75\x73\x7a\x9d\x69\x92\xdd\x24\xfb\xd1\x6c\xcf\x60\x51\x22\ \x4a\x78\x2e\x96\x22\x19\xc9\x6c\x88\x3e\x1c\x2f\xc9\x9a\x14\xc3\ \xbb\xf3\xee\xf0\xe8\x3d\x62\xa7\xc6\x4e\x05\x3c\x2f\x24\xc6\x24\ \xc6\x00\xfa\x8f\x71\x8b\xe2\x16\x49\xf7\xc4\x7c\x1b\xf3\x2d\x40\ \x0b\xa8\x21\x35\x84\x89\xd9\xda\x64\x6d\x32\x3c\xf6\x95\xfa\xd0\ \xfa\x50\xbe\x38\x2c\xa2\xe5\xc1\x96\x07\xd9\xb4\x73\xaf\x56\xac\ \xaf\x58\x7f\xac\xf8\x89\x36\x4b\x1e\x5b\xf2\x58\xda\x0f\xf4\xea\ \x6e\xc8\x74\x9a\x31\x74\x40\xb7\x2d\xdd\xb6\x1c\xf9\x32\xf1\x78\ \x52\x6e\x52\xae\xf7\x86\xb1\xc5\x62\x16\xc3\x0e\x71\x95\x9d\x65\ \x67\xd1\xd7\x7e\x8e\x4a\xa8\x04\x24\xd6\xe2\x8a\x2c\xc4\x2d\xe7\ \x8a\x80\x9f\xa1\xab\x74\x55\xce\x03\xe9\x26\xdd\x04\x40\x74\x83\ \x6e\x48\x37\xd1\x75\xba\x0e\x88\x6d\x48\x95\x35\xa9\x42\xaf\xd2\ \xab\xe0\xb1\xa6\x95\x9f\x28\x3f\x81\x69\xb7\x6e\x9e\xa8\x3a\x51\ \x25\x5e\xb3\x9a\x5b\x86\x65\x20\x29\x66\xa2\xb7\x8f\xb7\x0f\xf5\ \xe1\x25\xe2\xa0\x38\x88\x02\x6d\x2e\xde\x93\x35\xb4\x38\xfe\x33\ \xff\x19\xde\x90\xc3\x09\x85\x09\x85\x40\xc8\xa0\xc6\x17\x1a\x5f\ \x00\xb4\xaa\xf0\xd9\xe1\xb3\x01\xbd\x59\xfc\xb4\xf8\x69\x00\x9a\ \x61\xbc\x2c\xf0\x18\xfe\x24\x0b\x5c\xa4\xfb\x74\x1f\xb6\x98\xc1\ \x72\x59\x2e\x6c\xad\x9f\x73\x41\xd2\xef\x91\x67\x86\x67\x06\x8e\ \x16\xf4\xdc\x5a\xbb\xb5\x36\xf3\x47\xd6\xd2\x0e\xcd\x0f\xcd\xef\ \x9a\x1e\x52\xe5\x55\xbd\x61\xae\xf5\x67\xfb\xb3\x45\xb8\xd5\xdc\ \x98\x63\xcc\x41\x3f\xeb\x73\xa3\xd6\xa8\x05\x59\xd9\x06\x0c\x00\ \xe6\xc3\x46\x03\xa3\x81\xf4\xaa\x21\x9f\x53\x80\xf1\xb1\x11\x6d\ \x44\xcb\x79\x8b\xe1\x35\xbc\x72\xee\x6a\x84\x19\x61\x40\xe0\xdf\ \xc6\x4e\x63\x27\x60\xce\xb5\x4c\xcb\x84\xa7\x3e\xa5\xfa\xd5\xea\ \x57\x51\x57\xf1\x7a\xe9\xb8\xd2\x71\x58\x4c\xff\xb4\x33\xec\x0c\ \xdc\x08\x89\xd0\x1f\xd1\x1f\xc1\xc2\xba\x2d\x76\xa1\x5d\x88\x02\ \xe3\x2c\xdf\xc0\x37\xa0\xce\x3f\xdd\x3a\x6e\x1d\x87\x57\x50\xa3\ \xf5\x8d\xd6\x03\x62\x41\xdc\xb6\xb8\x6d\x80\x39\x86\xf9\x98\x0f\ \x40\x42\xe4\x81\xc8\x03\x80\x35\xd8\xa8\x37\xea\xa5\x2f\xb9\xef\ \xc7\x7a\xc7\x2c\x32\x8b\xa4\x23\xcd\x55\xe6\x2a\x68\xf6\x4c\x63\ \x95\xb1\x0a\x5e\xab\xdc\x4a\xb6\x92\xf9\xeb\x34\xac\x3a\xad\x3a\ \x0d\x88\x67\x0d\x26\x34\x98\xd0\x6d\x97\x1e\xe2\xf5\xed\xf1\xed\ \x69\xb6\x9c\x5e\xe4\x09\x3c\x01\x83\xac\x5d\x81\x3b\x81\x3b\x62\ \xba\x35\x44\x84\x88\x10\x02\x5f\x47\x3b\x68\x07\x60\x97\xba\xa7\ \x2e\x3f\x4f\xc7\xe9\x38\x20\xce\xbb\x57\xd8\x2e\xa3\x7a\xaa\x97\ \xf3\x28\x0a\x50\x40\x5a\x1b\x9c\xe7\x50\x2c\xc5\x02\x74\x84\xb5\ \x64\x2d\x81\x7b\xed\x2f\xd3\x65\x42\x58\x5d\x66\xcd\xf9\x9a\xf3\ \x00\xf5\xd5\xa6\x69\xd3\x28\x0d\xbb\xed\x1e\x76\x0f\xa4\x69\x84\ \x9f\x65\x81\x36\xfc\x59\xfe\x2c\xc2\x7c\x33\x63\xd7\xc4\xae\x01\ \xf8\xb0\xe8\xa2\xe8\x22\x20\x50\x64\x65\x5b\xd9\x00\x1b\x1e\xd7\ \x2e\xae\x1d\x60\x7c\x6e\xa4\x1b\xe9\x72\x2e\xc2\x8b\xb2\xc0\x73\ \xec\x61\xf6\x30\x40\x4f\xe0\xdf\xb2\x80\x8f\x3c\xe4\x01\xc4\x27\ \xee\x1d\xc9\x9a\xb3\xd6\xac\x35\x6e\xf1\xb6\xea\x31\x0d\x88\xc5\ \xf7\x3f\xb9\xff\x49\x33\xa1\x8b\x70\xf1\xad\xf8\x16\x89\x96\xd7\ \x58\x69\xac\x04\x2c\x3f\xeb\xca\xba\x22\x60\x75\xc1\x04\x59\xd8\ \x69\xee\x2d\xce\x77\x51\x2d\xd5\xca\xf9\xc7\xe0\xad\x3f\x90\x2a\ \xa8\x42\x6a\x12\x27\x2e\xed\x41\x21\x14\x02\x88\x48\x7c\x20\x0b\ \xbc\xa6\x4d\xd2\x26\x01\x81\x33\xb5\xad\x6b\x5b\x03\x35\x87\x6f\ \x8e\xba\x39\x0a\x10\x47\xf1\xb6\x2c\x68\x32\xcf\xe1\x39\x00\x9a\ \xe2\x2b\x59\xe0\x07\xa1\x0b\x1d\xf0\xbc\x1a\xba\x22\x74\x05\xe0\ \xdb\x13\xdb\x39\xb6\x33\xe0\xbf\x12\xb8\x1d\xb8\x0d\x84\x36\x8f\ \x5b\x1a\xb7\x14\x30\xc2\xed\x78\x3b\x1e\xb0\xbe\xb5\x52\xac\x14\ \x40\x7f\x81\x8d\x61\x63\xd4\x46\x50\x28\x85\x02\x74\x1d\x0f\xca\ \x02\xc3\xa8\x05\xb5\x90\xfe\xc5\xbd\x20\xbc\x2f\xb3\x99\x0d\xc3\ \x5e\x62\x8d\xb7\xc6\xcb\xb9\xa5\xbd\xd8\x5e\x8c\xb7\x74\xff\xcd\ \xfa\xdc\xfa\xdc\xb2\xde\x01\xf8\xaf\xfb\xaf\x03\x9e\x44\x2d\x4a\ \x8b\xc2\x04\x7b\x1a\xbf\xc0\x2f\x00\x56\x27\x36\x92\x8d\x04\xec\ \x25\xea\xf4\x97\xde\xa4\x5b\x74\x4b\xfa\x38\xee\xc8\x82\x5b\xe4\ \x23\x1f\x20\x3a\x52\x1e\xe5\xc9\xf9\x28\x5b\xcc\x16\x4b\x0f\x05\ \x0a\x03\x85\x40\xed\xc1\x1b\xfb\x6e\xec\x03\xfc\x5e\x63\xbb\xb1\ \x1d\xa0\x45\xac\x82\x55\x00\xe2\x47\xe1\x17\x7e\x80\x7a\xe0\x23\ \x59\x50\x6b\xea\x4e\xdd\x01\xcf\x8c\x98\x56\x31\xad\x80\xc0\x38\ \xa3\x95\x21\xf5\xfc\x10\x7a\x2e\xf4\x1c\x60\x75\x66\xdf\xb1\xef\ \x00\x9e\xe3\x4f\xf4\x27\x02\xac\x3f\x1b\xc2\x86\x00\xf6\x49\xf7\ \x30\xd6\x2e\x92\x20\x01\xb0\x55\xf8\x45\x16\x94\x49\x17\xe8\x02\ \x80\x16\xb4\x9b\x76\x03\xac\x5c\xab\xd5\x6a\xa1\x07\x96\xf8\x6d\ \xbf\x0d\xf8\x63\xeb\x37\xd4\x6f\x28\x7b\x47\xaf\x5c\x63\xa4\x18\ \x29\x67\xd6\x54\x1f\xbb\xf1\xd7\x1b\x7f\xc5\x73\xbe\xd5\x2d\x8b\ \x5a\x16\xb1\x70\x6b\x33\x6f\xcf\xdb\xe3\xac\x3d\x98\xb6\xd0\x16\ \xb4\xb7\xaa\xe8\x0e\xc9\x05\xdb\x8f\x91\x4d\x36\xc0\x5b\xd1\x1e\ \xda\x23\xe7\x71\x54\x40\x05\x72\xfe\x13\x0d\xa6\xc1\xd2\xe7\xf1\ \x8e\x2c\xfc\x13\x6a\x7c\x35\x3e\xa0\xee\x7c\x4d\x61\x4d\x21\x60\ \xb7\x10\x3d\x45\x4f\x00\x4d\x78\x11\x2f\x02\x04\xc7\x44\x59\xc0\ \xe4\x77\xf8\x1d\xc0\x97\x1c\x9d\x17\x9d\x07\x58\x05\xac\x2f\xeb\ \x0b\xd8\x2b\xac\x1d\xd6\x0e\x40\x9b\xee\x7b\xc0\xf7\x00\xe0\x7f\ \x34\x90\x1a\x48\x05\x98\xc0\x42\x59\xb0\x4c\xf7\xa3\xa8\x87\xba\ \x1b\xa0\x87\x53\x19\x95\x01\xda\xbb\xf4\x33\xfd\x0c\xb0\x59\xc1\ \x43\x78\x0a\x96\xca\x42\xff\x83\x67\x80\x67\x00\x35\xaa\x3b\x55\ \x5b\x5a\x5b\x0a\xd4\x5c\xab\x4a\xab\x4a\x3b\xfd\x89\x7e\xb6\xa7\ \x36\x4c\x1b\x76\xe2\x83\xe4\xf3\xb7\xa7\xde\x9e\x7a\xed\x6a\xc4\ \x1a\xef\x3a\xef\xba\x66\x2d\xb4\x8b\xf1\xc5\xf1\xc5\xe2\xaa\xb5\ \x89\x67\xf1\x2c\x82\xb5\x9c\xd6\xd3\x7a\xc0\x0a\x75\x6f\x29\xbb\ \x90\xaa\xa9\x1a\xe0\x7d\x9c\x53\x16\xf6\xa7\xb4\x8b\x76\x01\x46\ \x5d\xdd\xf2\xba\xe5\x80\xbf\xd9\xbd\xbc\x7b\x79\xce\x95\x5c\x64\ \x2c\x02\xf8\x25\xe7\x29\x02\x31\x40\xc4\x88\x18\x00\xed\x31\x40\ \x16\xf4\x00\x9b\xc3\xe6\x00\x9e\xcb\x21\x09\x21\x09\x40\x7d\x82\ \x7f\xb3\x7f\x33\xe0\xdd\x11\xde\x24\xbc\x09\xe0\xff\xd4\xda\x6b\ \xed\x05\xd8\x1f\xad\x31\xd6\x18\xe9\xd7\xf4\x2d\x7d\x0b\xe8\x9d\ \x49\xc6\x39\x83\x20\x81\x55\xed\x7e\x14\xb5\x76\xee\x85\xd2\x33\ \x9c\xc7\x36\xd8\x78\x54\xcb\xf6\x41\x4f\x31\x5b\xcc\xa6\x82\x9a\ \x98\xaa\x28\xd9\xed\x97\xbe\x30\x2f\x9a\x17\x8f\xfc\x42\xb9\xdb\ \xe0\xa4\x6c\x0c\xba\xa0\xcb\xfa\x63\x4d\x3f\x43\x31\x8a\x47\x75\ \x0e\x6b\x94\x58\x99\x58\xc9\x5b\xd0\xba\x06\x1d\x1a\x74\x60\x57\ \xcd\x9d\xee\x2d\x6b\x3d\x47\x7d\x49\x5d\xa1\x0d\xea\x9b\xa0\x9c\ \x17\xa2\xbb\x2c\x02\x83\xfd\x47\xfc\x47\xe4\xfc\x17\x7b\x8a\x3d\ \x05\xf0\xbf\xe4\x6e\x80\xf1\x8b\x7f\x92\x7f\x12\x20\x8a\xe9\x6d\ \x7a\x5b\xba\x0a\x6d\x65\xc1\x47\x89\x71\x62\x1c\xe0\x79\x2a\x42\ \x8f\xd0\x01\xdf\xa0\x48\x59\x00\xf3\x51\x26\x8b\x90\xa1\xd1\x5a\ \xb4\x06\x68\x85\x9a\x57\xf3\x02\x2c\x99\x3e\xa3\xcf\xe4\xfc\x13\ \xc9\x48\x5b\xb8\x87\xb2\x96\x8e\x7a\x59\xe8\x13\x59\x03\xd6\x40\ \xce\xd3\xc8\x22\x0b\xf0\x6c\x45\x95\x2c\xf4\x1a\xb5\x21\x7c\x1e\ \xf9\x48\x9e\xc2\x6c\xe6\xa5\x9f\xce\xe7\x9c\xcf\xd9\x31\x7d\x44\ \xfe\xf0\x01\xc3\x07\xf4\x5f\x44\x73\x7d\x98\x26\x0b\x91\x8f\x68\ \x44\x0f\xf2\xb4\x5c\x81\x79\x98\xb7\xcd\x08\xeb\x43\x13\x69\x22\ \x2f\xd3\x52\xe3\x1f\x88\x7f\x80\x35\x11\x8d\xc3\xb2\xc2\xb2\x00\ \x6b\x20\xb5\xa3\x76\x80\xd9\x4f\xa4\x8b\x74\x75\x28\x99\x4f\x9a\ \x4f\xca\xf9\x7d\xde\x8d\x77\x03\x6c\xe1\x5e\x89\xfa\x2b\xb5\x5f\ \xd4\x7e\x21\xe7\x0c\xbe\x9d\x6f\x07\xb8\x86\x4f\x65\xc1\xbb\xe3\ \xa6\x2c\xc4\x2d\xfc\x41\x16\xbe\x7e\x31\x03\x63\x06\x02\xd4\x5d\ \xab\xd0\x2a\x00\xfd\x6b\x75\x07\x02\xbe\x8f\x23\xe6\x46\xcc\x05\ \x28\x15\xf7\x64\xc1\x46\x53\x7f\xea\x0f\x68\x1f\xba\x87\x9d\x56\ \xe7\xde\x89\x5a\xb6\x7b\xa5\xb5\x75\xee\xd9\xa4\x1b\xe4\x25\x2f\ \x84\xbe\x13\xa3\x65\xc9\xd7\xca\x33\xdf\x33\x9f\x0f\xaf\x8f\xaf\ \x5a\x5c\xb5\x98\xfd\xf3\x6c\x76\xc9\xe4\x92\xc9\x23\xab\x58\x2a\ \xf6\x62\xef\x57\x31\x84\x60\xa2\xc6\x42\x46\x3f\x31\xbf\x31\xd2\ \x90\x76\x34\x36\x7e\x33\x2e\xe2\xe2\x43\x49\xfc\x65\x5c\xc6\x65\ \x91\x49\x9f\x45\xee\x8c\xdc\x49\xf9\xd6\x0a\x6f\x81\xb7\x00\x30\ \xb7\x8b\x6a\x51\x0d\x58\x65\xee\xe3\xcf\x5a\xc9\x4e\xb1\x53\x80\ \x79\xc7\x1e\x65\x8f\x02\xfc\x45\x75\x87\xeb\x0e\x03\x76\x14\x32\ \x65\xc1\xa7\xa3\x9b\x2c\xec\x79\xa2\x93\xe8\x04\xd0\x01\xcf\x05\ \xcf\x05\xc0\xbb\x3c\xf2\xa7\xc8\x9f\x00\xd1\x4f\x0c\x13\xc3\x00\ \xcf\xe6\xf0\x4b\xe1\x97\x00\xfd\x25\xef\x28\xef\x28\x80\x5a\xe0\ \x11\x59\xb0\x54\xea\x45\xbd\x00\xed\x63\x0a\xa7\x70\xe9\x0d\x8a\ \xa3\x38\xe9\x6b\x14\x49\x91\x80\xbe\xd3\xdd\x78\xfd\xc1\xe0\x47\ \xe0\x09\x6a\x4c\x8d\xc5\x44\xdf\x0a\x75\x88\xd3\x27\xb7\x3a\x5e\ \xda\x7b\x69\xef\xd9\xf5\x9f\x56\x55\xc9\xdf\x92\x7e\xb7\xeb\x46\ \x1d\x64\xfc\xeb\x68\xe1\x7a\x29\x98\xb0\x23\x94\x9c\xf8\x7b\xca\ \xb1\x65\x4d\xda\xa9\x5b\x75\x4d\x82\x6f\x36\x2a\x51\xc9\xdb\x5b\ \x5e\x2c\xc3\x32\x76\x96\x7b\x42\xef\x87\xde\x87\x65\xef\xf0\x8c\ \xf5\x8c\x85\x6e\xd6\xa2\x58\x16\x56\x18\xfb\x3d\xfb\xbd\xba\xe5\ \xad\x38\x2b\x0e\x08\xb4\x0d\x94\x04\x4a\x9c\xef\x0f\x07\xe9\xa0\ \x34\x0e\xc9\xb2\xb0\xb9\x68\x25\x5a\x01\xec\x89\xd0\xb8\xd0\x38\ \x69\x1b\xef\xa7\xde\x4f\x01\xe4\x51\x21\x15\x02\x9e\xd1\x61\x53\ \xc3\xa6\x02\xec\x05\xe7\x97\x29\xd0\xdb\xc1\x43\xcd\xa7\x16\x04\ \x68\x33\xdd\xa7\x8e\xc6\xd4\x57\x5e\x67\x8e\xa1\x18\x40\xaf\xa0\ \xa6\xd4\x14\xa6\x9e\x4f\x99\x94\x09\x8f\x2f\xc7\xf3\xab\xe7\x57\ \xfe\x90\x3f\xef\xf6\xf2\xdb\xcb\xd9\xc9\x5b\x33\x6f\x66\xdd\xcc\ \x1a\xfb\x9c\x66\x43\xe6\xcb\xf5\x9a\xae\x64\x55\x34\x31\x09\x2a\ \xd9\x1f\x5f\x73\xdc\x4d\x84\x74\xa4\xb3\xab\xcb\x72\x70\x08\x87\ \x0e\x0c\x88\x9d\x82\x46\x68\x94\x7e\x50\x74\x40\x08\x42\xf8\x8f\ \x66\x13\xf5\x19\x65\x5d\xad\xae\x9e\x24\x4f\x12\x84\xbd\x5e\x2f\ \xd2\x8b\x40\xe6\xdb\x2c\x99\x25\x03\xc6\x1b\x56\xb8\x15\x2e\xcd\ \xb0\x13\xed\x44\xc0\x1a\x86\xe5\xb2\xb0\x3f\x82\x0d\x5b\xea\x41\ \x88\x2c\x58\x78\x48\x52\x48\x12\x20\xa6\x69\xad\xb5\xd6\x00\x86\ \xb1\x42\x56\x08\xe8\x25\x21\x05\x21\x05\x00\x2d\xa5\xd3\x74\x5a\ \xfa\xbc\xfb\x3c\x67\x47\x29\x8c\xc2\x00\x6d\x3e\x35\xa7\xe6\x72\ \x3e\xef\x6e\x80\xbe\x90\x92\x28\x09\xb6\xbe\x89\x56\xd0\x0a\x68\ \x9e\xc1\x5a\x86\x96\xc1\x5f\xa7\x12\x7f\x85\xbf\x82\x2d\xa9\xfd\ \xb0\x6c\x49\xd9\x92\xdd\x8f\xbf\xd9\xd1\x2e\xb7\xcb\x7b\x17\xed\ \xf3\xb7\x6c\xd4\xb2\x11\xb6\x7f\xfd\xfc\xd5\xdb\x57\x6f\x63\x26\ \xcd\xfd\x14\x6e\xbe\x84\x0c\x0b\x31\xa3\x41\x20\xee\x47\x9d\xb2\ \x47\xf7\x86\x53\xc0\xc1\xf7\x4e\x0c\x63\x68\x80\x06\x6c\xa4\x15\ \x82\xc6\x68\x4c\xdf\x19\x7e\x9c\x97\x1d\x60\x9a\xee\xa9\x6c\x99\ \xfa\x58\x7d\x2c\x60\x24\xf1\x61\x7c\x18\x60\xe6\x89\x28\x11\x05\ \x58\xfb\x30\x54\x16\x96\x07\x67\x65\x61\xa7\x52\x6b\x52\x0b\x7e\ \xd4\xbb\xc9\xbb\x09\xe0\xd1\x18\x21\x0b\x1a\xa1\xf7\xd5\xfb\x02\ \xac\xbd\xa7\x97\xa7\x17\x80\xe6\xd8\x2c\x0b\x6a\xc0\x52\x59\x2a\ \xc0\x36\x52\x3c\xc5\x4b\xe7\x50\x34\x45\x03\xda\x75\x7a\x80\x1e\ \x90\x4e\x75\x0f\x43\xcf\x1b\xec\x0a\xbb\x82\xa7\x35\x83\xaf\xe7\ \xeb\xf1\x8d\x19\x5b\xb1\xba\x62\xf5\xfd\xcf\xf8\x60\x6b\x8e\x35\ \xa7\xdb\x7e\x24\x42\xe6\xe4\x06\x7a\x5b\x49\xb9\x62\x25\x62\x11\ \x2b\x86\xe8\xf8\x08\x2a\x9e\xf0\x02\x05\xf7\x8b\x02\x08\x08\x56\ \xc6\x4e\x29\x0f\x34\xa9\x9d\x0d\x99\x79\xb3\x99\x89\x1a\xd4\xcc\ \x86\x7e\x5e\x9d\xba\xf6\x3c\x5c\x43\x12\x92\xb4\x01\x62\x89\x18\ \x24\x06\xc9\x57\xb2\xcd\x14\x33\x05\xa1\x7c\x05\x3a\xcb\x82\x97\ \x22\x51\x16\x76\x2c\x34\x59\x58\x4b\x10\x25\x0b\x7b\xa7\xfb\xd9\ \xe5\x29\xa6\xcf\xf4\x49\xdf\x46\xad\x2c\xc4\x52\xde\x94\x37\x05\ \x68\xb7\x9d\x6d\x67\x03\x28\xa3\xf7\xe9\x7d\x80\x76\xd2\x4c\x9a\ \x29\x7d\xc7\xfd\x08\xb0\xde\xd4\x8c\x9a\x01\xda\x49\x6a\x40\x0d\ \x60\xea\x39\x6c\x28\x1b\x0a\x8f\x91\xaa\xce\x22\x7b\x10\xd6\xd6\ \x78\x6a\x3c\x1a\xbc\x07\xd5\xc2\xdf\xfc\x90\xcf\x70\x16\x7e\x19\ \xb3\x94\x1a\x51\x82\xd2\x1e\xc2\x4e\xe0\xae\xac\x87\xe6\xde\x85\ \x93\x99\x31\xae\xaf\x98\x0e\xdd\x06\xa7\x38\x7e\xf7\xc7\xbf\x2b\ \xd8\x0b\x93\x7f\xa7\xdc\xb1\x35\xdc\xa3\x7c\xca\x86\xa3\x9d\x63\ \x86\x23\x06\x31\xda\x2b\x81\x0d\xa8\x57\x35\xbc\xf0\xcb\x86\x9a\ \xef\xc0\x89\xb1\x15\x24\x0b\xd3\x80\x90\x85\xf5\x4f\x75\x07\x49\ \x9f\x41\x7f\x59\xd8\x97\xf1\xb4\x2c\xf8\xad\xe0\x17\x97\x56\x6c\ \x13\xdb\x04\x60\xae\xb3\x40\x60\xa2\xfb\xd4\xa1\x9e\xea\xd7\x72\ \x80\x71\x4a\xa1\x14\xd4\x6b\x44\xa9\x94\x8a\x50\x6d\x0f\x7b\x9c\ \x3d\x6e\x47\xb0\xe3\x81\xa9\x81\xa9\xda\xbd\xc8\x38\x7b\xa2\x3d\ \x71\xd5\x17\x97\xa2\x20\x33\xee\xc5\x86\xcf\x28\xd9\x2b\x97\x9c\ \xf7\xcf\x73\xba\xdc\x51\xc2\xa3\x8d\x76\x34\xe9\xfd\x87\xe0\x84\ \xbf\xe7\x40\xec\x0d\x47\x21\xd6\x3a\x63\xfb\x9a\x7e\xce\x78\x36\ \xc4\x59\x50\xa3\x11\x31\x69\xca\x7d\x1b\x42\x66\x28\xdb\x91\xbd\ \x4a\xc9\x3b\x18\x53\xa1\x41\x63\x25\x81\x5d\x60\xb2\x75\x06\x9c\ \x05\x87\x99\x2f\xc3\x89\xb9\xc9\xd5\xb8\x0b\x2e\x0b\x6b\x7e\xd0\ \x96\x70\x62\xef\x06\x81\xa4\x1f\xba\x1b\x25\x66\xab\xb3\x47\xfa\ \x16\x9e\x97\x05\x4d\xa6\x1c\xca\x41\x3d\xdb\x8f\x1d\xb2\xa1\x74\ \x57\x6d\x8c\x3d\x54\xbb\x20\xb6\x8a\xad\xda\xe6\xd8\xa6\x62\xbc\ \x18\xbf\x3b\xaa\xdf\x01\x7d\xbf\xbe\xbf\xdf\xe6\x27\x07\x58\x8f\ \x5b\x8f\x1b\x9b\xff\x36\x99\x9e\xa5\x67\xd1\x3a\xd0\x19\x2d\x65\ \xdf\xe4\x0d\xc5\x02\xb1\x00\x30\xf6\xc2\x09\x21\x98\x39\xcb\x5c\ \xa9\x99\x83\x97\x76\x38\x1a\xa8\x52\xb0\x28\x8b\x2b\x79\x35\xed\ \x53\xb6\x2d\x0f\x73\x5e\xdf\xdd\x50\x1f\xab\x4c\x84\x95\xa1\xe4\ \x19\x81\xc7\x95\xac\xc8\xd8\xa6\x94\x1b\x51\xe9\x18\x66\xa4\x07\ \x37\x62\x59\xf0\x8e\x88\x54\x1b\x26\x9d\x07\x26\x0b\xab\x99\x3b\ \xdb\x67\xe0\x84\xe7\xc2\x2f\x0b\x3e\x13\x42\xd6\x8f\x00\x54\x42\ \x70\x44\x61\x4f\x61\x31\x4a\x6d\x79\xa3\x58\x75\xa8\x1e\xcd\x7d\ \x38\x8e\x0c\x32\x9e\x5a\xdc\xee\x86\xfa\x5e\x73\xb7\xb8\x48\x88\ \x6b\xe2\x1a\x65\xda\x1b\xd4\x53\x4c\xe4\x8b\x78\x7c\x2f\xab\xd3\ \x57\x50\xb1\x66\x1c\x73\x84\x86\x60\xf6\xec\x74\xed\x1d\xe7\x60\ \x53\x5f\xc7\x50\xf6\x57\x85\xb8\xc7\x86\x29\xd9\x4a\x77\x43\x2a\ \x9e\xb0\x1c\x77\x3d\x89\x4c\x65\xf6\x34\x2a\x52\x36\xd8\x29\xe2\ \x95\xf6\x0f\xb6\xbb\x11\x2d\xf9\x09\x77\xdd\x7c\xa7\xa3\x66\x77\ \x74\x84\xbd\x10\x1c\x5c\x5a\x03\x5b\x16\x7c\x1c\x2c\x59\xd8\x25\ \x8e\xc2\x3e\x0a\x26\x4b\xbc\x23\x3c\xb2\xba\xfd\x0c\x7c\xf0\xd9\ \xdd\x44\x13\x78\xe1\xd5\xbe\x6e\xd8\x11\x61\x08\x3b\x9e\xfe\xa0\ \x1f\x63\x30\xa6\x3f\x35\xca\x52\x4f\xaf\x8a\x4d\x3f\xd4\xa9\xc3\ \x93\x8e\x5b\x07\x50\x8a\x52\xf1\x26\x9f\x85\x53\xb2\xee\xff\x21\ \x00\xe6\xcc\xf9\xf8\xff\x42\xf8\x4d\xa6\xff\xcd\x35\xa6\xd2\x95\ \xbe\x71\x08\xc3\x49\xc7\x3a\x77\x41\x6c\xb7\x98\xaa\xe4\xbd\xc4\ \xc7\xca\x94\x5b\x7a\x98\x32\xef\x57\xbc\xab\x6c\xdb\xc9\xf8\x50\ \x69\x67\x18\x23\x95\xda\x9b\x81\xc5\x4a\x0c\x32\xf2\x1d\x2d\x83\ \x39\xea\xee\x9f\x03\xe6\x3e\x07\xcb\xec\xed\xa8\xdb\x07\x1d\xd7\ \x1b\x59\x0a\xfb\x39\x6d\xac\x52\x13\x4d\xbf\x57\x16\x2f\xe8\x7a\ \x45\xf9\x74\x20\xe5\x80\xb2\xe2\xdd\xbd\x1b\x95\xcc\x67\x5e\x57\ \xf2\x00\x9f\xec\x5e\x40\xbd\x95\x63\xfd\xec\x54\xfc\xb7\x61\xf8\ \x4d\x16\x4e\x76\xad\xfb\xd2\x15\xfb\xdd\x91\x32\x1c\xc3\xd8\x05\ \x77\xe1\xac\x50\xc9\xe6\xe3\x25\xe5\xf9\xc6\x76\x6b\x65\x8f\x9d\ \x22\x44\xb9\xbb\x44\x73\x66\xad\x88\x0d\x56\xda\x95\xda\x53\x4a\ \xf1\x32\x6b\xea\x2e\x90\xb9\x7f\xbf\x3f\x38\xd7\xd3\xd7\x8e\x3a\ \x3d\xaa\x10\x6f\x59\x23\x95\xb6\xed\xcb\x71\x17\xde\x7c\x8f\x72\ \xf3\xa1\xa1\xb7\x95\x99\x4f\x8f\xf1\xb9\x0b\xdf\x77\x4a\x49\xd7\ \x03\xc7\xdc\x85\x9b\x17\xdd\xf7\x49\x6d\x1d\xeb\xbb\x7f\x87\xff\ \x18\x0d\xff\x43\xf6\x57\xba\x3e\x39\xc9\x95\x0a\x1d\x4c\x64\x07\ \xff\x01\x77\x41\x3b\x69\xac\x92\x02\xba\xb3\xe0\xfb\x57\xf9\xa7\ \xca\x0d\x9d\x68\x97\x32\x6c\x29\x4d\x55\xf6\x98\xcc\x23\x94\xb4\ \x82\x7f\xa5\xb4\xfb\x89\x5b\x4a\xb6\x80\xe7\x29\x61\xd8\xa7\x15\ \x76\x13\xcb\x52\xb2\xcf\x23\x1f\x72\xfc\xb0\xf9\x5a\xe5\x9c\x2b\ \x0b\xcb\x94\x13\xfb\x3f\xed\x57\x5a\xc9\xf7\x5e\x53\x52\x87\xfa\ \x62\xa5\x18\x62\xff\xcb\x7d\x5f\x9e\x91\x8e\x75\x23\x43\x1d\xd1\ \xa5\x3f\xfe\x63\x08\xff\x39\x2c\xa8\x37\x68\x08\x82\x26\x36\x77\ \x4c\x28\xc8\x70\x3c\xbe\xa6\xbb\x82\x66\x84\x6e\x71\x9c\xe0\x73\ \x16\xca\x9b\x63\xbc\xb2\xef\x4c\x73\x98\x72\xe5\xde\xfa\x24\x65\ \xf3\x83\xf5\x25\x4a\x11\x15\x38\xe7\x78\xd8\x7e\x44\xc9\xda\x87\ \x1d\x57\x5e\xdf\xd6\x78\x95\x72\x5c\x97\x2b\x1b\x94\xdf\x27\x9a\ \xb5\x4a\x2d\x23\xe1\x86\x92\x5f\x98\x37\x45\x29\xca\x1a\x6f\x56\ \xe2\xa1\xf2\x67\x1c\xcb\xe1\xc6\xff\x1b\x8d\xa0\xfc\x7f\xda\x00\ \x5f\xd0\xe8\xdf\x2c\x34\x10\xf4\x4e\x50\x33\x28\x4e\xed\x70\xf5\ \xec\x0f\x1e\x6e\xaf\x3b\xda\x31\xb7\x1c\x7b\x1f\x73\x16\xc2\xae\ \xfd\xf2\xbe\x92\x9f\xe3\xc9\xca\x06\x67\xab\xe6\x29\xff\x9c\x5c\ \xe7\xfc\xdc\xa4\x32\x53\x28\x3d\x1d\x43\x03\xca\xcf\xa3\xdb\xc4\ \x2b\xdf\x3e\x24\x2c\x65\x65\x92\x88\x51\xb2\xee\xcf\x3f\xab\xe4\ \xb7\x6f\x36\x56\xe2\x9c\x71\xd2\x91\xdd\x5e\xe2\xc8\xbb\x2c\xc0\ \x7f\x17\x3d\x68\xfc\x6f\xd6\xe5\x0f\x5a\x09\xfc\xdf\xee\x90\xe1\ \x2e\xd4\xd2\x95\x51\xd0\x4a\x38\xaf\x68\x17\x10\xa5\xd4\xb7\x06\ \xb7\xa7\x5d\x9b\x14\x65\xc8\xb5\x0e\xd7\x9c\x39\xe5\xa3\x6e\x80\ \xb3\x44\xe7\x5a\x75\xeb\x3b\x2b\x42\xf9\x64\xee\xfc\xa6\x70\xd2\ \xea\x84\xf3\xf3\x9f\xb5\xda\xab\x0c\xb9\x8c\x0e\xee\xcf\x05\xd7\ \xf3\x3d\x92\x95\xda\x65\x77\x66\xf7\x82\xfa\x5c\x29\xc5\x15\x23\ \xfe\xb7\x77\x3a\x05\xad\x76\xd1\x57\xb9\x7a\x22\x83\x3e\xed\xea\ \xfd\x20\x38\x2f\x0a\xce\xef\x04\xe7\xd1\xc1\xf9\xb1\xe0\x1c\xe6\ \xaa\x1f\x42\xac\x33\xcf\xc1\x5d\x67\xde\xcf\xba\x3a\x16\xb3\x85\ \x4a\xef\x73\x56\x4f\x65\x5d\x31\x9c\xf0\x6a\x3d\x4a\x19\x31\x98\ \xcf\x50\x9a\x99\xfc\x6d\xc7\x28\xc4\x29\xad\x01\xb8\xe3\xf8\xe7\ \xe0\x8d\xd8\x25\x68\x5d\xd0\x02\x57\xe3\xaf\xc1\xf9\xbd\xe0\xfc\ \x72\x70\x9e\x10\x9c\xd7\x05\xe7\x4a\x57\xfb\xf7\x1a\xdc\xd4\x05\ \x2d\x09\x7a\x33\xe8\x1f\x5d\xc4\x3d\x57\x1e\x13\xb4\x38\xe8\x5f\ \x5c\xed\x83\x41\x1b\xba\xf2\xe1\xa8\x77\x66\x06\x72\xbc\x22\xaa\ \x95\xd6\x39\xfe\x99\x32\x30\x5d\xbf\xe4\x1e\x8a\x9a\xe5\x38\xc5\ \x2a\x52\xd6\x1f\x17\x7b\x94\xfe\x91\x60\x4a\x79\x42\xdc\x77\xac\ \x03\x1c\xeb\x5d\xfd\x93\x82\xf3\xac\xa0\x9d\x82\x9a\x41\xa7\xb8\ \x9a\x4b\x83\xfe\xe2\x6a\x99\xae\xfc\x07\x57\xd1\xf3\xff\x01\x8d\ \xce\xd1\x26\xd3\x85\xe4\x79\x00\x00\x00\x22\x7a\x54\x58\x74\x53\ \x6f\x66\x74\x77\x61\x72\x65\x00\x00\x78\xda\x2b\x2f\x2f\xd7\xcb\ \xcc\xcb\x2e\x4e\x4e\x2c\x48\xd5\xcb\x2f\x4a\x07\x00\x36\xd8\x06\ \x58\x10\x53\xca\x5c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x06\x11\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x03\x00\x00\x00\x44\xa4\x8a\xc6\ \x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\ \x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\ \x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\ \x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\xac\x50\x4c\x54\ \x45\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x0d\x0d\x00\x00\x00\x0d\ \x0d\x0d\x00\x00\x00\x00\x00\x00\x19\x19\x19\xb3\xb3\xb3\xb5\xb5\ \xb5\xb3\xb3\xb3\xb5\xb5\xb5\xb3\xb3\xb3\xb5\xb5\xb5\xb7\xb7\xb7\ \xb6\xb6\xb6\xee\xee\xee\xf1\xf1\xf1\xae\xae\xaf\xb8\xb8\xb8\xbd\ \xbe\xbe\xc0\xc0\xc0\xc1\xc2\xc3\xc2\xc2\xc3\xc5\xc5\xc5\xc5\xc6\ \xc7\xc6\xc6\xc6\xc7\xc7\xc7\xc7\xc8\xc8\xc8\xc8\xc8\xc8\xc9\xc9\ \xc9\xca\xca\xca\xca\xca\xcb\xcb\xcb\xcb\xcc\xcc\xcc\xcc\xcc\xcc\ \xcd\xcd\xcd\xcd\xcd\xcd\xce\xce\xce\xcc\xcd\xce\xce\xce\xce\xcf\ \xcf\xcf\xcf\xd0\xcf\xd0\xd0\xd0\xd0\xd0\xd0\xd1\xd1\xd0\xd1\xd2\ \xd1\xc5\xca\xd1\xce\xcf\xd1\xd1\xd1\xd1\xd2\xd2\xd2\xcf\xd1\xd2\ \xd2\xd2\xd2\xd3\xd3\xd3\xd3\xd3\xd4\xd4\xd4\xd4\xd5\xd5\xd5\xd5\ \xd5\xd5\xd6\xd6\xd6\xb5\xc3\xd6\xd6\xd6\xd6\xd7\xd7\xd7\xd7\xd7\ \xd7\xd8\xd8\xd8\xd8\xd8\xd9\xc7\xce\xd9\xd5\xd7\xd9\xd9\xd9\xda\ \xda\xda\xdb\xd8\xd9\xdb\xdb\xdb\xdb\xdc\xdc\xdc\xd9\xda\xdc\xdc\ \xdc\xdd\xdd\xdd\xdd\xde\xde\xde\xda\xdc\xde\xde\xde\xdf\x9c\xb8\ \xdf\xdf\xdf\xdf\xe0\xe0\xe0\xe0\xe0\xe1\x92\xb3\xe1\xa5\xbe\xe1\ \xd7\xdb\xe1\xde\xdf\xe1\xe1\xe1\xe1\xe1\xe2\xe2\x98\xb7\xe2\xe2\ \xe2\xe2\xe2\xe3\xe3\xe3\xe3\xe3\xe4\xe4\xe4\x7a\xa6\xe4\xe4\xe4\ \xe5\xc9\xd5\xe5\xe5\xe5\xe5\xe6\xe7\xe6\xe6\xe6\xe7\xe7\xe7\xe7\ \xe8\xe8\xe8\xe9\xe9\xe9\x5b\x96\xe9\xe9\xe9\xe9\xea\xea\xea\x5f\ \x99\xea\x61\x9a\xea\x65\x9c\xea\x65\x9d\xea\x69\x9f\xea\xca\xd7\ \xea\xea\xea\xea\xeb\xeb\xeb\x68\x9e\xeb\x85\xaf\xeb\xeb\xeb\xeb\ \xeb\xec\xeb\xec\xec\xeb\xec\xed\xec\x6d\xa1\xec\x6e\xa3\xec\x70\ \xa4\xec\x75\xa6\xec\x7c\xaa\xec\x8c\xb4\xec\xec\xec\xec\xed\xed\ \xed\x76\xa7\xed\x7c\xab\xed\x7d\xac\xed\x84\xb0\xed\xdd\xe4\xed\ \xea\xeb\xed\xed\xed\xed\xee\xee\xee\x7b\xab\xee\x8b\xb4\xee\xa4\ \xc3\xee\xee\xee\xee\xef\xef\xef\x81\xaf\xef\x8a\xb4\xef\x9f\xc0\ \xef\xe3\xe8\xef\xef\xef\xef\xf0\xf0\xf0\xf0\xf0\xf0\xf1\xf1\xf1\ \xc2\xd5\xf1\xf1\xf1\xf1\xf2\xf2\xf2\x9e\xc0\xf2\x9e\xc1\xf2\xa1\ \xc2\xf2\xa2\xc3\xf2\xa3\xc3\xf2\xa8\xc6\xf2\xb1\xcc\xf2\xd3\xe0\ \xf2\xf2\xf2\xf2\xf3\xf3\xf3\xaf\xcb\xf3\xc5\xd8\xf3\xf3\xf3\xf3\ \xf3\xf4\xf3\xf4\xf4\xf4\xb0\xcc\xf4\xf4\xf4\xf4\xf5\xf5\xf5\xf5\ \xf5\xf5\xf6\xf6\xf6\xc3\xd8\xf6\xcc\xdd\xf6\xd1\xe0\xf6\xf6\xf6\ \xf6\xf7\xf7\xf7\xd3\xe2\xf7\xd4\xe2\xf7\xf6\xf7\xf7\xf7\xf7\xf7\ \xf8\xf8\xf8\xd5\xe3\xf8\xe0\xea\xf8\xf8\xf8\xf9\xe3\xec\xf9\xe8\ \xef\xf9\xee\xf3\xf9\xf9\xf9\xfa\xec\xf2\xfa\xf4\xf7\xfa\xf6\xf8\ \xfa\xf7\xf8\xfa\xfa\xfa\xfb\xea\xf1\xfb\xef\xf4\xfb\xf8\xfa\xfb\ \xfb\xfb\xfc\xf8\xfa\xfc\xfb\xfc\xfc\xfc\xfc\xfd\xf9\xfb\xfd\xfa\ \xfc\xfd\xfd\xfd\xfe\xfd\xfe\xfe\xfe\xfe\xff\xff\xff\xb1\xa5\xc7\ \x34\x00\x00\x00\x28\x74\x52\x4e\x53\x00\x01\x02\x03\x04\x05\x06\ \x07\x08\x0a\x0b\x0d\x13\x1c\x1f\x24\x27\x28\x2b\x2f\x31\x38\x39\ \x3a\x3a\x3b\x3c\x3e\x3f\x46\xc4\xc6\xd9\xd9\xe3\xe3\xeb\xec\xfe\ \xfe\xfc\x76\x12\x4c\x00\x00\x02\xa3\x49\x44\x41\x54\x78\xda\x6d\ \x91\xcb\x4b\x54\x71\x14\xc7\xcf\xef\x75\xbd\xf7\x3a\xe5\x38\x0e\ \x63\xf9\x98\xc2\x7c\x10\x85\xb9\x90\xa8\x84\x8a\x82\xda\x08\xba\ \x8a\x76\x51\x14\x2d\x5c\xb5\x2a\x92\x56\x51\x6d\xa2\x36\xae\x82\ \xa8\x45\x50\x7f\x40\xed\x5b\x58\x8c\x45\x68\x28\x65\xe4\x8c\x9a\ \x43\x99\xa5\x33\xa3\x33\xf7\xfd\xe8\x5c\x27\xef\x1d\xc1\xb3\xf8\ \xdd\xc7\xf7\x73\xce\xf7\x7c\xef\xe5\x00\x40\x28\x81\x9d\xca\xf7\ \x7c\x00\x04\xa8\xca\x08\x90\x1d\x74\xdf\xd5\xbc\x00\x10\xca\xd8\ \x02\x55\x64\x4e\x24\x0a\x14\x49\x15\x80\xd1\x80\x50\x87\x6d\x33\ \x00\x40\x5a\x5c\x9b\x28\xb8\x7b\x1a\x17\x52\xcb\xbb\xdd\x04\xad\ \xcf\x5f\x7f\xd8\xd6\x28\xe2\x4d\xfd\x12\x6c\x5a\x10\x42\xd9\x00\ \x93\x85\x72\x4a\x16\x20\x01\x8e\x21\xb7\x14\x94\x34\x4a\x48\x00\ \x60\xc5\x0b\xa8\x6f\x9a\x20\x4c\x14\x02\x0c\x31\x90\x70\xc0\x7f\ \x80\xb3\xb7\x56\x5d\xe5\x64\x3f\xa1\x81\xcc\x68\xb0\x49\xd0\x1c\ \x02\x64\xd7\x05\x90\x85\x84\xb2\xca\xf0\x40\xb5\xaa\x85\x87\xac\ \xbc\x24\xcd\x5f\xd5\x24\x55\xe8\xfa\xd1\x33\xa2\xaa\x93\x1a\x80\ \xd6\x5d\x93\x70\x53\x95\x71\x42\x04\xaa\xbc\xfa\x5e\x84\x00\x06\ \x21\x2f\x84\x97\xe7\xa4\xfd\x57\xa7\x25\xd9\xf3\x57\x06\xb6\x5b\ \x10\xf4\xbf\xac\x0a\x46\x84\x20\x8c\x63\x67\x54\x55\x40\xb5\x9f\ \xe8\x54\xb1\x62\x66\x49\x6e\x94\x59\x7a\xd5\x59\x6e\x6a\x67\x47\ \x7a\x59\x08\x08\x3a\xa2\xf2\xe2\x1f\xde\xc7\xb9\x30\xa7\x63\x87\ \x8d\xcf\xfb\x5a\x3c\x60\x11\x40\xe9\xe3\x54\x47\x7c\xb1\xfc\xfa\ \xd8\x82\xd4\xe3\x67\x26\x73\xbb\x57\xdf\x3b\x0d\xe7\x23\x00\xd4\ \xab\x4b\x1d\xe4\x1c\xf6\xc3\xe2\x97\xe3\x83\x00\x60\xcf\x4e\xa5\ \x25\x88\x96\x24\x93\xc9\xf1\x6c\x72\x24\x01\xa5\xa9\x43\xcd\xc0\ \x10\x70\x1d\x8f\x7a\x11\xc0\x86\xb5\x54\x77\x57\x1c\xac\x4c\xbc\ \x07\x75\x2f\xf7\xae\x6d\xa8\x19\x68\x04\x70\x12\x4f\x16\x73\x6d\ \xf5\x99\xe2\x10\x67\x40\xf5\xe9\xd3\xfb\x7d\xaf\x26\x26\xf7\xc6\ \x1c\xb5\x34\x2c\x99\x5d\xbd\x0d\xa8\x83\x3c\x48\x4d\x67\xdb\x87\ \x22\x37\x84\x2c\xf0\xbe\xa5\xfa\xa3\x3d\x5b\xd7\x6d\x0f\x62\xbe\ \xbf\x45\x59\x8f\x68\xd3\x4c\x2b\x94\x2e\x4d\xcc\xea\x07\x0d\x3b\ \x71\xb1\xb2\x6e\x5b\xf0\xc0\x09\x63\x8a\x9b\x5c\x81\xdf\x56\x27\ \x9c\xa0\x98\xa0\xbc\x96\xcf\x6e\x38\x8e\x8b\x63\xb6\x00\xbc\xde\ \xe7\xfe\xbc\x02\x7b\x57\x3b\x8a\xbc\x30\x97\xce\x93\x54\xec\x53\ \xd9\xf0\x42\x80\xc3\x6d\xe0\x6c\x73\x03\xa3\xf0\x77\xea\xd5\x9b\ \xef\x4f\x33\x65\xcd\x8a\x2c\xee\x19\x54\x36\xeb\x5a\x67\x65\x50\ \x53\xd9\x95\x8a\x9b\x7d\xf6\xd1\xd0\x8c\x28\x85\x3f\xca\x05\x87\ \xa5\x03\x38\xc0\x2e\x2e\xff\xfc\x30\xf3\x3c\x63\x96\x34\x54\x42\ \x8b\x3b\x32\xc8\x56\x7d\x82\x15\xfa\xbe\xad\x94\xd9\x5c\xf7\x78\ \x65\x43\x83\x2d\x20\x48\x7b\x17\x43\xb4\x32\x5c\x81\xe8\x85\x1f\ \xb9\x58\x66\x5d\xd3\x21\x04\xc0\x89\xd9\x68\x90\x06\x06\x48\x33\ \x39\x31\x6a\x96\x74\x13\x22\xc0\xd5\xcf\x32\xa8\x2d\x4b\x37\x6c\ \xa8\x01\x1c\xcd\x24\xdb\x00\xdf\xf6\xa2\x87\x7f\x17\x06\xe9\xeb\ \xb8\x7c\x9a\x06\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x08\x86\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x30\x00\x00\x00\x34\x08\x06\x00\x00\x00\xcc\x93\xbb\x91\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x04\x0b\ \x12\x0a\x22\xa6\x81\xb9\xfd\x00\x00\x08\x06\x49\x44\x41\x54\x68\ \xde\xd5\x9a\x5d\x6c\x14\xd7\x19\x86\x1f\xef\xda\x60\x77\x6b\x1b\ \x5b\x01\x13\x88\x6c\xb7\x6e\x84\x49\x6a\x1c\x89\x18\x68\x92\xca\ \x45\x88\xd2\x36\x89\x54\x35\xad\x9a\xda\x2d\x51\xef\xda\xab\x56\ \x8a\xd4\x9b\x70\x59\xe5\x26\xbd\x40\x6a\xa4\x56\x15\x8d\xf0\x1a\ \x1b\xbb\xc4\xb9\x30\x86\x02\x41\x29\x09\x04\xcc\x4f\x48\x5c\xa7\ \xb5\x69\xa1\xc1\x29\x76\x30\x38\xc6\xc6\x5e\xcf\xee\xce\x9c\x73\ \x7a\xb1\x3e\xc3\xec\xec\xfc\xec\x1a\x57\xa5\x9f\x34\x5a\xef\xec\ \xec\x99\xe7\x7b\xbf\xef\xbc\x73\xc6\xb3\x45\x15\xf5\xb1\x5f\x00\ \x7b\x79\x00\x22\x52\x52\x74\x4b\x29\x4e\x2a\x4b\x75\x03\x67\x80\ \x85\xbb\xd7\x13\x66\xd0\x77\x8a\x2a\xea\x63\xaa\x65\x4f\x23\xbb\ \xb6\x3e\xfb\x3f\x4f\x60\x32\x39\xc1\xd9\x13\x83\x5c\x7d\xf3\x06\ \xa9\x3b\x26\x40\x3d\x70\x1b\x48\xde\xbd\x9e\x90\x9e\x49\x03\xff\ \x15\xf8\x43\xbd\x87\x90\x88\x82\xb6\x8a\x92\x4a\x9e\xfa\xe6\x36\ \x9e\xfd\x6d\x2b\x5f\x7a\xfe\x61\x80\xeb\x40\x0d\x50\x5a\x51\x1f\ \x8b\xf8\x26\xb0\xdc\x21\x11\xbc\xf0\xc3\xef\x11\x21\x5a\xd0\xf7\ \x12\xd6\x3c\x97\x2f\x5d\xe6\xb1\xca\x66\x9e\x69\xdf\xca\x23\x3b\ \x56\x03\xfc\x2b\x28\x89\xc8\x72\x83\x1f\xea\x3d\x04\x40\x5f\xef\ \x5b\x48\x04\x7d\xbd\x6f\x15\x34\x86\x39\x6f\x01\x50\x17\x6b\x60\ \xcb\x4f\x9b\x59\xd3\x52\x15\x98\x44\x64\xb9\xc0\x25\x02\xc0\x56\ \xde\xfd\x1a\x14\x29\x91\x24\x25\x92\x08\x25\xb8\x73\x65\x0e\x00\ \x43\x24\x78\xac\xb2\x99\x86\xef\xae\xa7\x6a\x63\xb9\x6f\x12\x91\ \xe5\x02\x77\x2a\xad\x95\xd7\x9f\xb9\x2b\xa1\x81\xf5\x96\x35\xa6\ \xa5\x32\xc7\xc8\x14\x86\x48\xb0\x63\xd3\x2e\xd6\x6e\xa9\xf6\x4a\ \xa2\x08\xa0\x78\xa9\xe0\xee\xd0\x4a\xbb\x2b\xa1\xdf\x3f\xf7\xfd\ \xef\x10\x21\x8a\x21\x12\xbe\xe3\x5a\xca\x22\x7d\xd7\xe4\x6f\x33\ \x1f\xf1\xf1\xe1\x2b\x14\x97\x45\x99\x1f\x37\x58\x51\x59\xc2\x9a\ \xcd\x55\x44\x57\x44\x98\x1a\x9a\xfd\x15\xf0\x6b\xc0\x02\xd2\x91\ \xa5\x2a\xae\xc3\x4b\x79\x80\xbe\x9e\x3e\x0c\x91\xa0\xaf\xa7\xcf\ \x56\xd9\x10\x09\x06\x0e\x1d\x09\x3e\x89\x82\x81\x9f\xbf\xcb\x27\ \x47\x3e\xe3\x9f\x6f\xde\xe0\xb3\x73\x9f\x33\x76\xec\x26\x9f\xf4\ \x4f\xe8\x23\x7e\x06\xac\x06\xca\x2a\xea\x63\x91\xa2\x8a\xfa\x98\ \xda\x73\xf8\xe5\x82\x15\xcf\x9e\x48\x19\xa5\x35\x68\x59\x34\x86\ \x21\x12\x39\xaf\x3a\xdc\xef\x33\xe7\x90\x4c\x25\x6f\x01\x70\xa6\ \xeb\x3c\xf3\x37\x0c\xd2\x77\x4d\xd2\xf3\x16\xca\x92\x28\x09\x22\ \x2d\xb1\x12\x02\x60\x3b\x30\x02\x4c\x45\x0a\x55\xdc\xa9\xbc\xee\ \x61\x43\x24\x88\x10\xb5\xd5\x35\x44\x82\xfe\x9e\x23\x36\x64\x6f\ \xd7\x9f\xb2\xbe\x6b\x88\x04\xfd\xdd\x03\x36\xb8\xa5\x2c\xa4\x92\ \x54\xae\xa8\x62\x4d\xe9\x5a\x76\xbd\xb4\x83\x17\x5e\x79\x8e\x96\ \x57\x36\xf2\xc8\xf6\x35\xd4\x7d\xfb\x61\x6a\xb6\x54\x53\x5c\x6a\ \xe3\xae\xd0\xed\xef\x59\x01\x3f\x68\xf7\x84\xf3\x52\xd2\xb9\xcf\ \xef\x6f\xdd\xef\xe5\xc5\x95\xcc\x98\xd3\xf7\xf6\x49\x93\xe2\x48\ \x09\x96\x34\x11\x2a\x9b\x61\x2a\x79\x8b\xd3\xbf\xb9\xc4\xd4\xd0\ \x2c\xc0\xb7\x80\x8f\x81\x9b\x91\x30\xc5\xdd\x6e\xe1\xec\x61\xdd\ \x1e\x00\xfd\x3d\xf7\xd4\x07\xe8\xef\x1e\xc8\x02\xee\xed\xec\xb5\ \xdd\x25\x25\x53\x08\x25\x98\x31\xa7\x39\xde\xf3\x36\x96\x34\x6d\ \x68\x2f\xf8\xa4\x30\xf8\x62\x49\x39\xc5\x5f\x28\xf6\x5e\x0b\xed\ \x39\xfc\xb2\x0d\xee\x56\xd9\x2b\xbc\x94\xf7\xda\x5f\x16\x8d\x91\ \x10\x19\x5f\x37\xa5\xc9\xaa\x92\xea\x2c\xc5\xf5\xb9\x6a\x4a\xd7\ \x31\x99\x9c\xc8\x71\x24\x5d\x15\x1d\xef\xfc\xfe\x7d\xc6\x4f\xdd\ \xf6\xae\x80\x97\x27\x3b\x43\x2b\xec\xf9\xd9\x62\x3f\x6b\x78\x89\ \xa4\xbf\x7b\x80\x84\x98\xc3\x94\x26\xe6\x22\x84\x5d\x05\xd7\xb9\ \x26\x93\x13\x9c\x8c\x9f\xc2\x52\xd6\xbd\x6d\xb1\x2a\x61\x61\x57\ \x20\xc8\x9f\xc3\x94\x97\x48\x62\xd1\x72\x5b\x6d\x3f\xc5\x2d\x69\ \xf2\xd0\xca\x9a\x2c\xb5\xb5\xd2\x00\xeb\xcb\x6a\x19\x4b\x5c\xf3\ \x3d\x7f\x60\x05\xc2\xd4\x75\x2a\xac\xa1\xb5\xd2\x00\x73\xd6\x2c\ \x52\x49\x5b\xf1\xe3\x3d\x6f\xdb\xf0\x96\x34\xed\xa5\x42\xf7\x1f\ \x0f\xda\xe0\x4e\x78\x4b\x9a\x8c\x25\xae\x71\x61\xe0\x72\x41\x17\ \xd5\xbc\x2a\xe0\xec\xe5\x2c\xe5\x55\x66\x89\xee\x76\x13\x1d\xab\ \x4a\xaa\x3d\x7b\x7b\x7d\x59\x2d\xe3\xc6\xa7\xbe\x2d\x52\x17\x6b\ \xc8\xaa\x84\x61\x2d\x00\x70\x6e\xdf\x87\xf9\x57\xa0\xbf\x7b\xc0\ \x56\x59\xc3\x4b\x25\xed\xcd\x94\x26\x47\x0f\x1e\xb3\xdd\xc4\xa9\ \x64\x4a\x24\x39\x1a\x3f\x9e\xd3\x2a\x49\x61\x60\x49\x93\xae\x3f\ \x74\x07\xf6\xf7\x58\xe2\x1a\xa7\xe3\x83\x18\xd6\x82\x0d\x9f\x57\ \x05\x24\xd9\x37\x3d\xb1\x68\x39\x73\xd6\x2c\x40\x8e\xb5\x39\x55\ \x9e\x4a\x4d\x7a\x1e\x53\x53\xba\xce\x57\x69\xb7\xca\x59\x17\xba\ \x45\xe8\xc6\xca\x26\x46\x67\x87\x6d\xae\xf3\xfb\x86\xfc\x2b\xa0\ \x0f\x1a\xe8\x3e\x6a\x2b\x3c\x63\x4e\x23\x94\xc8\x01\xb3\xa4\xc9\ \x9f\xbb\x4e\x60\x49\x93\xa9\xd4\x64\xd6\x31\xba\xb7\x4f\xc6\x4f\ \x31\x96\xb8\xe6\xab\xf4\x81\xdf\x75\xe5\x40\xbb\x15\xff\xfb\xec\ \x10\x17\x3a\x87\x50\x4a\x61\xca\x34\x81\x77\x64\x1a\x7a\xd7\x8b\ \x3b\x29\x2f\xae\xcc\x5d\x29\x2e\xda\x9a\x06\xda\xf9\xa3\xed\x3c\ \xb4\xb2\x26\x73\xf1\x71\xd8\x9f\x3e\xf6\x99\xf6\xad\xd4\xc5\x1a\ \x7c\x4b\xff\xf5\xdd\xdb\xa8\x8b\x35\x78\xb6\x89\x44\x22\x94\x40\ \x29\x45\x73\xfb\x06\x1e\x5f\xf5\x44\xc0\x3a\x6c\x31\x8e\x1e\x3c\ \x66\xef\x74\xf7\xb4\x5b\xc5\x13\x07\xde\x41\x28\x91\x69\x0f\x97\ \x93\xe8\x63\x4f\xc7\x07\x03\x2d\xd1\xb0\x16\x88\xbf\x7e\x20\xcb\ \xd1\x9c\xe0\x96\x32\xb1\x54\x66\xac\xa1\x3b\x17\x19\xea\xba\x12\ \x9c\xc0\xae\x17\x77\xb2\xaa\xa4\xda\x13\x46\xb7\x88\xde\x5a\xdb\ \x9e\xa6\xa6\x74\x9d\x67\x65\xdc\x0a\xfb\xc1\x4b\x24\x4f\xfe\xa4\ \x89\xc6\xca\xa6\xcc\x2a\x5a\xa9\x1c\x70\x67\x34\xb7\x6f\x20\xf4\ \xa6\x7e\x2a\x35\x99\xb5\x2e\x71\xf7\xbf\xee\x6d\xed\xd9\x41\x4e\ \xe2\xae\x80\x6e\x95\x84\x35\x9f\x65\x16\xf1\xd7\x0f\x60\xca\xb4\ \x2f\xb8\xde\xef\xf5\x59\x56\x02\xfa\x42\xe3\x35\x69\x93\xc2\xb0\ \x2d\x30\xac\xb7\xfd\x7a\x5c\xb7\x88\x56\xdb\x94\x69\x4c\x99\xa6\ \xb9\x7d\x03\xcd\x55\x2d\x05\x41\xe7\x75\x53\xaf\x27\x65\x52\x18\ \xf6\xbe\x33\x5d\xe7\x6d\x9f\xf6\x6b\x0d\xbd\xbd\xd7\x31\xc8\xe8\ \xec\xb0\xdd\xe3\x1a\x58\xab\xed\x0c\x3d\x17\xbc\xa0\x4d\x61\xda\ \x5b\x68\x02\x61\x8b\x29\x3f\xf5\xbd\x9c\x64\x73\xfb\x57\x69\xac\ \x6c\x22\x25\x93\xbe\x16\xa8\xe3\xf1\xb6\x2f\xdb\x55\x70\x02\xfb\ \x41\x7b\x26\xe0\xb4\x40\xaf\xde\x3e\x1d\x1f\xcc\x51\xdf\x0d\xee\ \x74\x92\x4b\x9d\xc3\x0c\xdd\xb9\x18\x78\x72\xa7\xe2\xfb\xf7\xc6\ \x03\x81\x95\x50\x21\x09\x84\x2c\x5f\x9d\xae\xe2\x07\xee\x74\x12\ \xaf\xde\xf6\x02\xd7\xaa\x37\xb6\xd7\xb1\x6d\x75\xab\x27\xb8\x12\ \x0a\x19\x96\x40\x50\x68\xf5\x47\x67\x87\x7d\xc1\xdd\x4e\x32\xd4\ \x75\x25\xa7\x02\x5e\xe0\x4e\xd5\xf7\xef\x8d\x67\x81\x8b\xb4\x44\ \x06\xc0\xe7\x95\x80\x61\x2d\xf0\x64\xdb\xa6\xac\xde\xd7\xe0\x7e\ \x93\x52\xfb\xb6\xae\x80\x13\x3c\xa8\xbf\x75\x15\x54\x08\x74\x60\ \x02\x4e\x27\x31\xac\x05\x2e\x76\xfd\xd5\x56\x3f\x25\x93\xf6\xa4\ \x0c\x9b\x98\x1f\xc5\x47\xf9\x60\xfa\x2c\x96\xca\x6f\x52\xea\x56\ \x79\xe3\xb5\x8e\xbc\xe1\xb3\x12\xf0\x5b\xba\xb6\xb4\x6f\xb2\xdd\ \x24\xdf\x30\xac\x05\x36\xb4\xd5\xb2\xb9\xfa\xa9\x50\x27\x71\xf6\ \xb8\x14\x8a\x0d\x6d\xb5\x3c\xbd\x7e\x7b\xe1\x09\x78\xc5\x85\xce\ \x21\x52\x32\x19\xea\x26\x5e\x22\x8c\x76\x8d\x31\x78\xfb\xdd\x40\ \x70\xbf\x1e\x7f\xe3\xb5\x8e\xa5\x27\x20\x94\xb0\x5b\x25\xc8\x49\ \xc2\xae\x03\x7e\xae\x22\xd2\xd2\x06\xf7\x8b\x42\xaa\x10\x71\x83\ \x3b\x5d\x44\xaf\x04\x0b\x01\xd7\x31\x12\xcf\x54\x40\xb7\x88\x06\ \xcf\x37\xf2\xad\x42\xc4\x69\x71\x7e\x2e\x52\x08\xf8\xbd\x0a\xd4\ \xb2\x6d\x75\x6b\xa8\x0d\xde\x6f\x15\x22\x7e\x0e\xe2\xa5\x7e\x3e\ \xe0\x5a\xf1\x91\xce\x31\xde\x1f\xff\xcb\x7d\x3d\x38\xd9\xf7\xea\ \xfe\xac\x31\xf3\x4e\xe0\x89\xdd\x8d\x34\x57\xb5\xd8\xfe\x5d\x08\ \xf8\x52\xdd\xc4\xb3\x8a\x3f\x0e\x1f\x23\xe2\xbe\x52\x7e\xd8\x31\ \x82\xa5\x4c\x3e\x98\x3e\x9b\xd7\x82\xca\x0d\xae\xe3\x4a\xf7\xa7\ \x4b\xae\x80\x53\xf1\x7d\xaf\xee\x47\xa4\x04\x22\x25\xf2\x9b\x03\ \x4d\xbb\xbf\x12\xea\xdf\xfa\x04\x5e\xe0\x4b\x71\x12\x2f\x70\x00\ \x91\x12\x3c\xfa\x83\xf5\xb4\x3e\xba\x33\xbf\x0a\x0c\xc7\xaf\x62\ \x0a\xd3\xd3\xbf\x9d\xd0\x40\xe8\xe4\x2c\xa4\x02\x5e\xe0\x4e\xc5\ \xf5\x5c\x08\x4c\xc0\xbd\x22\x74\x02\x3b\x07\xcf\xd7\x55\xf2\xa9\ \x40\x18\xb8\x8e\xa0\x2a\x44\x9c\xbe\xad\x84\xe2\xdc\xcd\x53\x9e\ \x33\xbe\x50\x3b\x1c\xe9\xf0\x77\xa1\x7c\xc1\xbd\x1c\xc9\x37\x81\ \xc6\xf6\x5a\xbe\xb6\xf6\x1b\x9e\xd0\x4b\xf1\xf1\x8d\x2f\xd5\xe5\ \x54\x60\x29\xe0\xce\x2a\xf8\x26\x70\xfc\x7c\xe6\x7f\xff\xe7\x6e\ \x9e\x5a\x92\xda\x61\x15\xb8\x1f\x70\x67\xcc\x5c\x9d\xcf\xd9\x57\ \x0c\x30\x3d\x32\xc7\xc4\x99\xcf\x59\xce\x88\xae\x8c\xf0\x8f\x9e\ \x7f\x2f\xdb\x78\x33\x57\xe7\x91\xa6\xbd\x14\x51\xce\x04\x7e\x79\ \xad\x6f\xfc\x81\xf8\xbd\x50\x9e\x11\x07\x52\x64\x1e\x74\x53\x04\ \x50\x51\x1f\x6b\x01\x62\x64\x1e\x5f\x16\x3d\xc0\xf0\x6a\x11\x7e\ \x12\x98\x00\xe6\xf5\x63\xbf\xab\x8b\xf0\xd1\xff\x83\x04\x04\x60\ \x90\xf9\x35\x97\xd4\x09\xcc\x3e\xe0\xe0\x39\x89\xe8\x5f\x70\xfd\ \x07\x7f\x13\x8b\x6b\x3e\xe4\x89\xec\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x0c\x94\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x25\x69\x43\x43\x50\x69\x63\x63\x00\x00\x48\xc7\x9d\ \x96\x77\x54\x54\xd7\x16\x87\xcf\xbd\x77\x7a\xa1\xcd\x30\x74\x18\ \x7a\xaf\x52\x06\x10\xe9\x1d\xa4\x57\x51\x18\x66\x06\x18\xca\x00\ \xc3\x0c\xd8\x0b\x22\x2a\x10\x51\x44\xa4\x29\x82\x04\x05\x0c\x18\ \x0d\x45\x62\x45\x14\x0b\x01\x51\x01\x7b\x40\x82\x80\x12\x83\x51\ \x6c\xa8\x64\x46\xd6\x4a\x7c\x79\x79\xef\xe5\xe5\xf7\xc7\x3d\xdf\ \xda\x67\xef\x73\xf7\xd9\x7b\xdf\xb5\x2e\x00\x24\x2f\x3f\x2e\x2f\ \x1d\x96\x02\x20\x8d\x27\xe0\x07\x7b\xba\xd0\x23\xa3\xa2\xe9\xd8\ \x7e\x00\x03\x3c\xc0\x00\x73\x00\x98\xac\xac\x0c\xff\x10\x8f\x50\ \x20\x92\xb7\xbb\x2b\x3d\x4b\xe4\x04\xfe\x45\xaf\x87\x01\x24\x5e\ \x6f\x19\x7b\x05\xd2\xe9\xe0\xff\x93\x34\x2b\x83\x2f\x00\x00\x0a\ \x14\xf1\x12\x36\x27\x8b\x25\xe2\x3c\x11\xa7\xe6\x08\x32\xc4\xf6\ \x59\x11\x53\xe3\x53\xc4\x0c\xa3\xc4\xcc\x17\x25\x28\x62\x79\x31\ \x27\x2e\xb2\xd1\x67\x9f\x45\x76\x12\x33\x3b\x8d\xc7\x16\xb1\x38\ \xe7\x0c\x76\x1a\x5b\xcc\x3d\x22\xde\x91\x2d\xe4\x88\x18\xf1\x13\ \x71\x7e\x36\x97\x93\x23\xe2\xdb\x22\xd6\x4a\x15\xa6\x71\x45\xfc\ \x56\x1c\x9b\xc6\x61\x66\x01\x80\x22\x89\xed\x02\x0e\x2b\x49\xc4\ \x66\x22\x26\xf1\x43\x83\x5d\x45\xbc\x14\x00\x1c\x29\xf1\x0b\x8e\ \xff\x82\x05\x9c\xd5\x02\xf1\xa5\x5c\xd3\x33\xd6\xf0\xb9\x89\x49\ \x02\xba\x1e\x4b\x9f\x6e\x6e\x6b\xcb\xa0\x7b\x71\x72\x52\x39\x02\ \x81\x71\x20\x93\x95\xc2\xe4\xb3\xe9\xae\xe9\x69\x19\x4c\xde\x1a\ \x00\x16\xef\xfc\x59\x32\xe2\xda\xd2\x45\x45\xb6\x36\xb7\xb5\xb6\ \x36\xb6\x30\x31\xff\xa2\x50\xff\x75\xf3\x6f\x4a\xdc\xdb\x45\x7a\ \x19\xf4\xb9\x67\x10\xad\xef\x0f\xdb\x5f\xf9\xa5\xd7\x01\xc0\x98\ \x13\xd5\x66\xf7\x1f\xb6\xf8\x0a\x00\x3a\xb6\x01\x20\x7f\xef\x0f\ \x9b\xd6\x21\x00\x24\x45\x7d\x6b\x1f\xf8\xe2\x3e\x34\xf1\xbc\x24\ \x09\x04\x19\x76\xa6\xa6\x39\x39\x39\x26\x5c\x0e\xcb\x44\x5c\xd0\ \xdf\xf5\x3f\x1d\xfe\x86\xbe\x78\x9f\x89\xf8\xb8\xdf\xcb\x43\x77\ \xe3\x24\x30\x85\xa9\x02\xba\xb8\x6e\xac\xf4\xd4\x74\x21\x9f\x9e\ \x95\xc1\x64\x71\xe8\xc6\x7f\x1e\xe2\x7f\x1c\xf8\xd7\x79\x18\x05\ \x73\x12\x38\x7c\x0e\x4f\x14\x11\x2e\x9a\x32\x2e\x2f\x51\xd4\x6e\ \x1e\x9b\x2b\xe0\xa6\xf3\xe8\x5c\xde\x7f\x6a\xe2\x3f\x0c\xfb\x93\ \x16\xe7\x5a\x24\x4a\xfd\x27\x40\x8d\x35\x01\x52\x03\x54\x80\xfc\ \xdc\x07\x50\x14\x22\x40\x62\x0e\x8a\xbb\xfe\x7b\xdf\xfc\xf0\xe1\ \x20\x50\xb4\x46\xa8\x4d\x2e\xce\xfd\x67\x41\xff\x7e\x2a\x5c\x2c\ \x7e\x64\x71\x13\x3f\xc7\xb9\x06\x87\xd2\x59\x42\x7e\xf6\xe2\x9e\ \xf8\xb3\x04\x68\x40\x00\x92\x80\x0a\x14\x80\x2a\xd0\x04\x7a\xc0\ \x18\x58\x00\x1b\x60\x0f\x9c\x80\x3b\xf0\x01\x01\x20\x14\x44\x81\ \x55\x80\x05\x92\x40\x1a\xe0\x83\x1c\xb0\x1e\x6c\x01\xf9\xa0\x10\ \xec\x06\xfb\x40\x25\xa8\x01\xf5\xa0\x11\xb4\x80\x13\xa0\x03\x9c\ \x06\x17\xc0\x65\x70\x1d\xdc\x00\x43\xe0\x3e\x18\x05\x13\xe0\x19\ \x98\x05\xaf\xc1\x3c\x04\x41\x58\x88\x0c\x51\x20\x05\x48\x0d\xd2\ \x86\x0c\x21\x0b\x88\x01\x2d\x83\xdc\x21\x3f\x28\x18\x8a\x82\xe2\ \xa0\x44\x88\x07\x09\xa1\xf5\xd0\x56\xa8\x10\x2a\x81\x2a\xa1\x5a\ \xa8\x11\xfa\x16\x3a\x05\x5d\x80\xae\x42\x83\xd0\x5d\x68\x0c\x9a\ \x86\x7e\x85\xde\xc3\x08\x4c\x82\xa9\xb0\x0a\xac\x03\x9b\xc2\x0c\ \xd8\x19\xf6\x85\x43\xe1\x95\x70\x22\x9c\x09\xaf\x85\xf3\xe0\x5d\ \x70\x39\x5c\x07\x1f\x83\xdb\xe1\x0b\xf0\x75\x78\x08\x1e\x85\x9f\ \xc1\x73\x08\x40\x88\x08\x0d\x51\x47\x8c\x11\x06\xe2\x8a\x04\x20\ \xd1\x48\x02\xc2\x47\x36\x22\x05\x48\x19\x52\x87\xb4\x20\x5d\x48\ \x2f\x72\x0b\x19\x45\x66\x90\x77\x28\x0c\x8a\x82\xa2\xa3\x8c\x51\ \xf6\x28\x2f\x54\x18\x8a\x85\xca\x44\x6d\x44\x15\xa1\x2a\x51\x47\ \x51\xed\xa8\x1e\xd4\x2d\xd4\x18\x6a\x16\xf5\x09\x4d\x46\x2b\xa3\ \x0d\xd1\x76\x68\x6f\x74\x24\x3a\x11\x9d\x83\xce\x47\x97\xa1\x1b\ \xd0\x6d\xe8\x4b\xe8\x21\xf4\x04\xfa\x35\x06\x83\xa1\x61\x74\x31\ \x36\x18\x2f\x4c\x14\x26\x19\xb3\x0e\x53\x84\x39\x80\x69\xc5\x9c\ \xc7\x0c\x62\xc6\x31\x73\x58\x2c\x56\x01\x6b\x88\x75\xc0\x06\x60\ \x99\x58\x01\x36\x1f\x5b\x81\x3d\x86\x3d\x87\xbd\x89\x9d\xc0\xbe\ \xc5\x11\x71\x6a\x38\x0b\x9c\x07\x2e\x1a\xc7\xc3\xe5\xe2\xca\x70\ \x4d\xb8\xb3\xb8\x9b\xb8\x49\xdc\x3c\x5e\x0a\xaf\x8d\xb7\xc3\x07\ \xe0\xd9\xf8\x35\xf8\x62\x7c\x3d\xbe\x0b\x3f\x80\x9f\xc0\xcf\x13\ \xa4\x09\xba\x04\x07\x42\x28\x21\x99\xb0\x85\x50\x4e\x68\x21\x5c\ \x22\x3c\x20\xbc\x24\x12\x89\x1a\x44\x5b\x62\x10\x91\x4b\xdc\x4c\ \x2c\x27\x1e\x27\x5e\x21\x8e\x11\xdf\x91\x64\x48\x06\x24\x57\x52\ \x0c\x49\x48\xda\x45\x3a\x42\x3a\x4f\xba\x4b\x7a\x49\x26\x93\x75\ \xc8\x4e\xe4\x68\xb2\x80\xbc\x8b\xdc\x48\xbe\x48\x7e\x44\x7e\x2b\ \x41\x91\x30\x91\xf0\x96\x60\x4b\x6c\x92\xa8\x92\x68\x97\xb8\x29\ \xf1\x5c\x12\x2f\xa9\x2d\xe9\x2c\xb9\x4a\x72\xad\x64\x99\xe4\x49\ \xc9\x01\xc9\x19\x29\xbc\x94\x8e\x94\xab\x14\x53\x6a\xa3\x54\x95\ \xd4\x29\xa9\x11\xa9\x39\x69\x8a\xb4\xb9\x74\x80\x74\x9a\x74\x91\ \x74\x93\xf4\x55\xe9\x29\x19\xac\x8c\x8e\x8c\xbb\x0c\x5b\x26\x4f\ \xe6\xb0\xcc\x45\x99\x71\x0a\x42\xd1\xa4\xb8\x52\x58\x94\xad\x94\ \x7a\xca\x25\xca\x04\x15\x43\xd5\xa5\x7a\x53\x93\xa9\x85\xd4\x6f\ \xa8\xfd\xd4\x59\x59\x19\x59\x4b\xd9\x70\xd9\xd5\xb2\x55\xb2\x67\ \x64\x47\x69\x08\x4d\x87\xe6\x4d\x4b\xa5\x15\xd3\x4e\xd0\x86\x69\ \xef\xe5\x54\xe4\x9c\xe5\x38\x72\x3b\xe5\x5a\xe4\x6e\xca\xbd\x91\ \x57\x92\x77\x92\xe7\xc8\x17\xc8\xb7\xca\x0f\xc9\xbf\x57\xa0\x2b\ \xb8\x2b\xa4\x28\xec\x51\xe8\x50\x78\xa8\x88\x52\x34\x50\x0c\x52\ \xcc\x51\x3c\xa8\x78\x49\x71\x46\x89\xaa\x64\xaf\xc4\x52\x2a\x50\ \x3a\xa1\x74\x4f\x19\x56\x36\x50\x0e\x56\x5e\xa7\x7c\x58\xb9\x4f\ \x79\x4e\x45\x55\xc5\x53\x25\x43\xa5\x42\xe5\xa2\xca\x8c\x2a\x4d\ \xd5\x49\x35\x59\xb5\x54\xf5\xac\xea\xb4\x1a\x45\x6d\x99\x1a\x57\ \xad\x54\xed\x9c\xda\x53\xba\x2c\xdd\x99\x9e\x4a\x2f\xa7\xf7\xd0\ \x67\xd5\x95\xd5\xbd\xd4\x85\xea\xb5\xea\xfd\xea\xf3\x1a\xba\x1a\ \x61\x1a\xb9\x1a\xad\x1a\x0f\x35\x09\x9a\x0c\xcd\x04\xcd\x52\xcd\ \x6e\xcd\x59\x2d\x35\x2d\x7f\xad\xf5\x5a\xcd\x5a\xf7\xb4\xf1\xda\ \x0c\xed\x24\xed\xfd\xda\xbd\xda\x6f\x74\x74\x75\x22\x74\xb6\xeb\ \x74\xe8\x4c\xe9\xca\xeb\x7a\xeb\xae\xd5\x6d\xd6\x7d\xa0\x47\xd6\ \x73\xd4\xcb\xd4\xab\xd3\xbb\xad\x8f\xd1\x67\xe8\xa7\xe8\x1f\xd0\ \xbf\x61\x00\x1b\x58\x19\x24\x19\x54\x19\x0c\x18\xc2\x86\xd6\x86\ \x5c\xc3\x03\x86\x83\x46\x68\x23\x5b\x23\x9e\x51\x9d\xd1\x88\x31\ \xc9\xd8\xd9\x38\xdb\xb8\xd9\x78\xcc\x84\x66\xe2\x67\x92\x6b\xd2\ \x61\xf2\xdc\x54\xcb\x34\xda\x74\x8f\x69\xaf\xe9\x27\x33\x2b\xb3\ \x54\xb3\x7a\xb3\xfb\xe6\x32\xe6\x3e\xe6\xb9\xe6\x5d\xe6\xbf\x5a\ \x18\x58\xb0\x2c\xaa\x2c\x6e\x2f\x21\x2f\xf1\x58\xb2\x69\x49\xe7\ \x92\x17\x96\x86\x96\x1c\xcb\x83\x96\x77\xac\x28\x56\xfe\x56\xdb\ \xad\xba\xad\x3e\x5a\xdb\x58\xf3\xad\x5b\xac\xa7\x6d\xb4\x6c\xe2\ \x6c\xaa\x6d\x46\x18\x54\x46\x20\xa3\x88\x71\xc5\x16\x6d\xeb\x62\ \xbb\xc9\xf6\xb4\xed\x3b\x3b\x6b\x3b\x81\xdd\x09\xbb\x5f\xec\x8d\ \xed\x53\xec\x9b\xec\xa7\x96\xea\x2e\xe5\x2c\xad\x5f\x3a\xee\xa0\ \xe1\xc0\x74\xa8\x75\x18\x5d\x46\x5f\x16\xb7\xec\xd0\xb2\x51\x47\ \x75\x47\xa6\x63\x9d\xe3\x63\x27\x4d\x27\xb6\x53\x83\xd3\xa4\xb3\ \xbe\x73\xb2\xf3\x31\xe7\xe7\x2e\x66\x2e\x7c\x97\x36\x97\x37\xae\ \x76\xae\x1b\x5c\xcf\xbb\x21\x6e\x9e\x6e\x05\x6e\xfd\xee\x32\xee\ \x61\xee\x95\xee\x8f\x3c\x34\x3c\x12\x3d\x9a\x3d\x66\x3d\xad\x3c\ \xd7\x79\x9e\xf7\x42\x7b\xf9\x7a\xed\xf1\x1a\xf1\x56\xf1\x66\x79\ \x37\x7a\xcf\xfa\xd8\xf8\x6c\xf0\xe9\xf1\x25\xf9\x86\xf8\x56\xfa\ \x3e\xf6\x33\xf0\xe3\xfb\x75\xf9\xc3\xfe\x3e\xfe\x7b\xfd\x1f\x2c\ \xd7\x5e\xce\x5b\xde\x11\x00\x02\xbc\x03\xf6\x06\x3c\x0c\xd4\x0d\ \xcc\x0c\xfc\x3e\x08\x13\x14\x18\x54\x15\xf4\x24\xd8\x3c\x78\x7d\ \x70\x6f\x08\x25\x24\x36\xa4\x29\xe4\x75\xa8\x4b\x68\x71\xe8\xfd\ \x30\xbd\x30\x61\x58\x77\xb8\x64\x78\x4c\x78\x63\xf8\x9b\x08\xb7\ \x88\x92\x88\xd1\x48\xd3\xc8\x0d\x91\xd7\xa3\x14\xa3\xb8\x51\x9d\ \xd1\xd8\xe8\xf0\xe8\x86\xe8\xb9\x15\xee\x2b\xf6\xad\x98\x88\xb1\ \x8a\xc9\x8f\x19\x5e\xa9\xbb\x72\xf5\xca\xab\xab\x14\x57\xa5\xae\ \x3a\x13\x2b\x19\xcb\x8c\x3d\x19\x87\x8e\x8b\x88\x6b\x8a\xfb\xc0\ \x0c\x60\xd6\x31\xe7\xe2\xbd\xe3\xab\xe3\x67\x59\xae\xac\xfd\xac\ \x67\x6c\x27\x76\x29\x7b\x9a\xe3\xc0\x29\xe1\x4c\x26\x38\x24\x94\ \x24\x4c\x25\x3a\x24\xee\x4d\x9c\x4e\x72\x4c\x2a\x4b\x9a\xe1\xba\ \x72\x2b\xb9\x2f\x92\xbd\x92\x6b\x92\xdf\xa4\x04\xa4\x1c\x49\x59\ \x48\x8d\x48\x6d\x4d\xc3\xa5\xc5\xa5\x9d\xe2\xc9\xf0\x52\x78\x3d\ \xe9\xaa\xe9\xab\xd3\x07\x33\x0c\x33\xf2\x33\x46\x33\xed\x32\xf7\ \x65\xce\xf2\x7d\xf9\x0d\x59\x50\xd6\xca\xac\x4e\x01\x55\xf4\x33\ \xd5\x27\xd4\x13\x6e\x13\x8e\x65\x2f\xcb\xae\xca\x7e\x9b\x13\x9e\ \x73\x72\xb5\xf4\x6a\xde\xea\xbe\x35\x06\x6b\x76\xae\x99\x5c\xeb\ \xb1\xf6\xeb\x75\xa8\x75\xac\x75\xdd\xeb\xd5\xd7\x6f\x59\x3f\xb6\ \xc1\x79\x43\xed\x46\x68\x63\xfc\xc6\xee\x4d\x9a\x9b\xf2\x36\x4d\ \x6c\xf6\xdc\x7c\x74\x0b\x61\x4b\xca\x96\x1f\x72\xcd\x72\x4b\x72\ \x5f\x6d\x8d\xd8\xda\x95\xa7\x92\xb7\x39\x6f\x7c\x9b\xe7\xb6\xe6\ \x7c\x89\x7c\x7e\xfe\xc8\x76\xfb\xed\x35\x3b\x50\x3b\xb8\x3b\xfa\ \x77\x2e\xd9\x59\xb1\xf3\x53\x01\xbb\xe0\x5a\xa1\x59\x61\x59\xe1\ \x87\x22\x56\xd1\xb5\xaf\xcc\xbf\x2a\xff\x6a\x61\x57\xc2\xae\xfe\ \x62\xeb\xe2\x83\xbb\x31\xbb\x79\xbb\x87\xf7\x38\xee\x39\x5a\x22\ \x5d\xb2\xb6\x64\x7c\xaf\xff\xde\xf6\x52\x7a\x69\x41\xe9\xab\x7d\ \xb1\xfb\xae\x96\x59\x96\xd5\xec\x27\xec\x17\xee\x1f\x2d\xf7\x2b\ \xef\xac\xd0\xaa\xd8\x5d\xf1\xa1\x32\xa9\x72\xa8\xca\xa5\xaa\xb5\ \x5a\xb9\x7a\x67\xf5\x9b\x03\xec\x03\x37\x0f\x3a\x1d\x6c\xa9\x51\ \xa9\x29\xac\x79\x7f\x88\x7b\xe8\x4e\xad\x67\x6d\x7b\x9d\x4e\x5d\ \xd9\x61\xcc\xe1\xec\xc3\x4f\xea\xc3\xeb\x7b\xbf\x66\x7c\xdd\xd8\ \xa0\xd8\x50\xd8\xf0\xf1\x08\xef\xc8\xe8\xd1\xe0\xa3\x3d\x8d\x36\ \x8d\x8d\x4d\xca\x4d\xc5\xcd\x70\xb3\xb0\x79\xfa\x58\xcc\xb1\x1b\ \xdf\xb8\x7d\xd3\xd9\x62\xdc\x52\xdb\x4a\x6b\x2d\x3c\x0e\x8e\x0b\ \x8f\x3f\xfd\x36\xee\xdb\xe1\x13\xbe\x27\xba\x4f\x32\x4e\xb6\x7c\ \xa7\xfd\x5d\x75\x1b\xa5\xad\xa0\x1d\x6a\x5f\xd3\x3e\xdb\x91\xd4\ \x31\xda\x19\xd5\x39\x78\xca\xe7\x54\x77\x97\x7d\x57\xdb\xf7\x26\ \xdf\x1f\x39\xad\x7e\xba\xea\x8c\xec\x99\xe2\xb3\x84\xb3\x79\x67\ \x17\xce\xad\x3d\x37\x77\x3e\xe3\xfc\xcc\x85\xc4\x0b\xe3\xdd\xb1\ \xdd\xf7\x2f\x46\x5e\xbc\xdd\x13\xd4\xd3\x7f\xc9\xf7\xd2\x95\xcb\ \x1e\x97\x2f\xf6\x3a\xf7\x9e\xbb\xe2\x70\xe5\xf4\x55\xbb\xab\xa7\ \xae\x31\xae\x75\x5c\xb7\xbe\xde\xde\x67\xd5\xd7\xf6\x83\xd5\x0f\ \x6d\xfd\xd6\xfd\xed\x03\x36\x03\x9d\x37\x6c\x6f\x74\x0d\x2e\x1d\ \x3c\x7b\xd3\xf1\xe6\x85\x5b\x6e\xb7\x2e\xdf\xf6\xbe\x7d\x7d\x68\ \xf9\xd0\xe0\x70\xd8\xf0\x9d\x91\x98\x91\xd1\x3b\xec\x3b\x53\x77\ \x53\xef\xbe\xb8\x97\x7d\x6f\xfe\xfe\xe6\x07\xe8\x07\x05\x0f\xa5\ \x1e\x96\x3d\x52\x7e\x54\xf7\xa3\xfe\x8f\xad\xa3\xd6\xa3\x67\xc6\ \xdc\xc6\xfa\x1e\x87\x3c\xbe\x3f\xce\x1a\x7f\xf6\x53\xd6\x4f\x1f\ \x26\xf2\x9e\x90\x9f\x94\x4d\xaa\x4d\x36\x4e\x59\x4c\x9d\x9e\xf6\ \x98\xbe\xf1\x74\xc5\xd3\x89\x67\x19\xcf\xe6\x67\xf2\x7f\x96\xfe\ \xb9\xfa\xb9\xde\xf3\xef\x7e\x71\xfa\xa5\x6f\x36\x72\x76\xe2\x05\ \xff\xc5\xc2\xaf\x45\x2f\x15\x5e\x1e\x79\x65\xf9\xaa\x7b\x2e\x70\ \xee\xd1\xeb\xb4\xd7\xf3\x6f\x0a\xde\x2a\xbc\x3d\xfa\x8e\xf1\xae\ \xf7\x7d\xc4\xfb\xc9\xf9\x9c\x0f\xd8\x0f\xe5\x1f\xf5\x3f\x76\x7d\ \xf2\xfd\xf4\x60\x21\x6d\x61\xe1\x37\xf7\x84\xf3\xfb\xa0\x0d\x39\ \x66\x00\x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x01\xa5\x49\x44\x41\x54\x28\xcf\x4d\x90\ \x4f\x28\xc3\x61\x1c\xc6\xbf\x71\x58\x5c\xa5\xa5\xb8\x72\x95\x3b\ \x6a\x97\xb9\xf8\x13\xb9\xcd\x41\x72\x93\x37\xa3\x26\x29\x0e\x1a\ \x93\xa6\xed\xf7\xd2\x26\xcc\x96\x4d\x34\x76\x61\xf9\x7b\x21\x07\ \xe5\x34\xb4\x64\xc8\xa8\x69\xe4\xcf\xd5\xe5\xf1\xfc\x36\x07\xbf\ \x4f\xbf\x7a\xde\xe7\xfb\xbc\xdf\xf7\xfb\xbe\xd2\x2e\x1d\xd2\x29\ \x5d\xb2\x58\xa9\x9b\x74\xb7\xee\x23\xdd\xba\xc9\xa8\xec\xa2\xdb\ \x21\xed\x22\x66\x40\x5b\x74\xe3\xda\xe8\x6d\xea\x0b\x1f\xe4\x0b\ \xe9\xd4\xda\xa8\xd1\xa8\x2d\x7f\x01\x6d\x31\x5a\x8f\xc3\x1f\xb8\ \x44\x12\xeb\x24\x49\xf5\x8e\x83\xb0\xaf\x55\x5b\x18\x68\x13\x7f\ \xf3\x51\xe4\x15\x5b\x64\x1f\x47\x24\x89\x4d\xea\x1c\x92\x11\x7f\ \x73\x9b\x88\xcf\x1a\x1a\xcf\xd3\x4a\x60\x0f\x51\x98\x5f\x14\xbb\ \xd8\xa6\xf3\x82\xa5\x71\x9f\x55\xe6\x6d\xa9\xeb\x33\xc4\x18\xd8\ \x40\xa4\x10\x88\x50\x6d\xf3\xa8\x53\x5c\x5c\xcf\xdb\xc4\xeb\xc8\ \x21\x8e\x1d\x84\xc8\x32\xbe\xf1\x86\x45\x2c\x90\x55\xba\x77\xf0\ \x3a\x64\x6e\xe0\xbe\xb0\xf8\x41\x1e\x59\x3c\xf3\xec\x3c\x47\xfc\ \x44\x90\xee\x0d\xe6\x06\x64\x76\xf0\x0e\x2b\x6c\xf8\x84\xc7\x7f\ \xe5\x6f\x04\xe8\x5e\x61\x76\x50\x3c\xbd\x0f\x9c\x60\x95\x8d\x4d\ \xcc\x72\x51\x05\xe8\x5e\xc1\xd3\x2b\xd3\xf6\xb3\xf4\x21\x96\x48\ \x80\x98\xbb\x03\x7f\x1c\xe2\x24\x3d\x6d\x17\x77\x95\xdf\xfd\xc0\ \x01\x83\x85\x48\xb1\x79\x90\x7f\x08\x19\x18\x6e\x77\x95\xd4\xcb\ \x54\x4b\x2c\x9e\xe5\x0d\x16\x68\x17\x3b\x69\xae\xb2\x88\xc5\xa7\ \x5a\xea\x45\xac\x32\x51\x36\xe9\x88\x25\x72\x7c\xc3\x30\xbc\x24\ \x4c\x95\x43\x34\x31\xe9\x98\x28\xb3\x8a\xa8\x12\x55\xee\xac\x76\ \xf5\x78\x8c\xf3\xcc\x1b\x8a\x9c\x67\x3c\x86\xab\xc7\x59\xa3\xca\ \x55\x89\xa8\x52\x55\xa1\x6a\x55\x83\xd3\x36\xdc\x3f\x32\x36\x32\ \x43\xc6\x86\xfb\x87\x6c\xaa\x41\xd5\xb1\x52\xfa\x0b\xba\xb4\x57\ \x14\x44\xe0\xc7\xe7\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\ \x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x31\x2d\x31\x32\ \x2d\x31\x35\x54\x31\x36\x3a\x34\x37\x3a\x34\x34\x2b\x30\x39\x3a\ \x30\x30\xe3\x9f\x23\xde\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\ \x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x31\x2d\x31\ \x32\x2d\x31\x35\x54\x31\x36\x3a\x34\x37\x3a\x34\x34\x2b\x30\x39\ \x3a\x30\x30\x92\xc2\x9b\x62\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x06\x3d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ \x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x0c\ \x1e\x0e\x16\x27\x05\xd5\x66\x2c\x00\x00\x00\x06\x62\x4b\x47\x44\ \x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x05\xca\x49\x44\ \x41\x54\x78\xda\xed\x97\x6b\x6c\x14\x55\x14\xc7\xff\x77\x9e\x3b\ \xbb\xdb\xee\x8b\xd2\x76\xfb\xa0\xd0\x2d\xb4\xa5\x50\xa0\x08\xb4\ \x86\x52\xa0\x8a\x34\x4d\x4a\x89\xbc\x22\x51\x30\x80\x11\x14\x8b\ \x80\xb4\x1a\x68\x11\x81\x44\x2a\x44\xde\x04\x49\xa0\xad\xc5\x44\ \x54\x3e\x10\xd1\xc6\x04\x51\xe4\xd1\xc6\x20\x41\x40\x84\x80\xbc\ \x8a\x02\x4a\x4b\x69\xbb\xcf\xb9\xde\x99\x59\x68\x89\x89\x7e\x80\ \xc5\x0f\x7a\x36\xff\x9c\xc9\x66\x27\xff\xdf\x3d\xe7\xdc\xbb\x33\ \x04\xff\x72\xfc\x77\x00\xca\xd6\x1f\x8a\x2d\x18\xe4\x4e\x95\x44\ \xae\xa9\x28\x37\x25\xf0\xd8\x00\xd2\x26\xef\x04\x05\x66\x64\x7b\ \x7a\x6c\x58\x36\x73\x98\x75\xc7\xbe\x53\x87\xde\x2f\x2b\x18\x49\ \x08\x89\x3c\x40\x9f\x89\xdb\x6c\xa0\xea\x96\xd4\x44\xfb\xb4\xf9\ \x33\x47\x21\xa1\x67\x14\x66\x95\xef\xc6\xf7\xb5\xb3\x49\xc4\x01\ \xfa\x4c\xd8\x94\x0b\x1a\xfa\xb0\x64\x4c\x46\xef\x92\xe2\x1c\xa8\ \xe0\xa0\xc5\x0b\x2f\x6f\xc0\x95\x86\xa5\x24\x62\x2d\x48\x9d\xb4\ \x83\xa3\x01\x5f\x85\x33\x8a\xaf\x9a\x3d\x75\xb8\x90\xd8\x2b\x16\ \x2a\xa5\xa0\xd4\x30\x7b\xe9\xd5\x75\x68\x3e\xb8\x26\x32\x00\x9e\ \x29\x35\x09\x34\xd0\x59\x97\x93\xee\x2c\x98\x58\x94\x0d\x22\xf0\ \xd0\x82\x52\x7a\xdf\x6c\x7e\x59\x35\x7e\x3b\xb6\xf5\xd1\x03\xa4\ \x4d\xad\x2d\x31\x09\x74\x47\x49\x41\xb2\xab\x5f\x5a\x4f\x84\x54\ \x8a\xee\x5d\xa6\xec\xa3\xf5\x7d\xe1\x82\x55\xb8\x75\xbc\xee\xd1\ \x01\x30\x63\x05\x94\x56\xf7\x8a\xb3\xcc\x2d\x1e\x95\x04\xd9\xc4\ \x6b\x46\x86\xd8\x07\x24\x0c\x40\x8d\xcb\x25\x0b\x2a\x71\xfb\xf4\ \x5e\x42\x29\x25\x0f\x0d\x90\x36\xa5\x36\x8b\x23\x74\x77\xde\x40\ \x57\x56\x76\x3f\x07\x28\x00\xc2\x71\xe0\x08\xa7\xe7\xee\x00\xf7\ \x28\xde\x5a\x58\x01\x4e\x90\x91\x9f\x97\x83\xfc\xdc\xc1\x8d\xdd\ \x01\xba\x7a\x45\xc8\x3f\xad\x5a\xfb\xf1\x5c\x9b\x85\xaf\x1e\x3d\ \xc4\xa9\xd8\xa2\x45\x70\x1c\x0f\x9e\xe7\x59\xd6\x14\x06\x20\x9a\ \x48\x77\x07\x98\x65\x11\x54\x55\xf5\xeb\xf7\xd6\x6c\x31\x2a\xe0\ \x99\x5a\xe3\x56\x64\x69\xf9\xb3\x05\x9e\xf1\x31\x76\x45\xa8\x6b\ \x38\x7b\xe0\xe6\xed\xbb\xcb\xce\x7d\xf4\xfc\xb9\xbf\xae\xba\xc6\ \xc5\x40\x77\xa4\xc6\x8b\x25\xd9\x1e\x33\x04\x81\x19\x0b\x22\x33\ \x17\x58\xe6\xf5\xcc\xf1\x06\x04\x67\x40\x74\x5f\xa0\x2e\x95\x01\ \x70\xa0\x58\x59\xb5\x1a\xa4\xf7\x84\x4d\x6e\x76\xd3\xb1\x91\x43\ \xdc\x89\x39\x19\x2e\x76\x13\xc1\x4f\x17\x5b\xf1\xe5\x91\x2b\x2d\ \x7e\xbf\xff\xc9\x8b\x7b\xe7\x9d\xee\x9a\xf2\x5d\xa3\x25\x9e\xd6\ \x66\x25\xf3\x09\x31\x76\x8e\x99\x8b\x86\x44\x23\xf3\x5a\xd6\x41\ \x04\xa3\x12\xbc\xd1\x8e\xae\x39\xa0\xfa\xea\x43\x4c\x22\x07\xbc\ \xb3\xb4\x0a\x24\x79\xfc\xbb\xdb\x07\xa4\xb9\x66\xf5\xeb\x1d\x1d\ \x1e\x09\x8a\x60\x30\x84\x1b\xbf\xfb\x70\xf8\xc4\x8d\xfd\x97\xf7\ \x2f\x2e\x62\x7b\x5b\x00\xb0\xdc\xae\xa8\xe5\x7d\xdd\xe0\x24\x01\ \xba\x89\x24\x4a\x10\x24\x09\xa2\x68\x48\xd0\x33\x03\x11\x34\x31\ \x90\x7b\xed\x20\xb8\x3f\x88\xaa\x06\x10\x0a\x41\x91\x38\x2c\xaf\ \x28\x07\x49\x2a\xac\xbc\x34\xb4\xbf\x2b\xd9\xe1\xb0\x23\xda\xee\ \xd0\x4b\x76\xa7\xb5\x05\x1d\x6d\xad\x68\xba\xd8\x1e\xb0\xc4\x3b\ \xcc\xed\xcd\xea\x17\xf1\xf6\xc0\xd8\xb8\xe8\xd0\xfd\x19\x11\x25\ \x19\x92\xcc\xc4\xb2\x28\x9b\x58\x96\xf4\xef\xc2\x30\x3a\x80\xc0\ \x87\xdb\xd0\x55\x01\x7d\x7b\xaa\x0c\xc0\x15\x2d\xa1\x7c\x41\x19\ \x48\x62\xfe\x6b\xd7\x14\x99\x77\xa7\x67\x66\x23\x35\xcd\x03\x49\ \x14\xd1\xdc\x7c\x0d\x57\x2f\x9d\xc3\xd5\xb6\xf6\x90\x25\x3e\xce\ \xdc\x76\x35\xf4\xb9\xdb\x1e\x1c\xab\x90\x76\x66\xa4\xf5\x58\x80\ \xac\x99\x9a\x14\x23\x33\x19\x59\xd6\xae\xf5\x2a\x88\x1a\x80\xa0\ \x0f\xa6\x3e\x90\x5a\x48\x3c\x61\xe6\x2a\xee\xdc\xf5\xe2\xfa\xcd\ \x36\xec\xde\xb2\x1c\xc4\x96\x51\x5a\xef\x19\x3c\x68\x5a\x52\x42\ \x06\x06\x0e\xc8\x82\xc9\x24\xe3\xf4\x99\x9f\x71\xfe\xc2\x0f\x38\ \xd3\xd8\xf8\x4d\xeb\x99\xcf\x46\xa5\x14\xaf\x15\x28\x0d\x56\x8a\ \xb4\xa3\xa2\xb3\xe5\x3a\x6f\xb5\x98\xe1\x72\x39\xe1\x70\xda\x61\ \xb7\xdb\x60\xb5\x5a\x75\x29\x66\x06\xa4\x57\x46\x82\x24\x6a\x15\ \x10\x0c\x73\xca\x21\xc8\x8c\x5b\xda\xfc\xb8\xdb\xe1\x83\xcf\xef\ \x87\x4a\x43\xa8\xdf\xb8\x14\xc4\x92\x52\xe0\x91\x14\xa9\x31\xbb\ \x68\xa2\x23\x7d\xe0\x70\x46\x2f\xe0\xec\xc9\x46\x1c\xfd\xb8\xce\ \x1b\x0a\xaa\x05\xed\xbf\x1c\x3c\x86\x70\x24\x16\x56\xe5\x4b\x22\ \x6a\x25\xe2\x4b\x0e\xfa\x03\xcc\xd0\x0a\xb3\x35\x0a\x16\x26\xb3\ \x85\x65\x8b\x95\x65\x05\x66\xc5\xa4\x83\xb0\xc5\x18\xad\x11\x78\ \x80\x10\xbd\xf7\x7e\x76\x9f\xd7\xe7\x63\xad\x08\x61\xe7\xba\x25\ \xc6\x36\x94\x63\x07\x66\xc8\xd1\xd6\xb5\xf6\xde\x29\x85\x9c\x20\ \x72\xad\x97\x2f\x7f\xd7\x79\xeb\x8f\xc5\xde\x5f\x4f\x30\xf3\x07\ \x23\x3e\xff\x0d\x07\xcf\xd3\x6d\x4e\x87\x75\x92\x66\x22\x0a\xa6\ \x2e\x08\x0d\xc0\xac\x03\xe8\x52\x98\x74\x08\x51\xd2\xe7\x20\x10\ \x64\xe6\x5e\x1f\x3a\x99\x82\x6a\x10\x1f\xac\x59\xf4\xe0\x49\xd8\ \x6b\xdc\x74\x21\xe0\xed\xe4\xe6\x7c\xbd\xc7\x5f\xf5\x37\x87\x51\ \x6c\xee\x2b\x00\x55\x67\xda\x9d\x51\xeb\xdd\xc9\xbd\xac\x22\xa7\ \x18\x15\xb0\x5a\x98\xb1\xd2\x05\xa1\x67\x85\x81\xc8\xda\x30\xea\ \x2b\xf7\x31\x88\x0e\xaf\x17\x01\x06\xf0\xe9\xd6\xb7\x1f\xee\x28\ \xee\x91\xf3\x62\x9a\x6c\x12\xeb\x3d\x59\x99\x43\x7b\xb8\x92\x60\ \x92\x0c\xf3\x30\x80\x61\x6e\x66\x95\x30\xc9\xfa\x79\xe0\xa3\x41\ \xac\x5e\x34\x0d\xbe\x4e\x2f\x6c\x0e\x27\xe2\xe2\xe2\x0e\x13\x3c\ \x64\x38\xb3\xa7\x8b\x84\xa8\x2b\xdc\xa9\x29\x8b\xb3\x86\xe4\x71\ \x66\xde\x0c\xa5\x7b\x0b\x64\x59\xdf\x15\x44\x9b\x01\x01\x58\x55\ \x36\x19\x2d\xe7\x8f\x90\x2a\x4a\x51\xf9\x28\xff\x8e\x6d\x99\xa5\ \x63\x2c\x36\x4b\xcd\xd0\xb1\xe3\x12\x12\x62\xfa\xc0\x24\x88\x90\ \x99\xb9\x2c\x89\x10\xc2\x43\xa8\x4a\x1c\xd6\xbd\x39\x13\x2d\x67\ \xbf\x8d\xcc\x03\x49\x74\xda\x33\x2e\x10\x75\x7b\xdf\x11\xb9\xa5\ \x39\x23\x9e\x86\x42\x45\x6d\x57\x19\x67\x01\x00\x55\x11\xb1\x6d\ \xc5\x3c\xb4\x9c\x39\x10\xb9\x47\x32\xab\xe7\x29\xd0\x80\x77\x8e\ \x3d\x29\x61\x5d\xde\x84\xe7\xcc\xb1\x72\x0c\x38\xc0\x00\xb0\xca\ \xa8\xad\x5e\x8c\x96\x53\x5f\x45\x0a\xa0\x2b\x94\xa4\xdc\x74\x41\ \x96\xea\xfb\x8f\x2f\x19\x9c\xd9\x77\x18\xb8\xce\x00\x68\x94\x82\ \x3d\x9b\x97\xa1\xf5\x64\x43\xa4\x01\x8c\x30\x25\x8e\x90\x40\xd5\ \x95\x31\x99\xfd\x5f\x1f\x5c\x58\xca\x45\xf5\x88\x45\xc3\xc6\x15\ \xb8\x79\x7c\x5f\x77\x80\xc8\x87\x1c\xff\x44\xa1\x6c\x31\xef\xca\ \x9d\x35\xc3\x7d\xed\x68\xd3\x9d\x1f\xf7\x6e\xb6\x3d\xf6\x57\x33\ \x7b\xea\xe8\xe8\xe4\xec\xfe\xc5\xcd\x57\xae\x5f\xb8\xd5\xf4\xc9\ \x51\x84\xe3\xff\xb7\xe3\x3f\x01\x27\x85\xe0\xc7\x0d\x4c\x49\xac\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\xa3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x30\x00\x00\x00\x34\x08\x06\x00\x00\x00\xcc\x93\xbb\x91\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x04\x0b\ \x12\x08\x03\xd8\xde\xcb\x21\x00\x00\x07\x23\x49\x44\x41\x54\x68\ \xde\xd5\x9a\x5f\x6c\x1c\x47\x1d\xc7\x3f\xb3\x71\x30\xb6\x03\x49\ \x49\x62\xa2\x12\x21\x63\x45\xa0\x0a\x04\xa2\x2a\x52\x41\x55\xf9\ \xf3\x80\x50\xd3\xe0\x38\x8d\x53\xb0\x04\x8f\xc0\x4b\x85\x10\x20\ \x1e\xe8\x43\x85\x52\x22\xa4\x16\x0a\x15\x6a\x2b\x10\x34\xd8\x3e\ \xff\xaf\x71\x11\x7d\x00\x54\x2a\xb5\x12\x12\x42\x80\x4a\x4b\x1a\ \x64\x99\x2a\x72\x23\xd7\x49\xa5\xc4\x76\xec\xf8\x6e\x77\x86\x87\ \xf1\xef\x76\x76\x6f\x76\x76\xed\x18\x11\x7e\xd2\x6a\xef\xe6\x6e\ \xe7\xbe\xf3\xfd\x7e\xe7\x3b\x73\x7b\x07\xf0\x75\xc0\xdc\x14\xc7\ \xae\x3b\xdf\x24\xba\x7d\x04\x38\x0a\xec\x05\x76\x53\x52\x0a\x30\ \x0f\x7c\xdb\xf0\xa9\xbb\xf8\x9f\xd7\x95\xab\xf0\xc2\x4b\x30\x34\ \xfc\x7b\x58\xfb\x2c\x40\x0f\x70\x09\xb8\x0e\xe8\xc2\x01\x4c\xcf\ \x9a\x1d\x07\x33\x3c\x6e\x18\x1c\x50\x5b\xba\xa6\x91\xc0\xfa\x1a\ \x2c\xaf\x18\x9e\x7d\x4e\xf1\xc7\xdf\x2a\x80\x5e\xe0\xcd\xa2\x41\ \x44\xff\x0d\x26\xb5\x86\xc1\x01\x45\xb4\xc5\xde\x37\xae\xc3\x5f\ \xfe\x06\xef\x3d\xac\x38\x79\xdc\x70\xfb\xdd\x06\x60\x1e\x78\x37\ \xf0\x76\x1f\xde\x68\xa7\x81\x0f\x8f\x5b\x35\x6b\x93\x06\xad\xed\ \x79\x2b\x75\x7d\xc3\x9e\x0f\x75\x2b\xbe\x74\xbf\xa1\xf7\x23\x06\ \xe8\x2c\x1c\x44\xb4\x53\xc0\xf5\xa6\xb8\xc2\x7c\xfe\x5c\xe5\x7a\ \xad\xe1\x1f\xff\xb4\x6d\x71\x6c\x95\xe8\xbb\x07\xf6\xf7\xac\x82\ \x3a\xe0\x1d\x44\xb4\x53\xc0\x5d\xa6\x85\x79\x79\x2d\xaf\x84\x0b\ \x58\xe7\x5c\x1d\xc7\xa9\x12\x71\x0c\x77\xdd\x09\x9f\xb9\x1b\x0e\ \xbe\x6f\x29\x6f\x27\xb5\xed\x49\xac\xb5\xbf\x3d\x8a\xb2\xaf\xb9\ \xcf\xb5\x86\xb6\xb6\x14\x60\x51\x0a\x9d\xf9\x11\x3c\xf0\x15\xc3\ \x1f\x5e\x80\x3d\x5d\xf0\xef\x0b\x8a\x77\xdd\x02\x5d\x1d\x86\x3f\ \xff\x55\xf1\xc6\x6b\xea\x49\xe0\xf4\x66\x3a\xd5\xdb\x6e\x14\x78\ \x6d\x32\x4d\x1b\x61\x7a\x70\x40\x31\x3c\x61\x18\x3c\xa9\xa8\x4d\ \xd9\xb3\xb0\xeb\x3e\xf7\x95\xd1\xf0\xcd\x6f\x7d\x1f\xcc\x32\x10\ \xa7\x26\x89\x8e\xf0\x9e\x9e\xaf\x02\x7c\x0d\x78\x0a\x58\x05\xe2\ \x4a\x0a\x14\x31\x9e\x67\x5a\xde\x27\x4c\xe7\xcf\x52\xee\xf3\xc4\ \xa4\x9f\xb1\xb2\x6c\x9f\x4c\xcc\x28\xe6\xe6\xe1\xca\x55\xc3\xca\ \xca\x22\xe8\x05\x30\x8b\x10\x3f\x0f\xf5\xc7\x00\x3e\x0d\x9c\x03\ \x2e\x47\x55\x3d\xee\x63\x5e\x5e\x8f\x63\x3b\x88\xda\x94\x69\x32\ \x3d\x3c\x61\x9a\x20\x9f\xae\xa5\x04\x25\x06\x36\x1a\xb6\x2d\x31\ \xf6\xfa\x24\xb6\xcc\x77\x76\x2a\xf6\xee\x53\x7c\xf9\x8b\xf0\xbd\ \xef\xc2\x77\xbe\xa1\x38\x76\xcf\x21\xfa\xfb\xee\xe0\xe3\x9f\x38\ \x06\xbb\x07\xa5\x9b\xb7\x01\x6d\x85\x73\xa0\x08\x74\xbe\xdd\xe7\ \x69\xb7\x4d\x1e\x27\x06\xda\x77\x5b\xe0\xcd\x81\xc4\xd0\xd9\x01\ \xab\xd7\xb2\xfd\xe7\xd5\x4c\xe7\x87\xe1\x87\x3f\x55\xbc\xf1\x9a\ \x02\xf8\x1c\xf0\x0a\xb0\x18\x95\x31\x9e\x4f\x0b\x61\x59\x98\x6e\ \xdb\x9c\x45\xc3\x13\x29\xfb\x89\xb1\x0c\x6f\x34\x52\x8b\xfc\xfc\ \x57\xf6\x41\xa3\x6e\x0f\xad\x2d\xf8\xb1\x69\xd3\x92\x4a\x79\x0c\ \xf5\xba\xa1\xb3\x03\xde\xf9\x8e\xc0\x56\xc2\x4d\x8b\xb2\xf2\x31\ \xef\x63\xb9\x7d\x37\xac\x6f\xa4\x8c\xef\xe9\xca\x32\x2e\x7d\xec\ \xdb\x6b\x13\xc8\x17\xa7\x5a\xa7\x84\x3d\xf5\xb4\xe2\xef\x2f\x15\ \x28\x10\xf2\xbb\xcb\xb0\x0b\x58\x0e\xf1\xb8\x80\xd7\x1a\x86\x46\ \x0d\xeb\x1b\x16\x78\x12\x67\x55\x88\xe3\x2c\x01\x57\xae\xc2\xf0\ \x78\xda\x1e\xc7\x16\xb8\x0b\x3e\xb8\x1b\x9d\x9e\x35\xc1\x7c\x76\ \x99\x77\x19\x76\x07\xdf\xd1\x9e\xb2\x5d\xc4\xb8\xd6\xd6\x06\x2e\ \xdb\xee\xe7\x1e\xd8\x0f\x4b\x97\x5a\x41\xcb\x38\x7e\x76\x36\xa0\ \x80\xaf\x84\x5d\x61\xda\x05\x2f\x8a\x0d\x8d\xda\xde\xd7\xd6\x6d\ \x92\x08\xe3\x63\xd3\xa6\x09\x5e\x92\x4a\x6b\x78\xe2\x17\x78\x55\ \xd0\xda\xb0\x74\xc9\xf0\xbb\xe7\xb3\xc0\xcb\x44\x68\x51\x20\xf1\ \x5c\xe0\x7a\x39\xbf\xe8\x40\x6b\x9a\x48\xed\xe9\xf2\x7b\xfb\xc0\ \x7e\xb8\xfc\x16\x85\x16\xe9\x3e\xa8\x58\x5c\x32\x2d\x2a\xfd\x72\ \x24\xa0\x80\xb0\x2c\x35\x34\x9a\xa6\x83\x80\x37\x3a\x3d\x92\x38\ \x5d\x0b\xf2\x36\x89\x63\x18\x1a\x6f\xb5\x4a\xbd\x6e\x7d\xfd\x93\ \x27\x5b\xc1\x0b\xdb\xda\xc0\xe2\x92\x61\x6c\x5a\xb5\xa8\x14\x54\ \x60\xa3\xd1\x3a\x89\x3b\xda\xad\x35\x42\xe9\xb4\xa7\x0b\x96\x57\ \xfc\xef\xd9\xb7\xb7\x98\xe9\x3c\xcb\xbe\x04\x3a\x7c\xab\x62\xe1\ \x62\x9a\x90\x67\x47\x4b\x52\x08\x60\x64\xdc\x34\x19\x5e\xbd\x56\ \xbc\x36\x8c\x4c\xda\xf3\xf2\x4a\xf6\x3d\xc2\xda\xf0\xb8\x9d\x90\ \x45\x4c\x3f\xf6\x44\x2b\xe8\x3c\xe3\x17\x16\xac\x12\xa2\x6a\x50\ \x81\xb5\xf5\x14\x44\x3e\x3d\x8a\x14\x90\x44\xc9\x77\x2e\xa0\xbb\ \x0f\xaa\x66\xaa\xf8\xec\x7e\xa8\xdb\x32\x1c\xda\xc2\x68\x0d\xbd\ \x3d\x8a\xf9\xd7\x0d\x23\x93\x01\x05\xdc\xfd\x7a\xde\xd3\x79\xf0\ \xc2\xfe\xe5\xb7\x5a\x93\x44\xc0\xd7\xa6\xc2\xe0\xe3\x18\x1e\x79\ \xbc\x75\xb5\x97\xb4\x72\x3f\x77\xfe\x75\xc3\xe4\xac\x0a\x2b\xb0\ \x7a\x2d\xcb\xbc\x0b\xda\xf7\xa5\xa3\x2c\x49\x42\x3e\x17\x90\x60\ \xbf\x75\x5d\x58\x08\xef\x04\xa4\x6d\x74\xba\x64\x1d\x70\xfd\xec\ \xdb\x97\x88\xb7\x25\xb3\x43\x49\x52\x9b\x6a\x8d\x42\x9b\x44\xd9\ \x3e\x1f\x79\x3c\xcb\x7a\x1e\x78\x23\x56\x24\xda\x1e\xde\xad\x7c\ \x9e\x95\xa2\xcd\x94\x44\xe0\xa9\x7e\x43\xf7\x41\xe5\x05\xed\xd6\ \x17\xee\x33\x1c\xea\x56\xce\xd6\x20\xeb\x6b\x69\x3f\x71\xcc\xd0\ \xdb\x93\x05\xd7\x88\x55\x13\x78\x59\x15\xae\xc4\x29\x63\x29\xb2\ \xb1\x69\xdb\xe1\xe2\x92\xf1\x82\x76\x93\xa4\x36\x99\x4e\x50\x17\ \xb0\x6b\x1f\xa9\x1f\xfc\x38\x0b\x3c\xb4\x1b\x0e\x0e\xa0\x6c\x33\ \x75\xea\x44\x96\xfd\xfc\x75\x6e\x9d\xec\x33\x1c\xbe\x55\x51\xaf\ \x97\x2f\x46\xc7\x8f\xd2\x54\x21\xb4\xad\x2e\xb5\x50\x3e\x49\x5c\ \x9b\xd4\xa6\x52\xf6\x8b\x80\xbb\x49\x32\x31\x63\xa3\x2f\x78\x27\ \xce\x61\xfc\xe1\x47\xc3\x80\x93\xa4\x64\x00\x45\xc0\xa5\x49\x3c\ \x1d\x02\xee\x1e\x3e\x6f\xfb\x80\xcb\xf5\x27\x8e\xc1\x6d\xef\xf7\ \x03\x4f\x92\x8a\x16\x2a\xda\x05\x8a\xf7\x17\x2e\x9a\x42\xe0\xf9\ \x89\x3a\x39\x9b\x2a\x20\xed\x3e\xe0\x2e\xb0\x87\x1f\xcd\x02\x6f\ \x34\xca\xad\x14\x95\xa5\x49\x1c\x5b\x3f\x0b\xfb\x79\xab\xf8\x26\ \x25\xc0\x7d\x9b\x0a\x68\x4d\x26\x06\x43\xfe\x16\x15\x42\x8c\x97\ \x2a\xe0\x4e\x64\xf1\xb2\xb0\x5f\xaf\xd3\x9c\x94\x45\x13\x53\xc0\ \x4d\xce\x2a\xce\xcf\x59\xf0\x55\x26\xa5\x58\xe5\xa1\x33\xd5\xc1\ \xb7\x4c\x62\x1f\xa8\x53\xfd\x69\x9a\x54\xbd\x05\xd3\x88\x15\xc7\ \x8f\xc2\x07\x8e\x94\x83\x71\x3d\xae\x35\x9c\xf8\x3c\x7c\xf8\x83\ \xdb\x18\x80\xaf\xc6\xa6\x2d\xf0\x50\x9a\xe4\x81\x8b\xc7\x9f\xf9\ \x0d\x9c\xfb\x57\x18\x78\x91\xc7\x1f\x3a\x73\x03\x03\x90\xe5\xbe\ \x5e\x0f\x27\x49\x11\xf0\xbc\x9f\x5b\x12\xa8\x91\x02\x2f\xaa\xad\ \xa8\x10\xe5\x81\xbb\x29\x22\x3b\xc1\xa2\x55\xd1\x07\x5c\x6a\x6a\ \xd6\x2a\x20\x16\x11\xe0\x55\xab\xaa\x0a\x51\xd1\x8e\x73\xa0\x2f\ \x4d\x91\xbc\xcc\x21\xe0\x52\xfd\xf7\x5a\x05\xaa\xae\xa8\xdb\x55\ \x21\xf2\x59\x63\x7c\xc6\x02\x9f\x9b\x37\xc1\x05\x28\x34\x29\xa7\ \x7e\x0d\x2f\xbf\x7a\x63\x3f\x9c\x3c\x78\xba\xfc\x9e\x95\xf7\xc6\ \xd6\x40\x9f\xe1\x48\x6f\xba\x8d\xdd\x0a\xf0\xed\xa6\x89\xaf\x4e\ \xf6\x95\xf7\x91\x51\x20\xd1\x8a\xf1\x19\x0b\xfa\xfc\x5c\x35\xf9\ \xf3\xc0\xa5\x9e\x79\x76\xfb\x0a\xb8\x7d\x3d\x78\x3a\xbc\xee\x44\ \x2e\x78\x19\x75\x59\x7e\x0b\x68\x1f\xf0\xed\x24\x49\xd1\xd6\x22\ \x8e\xed\x4e\xf5\x8e\x8f\x56\x54\x60\x6a\xd6\x76\xe0\xcb\x6f\x17\ \x74\x95\x7b\xa9\x5b\x51\xc0\x07\xdc\x65\x5c\xe6\x42\xe9\x1c\x70\ \xb3\xdb\x05\xec\x6e\x65\xab\xa6\x4a\x15\x05\xca\x80\xbb\xdf\x17\ \x8a\x54\x88\x5c\xf6\x93\x04\x5e\x39\xe7\xdf\x7b\x6f\x35\x0e\x27\ \x66\x8a\x15\xa8\x0a\xdc\x97\x48\x85\x03\xe8\xbf\x17\x3e\x74\x1b\ \x5b\xfa\x3a\x17\xaa\x53\xfd\xad\x0a\x6c\x07\xb8\xab\x82\xf7\x8e\ \x39\xd8\x3f\x58\x1c\xd8\x6f\xd9\xaf\xfa\x23\x47\x15\x05\x42\xb7\ \x65\xb6\x53\x3e\x45\xdb\x00\xce\xcf\xc1\x8b\x7f\x62\x47\xab\xbd\ \x1d\x66\x9f\xdb\xb9\xfe\x5e\x7e\x15\x74\x7c\xa9\x79\x63\xdc\x7d\ \xed\xe6\xf9\xbf\x50\xb5\xe3\x2c\xf0\x49\xec\x2f\xf6\xbb\x64\x79\ \xfd\x18\xd0\xb5\xf9\xf3\xa5\xe2\xe6\x2d\x03\x6c\x60\xff\x7e\x73\ \x11\x58\x15\xb0\xb7\x6c\x82\xdf\xf5\x7f\x30\x80\x04\x58\x07\xd6\ \xd8\xfc\xa5\x5e\xd2\xe8\x66\x06\xee\x1b\x88\x06\xf8\x0f\x09\xb1\ \x65\xd6\x5b\x51\xae\x34\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x02\x00\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\x82\xcc\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0b\x1d\x03\x20\x0f\x66\ \xf3\x7f\x75\x00\x00\x01\x84\x49\x44\x41\x54\x28\xcf\x4d\xd1\x3f\ \x4b\x94\x71\x00\xc0\xf1\xcf\xef\xb9\x27\xb3\x2e\x2d\x41\x3d\x25\ \x9d\x9a\x1a\x72\xe8\x1d\xb4\x5c\x6f\x20\x35\x6c\x09\xbc\x96\x20\ \x0c\x2a\xa8\x8e\x8a\x2e\x2c\xa2\x96\x76\x6f\x09\x42\x30\x5f\xc1\ \xbd\x81\xd6\x52\x82\x10\x1a\x92\x33\xfc\x97\xa7\x51\xe0\x73\xde\ \x3d\xbf\x86\x1a\xda\xbf\xcb\x87\x6f\xe0\xb1\xe8\x99\x17\xa5\x4e\ \x35\x2f\xc7\x31\x42\x33\x69\xa4\xf3\x0f\xb6\x1e\x09\x6a\xc2\x7d\ \x1d\xaf\x3d\x59\xe8\xcc\x6e\x3b\xe3\x34\x0e\xec\x1b\x96\xd6\x9f\ \x56\xee\x4a\x85\x39\x6f\x3c\x5c\x69\x5d\x48\xe3\x8c\xb3\x21\x15\ \x64\x76\xe2\x3b\x59\x18\x58\x7d\x3e\x31\x27\x70\x6f\xa1\x35\x7b\ \x3e\x5e\x0b\xbd\x52\x05\xe4\x0e\xb5\x2d\xc7\x4f\x61\xa0\xfe\xaa\ \x12\xee\x94\xda\x9b\x47\xb1\x16\x7a\xf5\x21\x47\x82\x9f\xda\x6a\ \x51\xe8\x19\x49\xb2\xea\x77\x15\x27\xf4\xa9\xb9\x25\x91\xb8\xea\ \x92\x7e\xc7\xdc\xb4\x21\xab\x26\x59\x79\xc8\x60\x28\xa0\xeb\x00\ \x74\xec\xe2\xb8\xe1\x30\x2a\x2b\x27\xed\xb1\x01\x51\xc4\x57\xeb\ \xa0\x65\x03\xa9\x60\x54\x7b\x2c\xcd\x45\x89\x80\x8f\x3e\x83\x6d\ \x2d\x04\x89\xa0\x2b\xc9\x9b\x3b\xba\xba\x38\x65\x08\x14\x0d\xa1\ \x8b\xa6\xd8\x4c\x34\xd6\xed\xc5\x0c\xa9\x93\x20\x55\x44\xc7\x41\ \x5c\xa3\x11\x66\x4a\x47\x9b\xc5\xf8\x32\xf4\xea\xff\x8f\x79\x28\ \xba\x1d\xf7\x42\xcf\x48\x61\xf5\xf7\xc4\xf8\xee\xc5\x5f\x71\x22\ \x1c\x21\xa0\x23\xc3\xdb\xf8\x21\x14\xeb\x8b\x8b\xa6\x31\xbd\x72\ \x39\x5e\xcf\xbf\xe4\x7b\xb1\x15\xf7\xe3\x7e\xfc\x96\xdf\xc8\xcb\ \x71\x7a\x85\x69\x61\x4a\xf4\xde\xd4\x42\x67\xf6\x87\x73\xc6\x05\ \x4d\x6b\x06\xa5\xf5\xa5\xca\xa4\x20\xf0\x37\xb9\x52\x52\xed\xfe\ \xdb\x5d\x68\x98\x5f\xde\x9a\x14\x2c\xf9\x03\xd7\xf2\x9f\xf3\xf6\ \xd7\xa8\x95\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x08\xa0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ \x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ \x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ \x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ \x46\x00\x00\x08\x16\x49\x44\x41\x54\x78\xda\x62\x64\xa0\x10\xb0\ \xdb\xad\x4a\xfc\xfb\xfb\x5f\xff\xdf\x5f\x7f\xf9\xff\x7f\x7b\x10\ \xc0\x70\xbd\x7a\x17\x50\xf8\x27\x10\xff\x23\x46\x3f\x40\x00\xb1\ \x90\x6b\x31\x9f\xe7\x26\xa0\xc5\x7f\xeb\x7f\xff\x97\x91\xff\xcf\ \xa9\xc9\xc0\xf8\xe6\x2c\xc3\xff\xff\xf7\x03\x80\x52\x17\x81\xf8\ \x19\x10\xff\x62\xb7\x5d\xe9\x08\x54\xd3\x00\x74\xa0\xfe\xff\xf7\ \x67\xec\x19\xee\x4d\xb8\x01\x12\x07\xe2\xff\x30\x73\x00\x02\x88\ \x64\x07\x88\x86\xee\x0c\xfc\x03\xf4\xf1\x9f\xbf\x92\xf2\xbf\x18\ \x54\x81\xde\xe4\x82\x9a\xc4\xce\xc0\xf0\xf7\x3b\x0f\x90\x25\xc0\ \x6d\x33\x45\x8a\x81\x5d\xaa\xfd\xf7\x3f\x61\xbb\xff\xec\x6a\x0c\ \x0c\x6f\xaf\x30\x30\xb0\xf2\x27\x02\xe5\xba\x81\xf8\x25\x10\xff\ \x81\x99\x07\x10\x40\x44\x3b\x40\x3a\xfe\x80\xe3\xdf\x3f\x7f\x1b\ \x18\xfe\x0b\xd8\x31\xb0\x28\x30\xfc\xfe\x29\xc4\xf0\x0f\x6a\x0c\ \x3f\x37\x03\x83\xb9\x1a\x17\xc3\xae\x03\x02\x62\x3c\xee\x8b\x5a\ \xfe\xb1\x48\x7b\xff\xfc\xab\xc2\xf0\x97\x51\x0e\x2c\xcf\xc8\x70\ \x03\x18\x3a\x7f\xa4\x80\x4c\x41\x20\x7e\x8f\xec\x00\x80\x00\x22\ \xe8\x00\xc5\xec\x13\x8e\xff\x80\xc1\xc8\xcc\xc4\x6b\xc7\xca\x22\ \xcb\xf0\xeb\x97\x00\xc3\x97\xaf\xc0\x08\xfe\x0b\xb1\x38\xc7\xf7\ \x1f\x83\xaf\xc5\x37\x86\xde\x35\xbf\x18\x84\x35\x2d\xed\xfe\x31\ \x28\x30\xfc\xf8\x25\x0d\x0c\x0c\x84\x19\xb2\x12\xcc\x0c\x0f\xef\ \xfc\x67\x02\x32\xd9\x80\x98\x09\xd9\x7c\x80\x00\xc2\xe9\x00\x8d\ \x92\xd3\x8a\x7f\xff\x31\x35\x30\xfd\x67\x8d\xe3\x17\x94\x01\xfa\ \x40\x90\xe1\xeb\x17\x60\x28\xff\x83\x58\x1e\xe9\xf0\x9f\xa1\x2a\ \xfc\x37\xc3\xe4\x1d\x8f\x18\x82\x7b\x3e\x30\xb0\xb1\xc8\x30\x70\ \xf3\x49\xc0\x1d\x07\x02\xb6\x3a\xff\x19\x3a\x12\xfe\x30\xac\xdb\ \xc5\xc1\xd0\x75\x07\x1a\x18\x10\x0c\x07\x00\x01\x84\xe1\x00\xbd\ \x86\xcb\x40\x8b\x19\x1a\x58\x19\x58\xe3\x84\x79\x45\x19\xd8\x59\ \x84\x18\xbe\x00\x2d\xfe\x0a\x34\xf8\x2f\xd0\xe0\x60\x4b\x06\x86\ \x24\x97\xbf\x0c\xfb\xae\xbd\x62\x08\x9d\xf4\x1a\xe8\x20\x21\x06\ \x51\x11\x03\x86\xef\xdf\x58\xe0\x96\x5b\x6b\x31\x30\x94\x87\xfe\ \x63\xb0\xd6\xfc\xcb\xf0\xef\xdf\x7f\x86\xb5\xff\xfe\xe3\x0c\x61\ \x80\x00\x82\x3b\xc0\xb4\xff\xa1\xc0\xdf\x9f\xbf\x8a\x98\x18\x98\ \x6a\xa5\x04\x04\x80\x29\x09\xd5\x62\x43\x05\x06\x86\x62\x60\x70\ \xef\xbf\xf5\x8e\x21\x6d\xd1\x5b\x06\x16\x66\x7e\xa0\xc5\xda\x0c\ \xdf\xbf\x33\xc3\xd5\x98\xab\x32\x30\xe4\x79\xff\x67\xb0\x50\xff\ \x0f\xe4\xff\x03\x5b\x0e\xc6\xc8\xf6\x3b\x31\xc8\x33\x48\x30\x84\ \x31\x7c\x67\xd8\xc2\xb0\x9e\xe1\x02\x40\x00\x81\x1d\x60\x39\xe5\ \x71\x23\xd3\x7f\x86\x7c\x19\x31\x61\x7e\x31\x3e\x7e\x86\x9f\xdf\ \x99\xc0\xbe\xf9\x03\x4c\x2a\x3a\xd2\x0c\x0c\xd1\x16\x0c\x0c\xa7\ \x9f\xbd\x67\x48\x5d\xfe\x8e\x81\x8f\x93\x9f\x41\x51\x56\x85\xe1\ \x07\x92\xc5\xe2\xfc\x0c\x0c\x1d\x91\x0c\x0c\x2e\x7a\x20\x3e\xc4\ \xd2\xff\xff\xff\xc3\x1d\x00\x62\x33\x70\x7f\x12\x65\x08\x60\x68\ \x64\xe0\x66\xf0\x66\x04\xa6\x82\xff\xff\xc0\x09\xf2\x11\x40\x00\ \xb1\x80\x2c\x97\x17\xe7\xa9\x53\x93\xe4\x63\xf8\xf5\x93\x09\x1c\ \xcf\xbf\x81\x16\xcb\x00\x0d\x8d\x75\x05\xaa\xf8\xfc\x8d\xa1\x71\ \xff\x07\x60\xc6\x65\x65\xd0\x51\x96\x63\xf8\xf7\x9b\x15\xee\x38\ \x11\x60\x22\xcc\x73\x66\x60\xf0\x32\x80\x78\x0e\x64\x11\xba\xc5\ \x1f\xbe\xbd\x67\x78\xfc\x77\x09\x03\x93\xde\x54\x3b\x90\x3b\xfe\ \xc3\x8a\xa7\x1f\x0c\x42\x40\x52\x04\x20\x80\x58\xb8\x39\x58\xf2\ \x0d\x95\x04\xc0\xbe\xf9\x0d\x2c\x22\xf8\x80\xe9\x34\x4c\x87\x81\ \xc1\x46\x89\x81\x61\xee\xe9\xcf\x0c\xdb\xef\xfe\x66\xd0\x52\x12\ \x63\xf8\xff\x97\x05\xec\xb8\x2f\x40\x8b\x85\x38\x81\xe9\xc0\x9c\ \x81\xc1\x59\x13\x35\x3e\x21\x16\x33\x40\x2d\xfe\xc0\x30\x75\xef\ \x64\x86\x19\x07\xa7\x30\xfc\x62\xfd\xcc\xc0\xc6\xc5\xc8\xf0\xf3\ \xeb\x7f\x06\x3d\x59\x7d\x86\xb6\xa0\x0e\x06\x9f\x2a\x4f\x76\x50\ \x41\x0a\x10\x40\x2c\x9c\xec\xac\xfc\x3f\x81\x05\x27\x37\x33\x03\ \x83\x37\xd0\x62\x33\x19\x88\x61\x5f\x7e\xfe\x63\x58\x71\xf9\x1b\ \x83\xab\x81\x38\xd8\x71\x5f\x81\xd9\x8a\x05\x98\x7e\xfd\xb4\x19\ \x18\x02\xf4\x30\x13\x13\xcc\xc7\x20\x3c\xf3\xe8\x14\x86\xee\x3d\ \xad\x0c\x3f\x59\x3e\x33\xb0\x8a\x03\xa3\xe5\x33\x23\x83\x14\xb7\ \x1c\x43\x79\x78\x2d\x43\x94\x45\x0c\x30\xdd\xfc\x82\xeb\x03\x08\ \x20\x16\x36\x60\x7c\xd8\x00\x8b\x08\x4b\x60\x5c\x73\x20\xe5\x89\ \xdb\x6f\xff\x30\x48\x08\x72\x30\x80\x1c\x07\x4c\x1f\x0c\x2e\xc0\ \x10\xb1\x57\x64\x60\xe0\x64\xc5\xb4\x1c\x1c\xb4\x40\x62\xf5\x95\ \x25\x0c\x7d\x87\x5a\x19\xde\x31\x3e\x65\xe0\x92\x07\xea\xfb\xcc\ \xc4\x20\xca\x2c\xcb\x50\xe4\x55\xc3\x10\x69\x1c\x0b\x8c\xb6\xbf\ \x40\x0c\x4a\x9c\x88\x6a\x02\x20\x80\x58\xc4\xb9\xfe\x33\x38\xca\ \x63\xcf\x22\x5c\x2c\x4c\x58\x1d\x87\x0e\xf6\x3e\xdc\xcc\xd0\x76\ \xa4\x82\xe1\xdd\xff\x17\x0c\x4c\x92\x7f\x18\x38\xbf\x31\x31\xb0\ \xfe\xe2\x65\xc8\xb0\xcc\x62\x48\x36\xc9\x61\xe0\x63\xe7\x47\xc9\ \x15\x20\x36\x03\x2f\x03\x30\xb3\x32\x30\x03\x04\x10\x0b\x03\xee\ \x2c\xca\xa0\x25\xf8\x0f\xa7\xe3\x60\xe0\xf4\xcb\xc3\x0c\x2d\x97\ \xf2\x18\x04\x64\x79\x18\xfe\x7c\x05\x06\xcf\x4f\x6e\x86\x70\xbd\ \x0c\x86\x58\xad\x6c\xb0\xc5\x20\x00\xb2\x10\x96\x3b\x40\xbe\x07\ \x3b\x00\x52\x20\xb1\x01\x04\x10\x0b\x38\x8b\xe0\x00\xb7\x5e\xff\ \x26\x58\x47\x9c\x7d\x7d\x84\x41\x4a\x54\x9c\xe1\xdd\xb7\x37\x0c\ \xae\x92\xc1\x0c\x05\x3a\x6d\x0c\xbc\xac\xfc\x48\xd1\xf3\x1f\xc5\ \xe7\x60\xf6\x5f\x78\x14\xb0\x00\x04\x10\x6e\x07\x40\x13\x14\x3e\ \x00\x93\xb7\x12\x76\x63\x08\x35\x48\x63\x10\xe7\x94\xc1\x9a\x38\ \x61\x3e\x87\x38\x02\x88\x91\xd2\x00\x40\x00\xb1\x30\xe0\x28\x26\ \x41\xa2\xff\xff\xe1\x77\x00\xc8\x40\x06\xc6\xff\x0c\x39\x6a\x4d\ \x38\xe5\x91\x2d\x87\xb3\xff\x22\xcc\x05\x08\x20\x26\xdc\x21\xc0\ \x80\x37\x04\xe0\x25\x1c\x23\x7e\x07\x62\x58\x0e\x2e\x9a\x11\xe6\ \x02\x04\x10\x4e\x07\xfc\x87\xe4\x2d\x5c\xb1\x03\x8f\x5b\x46\xd4\ \xda\x15\xc3\x72\xe4\xc4\x07\x2f\x21\x91\x42\x16\x20\x80\x98\xb0\ \x05\x33\xc8\x02\x74\x85\xe8\x8e\x83\x85\x00\x23\x23\x13\x0e\xfd\ \xa8\xd9\x0e\xdd\x21\x30\x00\x10\x40\x4c\xd8\x3c\x09\x2b\xd1\xb0\ \x85\x0e\xcc\xf7\x30\x47\x00\x6b\x4f\x86\x17\xdf\x1f\x63\x75\x20\ \xba\xcf\x41\x0e\xb9\xf7\xea\x1e\x43\xe9\xfa\x3c\x50\xb3\xf5\x0d\ \x28\xa0\x00\x02\x88\x05\x3d\x98\x31\x6a\x31\x1c\xbe\x87\x61\x46\ \x46\x46\xa0\x03\x9e\x30\x48\x70\xca\xc2\xe5\x11\x85\x0e\xc2\xf2\ \x57\xef\x5f\x31\xd4\x6f\xae\x62\x58\x77\x74\xd5\x4d\x86\x3b\x0c\ \xeb\x18\xae\x30\x9c\x00\x2a\xff\x00\x10\x40\x2c\xe8\xc1\x0c\xb3\ \xd8\x40\x8a\x0d\x23\x0a\xd0\x1d\x07\x72\x1f\x28\x04\x40\x8e\x40\ \x4f\xf9\xb0\x20\x7f\xf3\xe9\x0d\xc3\xf4\x43\x93\x18\x16\x1e\x98\ \xf7\xf8\xed\xc9\xf7\x4b\x81\x16\x9f\x06\x2a\x7b\x03\x6d\x9c\xbe\ \x02\x08\x20\x94\x72\x00\x39\x68\x7f\xff\xfe\xcb\x80\x5e\x4a\x22\ \x57\x38\x10\x35\x7f\x80\x6d\xc4\x3f\x70\x07\x20\x87\xcc\xfb\x6f\ \xef\x80\xb5\xe9\x14\x86\x79\x87\x67\xbc\x7d\x75\xf6\xfd\x86\x1f\ \xbb\xff\xed\x80\x5a\xfc\x02\x4a\x7f\x01\x35\xd1\x01\x02\x08\xc5\ \x01\xb0\x78\xba\xf9\xf0\x03\x43\xd3\xf2\x7b\x0c\xfc\x0a\x52\x58\ \x1d\x07\x56\xf3\xe0\x3d\x43\xcf\xca\x3b\x0c\xd7\xd8\x9f\x31\x58\ \x67\x33\xc1\xd5\x80\x1c\xb5\xe6\xda\x22\x86\x69\x47\x7b\xde\xde\ \x3c\x74\x6f\xc3\x87\x75\x7f\x76\x42\x5b\xc2\x60\x1f\x03\xf1\x47\ \x68\xdf\x00\x5c\x1a\x01\x04\x10\xbc\x20\x02\x19\x7a\xe7\xc9\x27\ \x86\x09\x9b\x1f\x33\xac\x3f\xfc\xf8\xed\xb7\xfb\xfb\x36\x84\x64\ \xe5\x25\x23\xe7\x0a\x90\x9a\x5b\x8f\x3e\x32\xf4\xaf\x7f\xc0\xb0\ \xfe\xd0\xa3\xb7\x3f\x1e\x1d\xdc\x60\x99\xb6\x53\x90\x91\x31\x3a\ \x08\x24\xb7\xe1\xde\x12\x86\x19\xe7\x3a\xbf\xdd\x38\x7e\x6f\xcf\ \xab\x95\xbf\x36\xfe\x7a\xf1\xef\x31\x92\xc5\x9f\xc0\xcd\x10\xb4\ \x1e\x13\x40\x00\xb1\x9c\xbc\xfb\x05\x98\x40\xbe\x33\x4c\xda\xf6\ \x94\x61\xf1\xc1\xe7\xdf\x3e\x5f\xdf\xb6\xfc\xfd\x91\x0e\x50\xf7\ \xea\xdd\xff\xff\xb9\xc9\x90\x90\xf9\xc7\xf0\xe2\xcd\x17\x86\xe6\ \x55\x0f\x19\xd6\x1f\x7f\xf9\xed\xdb\xed\x1d\xcb\xbf\x9c\xe9\x05\ \xab\xe1\x16\x32\x88\xb8\xf8\xf6\x14\x43\xef\xb9\xca\x6f\x47\x0f\ \x1c\xdf\xf3\x68\xde\xf7\x8d\x3f\x9e\xfc\x7b\x06\xb5\xf4\x15\xd4\ \xf7\xdf\x71\x75\xd5\x00\x02\x08\x9c\x08\x3d\xbb\xaf\x7f\x7d\x7e\ \xed\xe8\xde\x37\x87\xfa\x37\xfe\x7e\x7f\xff\x29\x50\xfc\x39\x48\ \x33\x48\xee\xcd\xc7\x1f\x0c\x73\xf6\x3c\x63\x58\x7c\xe0\xf9\xb7\ \x97\x37\x4f\xec\xf9\x78\x6a\xf2\xc6\x3f\x1f\x1f\xc2\xd5\xf0\x8a\ \x71\xbd\x5f\x7e\x69\xc6\xe6\x83\xc5\xb7\x96\x7f\xbe\xf7\xf3\x03\ \x92\xc5\x1f\xa0\x16\xff\xc1\x57\x9c\x03\x04\x10\xa3\x6a\xce\xde\ \x9a\xc7\x6b\x0b\xce\xfd\x78\x7e\x19\xe4\xc2\xd7\xd0\x20\x03\xbb\ \xda\xb4\xe1\xca\xdf\x3f\x3f\x7e\x7c\x7d\x71\xed\xd8\xde\x37\x87\ \xc1\x8e\x7b\x86\xae\x06\x88\x39\x80\x18\xd8\xee\x61\xe0\x81\x06\ \xf3\x3b\x62\x2c\x86\x01\x80\x00\x62\x80\x6a\x04\xf5\xa1\x40\x55\ \x19\x2f\x72\x53\x5d\x35\xff\x50\x37\x87\x84\x8e\x37\x90\xe9\x01\ \xc4\xc6\xa0\x4e\x0e\xba\x1a\x50\xa3\x02\xd4\x76\x01\x62\x6e\x72\ \xfa\x9a\x00\x01\xc4\x08\x35\x80\x19\x1a\x47\x7f\xb0\x38\x4e\x04\ \x94\x46\x89\x0d\x52\x52\x01\x40\x80\x01\x00\x53\xcb\xb1\x15\x4e\ \xb6\xdd\x8c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x4b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x25\x69\x43\x43\x50\x69\x63\x63\x00\x00\x48\xc7\x9d\ \x96\x77\x54\x54\xd7\x16\x87\xcf\xbd\x77\x7a\xa1\xcd\x30\x74\x18\ \x7a\xaf\x52\x06\x10\xe9\x1d\xa4\x57\x51\x18\x66\x06\x18\xca\x00\ \xc3\x0c\xd8\x0b\x22\x2a\x10\x51\x44\xa4\x29\x82\x04\x05\x0c\x18\ \x0d\x45\x62\x45\x14\x0b\x01\x51\x01\x7b\x40\x82\x80\x12\x83\x51\ \x6c\xa8\x64\x46\xd6\x4a\x7c\x79\x79\xef\xe5\xe5\xf7\xc7\x3d\xdf\ \xda\x67\xef\x73\xf7\xd9\x7b\xdf\xb5\x2e\x00\x24\x2f\x3f\x2e\x2f\ \x1d\x96\x02\x20\x8d\x27\xe0\x07\x7b\xba\xd0\x23\xa3\xa2\xe9\xd8\ \x7e\x00\x03\x3c\xc0\x00\x73\x00\x98\xac\xac\x0c\xff\x10\x8f\x50\ \x20\x92\xb7\xbb\x2b\x3d\x4b\xe4\x04\xfe\x45\xaf\x87\x01\x24\x5e\ \x6f\x19\x7b\x05\xd2\xe9\xe0\xff\x93\x34\x2b\x83\x2f\x00\x00\x0a\ \x14\xf1\x12\x36\x27\x8b\x25\xe2\x3c\x11\xa7\xe6\x08\x32\xc4\xf6\ \x59\x11\x53\xe3\x53\xc4\x0c\xa3\xc4\xcc\x17\x25\x28\x62\x79\x31\ \x27\x2e\xb2\xd1\x67\x9f\x45\x76\x12\x33\x3b\x8d\xc7\x16\xb1\x38\ \xe7\x0c\x76\x1a\x5b\xcc\x3d\x22\xde\x91\x2d\xe4\x88\x18\xf1\x13\ \x71\x7e\x36\x97\x93\x23\xe2\xdb\x22\xd6\x4a\x15\xa6\x71\x45\xfc\ \x56\x1c\x9b\xc6\x61\x66\x01\x80\x22\x89\xed\x02\x0e\x2b\x49\xc4\ \x66\x22\x26\xf1\x43\x83\x5d\x45\xbc\x14\x00\x1c\x29\xf1\x0b\x8e\ \xff\x82\x05\x9c\xd5\x02\xf1\xa5\x5c\xd3\x33\xd6\xf0\xb9\x89\x49\ \x02\xba\x1e\x4b\x9f\x6e\x6e\x6b\xcb\xa0\x7b\x71\x72\x52\x39\x02\ \x81\x71\x20\x93\x95\xc2\xe4\xb3\xe9\xae\xe9\x69\x19\x4c\xde\x1a\ \x00\x16\xef\xfc\x59\x32\xe2\xda\xd2\x45\x45\xb6\x36\xb7\xb5\xb6\ \x36\xb6\x30\x31\xff\xa2\x50\xff\x75\xf3\x6f\x4a\xdc\xdb\x45\x7a\ \x19\xf4\xb9\x67\x10\xad\xef\x0f\xdb\x5f\xf9\xa5\xd7\x01\xc0\x98\ \x13\xd5\x66\xf7\x1f\xb6\xf8\x0a\x00\x3a\xb6\x01\x20\x7f\xef\x0f\ \x9b\xd6\x21\x00\x24\x45\x7d\x6b\x1f\xf8\xe2\x3e\x34\xf1\xbc\x24\ \x09\x04\x19\x76\xa6\xa6\x39\x39\x39\x26\x5c\x0e\xcb\x44\x5c\xd0\ \xdf\xf5\x3f\x1d\xfe\x86\xbe\x78\x9f\x89\xf8\xb8\xdf\xcb\x43\x77\ \xe3\x24\x30\x85\xa9\x02\xba\xb8\x6e\xac\xf4\xd4\x74\x21\x9f\x9e\ \x95\xc1\x64\x71\xe8\xc6\x7f\x1e\xe2\x7f\x1c\xf8\xd7\x79\x18\x05\ \x73\x12\x38\x7c\x0e\x4f\x14\x11\x2e\x9a\x32\x2e\x2f\x51\xd4\x6e\ \x1e\x9b\x2b\xe0\xa6\xf3\xe8\x5c\xde\x7f\x6a\xe2\x3f\x0c\xfb\x93\ \x16\xe7\x5a\x24\x4a\xfd\x27\x40\x8d\x35\x01\x52\x03\x54\x80\xfc\ \xdc\x07\x50\x14\x22\x40\x62\x0e\x8a\xbb\xfe\x7b\xdf\xfc\xf0\xe1\ \x20\x50\xb4\x46\xa8\x4d\x2e\xce\xfd\x67\x41\xff\x7e\x2a\x5c\x2c\ \x7e\x64\x71\x13\x3f\xc7\xb9\x06\x87\xd2\x59\x42\x7e\xf6\xe2\x9e\ \xf8\xb3\x04\x68\x40\x00\x92\x80\x0a\x14\x80\x2a\xd0\x04\x7a\xc0\ \x18\x58\x00\x1b\x60\x0f\x9c\x80\x3b\xf0\x01\x01\x20\x14\x44\x81\ \x55\x80\x05\x92\x40\x1a\xe0\x83\x1c\xb0\x1e\x6c\x01\xf9\xa0\x10\ \xec\x06\xfb\x40\x25\xa8\x01\xf5\xa0\x11\xb4\x80\x13\xa0\x03\x9c\ \x06\x17\xc0\x65\x70\x1d\xdc\x00\x43\xe0\x3e\x18\x05\x13\xe0\x19\ \x98\x05\xaf\xc1\x3c\x04\x41\x58\x88\x0c\x51\x20\x05\x48\x0d\xd2\ \x86\x0c\x21\x0b\x88\x01\x2d\x83\xdc\x21\x3f\x28\x18\x8a\x82\xe2\ \xa0\x44\x88\x07\x09\xa1\xf5\xd0\x56\xa8\x10\x2a\x81\x2a\xa1\x5a\ \xa8\x11\xfa\x16\x3a\x05\x5d\x80\xae\x42\x83\xd0\x5d\x68\x0c\x9a\ \x86\x7e\x85\xde\xc3\x08\x4c\x82\xa9\xb0\x0a\xac\x03\x9b\xc2\x0c\ \xd8\x19\xf6\x85\x43\xe1\x95\x70\x22\x9c\x09\xaf\x85\xf3\xe0\x5d\ \x70\x39\x5c\x07\x1f\x83\xdb\xe1\x0b\xf0\x75\x78\x08\x1e\x85\x9f\ \xc1\x73\x08\x40\x88\x08\x0d\x51\x47\x8c\x11\x06\xe2\x8a\x04\x20\ \xd1\x48\x02\xc2\x47\x36\x22\x05\x48\x19\x52\x87\xb4\x20\x5d\x48\ \x2f\x72\x0b\x19\x45\x66\x90\x77\x28\x0c\x8a\x82\xa2\xa3\x8c\x51\ \xf6\x28\x2f\x54\x18\x8a\x85\xca\x44\x6d\x44\x15\xa1\x2a\x51\x47\ \x51\xed\xa8\x1e\xd4\x2d\xd4\x18\x6a\x16\xf5\x09\x4d\x46\x2b\xa3\ \x0d\xd1\x76\x68\x6f\x74\x24\x3a\x11\x9d\x83\xce\x47\x97\xa1\x1b\ \xd0\x6d\xe8\x4b\xe8\x21\xf4\x04\xfa\x35\x06\x83\xa1\x61\x74\x31\ \x36\x18\x2f\x4c\x14\x26\x19\xb3\x0e\x53\x84\x39\x80\x69\xc5\x9c\ \xc7\x0c\x62\xc6\x31\x73\x58\x2c\x56\x01\x6b\x88\x75\xc0\x06\x60\ \x99\x58\x01\x36\x1f\x5b\x81\x3d\x86\x3d\x87\xbd\x89\x9d\xc0\xbe\ \xc5\x11\x71\x6a\x38\x0b\x9c\x07\x2e\x1a\xc7\xc3\xe5\xe2\xca\x70\ \x4d\xb8\xb3\xb8\x9b\xb8\x49\xdc\x3c\x5e\x0a\xaf\x8d\xb7\xc3\x07\ \xe0\xd9\xf8\x35\xf8\x62\x7c\x3d\xbe\x0b\x3f\x80\x9f\xc0\xcf\x13\ \xa4\x09\xba\x04\x07\x42\x28\x21\x99\xb0\x85\x50\x4e\x68\x21\x5c\ \x22\x3c\x20\xbc\x24\x12\x89\x1a\x44\x5b\x62\x10\x91\x4b\xdc\x4c\ \x2c\x27\x1e\x27\x5e\x21\x8e\x11\xdf\x91\x64\x48\x06\x24\x57\x52\ \x0c\x49\x48\xda\x45\x3a\x42\x3a\x4f\xba\x4b\x7a\x49\x26\x93\x75\ \xc8\x4e\xe4\x68\xb2\x80\xbc\x8b\xdc\x48\xbe\x48\x7e\x44\x7e\x2b\ \x41\x91\x30\x91\xf0\x96\x60\x4b\x6c\x92\xa8\x92\x68\x97\xb8\x29\ \xf1\x5c\x12\x2f\xa9\x2d\xe9\x2c\xb9\x4a\x72\xad\x64\x99\xe4\x49\ \xc9\x01\xc9\x19\x29\xbc\x94\x8e\x94\xab\x14\x53\x6a\xa3\x54\x95\ \xd4\x29\xa9\x11\xa9\x39\x69\x8a\xb4\xb9\x74\x80\x74\x9a\x74\x91\ \x74\x93\xf4\x55\xe9\x29\x19\xac\x8c\x8e\x8c\xbb\x0c\x5b\x26\x4f\ \xe6\xb0\xcc\x45\x99\x71\x0a\x42\xd1\xa4\xb8\x52\x58\x94\xad\x94\ \x7a\xca\x25\xca\x04\x15\x43\xd5\xa5\x7a\x53\x93\xa9\x85\xd4\x6f\ \xa8\xfd\xd4\x59\x59\x19\x59\x4b\xd9\x70\xd9\xd5\xb2\x55\xb2\x67\ \x64\x47\x69\x08\x4d\x87\xe6\x4d\x4b\xa5\x15\xd3\x4e\xd0\x86\x69\ \xef\xe5\x54\xe4\x9c\xe5\x38\x72\x3b\xe5\x5a\xe4\x6e\xca\xbd\x91\ \x57\x92\x77\x92\xe7\xc8\x17\xc8\xb7\xca\x0f\xc9\xbf\x57\xa0\x2b\ \xb8\x2b\xa4\x28\xec\x51\xe8\x50\x78\xa8\x88\x52\x34\x50\x0c\x52\ \xcc\x51\x3c\xa8\x78\x49\x71\x46\x89\xaa\x64\xaf\xc4\x52\x2a\x50\ \x3a\xa1\x74\x4f\x19\x56\x36\x50\x0e\x56\x5e\xa7\x7c\x58\xb9\x4f\ \x79\x4e\x45\x55\xc5\x53\x25\x43\xa5\x42\xe5\xa2\xca\x8c\x2a\x4d\ \xd5\x49\x35\x59\xb5\x54\xf5\xac\xea\xb4\x1a\x45\x6d\x99\x1a\x57\ \xad\x54\xed\x9c\xda\x53\xba\x2c\xdd\x99\x9e\x4a\x2f\xa7\xf7\xd0\ \x67\xd5\x95\xd5\xbd\xd4\x85\xea\xb5\xea\xfd\xea\xf3\x1a\xba\x1a\ \x61\x1a\xb9\x1a\xad\x1a\x0f\x35\x09\x9a\x0c\xcd\x04\xcd\x52\xcd\ \x6e\xcd\x59\x2d\x35\x2d\x7f\xad\xf5\x5a\xcd\x5a\xf7\xb4\xf1\xda\ \x0c\xed\x24\xed\xfd\xda\xbd\xda\x6f\x74\x74\x75\x22\x74\xb6\xeb\ \x74\xe8\x4c\xe9\xca\xeb\x7a\xeb\xae\xd5\x6d\xd6\x7d\xa0\x47\xd6\ \x73\xd4\xcb\xd4\xab\xd3\xbb\xad\x8f\xd1\x67\xe8\xa7\xe8\x1f\xd0\ \xbf\x61\x00\x1b\x58\x19\x24\x19\x54\x19\x0c\x18\xc2\x86\xd6\x86\ \x5c\xc3\x03\x86\x83\x46\x68\x23\x5b\x23\x9e\x51\x9d\xd1\x88\x31\ \xc9\xd8\xd9\x38\xdb\xb8\xd9\x78\xcc\x84\x66\xe2\x67\x92\x6b\xd2\ \x61\xf2\xdc\x54\xcb\x34\xda\x74\x8f\x69\xaf\xe9\x27\x33\x2b\xb3\ \x54\xb3\x7a\xb3\xfb\xe6\x32\xe6\x3e\xe6\xb9\xe6\x5d\xe6\xbf\x5a\ \x18\x58\xb0\x2c\xaa\x2c\x6e\x2f\x21\x2f\xf1\x58\xb2\x69\x49\xe7\ \x92\x17\x96\x86\x96\x1c\xcb\x83\x96\x77\xac\x28\x56\xfe\x56\xdb\ \xad\xba\xad\x3e\x5a\xdb\x58\xf3\xad\x5b\xac\xa7\x6d\xb4\x6c\xe2\ \x6c\xaa\x6d\x46\x18\x54\x46\x20\xa3\x88\x71\xc5\x16\x6d\xeb\x62\ \xbb\xc9\xf6\xb4\xed\x3b\x3b\x6b\x3b\x81\xdd\x09\xbb\x5f\xec\x8d\ \xed\x53\xec\x9b\xec\xa7\x96\xea\x2e\xe5\x2c\xad\x5f\x3a\xee\xa0\ \xe1\xc0\x74\xa8\x75\x18\x5d\x46\x5f\x16\xb7\xec\xd0\xb2\x51\x47\ \x75\x47\xa6\x63\x9d\xe3\x63\x27\x4d\x27\xb6\x53\x83\xd3\xa4\xb3\ \xbe\x73\xb2\xf3\x31\xe7\xe7\x2e\x66\x2e\x7c\x97\x36\x97\x37\xae\ \x76\xae\x1b\x5c\xcf\xbb\x21\x6e\x9e\x6e\x05\x6e\xfd\xee\x32\xee\ \x61\xee\x95\xee\x8f\x3c\x34\x3c\x12\x3d\x9a\x3d\x66\x3d\xad\x3c\ \xd7\x79\x9e\xf7\x42\x7b\xf9\x7a\xed\xf1\x1a\xf1\x56\xf1\x66\x79\ \x37\x7a\xcf\xfa\xd8\xf8\x6c\xf0\xe9\xf1\x25\xf9\x86\xf8\x56\xfa\ \x3e\xf6\x33\xf0\xe3\xfb\x75\xf9\xc3\xfe\x3e\xfe\x7b\xfd\x1f\x2c\ \xd7\x5e\xce\x5b\xde\x11\x00\x02\xbc\x03\xf6\x06\x3c\x0c\xd4\x0d\ \xcc\x0c\xfc\x3e\x08\x13\x14\x18\x54\x15\xf4\x24\xd8\x3c\x78\x7d\ \x70\x6f\x08\x25\x24\x36\xa4\x29\xe4\x75\xa8\x4b\x68\x71\xe8\xfd\ \x30\xbd\x30\x61\x58\x77\xb8\x64\x78\x4c\x78\x63\xf8\x9b\x08\xb7\ \x88\x92\x88\xd1\x48\xd3\xc8\x0d\x91\xd7\xa3\x14\xa3\xb8\x51\x9d\ \xd1\xd8\xe8\xf0\xe8\x86\xe8\xb9\x15\xee\x2b\xf6\xad\x98\x88\xb1\ \x8a\xc9\x8f\x19\x5e\xa9\xbb\x72\xf5\xca\xab\xab\x14\x57\xa5\xae\ \x3a\x13\x2b\x19\xcb\x8c\x3d\x19\x87\x8e\x8b\x88\x6b\x8a\xfb\xc0\ \x0c\x60\xd6\x31\xe7\xe2\xbd\xe3\xab\xe3\x67\x59\xae\xac\xfd\xac\ \x67\x6c\x27\x76\x29\x7b\x9a\xe3\xc0\x29\xe1\x4c\x26\x38\x24\x94\ \x24\x4c\x25\x3a\x24\xee\x4d\x9c\x4e\x72\x4c\x2a\x4b\x9a\xe1\xba\ \x72\x2b\xb9\x2f\x92\xbd\x92\x6b\x92\xdf\xa4\x04\xa4\x1c\x49\x59\ \x48\x8d\x48\x6d\x4d\xc3\xa5\xc5\xa5\x9d\xe2\xc9\xf0\x52\x78\x3d\ \xe9\xaa\xe9\xab\xd3\x07\x33\x0c\x33\xf2\x33\x46\x33\xed\x32\xf7\ \x65\xce\xf2\x7d\xf9\x0d\x59\x50\xd6\xca\xac\x4e\x01\x55\xf4\x33\ \xd5\x27\xd4\x13\x6e\x13\x8e\x65\x2f\xcb\xae\xca\x7e\x9b\x13\x9e\ \x73\x72\xb5\xf4\x6a\xde\xea\xbe\x35\x06\x6b\x76\xae\x99\x5c\xeb\ \xb1\xf6\xeb\x75\xa8\x75\xac\x75\xdd\xeb\xd5\xd7\x6f\x59\x3f\xb6\ \xc1\x79\x43\xed\x46\x68\x63\xfc\xc6\xee\x4d\x9a\x9b\xf2\x36\x4d\ \x6c\xf6\xdc\x7c\x74\x0b\x61\x4b\xca\x96\x1f\x72\xcd\x72\x4b\x72\ \x5f\x6d\x8d\xd8\xda\x95\xa7\x92\xb7\x39\x6f\x7c\x9b\xe7\xb6\xe6\ \x7c\x89\x7c\x7e\xfe\xc8\x76\xfb\xed\x35\x3b\x50\x3b\xb8\x3b\xfa\ \x77\x2e\xd9\x59\xb1\xf3\x53\x01\xbb\xe0\x5a\xa1\x59\x61\x59\xe1\ \x87\x22\x56\xd1\xb5\xaf\xcc\xbf\x2a\xff\x6a\x61\x57\xc2\xae\xfe\ \x62\xeb\xe2\x83\xbb\x31\xbb\x79\xbb\x87\xf7\x38\xee\x39\x5a\x22\ \x5d\xb2\xb6\x64\x7c\xaf\xff\xde\xf6\x52\x7a\x69\x41\xe9\xab\x7d\ \xb1\xfb\xae\x96\x59\x96\xd5\xec\x27\xec\x17\xee\x1f\x2d\xf7\x2b\ \xef\xac\xd0\xaa\xd8\x5d\xf1\xa1\x32\xa9\x72\xa8\xca\xa5\xaa\xb5\ \x5a\xb9\x7a\x67\xf5\x9b\x03\xec\x03\x37\x0f\x3a\x1d\x6c\xa9\x51\ \xa9\x29\xac\x79\x7f\x88\x7b\xe8\x4e\xad\x67\x6d\x7b\x9d\x4e\x5d\ \xd9\x61\xcc\xe1\xec\xc3\x4f\xea\xc3\xeb\x7b\xbf\x66\x7c\xdd\xd8\ \xa0\xd8\x50\xd8\xf0\xf1\x08\xef\xc8\xe8\xd1\xe0\xa3\x3d\x8d\x36\ \x8d\x8d\x4d\xca\x4d\xc5\xcd\x70\xb3\xb0\x79\xfa\x58\xcc\xb1\x1b\ \xdf\xb8\x7d\xd3\xd9\x62\xdc\x52\xdb\x4a\x6b\x2d\x3c\x0e\x8e\x0b\ \x8f\x3f\xfd\x36\xee\xdb\xe1\x13\xbe\x27\xba\x4f\x32\x4e\xb6\x7c\ \xa7\xfd\x5d\x75\x1b\xa5\xad\xa0\x1d\x6a\x5f\xd3\x3e\xdb\x91\xd4\ \x31\xda\x19\xd5\x39\x78\xca\xe7\x54\x77\x97\x7d\x57\xdb\xf7\x26\ \xdf\x1f\x39\xad\x7e\xba\xea\x8c\xec\x99\xe2\xb3\x84\xb3\x79\x67\ \x17\xce\xad\x3d\x37\x77\x3e\xe3\xfc\xcc\x85\xc4\x0b\xe3\xdd\xb1\ \xdd\xf7\x2f\x46\x5e\xbc\xdd\x13\xd4\xd3\x7f\xc9\xf7\xd2\x95\xcb\ \x1e\x97\x2f\xf6\x3a\xf7\x9e\xbb\xe2\x70\xe5\xf4\x55\xbb\xab\xa7\ \xae\x31\xae\x75\x5c\xb7\xbe\xde\xde\x67\xd5\xd7\xf6\x83\xd5\x0f\ \x6d\xfd\xd6\xfd\xed\x03\x36\x03\x9d\x37\x6c\x6f\x74\x0d\x2e\x1d\ \x3c\x7b\xd3\xf1\xe6\x85\x5b\x6e\xb7\x2e\xdf\xf6\xbe\x7d\x7d\x68\ \xf9\xd0\xe0\x70\xd8\xf0\x9d\x91\x98\x91\xd1\x3b\xec\x3b\x53\x77\ \x53\xef\xbe\xb8\x97\x7d\x6f\xfe\xfe\xe6\x07\xe8\x07\x05\x0f\xa5\ \x1e\x96\x3d\x52\x7e\x54\xf7\xa3\xfe\x8f\xad\xa3\xd6\xa3\x67\xc6\ \xdc\xc6\xfa\x1e\x87\x3c\xbe\x3f\xce\x1a\x7f\xf6\x53\xd6\x4f\x1f\ \x26\xf2\x9e\x90\x9f\x94\x4d\xaa\x4d\x36\x4e\x59\x4c\x9d\x9e\xf6\ \x98\xbe\xf1\x74\xc5\xd3\x89\x67\x19\xcf\xe6\x67\xf2\x7f\x96\xfe\ \xb9\xfa\xb9\xde\xf3\xef\x7e\x71\xfa\xa5\x6f\x36\x72\x76\xe2\x05\ \xff\xc5\xc2\xaf\x45\x2f\x15\x5e\x1e\x79\x65\xf9\xaa\x7b\x2e\x70\ \xee\xd1\xeb\xb4\xd7\xf3\x6f\x0a\xde\x2a\xbc\x3d\xfa\x8e\xf1\xae\ \xf7\x7d\xc4\xfb\xc9\xf9\x9c\x0f\xd8\x0f\xe5\x1f\xf5\x3f\x76\x7d\ \xf2\xfd\xf4\x60\x21\x6d\x61\xe1\x37\xf7\x84\xf3\xfb\xa0\x0d\x39\ \x66\x00\x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x01\x5c\x49\x44\x41\x54\x28\xcf\x5d\x91\ \xcd\x2b\x44\x61\x14\xc6\xdf\xbf\x41\x59\x4d\x59\x59\xf9\x17\xee\ \xc2\xe6\x66\x61\x35\xcb\x11\x46\x24\x16\x26\x65\x64\x4c\xa9\xab\ \xe1\x9a\x99\x26\xc3\xcb\x90\x88\x84\x69\x4a\xf2\x95\x8f\x2c\xa8\ \x59\x0e\x8a\x15\x62\x44\x32\x59\x58\x58\x98\xd5\x64\xf1\x73\x70\ \x87\x3b\xce\xe9\xed\xd4\xf3\x3c\x9d\xd3\xf3\xbc\x0a\xf5\xd3\xba\ \x4a\x87\xf5\x96\x7e\xd2\x05\xbd\xab\x2d\x5d\x5d\xc6\x9d\x91\x8c\ \xa5\x38\x20\xc7\x2d\x79\x4e\x39\x62\x86\x64\xc2\x25\x88\x47\x56\ \xb9\xe3\x90\x25\x34\x93\x2c\xb2\x27\xb2\x0c\x71\xcb\x11\x8c\x46\ \x96\xb9\x60\x96\x6d\xae\x78\x93\xbe\x66\x9f\x69\xce\x59\x63\xd4\ \x16\x81\xe5\x89\xca\xd2\x04\x27\xfc\xd5\x2b\x59\xe2\x9c\xc9\xb3\ \x3c\x2a\x6c\xaf\xb3\xc0\x86\x8b\xce\xd1\xcc\xbb\x1c\x9c\x61\x9d\ \xb0\xad\x82\x97\x5b\x8c\x70\x5f\x41\xdf\xc8\x7c\x61\x98\x1d\x82\ \x57\x2a\x50\x4a\xd3\x4f\xf1\x1f\x0d\x1f\xf4\x92\x26\x50\x52\x9d\ \xc5\x14\x01\x59\xf9\x53\xc7\xb4\x52\x70\x04\xdd\x72\xa4\xb3\xa4\ \xfc\x97\x63\x84\xc4\x3f\xbf\x92\x36\x4a\x32\x9f\xe9\x23\x8a\x3f\ \xaf\x7c\x76\x88\x29\x49\xc0\xed\xe1\xab\x32\x4c\x30\x88\x2f\xa5\ \xbc\x9e\x26\xe6\xe8\xaa\xf0\x81\x64\xd2\x21\xde\x7c\x78\xeb\x24\ \xa8\x46\xbb\x45\xe8\x76\xe6\x79\xfc\x26\x0b\x2c\xf3\x85\xf8\x69\ \xb4\x9d\xa8\xcd\x21\x9f\x00\xe3\x02\x9b\xd2\x4d\x12\xd0\xa6\xb8\ \x31\x07\x5c\x9f\x55\x1f\x31\xe9\x61\x45\x12\xcc\x8a\xb9\x5e\x1a\ \xa8\x8f\x54\xfc\x26\xca\xa8\x31\x62\x46\xde\x40\xfa\xc1\x48\x1a\ \xb5\x65\xfc\x13\x20\x1c\x7a\xbe\xc4\x32\x1f\xaf\x00\x00\x00\x25\ \x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\ \x32\x30\x31\x31\x2d\x31\x32\x2d\x31\x35\x54\x31\x36\x3a\x34\x36\ \x3a\x35\x30\x2b\x30\x39\x3a\x30\x30\x34\xb8\x6c\x6d\x00\x00\x00\ \x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\ \x00\x32\x30\x31\x31\x2d\x31\x32\x2d\x31\x35\x54\x31\x36\x3a\x34\ \x36\x3a\x35\x30\x2b\x30\x39\x3a\x30\x30\x45\xe5\xd4\xd1\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x18\x75\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\xe4\x00\x00\x00\x56\x08\x02\x00\x00\x00\x50\x37\xad\xa4\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\ \xc7\x6f\xa8\x64\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x03\x14\ \x13\x24\x01\xf9\xb1\x91\x46\x00\x00\x17\xf5\x49\x44\x41\x54\x78\ \xda\xed\x5d\x77\x58\x14\xc7\xff\x9e\xd9\x72\xc7\x01\x02\x07\x88\ \x48\x11\x1b\x10\xb0\x81\x20\x11\xbb\x60\xef\xf8\xd3\x68\x82\xbd\ \x6b\x8c\x11\x4b\x40\x93\x60\x82\x29\x9a\x44\x13\x35\x96\x04\x35\ \x31\xb1\xc5\x68\x02\x06\x4b\x14\x22\x82\xb1\x82\x05\x85\xaf\x09\ \x88\x8a\x02\x42\x54\x90\x7e\xb0\xbb\xf3\xfb\xe3\x60\x39\x67\x0f\ \xb8\x3b\x16\x04\xdd\xf7\xd9\x87\xe7\x9c\x9d\xdd\x9d\x9b\x7b\xf7\ \x9d\x4f\x99\x19\xa1\x51\x9b\x2e\x40\x82\x84\xe6\x00\x42\xea\x02\ \x09\x12\x59\x25\x48\x10\x19\x14\x00\x50\xea\x05\x09\xcd\x84\xac\ \x12\x57\x25\x48\x66\x80\x04\x09\x12\x59\x25\x48\x36\xab\x04\x09\ \x92\xb2\x4a\x90\x20\x91\x55\x82\x14\x0d\x90\x20\x41\xb2\x59\x25\ \x48\x90\xcc\x00\x09\xaf\x8a\xb2\x1a\x08\x19\x81\x3a\x75\x6c\xdb\ \xd3\xab\xdb\x88\xc1\xfe\xfe\x03\xfa\x42\x28\xa6\x42\x23\x84\x62\ \x62\xe3\x8f\x9f\x8e\xb9\x98\x78\x23\x39\xed\x5e\x39\x27\xc9\xbf\ \x04\x00\x8d\xda\x7a\x1a\x70\x99\x9f\x4f\x97\xc8\x7d\xbb\x28\x8a\ \x6a\x84\x26\x32\x0c\x33\x36\x70\xf6\x5f\x97\x6f\x4a\xbf\xd6\x2b\ \x4f\xd6\x76\xfa\x91\x95\x86\xdc\xfe\xad\x5f\x8c\x1a\x36\x04\x00\ \x90\x9d\x9d\x1d\x1f\x1f\x9f\x9e\x9e\x7e\xe7\xce\x9d\xbc\xbc\x3c\ \x84\x90\x5a\x14\xf9\x0f\x35\xfd\xad\xb3\x82\x52\xa9\x74\x71\x71\ \x71\x76\x76\xf6\xf3\xf3\x73\x70\x70\x00\x00\x44\x9d\x3c\xf5\xd6\ \xdb\xef\x55\x20\xc9\x6e\x91\xc8\xaa\x33\x7e\xdd\xb6\x6e\xd4\xb0\ \x21\x08\xa1\x93\x27\x4f\x1e\x3c\x78\xb0\xac\xac\xcc\x00\x2e\xea\ \x7e\x4a\x2e\x97\xcf\x9c\x39\x33\x20\x20\x00\x42\x18\x75\xf2\xd4\ \xc4\x45\x21\xd2\x6f\xf6\xea\x92\x55\xa1\x0f\x59\xfd\x7a\x74\x89\ \xfa\x65\x0f\x42\x68\xe3\xc6\x8d\xd7\xaf\x5f\x47\x08\x71\x1c\x07\ \x00\x50\xff\x35\x80\x8b\x3a\x9e\xf2\xf1\xf1\x09\x0b\x0b\x83\x10\ \x8e\x9a\x34\xfd\xaf\x2b\x92\x3d\x60\x20\x4a\xd2\xaf\x62\x25\xc6\ \xed\xbb\x37\xa3\x47\x13\x00\x40\x1d\x0f\x19\x01\x22\xf6\xed\x02\ \x00\x44\x47\x47\x27\x27\x27\x53\x14\x45\x92\xa4\xfa\xaf\x1a\x04\ \x41\x40\x08\x89\x1a\x50\xcb\xa9\x3a\x71\xe5\xca\x95\x88\x88\x08\ \x00\x40\xc4\xbe\x5d\x32\x02\xe8\xde\x66\xe9\x78\xfe\xd0\xa2\x56\ \xcd\xe8\xd1\x7a\x98\x80\x9d\x3a\x3a\x51\x14\x95\x93\x93\x13\x19\ \x19\xa9\x66\x27\xcf\x57\x8a\xa2\x08\x82\xe0\x29\xdb\x10\xd8\xb3\ \x67\x4f\x66\x66\x26\x45\x51\x9d\x3a\x3a\x89\xfb\xd2\x4f\x19\xed\ \x57\x92\x9e\x28\x3c\xe6\xbe\x31\x52\x12\xe3\x26\x05\x3d\xc8\xfa\ \x7a\xf7\x6e\x00\x80\x84\x84\x04\x96\x65\x79\x35\xe5\x95\x95\xd2\ \x80\xbe\x94\xd5\x45\x8f\x19\x86\x89\x8d\x8d\xe5\x9b\x21\x5e\x90\ \x8c\xfb\xe4\x83\x60\xad\x67\x3e\x5e\xb5\x1c\x70\xac\x44\x91\xa6\ \x44\x56\x9d\x65\x78\xc4\x10\x3f\x00\x80\x5a\xde\x78\x52\x62\x94\ \xd5\x24\xae\xe8\xb6\xc1\x9d\x3b\x77\x00\x00\x23\x86\xf8\x89\x38\ \x3a\xb5\xb7\xb7\xb6\x69\x69\xad\xb5\x6b\x2c\xcc\xcd\x5f\x6b\x6b\ \x27\x59\x01\x4d\xe7\xd1\x7a\xa4\x5b\xfd\xfb\xf7\x55\x93\x95\x24\ \x49\xb5\x3f\x44\x10\x84\xda\xc7\x42\x08\xa9\x93\x02\xea\xcf\xfc\ \x59\x8e\xe3\x20\x84\x7c\x49\x3d\xe3\x06\xe9\xe9\xe9\x55\xcd\x10\ \x2d\x47\xf0\xee\x9c\xe9\xb5\x9c\x5d\xbe\x68\xce\xdc\x55\x9f\xbd\ \xdc\x1e\x76\x33\x7a\xb4\x1e\x66\x80\x9a\x8e\x25\x25\x25\x9a\x1e\ \x15\x26\xa5\x98\xe2\x0a\x3d\xb0\xfa\xd8\x06\xcf\x9e\x3d\xe3\x9b\ \x21\x0a\x28\xc0\xcd\x9d\x31\xa5\x96\x0a\x81\x6f\x8c\x97\x41\x4e\ \x1a\x7f\x9b\x08\xf4\x4e\x41\xa9\x39\xa7\xd6\x3c\x96\x65\x79\xf6\ \x68\x2a\x2b\x5f\x41\xab\xe8\x2a\x95\xca\xd2\xd2\xd2\x92\x92\x92\ \x5a\xe4\x56\xad\xc7\x5a\xe5\x56\x44\x0c\xec\xe9\x51\x67\x9d\x21\ \x7d\x7c\xa2\xe2\x13\x24\xa2\x34\x57\xb2\xf2\xc3\xba\x9a\x52\x6a\ \x6a\xf2\x94\xe5\x69\x2a\x64\x30\xc7\x71\xc3\x86\x0d\x9b\x38\x71\ \x22\x00\x80\x65\xd9\x98\x98\x98\x43\x87\x0e\xa9\x54\x2a\xbd\x6c\ \x03\xd1\x3c\x2b\x84\x3e\x59\xbd\x02\x2b\xac\xa8\xa8\xa0\x69\x5a\ \xb3\xe4\xb3\x0f\x83\xff\x18\x3c\x41\xdc\x99\x0f\xaf\x20\x8c\x3b\ \x78\x8b\x12\x0d\xd0\xcf\x48\xe6\x9d\x7d\xf2\x79\x08\xc3\xae\xc2\ \xb3\x13\x26\x4c\x50\x33\x55\x4d\xfa\x21\x43\x86\xac\x5b\xb7\xce\ \xde\xde\x5e\x77\xdb\x40\x44\xbf\xa0\xa5\x99\xa2\x4b\x27\x77\xac\ \x3b\xfa\x8c\x98\x80\x95\x74\xec\xd0\xae\xb5\xd2\x54\xf2\xb0\x9a\ \xc2\x41\xe8\xfb\x4d\xd5\x34\xad\x93\x9a\x42\xe3\xd5\xc4\xc4\x64\ \xd0\xa0\x41\x58\x57\x59\x5b\x5b\x07\x07\x07\xb7\x6a\xd5\x4a\xc7\ \x18\x96\x88\x3d\x3c\xe3\x8d\xb1\x58\x63\xa2\x4e\x9e\xbe\x79\x37\ \xeb\x4c\xfc\xdf\x58\xf9\xec\x37\xc7\x4b\x5c\x6d\x0a\x07\x61\x80\ \x19\xa0\xe9\x30\xe9\x22\xa8\xea\xbf\x5e\x5e\x5e\xd8\x08\xab\x86\ \x52\xa9\x0c\x0e\x0e\xb6\xb6\xb6\xd6\xc5\x03\x13\xcd\x11\xe5\xd8\ \x0f\x56\xbc\x8b\x15\xae\xdb\xbc\x03\x00\xb0\xf6\xab\x2d\x58\x79\ \xf0\xd2\xb7\x09\x24\x05\x5c\x9b\x44\x52\x40\xbf\x17\x13\x8b\x03\ \xd4\x44\x50\xec\x9f\x04\x41\xb4\x6b\xd7\x8e\x7f\xea\xa5\x2c\xd5\ \xd5\x47\x2a\x4d\x7d\x7d\xef\xbd\xf7\x2c\x2d\x2d\xeb\x0c\x1a\x88\ \x25\x08\x1e\xae\xed\x64\x32\x99\x66\x47\x30\x0c\x73\xed\x9f\x7b\ \x00\xc0\xcb\xb7\x52\xd5\x06\x77\xb5\x5d\x4f\x51\xde\x9d\x9c\x25\ \x69\x6d\x02\x66\x80\x41\xca\x8a\x09\x6a\x9d\x26\x2c\x45\x51\x16\ \x16\x16\xfc\x4d\x52\x9f\x56\xec\xbc\x5e\x78\x3d\xa7\x9a\xaf\x36\ \x36\x36\x41\x41\x41\x26\x26\x26\xc2\x38\x97\xa6\x6d\x20\xd6\x3b\ \xfa\xc1\xb2\xb7\xb1\x92\x2f\x36\x6f\x47\x90\x04\x00\x70\x90\xdc\ \xb4\x7d\x27\x76\x36\x74\xf9\x3b\x92\xb0\x35\xa7\x74\xab\xa6\xcd\ \xaa\xbb\x6b\xc5\x9f\xd2\x24\x6b\x7e\x19\x0b\x00\xd8\x7d\xbd\x28\ \xf9\xbf\x72\xbe\xd0\xde\xde\x7e\xc1\x82\x05\x34\x4d\xd7\x12\x97\ \x15\xc7\x33\xa5\xe1\xf0\xc1\x7e\x58\xe1\x0f\x07\x7f\xe3\x3f\x7f\ \xb7\xf7\x10\x76\xd6\xaf\x7f\x9f\x16\xb2\xc6\x98\x4a\x2b\x23\xb8\ \x5e\x5d\x3a\xae\x9a\xff\xd6\xe9\xbd\xdf\xde\x39\xf7\x47\xc1\xed\ \xf3\x0f\xaf\x9c\x3a\x7b\xe8\xfb\x2f\x83\x17\x0e\xf5\xed\x66\x6e\ \x44\x8a\x1e\xbf\x6b\x56\xa1\x2b\x3d\x63\x32\x89\x89\x89\x72\xb9\ \x5c\x2e\x97\x2b\x95\x4a\xa5\x52\x49\x92\xa4\x3a\x4d\x85\x05\xaa\ \x78\xf0\x31\x2c\x33\x33\x33\xfe\x26\xcf\x54\x1c\x01\x01\x8b\x50\ \xf8\xb5\xc2\xb7\xbd\xcd\x9c\x2d\x2b\x6d\x59\x77\x77\xf7\x37\xdf\ \x7c\xf3\xc0\x81\x03\xea\xfb\x60\xb7\x12\x2b\xed\x32\x76\x70\x5f\ \xac\xe4\xc1\xc3\xcc\x87\x4f\x0b\x61\xd5\x38\x93\xf1\x5f\x7e\xf6\ \xa3\x9c\xd6\xb6\xad\x34\xeb\x8c\x1f\xee\xb7\xe7\x68\xb4\xc1\x0f\ \x2d\x49\xbd\x8c\xbf\x33\xce\x3e\x9a\xff\x6c\xd9\x42\xfe\x69\xf0\ \xd2\x29\x93\xfe\x0f\xab\x66\xa9\xb4\xb0\x54\x7a\xf4\xe8\xee\xf1\ \xf6\xdc\x99\x00\x80\xcb\x89\xd7\xe6\xaf\xf8\xe0\xf6\x83\x5c\x71\ \xa2\x69\xfa\xdf\x03\x21\x6e\xee\x84\x11\x9b\xd7\x85\x61\xe5\x1c\ \xc7\xf9\x0e\x0b\xb8\x79\x37\xdb\xb0\xaf\xaf\x63\x9c\x55\xbf\xf6\ \x26\x27\x27\x6b\xc6\x59\x2d\x2c\x2c\x94\x4a\xa5\xa5\xa5\xa5\x95\ \x95\x95\xa5\xa5\x25\x45\x51\x9a\xf9\x55\x3e\x16\x4b\x92\xa4\xb1\ \xb1\x71\x35\x59\xcb\x10\x01\x21\x02\x88\x45\xe8\xfb\x6b\x05\xcb\ \x5f\xb7\xb0\x35\x25\x2b\x83\x47\x7d\xfa\x94\x96\x96\x46\x45\x45\ \xb1\x2c\xcb\xa7\x73\x01\x00\x26\x26\x26\xae\xae\xae\x22\xb0\x95\ \xe3\x3e\x15\xcc\x5c\xf9\xf0\xf3\x0d\x10\x92\x1a\x3f\x21\xf9\xe1\ \xe7\x1b\x76\x6e\xfa\x42\xb3\xce\xda\xd5\x2b\xf6\x44\x9c\x02\x04\ \x29\x9e\x52\x40\xde\xdb\x5b\x36\x6b\xd2\xda\xf7\x57\xea\x72\x8d\ \x8f\x97\xe7\xb5\x33\xc7\x7e\xd8\xf7\xcb\xe2\x35\x5f\x22\x48\x36\ \x36\x5b\x39\x76\xc3\xea\x77\x16\xcd\xc6\x73\xd4\x4f\xf3\xf2\xbb\ \x0f\x1a\x9b\x5b\x50\xa6\xcf\x0d\xa1\x01\x64\xd5\xdb\x0c\xd0\xe4\ \x62\x5e\x5e\xde\xd3\xa7\x4f\xd3\xd2\xd2\xf8\xec\x94\x83\x83\x83\ \xa3\xa3\xa3\x8d\x8d\x8d\x5a\x0b\xd5\x02\x60\x64\x64\xc4\x2b\x01\ \x8b\x10\xc3\x21\x02\x02\x04\x20\x00\x40\xc5\x82\x1d\x57\x0b\x96\ \xf7\x34\xe7\xc7\xd9\xc1\x83\x07\xb7\x69\xd3\xe6\xc4\x89\x13\x34\ \x4d\x9b\x98\x98\xb4\x6d\xdb\xd6\xc5\xc5\xa5\x75\xeb\xd6\xa2\x68\ \x49\xbb\xd6\x96\xb6\x36\x2d\xf1\xa0\xd5\x5f\x78\xb8\xea\xe8\xe9\ \x38\x3c\xca\x66\x65\xd9\xd1\xbe\x65\x5a\xf6\x53\x71\x87\x36\x1a\ \xb0\xc7\xf7\x6d\xeb\xdd\x53\x3f\x99\x99\x19\x38\xa9\xb3\x9b\xab\ \xdf\x1b\x73\x58\x48\x82\xc6\x02\x89\xd8\x23\xe1\x1b\x86\xf8\xf5\ \xc7\xca\x53\x6e\xff\xdb\x77\xdc\x94\x52\xb6\xc1\xf3\x26\x06\x66\ \xb0\xb0\x01\x9a\x47\x7e\x7e\x7e\x5e\x5e\x5e\x52\x52\x12\x4d\xd3\ \xf6\xf6\xf6\x0e\x0e\x0e\x0e\x0e\x0e\x0a\x85\x42\x53\x56\x55\x0c\ \xa0\x08\x88\x00\xe2\x10\x40\x08\x70\x00\xe4\xab\xb8\xef\xaf\x15\ \xbe\xe3\x6d\x26\x23\x2b\xbf\xb0\xab\xab\xab\x86\x8e\x8a\x89\x77\ \x66\x05\x62\x25\xd1\xb1\xf1\x25\x0c\x5e\xad\xa8\x02\x9d\x89\x3f\ \x3f\xb0\x6f\x2f\xcd\xc2\xa5\xf3\xa6\x2f\xfe\xf8\x6b\x71\x7f\xfe\ \x0b\x51\xfb\xdd\x5f\x73\x31\xe0\xda\x1e\xdd\x3d\x7e\xfa\x66\xed\ \x5b\x4b\xd7\x34\x4e\x76\xcd\x98\x02\xe7\x22\x0f\xbe\xe6\xd2\x11\ \x2b\xff\x33\x26\x76\xc2\xfc\x15\x8d\xf3\xce\x18\xe2\x60\x61\x3e\ \x96\xd6\x18\x13\xc3\x30\xf7\xee\xdd\x8b\x8f\x8f\xdf\xbf\x7f\x7f\ \x64\x64\x64\x66\x66\x66\x35\x59\x59\x24\x23\x81\x8c\x84\x32\x12\ \xd2\x24\xa4\x09\x40\x11\x20\xb3\x90\xd9\x7d\xa3\xb0\xa4\xa2\x61\ \xbd\x07\x12\xb0\x0b\x66\x4d\xc3\x0a\x3f\xd9\xb8\x55\x6b\xe5\xb5\ \x1b\xf0\x80\xeb\xac\x29\x93\x69\x20\xde\xbc\x16\x8e\x8d\xdc\xfd\ \x8d\x26\x53\x6f\xdc\x4c\x9e\xbe\x30\xc8\xa9\x7b\x3f\x73\x67\x6f\ \xe3\x0e\xde\x8a\x8e\x3d\x4c\x3b\x7a\xb7\xea\xe4\x3b\x26\x70\xf6\ \xcd\xe4\xff\x09\x6f\x10\x30\x6a\x78\xef\xae\xce\x8d\xc0\x92\x56\ \xe6\x8a\xb4\x8b\xa7\x84\x4c\xdd\x1a\xfe\x63\xc0\xbc\x15\x8d\xa6\ \xee\x7a\xdb\xac\x98\x19\xc0\x5b\xa5\xb5\xc8\xed\x93\x27\x4f\x1e\ \x3c\x78\xc0\xdf\xa1\x9c\x45\x34\x09\x11\x02\x1c\x02\x08\x80\x4a\ \x7d\x45\xe0\x6e\x7e\xc5\xa6\x2b\xf9\xd3\xba\xb4\xb0\x6f\xa1\x5d\ \xef\x73\x4b\xd8\xdb\x8f\x2b\x2e\xde\x7e\x60\xb0\xcd\xda\xdf\xbb\ \xab\xd0\x2d\x48\x48\xb9\x03\xb4\x75\xf7\xe5\x5b\x69\x1c\xc7\x61\ \x21\x08\xbf\x9e\x9e\x7f\x5e\x4c\x12\xa5\xeb\xc3\xc3\x82\xfc\xfa\ \xf5\xa9\xf2\xf0\xb2\x26\xcf\x5d\x72\x35\x35\xa3\xca\xc9\xa3\xd4\ \x33\x8d\x39\x00\x0a\xcb\x51\xf4\xe5\xe4\xe8\x31\xd3\xc6\xf9\xf5\ \xdc\x1f\x8e\xbf\x3f\x47\xf7\xee\xb4\xe9\xda\x8f\x33\x9c\x2e\x75\ \xf7\x64\xb7\x0e\x76\x7f\x1f\x3f\x2c\x0c\xc5\x2c\x09\x59\x13\x7e\ \xf8\x04\x24\xa8\x86\x7b\xb4\x40\x59\xf5\x8c\x28\xd7\x12\xb4\xaf\ \x45\x6e\x6d\x6d\x6d\xab\x5d\xef\x02\x26\x2e\xa3\x34\xa7\x98\xa5\ \x08\x40\x13\x80\x26\x60\xa5\xca\x12\xb0\x48\x85\x76\x5c\x2d\xb8\ \xfa\x48\x55\xce\xa2\x7c\x15\x97\x5d\xc4\xa6\xe7\x33\x89\xd9\xaa\ \x03\xc9\x45\x1f\xc5\xe5\x7d\x72\x2e\xff\xf0\xed\xe2\xeb\x0f\xf2\ \x0c\x0b\x2a\x23\x80\x3e\x7d\x7f\x39\xf6\xfd\xbf\xde\x1e\xce\x11\ \xa4\xd6\xfa\x1c\x41\x6e\xda\xb1\x0b\xab\xff\xe9\x07\x2b\x90\xda\ \xd8\xae\x77\x3c\x3e\x30\xb0\xd2\x20\x89\x3f\x7f\xc9\x7d\xe0\xd8\ \x6b\x77\x1e\x42\xa2\xe6\x9f\x83\x24\x23\xce\x5e\x19\x39\x79\x26\ \x3e\x3a\x1b\x2b\x7a\x7b\xba\x35\x50\x4e\x00\x01\x14\xe0\xe7\x73\ \xe1\xe4\x6f\x42\xa6\x8e\x98\x34\x63\xe7\x6f\x7f\xd6\xd6\xe0\x86\ \x99\x7c\xad\xb7\x19\xa0\xe9\xef\xd7\xa4\xa6\x58\x1d\x1f\x1f\x1f\ \xcd\x8c\xc0\xbd\x7c\x26\x3d\x8f\x31\xa1\x89\xae\x36\xb4\x8b\x95\ \x8c\x22\xd4\x12\x5b\x29\xb7\xbf\xff\x53\x72\xe4\x76\x71\x95\xf4\ \x22\x0e\x55\xaa\x2f\x01\x01\x00\x80\x30\xd4\x44\xb3\x36\x95\x77\ \xeb\xdc\x49\xb3\xa4\x4c\xa5\xfa\x70\xd3\x0f\xb5\x5c\xf2\xdd\xde\ \x43\x41\x8b\xe6\x6a\x96\xb8\xbb\xba\xb4\x32\x33\xca\x2d\x54\x89\ \x35\xb4\x5d\xbc\x92\x38\x6c\xda\x62\xa4\x5b\x90\xe1\xaf\xc4\x94\ \x1f\xf6\xfd\x32\x33\x70\xd2\x73\xe6\x4a\x48\x50\xff\xc9\x0b\xc4\ \xb7\x5c\x39\x6e\xd5\xbc\xb7\x42\xdf\x5b\x8a\x15\x97\x97\x97\x77\ \xf7\x1f\x93\x9e\x93\xff\x42\x92\x02\xfa\x89\x83\xee\x6a\xca\xc3\ \xd4\xd4\xd4\xd7\xd7\x97\x7f\x64\x42\xb6\x4a\x4e\x42\x39\x09\xcb\ \x59\xee\x72\x96\xea\x60\x4a\x51\x42\xb6\xaa\x9c\x45\x34\x01\x68\ \x12\xd0\x64\xa5\xdc\xd2\x95\x16\x2d\x94\x11\x50\x46\x54\x5b\xb7\ \x24\x61\x60\xb2\x6e\xea\x78\x7c\x01\x60\xda\xdd\x8c\xda\x2f\xc9\ \xc8\x2d\xc8\x7e\x94\x83\x5d\x35\x7d\xe2\x58\x91\x52\x9d\x80\x61\ \x98\xd1\x33\x16\x23\x82\xd2\xf1\x26\x10\x12\x2b\x3f\xfd\x46\x18\ \xcc\x32\xa6\x44\xd6\x37\xc8\x71\xbb\xd6\xad\x16\x32\x35\xfb\x51\ \x4e\x5b\x6f\xbf\xf4\x9c\x67\x2f\x66\x75\xab\xbe\x4f\xab\x85\x9a\ \x5a\x89\xeb\xe3\xe3\x13\x11\x11\x61\x6f\x6f\x5f\x19\x52\x06\xe0\ \x46\x8e\x4a\x46\x42\x19\x55\x79\x00\x00\xfe\xf7\xb8\xe2\x50\x4a\ \x51\x5c\x46\x59\x81\x0a\xc9\x2a\xad\x02\x20\x23\x80\x4c\x83\xb5\ \x6a\x9f\x8c\x26\x20\x6d\x18\x5b\x39\x36\x74\x25\x3e\x73\x65\xc2\ \xbc\x65\x75\x75\x0f\x11\xfa\xf9\x46\xec\xaa\xf7\x97\x2d\x26\x38\ \x56\x04\xaa\x02\x30\x73\xf1\x8a\x92\x0a\xfd\xee\x53\xca\x80\xbf\ \xe2\xce\x61\xf7\x69\x63\xdb\x52\x44\xbe\xc8\x20\x7b\xe6\x97\xef\ \xde\x9c\x30\x0e\xab\x9c\x70\xed\x86\x7b\xff\x31\xcf\xca\xd8\x17\ \x35\x29\xc1\xc0\x68\x80\x26\x35\xb5\xaa\x29\x4d\xd3\x03\x06\x0c\ \xd8\xbe\x7d\xfb\xce\x9d\x3b\x79\xa6\x02\x00\xee\xe5\x57\x14\x57\ \x20\x39\x05\xe5\x24\x50\xeb\xab\x9c\x84\x32\x12\x50\x04\xbc\xff\ \x8c\x89\xf8\xa7\xf8\x64\x7a\xc9\xb3\x32\x8e\x26\x20\xa5\x56\x56\ \x92\x97\x5b\x58\x69\xdd\x52\x86\x38\x13\xdd\x9c\x1d\x8d\x8c\x8c\ \xb0\xc2\xbc\xa7\x4f\xea\xbc\xf0\x68\x74\x3c\x9e\x11\x95\xc9\x3c\ \x5c\x45\x58\x0e\x8e\x10\x8a\x8c\x39\x6f\xc0\x85\x9b\xbf\xdf\x83\ \x95\x78\x75\x71\x13\x6b\xa8\x35\x37\x22\x93\xcf\x44\xfa\x78\xe1\ \x5b\x9f\x1c\x8e\x8c\x1a\x30\x71\x6e\xf9\x0b\xdd\xbe\xc9\x70\xb2\ \xd6\x24\xa8\x66\x66\x66\xd3\xa7\x4f\x8f\x88\x88\xf8\xfa\xeb\xaf\ \x7d\x7d\x7d\x35\x6d\xa9\xbc\x32\x6e\xfb\xd5\x02\x59\x15\x47\xb5\ \x1c\x14\xfc\xaf\x84\x8d\x4c\x2d\x3e\x9b\x51\x56\x5a\x81\x68\x12\ \x54\x5b\x02\xbc\xdc\x92\x86\x18\x67\x21\x4b\xe6\x63\x25\xf1\xe7\ \x2f\x15\xaa\xea\x8e\x43\x15\x55\xa0\xd8\x78\x9c\x52\xef\x2f\x5d\ \x58\xff\xae\xdf\xb4\x63\x97\x61\x41\x9f\xff\xa5\xdd\xc5\x4a\x7a\ \xbf\xee\x25\x0a\x1b\xda\xb5\xb2\x48\xbf\x1c\x6d\x6f\xd7\x1a\x2b\ \xff\x6c\xe3\x96\xe9\xcb\xc3\x10\x41\x82\x17\x0a\x0a\xe8\x69\x98\ \xd7\x92\x14\x30\x33\x33\x9b\x38\x71\xe2\xf8\xf1\xe3\x4d\x4d\x4d\ \x85\x17\x9e\xcd\x28\xdb\x9e\xf8\x2c\xbf\x8c\x93\x93\x50\xed\x33\ \x55\x1d\x08\x01\xbe\x04\x71\x08\x72\x08\x3c\x28\x60\x1e\x14\x54\ \xb8\x5a\xc9\x3c\x6d\xe5\x0a\x0a\x72\x08\x21\x04\x38\x04\x11\x00\ \xee\x76\x66\xfa\xb6\x59\x41\xa2\x31\xc3\x87\x60\x85\x61\x1b\xbe\ \x85\xba\xcd\x8c\x59\xbb\x71\xeb\x80\xe7\xb3\x03\xc3\x07\xfb\x19\ \xd3\x50\x98\x4a\xd0\x0b\x51\xa7\xcf\x00\x83\xbc\xa2\xdc\xfc\x42\ \xac\xc4\xc1\xae\xb5\x61\xb7\xd2\xbc\xaa\x6f\x37\xe7\x93\x87\xf6\ \x08\xab\x4c\x5f\xb4\xec\xd7\xe8\x0b\x90\x14\x7b\xc7\x48\xd8\x58\ \xe9\x56\xcc\xd9\xb7\xb4\xb4\x9c\x38\x71\xe2\x98\x31\x63\x84\x43\ \x2d\x00\xe0\x51\x11\xfb\xf3\xad\xc2\x8b\x0f\xcb\x38\x04\xaa\x98\ \x5a\x49\x4a\x0e\x80\xe7\x89\x0b\x78\xdf\x9f\x43\x20\xed\x69\x45\ \x7a\x1e\xd3\xad\x95\xac\xab\x8d\x0c\x12\x95\xa7\xc6\x75\xb1\x0b\ \xd2\xb3\xcd\xa3\xfd\x7a\x0b\x87\xe0\x4b\x37\xff\x05\xba\x09\xdb\ \xe5\xe4\x54\x61\xc0\x75\xdc\xe0\xbe\xfb\x4f\xc4\xd7\xe7\xc7\x4a\ \x49\xbb\x6f\xd8\x85\x15\x2c\x9e\x3a\xc1\xe6\xdc\xe8\x6f\x90\x70\ \x73\xc7\x0f\xdd\xb4\xee\x63\x61\x2f\xf5\x1b\x3d\xe9\x6a\xea\xc3\ \x26\xb2\x04\xad\xbe\x73\x03\x10\x42\x9e\x9e\x9e\xa1\xa1\xa1\x42\ \x35\x45\x08\x24\xe5\x96\x9f\xbe\x5b\x92\x94\x53\xce\x22\x20\xd3\ \x10\x54\xa4\x9d\xa3\x55\x0c\x7e\xfe\xf3\x8d\x5c\x55\x46\x41\x45\ \x5f\x47\x85\x95\x31\xd9\xca\x98\xb0\x31\x95\xe9\xfb\x4b\x7c\xf6\ \x01\x3e\x47\x64\xdb\xae\x3d\xba\x0f\xc1\x1c\xa4\x36\xed\xd8\x85\ \xc5\xb0\xd6\xae\x5e\xb1\xff\xd8\x59\x50\x8f\x59\x8b\x45\x65\x15\ \xc0\x20\x33\x00\x09\x8c\x37\x07\xc1\xc0\xad\x57\x22\xed\xcb\xe0\ \x85\x6f\xcf\x99\x81\x37\xaf\xb8\xd8\xd3\x6f\x6c\x56\x7e\x09\x68\ \x32\x30\x7c\x75\xab\xda\x12\xf0\xf5\xf5\x5d\xb5\x6a\x15\xb6\xab\ \xb0\x8a\x41\xe7\x1e\x96\xc5\xde\x2f\xcd\x2d\x66\xb9\x4a\x9a\x6a\ \x4a\xa9\x16\x52\x22\x21\x77\x35\x08\x5d\x54\x8e\x8e\xa7\x95\x74\ \xb6\x91\x2d\xf5\x31\xd7\xb7\xc1\x4e\x2d\xcd\x85\xc2\xb3\x7d\xcf\ \x2f\x7a\xdd\xe4\xfb\xbd\x87\x31\xb2\xda\xda\xb4\x6c\x6b\xab\xbc\ \x97\xfb\xcc\xe0\xae\x67\x91\xa1\x99\x38\xc1\x1b\x62\x61\x6e\x66\ \x58\x1b\x48\xc4\xfe\xba\x63\xfd\x50\xff\x01\x58\xf9\x9d\xbb\xf7\ \x7d\x47\xbf\x59\x5c\x01\x9a\x14\x0c\x4f\xb7\xaa\x2d\x81\xc0\xc0\ \x40\x4d\xa6\x96\x32\xe8\xef\x07\x65\x71\x19\xa5\x45\xe5\x88\x43\ \xa8\xda\x3c\x05\xf8\x10\x5f\xe3\x01\x00\x87\x10\xd2\x26\xb1\x69\ \x4f\x2b\xda\x98\x53\xfa\x66\xea\x16\x4d\x9f\x8c\x95\x3c\xcd\xcb\ \xbf\xfb\x28\x4f\xaf\xc9\x7e\x19\xff\x15\x08\x67\xb8\xbe\x33\xf3\ \xad\xe5\xeb\x77\x18\x3e\xf8\x42\x12\x8a\xb9\x21\x8a\x21\xb7\x4a\ \x3b\xf7\x87\x8d\x8d\x0d\x56\x18\x1b\x7f\x7e\xec\xec\x65\x4c\x83\ \x67\xfc\x1b\x3e\xdd\xaa\x19\x07\x70\x73\x73\x6b\xdf\xbe\x3d\x7f\ \xaf\x2b\x59\xaa\x8d\x17\xf3\x63\xef\x97\xb2\x1c\xe0\xbd\x7b\x39\ \x05\xe5\x14\xd0\x70\xf9\x2b\xa7\xb0\xc8\xaa\x42\xa7\x32\xb2\xaa\ \x8e\xba\x72\x65\x30\xeb\xb9\x43\x5d\xd8\x41\x49\x99\xa9\xa7\x11\ \xea\xdc\x66\x12\x30\x8b\xe7\xe2\x03\x5c\xe8\xba\x0d\x80\x24\xf5\ \x0b\xf1\x91\x44\xe8\x3a\x3c\xe0\xba\x60\xd6\x54\x12\xb0\x06\x47\ \x1a\x21\x01\x1b\x7b\x31\x95\x00\x42\xa6\xde\xba\x75\x6b\xe4\xec\ \x65\x0c\x41\x36\xc1\xd5\x5f\x86\xaf\x6e\x25\x08\xa2\xa8\xa8\x48\ \x73\x02\x7f\x5b\x0b\xca\xd5\x8a\x36\xaa\x0c\xf8\x03\x19\xf5\x1c\ \xd5\xb4\x06\xaa\xd4\xc7\xf3\xd4\x7c\x8e\xd9\x1a\xdc\x05\x59\x45\ \x6c\x5a\x9e\x7e\x23\x53\x1f\x4f\x77\xa1\x73\xf0\xdb\xc9\x58\x03\ \x74\xe0\x68\xcc\x39\x61\x61\x3f\xaf\x4e\xe0\xe5\x82\x8b\x8b\x8b\ \x8d\xb9\x71\xd3\x6c\x9b\xe1\x0e\x16\x84\x30\x37\x37\x37\x21\x21\ \xa1\x47\x8f\x1e\xea\x53\x2d\x8d\xc9\x09\x6e\xa6\x79\x65\xdc\x95\ \x2c\xd5\x8d\x1c\x95\x8a\x45\x35\xb9\x50\x08\xd4\xe8\x4e\x69\x89\ \x0c\x68\x98\x10\xa7\xd3\x4b\x3b\x7a\xd1\xba\x47\xdd\xd7\x86\x68\ \x89\x1c\x64\xdd\x88\x17\xab\xfb\xd6\x86\x04\xf5\x9e\x38\xaf\xf9\ \xee\xd7\x92\x92\x92\xe2\xee\xfe\xdc\x4e\x1f\x32\x99\x2c\xf5\xc2\ \xa9\xae\x03\x46\xdd\x7f\x5c\xd8\xd4\x5a\x5b\xdf\xb9\x01\x87\x0e\ \x1d\xca\xcb\xcb\xd3\xbc\xa3\xd2\x88\x18\xd2\x5e\xb1\xa4\x87\xf9\ \x28\x67\x63\x27\x73\x4a\x33\x53\x55\x83\x94\xd6\xa4\xbb\x40\xa3\ \x72\xa5\xc1\x70\x3e\xb3\x4c\x55\xe9\x98\xd4\x7d\x58\x99\xc8\xbc\ \x3c\xba\x36\x68\xf7\x79\x76\xed\x6c\x65\x22\x7b\x11\xcb\xa0\xc5\ \xb1\x03\x7a\x8c\x9b\x7d\xe0\x48\x24\x2e\x60\x14\x95\x1c\x7f\xc2\ \xcd\xb1\x65\x33\xde\xf9\x5a\x68\x06\x10\x04\x91\x91\x91\x11\x12\ \x12\x92\x9c\x9c\x8c\x55\x93\x53\xd0\xa3\x95\x7c\x7a\xd7\x16\x73\ \x3c\xcd\x7a\x3a\x18\xb5\x90\x13\xbc\x3d\xaa\x39\xbe\x6b\xb1\x62\ \xab\x08\xad\x95\xc1\x1c\x07\x22\x6f\x64\xeb\xd8\xd4\xc0\xb1\xc3\ \x1a\xe1\x75\x9f\x1a\x30\xa2\x19\x8f\xfa\x04\x39\x67\xd5\xba\x1d\ \x3f\xfc\x2c\x08\xd8\xc3\x84\xd3\x11\x3d\x5c\xdb\x34\x35\x65\xd5\ \xdb\x0c\xc0\xb2\xac\x05\x05\x05\x61\x61\x61\x6b\xd6\xac\x49\x48\ \x48\x10\x2e\x14\x6e\x69\x4c\xfa\xb7\x55\xcc\xf1\x68\xe1\x6e\x4d\ \xd7\x26\xa5\x1a\x1c\xad\x4d\x77\x29\x70\xe4\xea\x03\x1d\xc3\x87\ \xc2\x99\x2b\x0d\x81\xd0\x95\x4b\x9a\xf7\x06\xd9\x04\xb9\xec\xf3\ \xed\xeb\xbe\xd9\x26\x3c\x13\x1b\xb9\xdf\xdf\xdb\xad\x29\x91\x15\ \x42\x5d\x0f\x6d\x66\x00\x4f\xdc\x7f\xff\xfd\xf7\xab\xaf\xbe\x0a\ \x0a\x0a\x3a\x75\xea\x54\x69\x69\x29\xf6\x18\x53\x19\x31\xc6\xc5\ \x24\xc0\xd5\xc4\x4a\x41\x56\xd3\xb1\xca\x0f\xab\xd2\x51\xa0\x55\ \x7a\x2b\x6d\x00\xf5\x2c\x2d\x12\xb2\x1c\xd2\xa5\xb5\x9d\xdb\xdb\ \x19\x1b\x2b\x1a\xa1\x07\x8d\x8c\x8c\xba\x76\x70\xd0\xb1\xf7\x30\ \xf9\x32\xfc\x30\xec\x6e\x35\x5c\x05\x49\x32\x6c\xc7\xbe\x90\x8f\ \xd7\x69\x71\x2b\xf7\x86\x4f\xf0\x7f\x1d\xd5\xb3\xb5\x22\x7d\xfd\ \xfa\xee\x75\x85\x21\x27\x27\x67\xf7\xee\xdd\xf3\xe7\xcf\xdf\xb6\ \x6d\xdb\xed\xdb\xb7\xb1\x6b\x3b\x28\xe9\x29\x9d\x4d\x8d\x68\x80\ \x0d\xf4\xb5\x4a\x29\x14\x54\xd6\x29\xfe\x17\xb2\x78\x6e\xa3\xbd\ \xf1\x21\xef\xcc\x69\xee\x41\x00\x08\x89\xcd\x07\xa2\xe6\x2f\x5f\ \x2d\x3c\xb5\x67\xeb\x86\x79\xe3\x07\x37\x85\xcd\x35\xea\x95\x6e\ \xad\x69\xc9\x40\x45\x45\x45\x5c\x5c\xdc\xd9\xb3\x67\x6d\x6d\x6d\ \x47\x8f\x1e\xed\xef\xef\xcf\xfb\xcb\x72\x0a\x3a\xb4\xa0\x1e\x15\ \xb1\x75\xe7\x5a\x41\xf5\x67\xa4\x51\x2e\xa7\xea\x7e\xc1\x8c\x08\ \x2e\x60\x14\x6e\xb0\x1e\x8a\x88\x9a\xb9\x6a\x7d\xfd\xbb\xec\xfd\ \x79\x93\x57\x07\x3d\xb7\xfb\xd0\xd8\x11\x43\x15\x2b\xc3\x4a\x39\ \xa2\x99\xf3\x15\xfe\x7c\x2c\xee\x59\xc1\x92\x83\xe1\x9b\xb1\x53\ \xdf\x7c\xb6\xc6\xc2\xdc\xec\x8b\x1f\x0e\x1b\xa0\x6e\x4d\xc2\x66\ \xad\x69\xa2\x20\x26\xb4\xe1\xe1\xe1\xa1\xa1\xa1\x39\x39\xd5\xf3\ \xed\xdb\x9a\xd3\x78\x52\xa0\x56\x29\xc5\xa4\x97\xd6\x81\xac\x23\ \xfb\xbf\x2e\x2c\xfc\xe6\xfb\x3d\xa2\x74\xd9\x9e\xc3\x47\xb5\x3c\ \x71\x40\xcf\x97\x20\xc8\x0a\x21\xfc\xe3\xdc\xb5\xe1\x93\x67\x09\ \x4f\x7d\x14\x1c\xf4\xd9\xd2\x59\x2f\xd6\x3a\x37\x70\x17\x41\xbd\ \x96\x0d\xa6\xa6\xa6\x1e\x3b\x76\x8c\x7f\xa4\x83\x19\x85\x79\x57\ \x9a\x0b\x07\x64\x35\x58\xae\xd5\x9f\x69\xb2\xf6\x76\x22\x84\x3e\ \x7d\x1f\xdf\xd2\x9a\x61\x98\xa4\x3b\x99\xa2\x44\x61\x1e\x3e\x2e\ \xce\x7d\x8c\xcf\xda\xfe\x64\xf5\x72\x84\x50\xb3\x0b\x5d\x69\xad\ \x16\x77\x23\xad\xf7\xa8\x49\xc2\xaa\x4b\x17\xcc\xfe\x76\xcd\x52\ \xc0\x71\x2f\x2a\x74\x55\xaf\xa4\x80\xee\xcb\x06\x93\x92\x92\x34\ \x03\xb1\x26\x32\x42\xc5\x70\xea\xb1\x1e\x09\x92\x02\x1d\x95\x74\ \x6f\x47\x05\x02\x88\xe1\x00\xc3\xa1\x0a\x16\x3c\x2e\x65\x33\x0b\ \x99\x07\x05\x4c\x4e\x31\x6b\x54\xd7\x4a\x81\x36\x56\x2d\x1c\xed\ \xed\x70\x59\xdd\xb1\x1b\x11\x22\xcd\xc8\x24\x88\xb0\x2f\x37\x7f\ \xbb\xfe\xb9\x09\x75\x8e\xf6\x76\x6d\xac\x5a\x3c\x78\x5a\x0c\x5e\ \x0a\x5c\xbf\x93\xed\xe1\x37\xe6\x6a\x74\x04\x36\x31\x72\xe6\x5b\ \x6f\x58\x98\x99\x4d\x5d\x1e\x26\x5a\x67\xea\x19\x0d\x10\x61\x29\ \x76\x9d\xcb\x06\x1f\x3f\x7e\x5c\x50\x50\xc0\x3f\xd5\x5c\x1d\x76\ \x15\x04\xaa\x8c\x28\xd8\xcb\xc1\xa8\xbf\x93\x82\x22\x00\x4d\x40\ \x05\x05\x5b\xc8\x08\x4b\x05\xe1\x62\x49\x0f\x74\x52\x4c\xeb\xd2\ \xe2\xdd\x1e\xe6\x73\xfb\xb4\xab\xbd\x9d\x0b\xa6\x4e\x10\x7e\xcf\ \xdd\xbf\x44\x88\x18\xe1\xfe\xfd\xf4\x59\xe1\x23\x16\x4c\x9d\xf0\ \x52\x08\x6b\xe5\x91\xfa\x28\xdf\xad\xef\x88\xf2\xf2\x72\xec\x8a\ \x80\x51\xc3\x8e\x86\x7f\x49\x20\xa6\x19\xcc\x0d\xa8\x93\x9a\x35\ \x9d\xd5\x24\xab\x09\xad\x65\x7c\x37\xa1\xe1\x40\x27\x85\x9b\x75\ \x6d\xd3\x55\x65\x24\x74\xb1\xa9\x2d\x73\x4d\x22\xe6\xdd\xf9\xb8\ \xc9\xf5\x34\x2f\xff\xfe\x7f\xcf\x44\x7c\xc5\xf3\x4a\xd9\x9b\x29\ \xf8\x16\x29\xef\xce\x9f\x45\x22\x06\xbc\x44\x78\x98\x57\xe2\xdc\ \x7b\x78\x41\x21\x9e\x77\xf5\xeb\xd7\xfb\xcc\x81\xed\x54\xa3\x7f\ \x59\x3d\x6c\x56\x75\xf0\xc2\xc2\xc2\xa2\x4e\xbf\x4a\x2b\x71\x0b\ \x35\xbe\xb3\x82\x26\x84\x81\xaa\x1e\x76\x46\xfc\x5e\x82\xb5\xa0\ \x76\xd3\xb0\x57\xb7\xd7\x84\x99\xfa\xb5\x1b\xb6\x00\x9d\x97\x3b\ \xeb\xb8\x24\x3a\x6c\xc3\x56\xa1\x77\xd2\xab\xdb\x6b\x2f\x8f\xb4\ \x02\x08\x00\x7c\x5c\xcc\xb8\xf6\x1d\x2d\xb4\xd1\xbd\x3d\xbb\x5d\ \x3a\xfa\x93\x1c\x72\x8d\x6a\xb3\xea\x3e\x05\x23\x26\xee\xef\x41\ \xfd\xfb\x38\x3a\x3a\x16\x16\x16\xd6\xb9\xab\x85\xb0\x42\x51\x51\ \x51\x35\x59\x29\x88\xad\x6f\x71\xb2\xa0\x5a\x6b\x30\xb5\xb0\xb0\ \x70\xc3\x86\x0d\x99\x99\x99\x32\x99\xcc\xd6\xd6\xd6\xcd\xcd\xcd\ \xdd\xdd\xdd\xc5\xc5\x85\xa2\xa8\x98\xb8\xbf\x61\xcd\x3c\x0e\x5b\ \xb9\x44\x58\x7e\xe4\xc4\x19\xd1\x67\x9a\xfc\x75\xf1\xba\xb0\x30\ \x6c\xe5\x92\x81\x53\x96\xe8\x38\xaf\x45\xdc\x26\xc1\x06\xbb\xaa\ \xb0\x1c\x75\x1a\x38\x2e\xe1\xf8\x01\x27\x47\x07\xcd\xf2\xd7\x9c\ \x3b\xde\x38\x75\xc8\x6b\xd8\xe4\x12\x83\xf6\x0f\x84\x06\x29\xab\ \xae\x38\x11\x1d\x0b\x00\x70\x74\x74\x34\x20\x20\xa0\x9e\x4f\x88\ \x91\x95\x0f\x54\xb5\x6e\x41\xb6\xb7\xa8\x9e\x4b\x95\x9d\x9d\xbd\ \x6a\xd5\xaa\x9b\x37\x6f\x3e\x79\xf2\x24\x2b\x2b\x2b\x31\x31\xf1\ \xa7\x9f\x7e\x0a\x0e\x0e\x3e\x7c\xf8\x30\xdf\x0c\xad\x50\x2a\x48\ \x1f\x2f\xfc\xff\x61\xbb\x9d\x9a\xf6\xa4\x44\xfc\x01\x4b\x85\xc8\ \x13\xd1\x67\xb0\x42\x1f\x2f\x0f\xa5\xe2\x05\x2f\x01\x6d\x08\x94\ \xb2\x84\xe7\xb0\xc9\x29\xff\xa4\x62\xe5\x8e\xf6\x76\x29\xb1\x11\ \xe6\xf2\x46\x9a\x74\xa6\x87\x83\x75\xe9\xfa\x2d\x00\x80\x87\x87\ \x87\x5c\x2e\xd7\x7d\x3b\x16\xbe\x82\xe6\xe4\x2c\x05\x4d\x54\xe6\ \x5a\x49\x68\x2e\x27\x9c\x2d\xab\xed\xd4\xe2\xe2\xe2\xf5\xeb\xd7\ \xe7\xe6\xe6\x62\x37\x51\x28\x14\xfd\xfa\xf5\x03\x00\x5c\xba\x7e\ \xab\xa6\x16\x4e\x1e\x35\x48\x8b\xda\x7d\xb5\xa5\x5e\xd3\x9c\x6b\ \x3e\xbe\xd8\xba\x4b\xf8\xb8\xc9\xa3\x06\xbd\x44\x56\x40\xf5\x51\ \x0e\x48\xdf\x80\x19\x97\x13\xf1\xf1\xc4\xda\xca\xf2\x9f\x73\xc7\ \x5a\x9a\xd2\x8d\xe3\x60\xe9\x5a\x37\x25\xfd\x21\xc3\x30\xd6\xd6\ \xd6\x43\x87\x0e\x35\x2c\x20\xc0\xb7\x93\xb7\x53\x4d\x69\xa2\xa3\ \x25\xcd\xef\x04\x80\x10\xda\xb6\x6d\x5b\x6e\x6e\xae\xf0\x26\xd3\ \xa6\x4d\xb3\xb3\xb3\x63\x18\x26\x25\xfd\xa1\xf6\x16\x72\xec\x47\ \xc1\x4b\x85\x7d\x72\xfa\xfc\xb5\x06\xfa\xcf\x43\x12\x6f\xdf\x13\ \x26\x21\x3f\x0a\x5e\x0a\x38\xf6\x25\x64\x2b\x80\x2c\xa4\x07\x4d\ \x59\x1c\x7d\x16\x9f\x84\x6e\x6a\x62\xf2\xcf\xb9\xe3\x8e\x4a\x93\ \x26\x34\x45\xb0\x1c\x50\x01\x33\x16\x02\x00\x7c\x7d\x7d\xdd\xdc\ \xdc\x74\xf4\xab\xb4\x92\x55\xed\x57\x29\x28\xe8\x64\x4e\xd1\x44\ \xf5\x37\x39\x72\xe4\x48\x52\x52\x92\xf0\x26\xde\xde\xde\x23\x47\ \x8e\x04\x00\x04\xcc\x58\x58\x5e\x43\x8a\xd8\xdd\xc9\xd6\xd4\xc4\ \x04\x2b\x8c\x3e\x7b\xae\xe1\xb2\xa0\x1c\x41\x7d\xf7\xe3\x3e\xe1\ \x2f\xe7\xd6\xa6\x15\x78\x49\xc1\x11\x54\xc0\x82\x90\xdf\x8f\x9d\ \xc4\xa3\x34\x32\x59\x4a\xfc\x31\x57\x3b\x65\x13\x4a\xb7\x9e\xb9\ \x96\x1a\xf5\x67\x0c\x84\x30\x30\x30\x70\xc4\x88\x11\x72\xb9\xbc\ \x4e\x41\xd5\x6a\x06\x10\x10\x18\xd3\xd0\xd6\x94\xa2\x35\xb6\x57\ \xb9\x70\xe1\xc2\xf1\xe3\xc7\xb1\xcb\x8d\x8c\x8c\x66\xcc\x98\x11\ \x12\x12\x02\x21\x8c\xfa\x33\xe6\xcc\xb5\xd4\x9a\xda\xf6\xde\x22\ \x2d\x49\xc2\xf5\xdf\x86\x37\x68\xf7\xed\xd8\x7b\x58\x58\xb8\x72\ \xe1\x4c\xf0\xf2\x02\x11\xd4\xd4\x15\x9f\xfc\xb8\xff\x57\x61\x30\ \x24\xf1\xf4\xef\x5e\xce\xf6\x0d\x98\x0d\x36\x71\x1f\xa0\xd7\x05\ \x34\x62\x7e\xfe\xfa\xa3\x51\x43\xfd\x01\x00\x4f\x9e\x3c\x49\x4a\ \x4a\xca\xca\xca\xca\xcc\xcc\x2c\x28\x28\xc0\xfe\x93\x16\x61\x40\ \x20\x34\x34\xd4\xd2\xd2\x52\xeb\x6d\x6f\xdd\xba\xb5\x65\xcb\x16\ \x86\x61\xd4\x35\xcd\xcd\xcd\x9d\x9c\x9c\x9c\x9c\x9c\x7a\xf5\xea\ \xa5\xde\xdb\x35\xea\xcf\x98\xa9\x41\x1f\x55\x40\x0a\x48\x78\x55\ \xa1\x37\x59\xd5\x18\xe8\xe9\xfc\xfb\x8f\xdb\xb0\xed\x02\x1a\x08\ \x0c\xc3\x04\xcc\x58\x54\x8b\xa6\x4a\x78\x65\xc8\xda\x69\x80\x61\ \x57\xca\x00\xe3\xde\xce\xe1\x75\xcf\xce\xc3\xfd\xfb\xfb\xf7\xeb\ \x2d\xee\xa2\x39\x84\x50\x4c\xdc\xdf\x27\x62\xce\x5e\xba\x76\x2b\ \xe5\xee\xc3\x72\x20\x09\xaa\x84\x7a\x90\x55\x82\x84\x46\x06\x25\ \x76\x26\x45\x82\x84\xa6\x11\x0d\x90\x20\x41\x22\xab\x04\x09\x12\ \x59\x25\xbc\x54\x36\x2b\x94\x6c\x56\x09\x92\xb2\x4a\x90\x20\x91\ \x55\x82\x44\x56\x09\x12\x9a\xb8\xcd\x2a\xc5\x59\x25\x34\x1f\x07\ \x4b\xea\x04\x09\x92\x19\x20\x41\x82\x64\x06\x48\x78\x35\xf1\xff\ \xa6\x5c\x03\x7a\x8c\xc2\x47\xec\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x06\x30\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\ \x00\x09\x70\x48\x59\x73\x00\x00\x6e\xb9\x00\x00\x6e\xb9\x01\x7b\ \x67\x90\x7a\x00\x00\x05\x4d\x49\x44\x41\x54\x48\xc7\x5d\x55\xeb\ \x53\x55\x55\x1c\xdd\xdc\x6f\xf2\x07\x30\xc3\x1f\xa0\x30\xc3\x57\ \x3e\x78\x9f\xe7\xdc\xd7\x39\xe7\x5e\xc9\x4c\x6a\xa4\x72\xc2\x31\ \x4d\x31\x4b\xc4\x07\xa1\x68\x2a\x2a\x02\x0a\x82\x26\xa0\x99\xa3\ \xe0\x2d\xcd\xb4\x31\x48\xd3\x66\x74\xa4\xb2\x06\x5f\xcd\x28\xf5\ \x41\x9b\xc6\x4c\x70\x30\x07\xca\x42\x3b\xe7\xec\xd5\xda\x87\x7b\ \x7d\x74\xd6\xec\x7d\xf7\x39\x7b\xaf\xf5\x5b\xbf\xfd\xba\x42\xf0\ \x09\x88\xa0\x07\xfe\xfa\x74\x11\x15\x7a\x81\x5e\x19\xc9\x04\x87\ \xfc\xe3\x7e\xc7\xef\x06\xc6\x43\x43\x5a\x46\xaf\x8c\x16\x44\xd9\ \x17\xf1\x85\x85\x42\x84\x25\xfb\x04\x45\x88\xa0\x40\x5e\xd8\x17\ \x15\x5a\x71\xa4\xdb\x7f\x7f\x3a\xa6\x4b\x3f\xa2\x30\x89\x28\x02\ \xf0\xf3\x2d\x38\xaa\x75\xe9\x45\x71\xa1\xf9\xc2\x79\x4a\x40\x81\ \x4f\x28\x07\x5f\x44\x04\xf3\x23\x2d\x81\xc7\xd3\x91\x90\xcb\xdc\ \x6e\xa7\xdf\x1d\x90\xdf\xcb\x8b\xf2\x82\xec\xe3\x5b\xb5\x6b\xc8\ \x00\x82\x8f\xf4\x26\x6d\x4a\x82\x22\x9a\x98\x44\x96\x1e\xa6\xf5\ \xf0\xb4\xf0\x35\x3f\x2c\xa7\xd5\xfe\x46\x5e\xc7\x8f\xf2\x07\x7c\ \x8b\x0b\x38\x4f\x0c\xe0\xa2\x1c\xc4\x39\xd9\x6a\x97\x39\x41\x68\ \x57\xf5\xa9\x71\xa1\xfb\x9e\x11\x08\xf3\x25\x5c\x1a\xba\xe7\xc7\ \x0a\x7b\x40\x5e\xc5\x80\xfc\x1a\x67\x71\x06\xa7\x71\x0a\xfd\xe8\ \xc3\x49\x7c\x8e\xe3\x38\x29\xcf\xe1\xac\x5c\x65\x07\x11\x19\xd1\ \x4b\x63\x94\xd0\x85\xee\x09\xa8\x8c\x8a\x42\xc3\x01\xb4\x39\x97\ \x19\xe7\x34\xbe\xf2\xa8\x5f\x66\xeb\x3e\x92\x8f\xe1\x53\x7c\x82\ \x5e\x7c\x2c\xcf\xa0\xd5\xd1\x28\x11\x2d\xe6\x7c\xe5\x69\xc2\x9b\ \xfb\x70\x7e\x78\x30\x80\x76\xfb\x3b\xf4\xc9\x7e\xc6\xfc\x82\x31\ \x8f\xe3\x04\xc6\x31\x41\x8c\xe1\x08\xa9\x87\xd1\x83\x43\x38\x80\ \xbd\xf2\x33\xb4\xda\x11\x68\x97\xe2\xf9\x31\x95\x82\xb2\xaf\x35\ \x05\xb0\xce\x3e\x8f\x13\x72\xd2\xac\x8a\x97\xe1\xf0\x87\x70\x89\ \x87\xd8\x87\x0f\xf1\x11\xcb\x3e\x74\x13\x1d\xb2\x07\xf5\x76\x18\ \xb1\x66\x95\x06\x35\xe2\x25\xc1\x89\x39\x8c\x7d\xcc\x23\x1e\xa1\ \xd5\x0c\xe3\x1d\xc0\x07\x8c\xfd\x2f\x31\x86\x36\xb6\xbb\xb0\x87\ \xf5\x2e\x74\xa0\x1d\xdb\xb1\x5f\xce\x45\x78\xc2\x28\x89\xd3\x81\ \xd0\x3a\x83\xd8\x69\x1f\xc7\x61\x79\x98\x56\x0f\xe1\x20\xc9\x07\ \xd0\x89\x6d\x78\x80\xc7\xc4\x1f\x68\x40\x2b\x89\x3b\x59\x6f\x47\ \x0b\x9a\xd1\x28\x9b\xd1\x6c\x47\x11\xed\xe2\x24\x9a\x85\xc1\xe1\ \x72\x64\xe4\x41\x8f\xf8\xd4\x68\x3b\xd6\x61\x14\x8f\x88\x51\xbc\ \x87\x46\x52\x9b\x28\xd9\x88\x2d\xd8\x4c\xc1\xf5\xd8\x49\x0f\x91\ \x91\xb2\x42\x11\xab\x0c\xa1\xc6\xed\xc1\x5e\xa2\x8b\x71\xf7\x60\ \x37\xa3\xed\xe2\xf0\x1a\xdc\xc3\x3f\xc4\x08\xde\xc5\x06\x12\x1b\ \xb0\x91\xbf\xef\x53\xb8\x9e\x92\x0d\xa8\x73\x35\x18\x95\x42\xef\ \x0d\xa1\xc1\xd9\x4b\xda\x6e\x2f\xbf\x36\xcf\xe8\x0e\x6c\x42\x15\ \xee\xe2\x6f\xe2\x2e\x16\xa0\x8e\xd4\x7a\xac\xc5\x1a\x52\x6b\xb1\ \x1a\x2b\x59\x9a\x9c\x38\x62\xbd\x22\x72\x23\x86\x6d\x6e\x07\x89\ \x3b\x48\x6c\xf6\x8c\x6e\x25\xd6\x62\x1e\xee\xe0\x2f\xe2\x0e\xe6\ \xd2\x4d\x1d\x29\xab\x48\x5c\x81\xe5\xa8\xc6\x32\x2c\x45\xab\xfb\ \x02\xa2\xd7\x85\x36\x96\xc4\x56\xd9\xe2\xe5\xb7\xd5\xcb\x4f\x19\ \xdd\xc0\xc1\x15\xb8\x8d\x3f\x89\xdb\x78\x85\xc3\x57\x92\x56\xcd\ \x64\xde\x61\xbb\x0a\x8b\x29\xdf\x26\x5f\x86\x3e\x26\x34\x27\x81\ \x0d\x72\x73\x36\xbf\xf5\x9e\xd1\x3a\x5a\x5d\x86\x72\xfc\xca\x25\ \x1c\x63\xfd\x22\xde\x22\xb1\x0a\x8b\xb0\x10\xf3\x89\x37\xd9\xae\ \x46\x97\x7c\x09\x51\x47\xe8\x4e\x0c\xab\xe5\x46\x8f\xac\xa8\xb5\ \x8c\xbd\x82\x58\x4c\xda\x2f\x5c\xc8\x07\xac\xcb\x18\xaf\x8a\x58\ \x4a\xda\x2a\xce\x42\x9d\xd7\x5f\x2e\x13\x48\x3a\x22\x3a\x16\x45\ \x9a\x66\x5e\xa7\xf2\x22\xbc\x4d\x93\xca\x6a\x0d\x96\xd0\xc1\x4d\ \xdc\x27\x6e\x62\x36\xc9\xcb\x49\x57\xc6\x2b\x30\x13\x06\xef\x88\ \x28\x62\xd2\x80\x31\x26\xa2\xd7\x63\xd0\xb9\x20\x1a\x74\x22\x06\ \xaa\xc2\x42\x9a\x75\x1c\xb7\x3c\x07\xb7\xbc\x9e\x84\x47\x52\x88\ \xb3\xcf\xe0\x45\x63\xb8\x06\x92\x37\x44\xac\x37\x86\x38\x17\x24\ \xc1\x8e\x1c\x94\x4c\x84\xb8\x42\xf2\x2d\xd6\x4a\xdc\xf0\x68\x1e\ \x31\xd7\x76\x58\x7a\x45\xbc\x92\x14\x37\x47\x4d\x3c\x03\x3f\xc2\ \xa4\x46\x58\x07\xf9\xa6\x48\xc9\xac\x48\x16\xae\xa9\x36\x52\xbc\ \x30\x3e\x42\xa2\x4c\xe0\xff\x08\x31\xae\xb2\xac\x53\xe2\x39\xe2\ \xa4\x0b\x35\x03\xc3\x66\xa1\x48\x88\x44\x17\x87\xdb\x89\xac\x48\ \x2e\x4e\x8c\xc3\x06\xf1\x33\x31\xc8\x56\xdc\x23\x99\x39\x09\xc9\ \xcb\xd6\x66\xe9\x34\x85\x12\x28\x49\x4c\x90\x28\x9f\xb7\x18\xc7\ \x0c\x0c\x71\x17\xfe\x8e\x9f\xd8\x4a\x64\x05\x9e\x40\x5a\xb0\x26\ \xac\x12\x4b\x88\xa4\x2f\x29\x92\xcd\x24\xda\x46\x56\x64\xd2\x64\ \x92\xfb\x60\x08\xbf\x11\x43\x98\xc5\x2f\xa9\x27\x64\x4b\x91\x55\ \xfc\x26\x4b\x98\x3e\x61\x10\xc9\x7c\xe3\x12\xe9\x94\xb0\x64\x9a\ \xc4\x72\xbc\x4a\x2c\xc4\x65\x2f\x85\x2b\xdc\x87\x73\x89\x39\xdc\ \x0f\x33\xb9\x67\x28\x65\x53\x62\xd0\xca\x37\x05\x53\x48\x0a\x23\ \x8f\x22\xc5\xc6\x88\x5a\x98\xd9\x98\x27\x17\x72\x3b\x2d\xe7\xd1\ \x59\xc3\x73\xb1\xc5\x3b\xff\xea\xf8\xae\xe4\xe6\xae\xc2\x02\xf9\ \x1a\x66\x38\x74\x31\x6c\x16\x59\xc2\xca\x63\x0a\xca\x81\xe1\x63\ \x29\x35\x29\x91\xb2\xdf\x90\xb5\xd8\x24\x1b\x79\x36\x3b\x78\xc0\ \x3b\xb3\x37\x44\x1b\xcf\xe9\x16\xb9\x0e\x4b\xe4\x2c\x9a\xb7\xee\ \x99\xa5\xa4\xfb\x58\xb2\x02\x94\x30\x85\x31\xd5\xbc\xca\xcc\x9c\ \x0a\xbb\x56\xb6\xe3\xa0\x3c\xca\xbb\xf9\x14\xaf\xf6\x7e\x5e\xb3\ \x19\xd9\x8d\x06\xb9\xc0\xf6\xa2\x5f\x33\xa7\xe5\xe8\x9e\x80\xe9\ \x15\xd3\x97\x16\xd6\x14\xab\xc9\x7a\xa4\x66\xa2\xc2\xad\x71\x9a\ \xdd\xfd\xf2\xa8\x3c\x26\x7b\x64\x87\x5b\xef\xcc\x77\xcb\xb8\xf2\ \xe6\x63\xab\xc5\x64\xee\x39\xba\xa5\xfe\x1d\xcd\x9c\x8b\x3c\x53\ \x7d\x2e\x4a\x75\x99\xa3\x06\x77\x85\xc1\x13\x31\x93\x53\x5a\xa6\ \xd6\x84\xeb\x63\xde\x4f\x75\xa7\x8a\x19\xc6\x67\xe6\x3d\x43\x57\ \x4f\x4a\xe4\x3e\x58\xf4\x91\x16\xa9\x82\x74\x65\x2a\x63\x0d\x99\ \xe3\xa6\x6b\x3a\xe6\xb8\x35\x94\xca\xa4\x2b\xd3\x05\xaa\xef\x69\ \xec\x49\xfa\x7f\xb4\xbc\xc8\xa0\x93\xf0\x4e\x7f\x00\x00\x00\x25\ \x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\ \x32\x30\x31\x31\x2d\x31\x32\x2d\x31\x35\x54\x31\x36\x3a\x34\x30\ \x3a\x35\x36\x2b\x30\x39\x3a\x30\x30\x5a\x76\x29\x10\x00\x00\x00\ \x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\ \x00\x32\x30\x31\x31\x2d\x31\x32\x2d\x31\x35\x54\x31\x36\x3a\x34\ \x30\x3a\x35\x36\x2b\x30\x39\x3a\x30\x30\x2b\x2b\x91\xac\x00\x00\ \x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\x00\x77\ \x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x9b\ \xee\x3c\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x38\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ \x67\x9b\xee\x3c\x1a\x00\x00\x04\xca\x49\x44\x41\x54\x58\x85\xb5\ \x97\x4d\x68\x54\x57\x18\x86\x9f\xef\xdc\x7b\x67\xf2\x33\xf9\x99\ \x49\x6d\x88\x89\x31\xc5\x90\x44\x29\x84\x42\x37\xa5\x8b\x42\x36\ \x46\x0d\xb5\x0b\x17\x45\xda\xae\x5a\xa4\x22\xb8\x70\x51\x0c\xd8\ \x65\x90\x6e\x2c\x76\xd9\x85\xcb\xb6\x12\x17\x56\x45\x21\x5d\xb4\ \xa0\x66\x23\x44\x09\x01\x19\x31\x11\x8d\x69\x98\xe6\x67\x92\xc9\ \x64\xe6\xce\xcc\x9d\xaf\x8b\xc9\x1d\x27\xff\x33\x35\x7d\xe1\x32\ \xe7\x9e\xf3\x7d\xe7\x3c\xf7\xbd\xe7\xdc\x73\x46\x7e\x84\x5f\xbb\ \xe1\x04\x22\x08\x88\x18\x83\x29\x94\xc1\x18\x91\xb5\xb2\x11\x41\ \x0a\x02\x91\xd2\x7b\x5d\xab\x45\x8c\xd1\xa7\xf1\x78\xf6\xab\x7c\ \xbe\x81\x32\x65\xb7\x40\x67\xff\xd5\xab\x21\x9a\x9b\xcb\xcd\xd9\ \x51\xe6\xdc\x39\xb7\x92\x78\xdb\x86\x5a\xd2\x69\x58\x5c\x7c\x53\ \x9b\x4c\xc2\xca\x4a\xa1\x5c\x53\x03\x75\x75\x6f\xda\x56\x57\x61\ \x6e\x0e\xf2\x79\x70\x1c\x68\x69\x01\x63\x8a\xcd\x01\xdb\x96\x41\ \x11\x7b\x48\x35\x57\x2e\x40\x35\xc9\x24\xe4\x72\x78\xf7\xef\x67\ \x1e\x8c\x8c\xa4\x97\xb3\xd9\xe5\x34\x2c\x79\x20\x1f\xb7\xb5\xb5\ \xb7\x9d\x3d\x1b\xf2\x13\xe2\xd7\xaf\xaf\xfc\xfe\xf8\xf1\x0b\x0b\ \x12\x0e\x04\xdf\x75\x9c\x8e\x0f\x7a\x7a\x02\x0d\xa7\x4e\x85\x70\ \x1c\x02\x96\x95\x07\x6a\x81\xa5\x8a\x00\xbc\x87\x0f\x73\x3f\x8f\ \x8c\xfc\xf5\x12\x06\x86\x54\x33\x00\x83\x22\x8d\xbd\xd9\xec\x54\ \xa9\x3b\x99\x54\x2a\xfb\x14\xbe\x1c\x52\x7d\xec\xd7\xfd\x20\x72\ \xe1\x6b\xd7\xfd\x3e\x72\xf2\x64\x7d\xd0\x98\x3c\x10\x2a\x1b\xc0\ \xb1\x2c\x8b\x78\x9c\xd7\x13\x13\x89\x97\x70\xc6\x1f\xdc\x97\x7a\ \x9e\xae\x7b\x3d\x99\x8c\x6e\xec\xe4\x3b\xb8\x72\x28\x1a\xfd\xf6\ \xd3\xd7\xaf\xeb\x15\x88\x41\x44\x44\x16\xa1\x30\x7f\xb7\xf8\xf5\ \xcb\x19\xf9\x33\x10\x58\xf8\xe4\xe8\xd1\xf0\xdd\x3b\x77\xfe\x3e\ \xe6\x79\xfb\x4b\x3b\x1e\x14\x69\xfc\x22\x1c\x9e\x3c\xd2\xd7\x17\ \x06\xd8\x7f\xfb\x36\xef\x74\x74\x68\xce\x98\x8c\x31\x46\xa5\xb0\ \x12\x30\xc6\xa8\x05\x4e\xc0\x18\x5b\x40\xb3\x96\xe5\x8a\x48\x5e\ \x44\xd4\x14\x56\x92\xfa\x71\xfe\x4a\xca\x66\xb3\x8c\x8e\x8e\x8e\ \xd9\xd1\x4c\x26\x99\xbc\x75\x4b\x9f\xc1\x83\x63\x5b\x79\x94\xcd\ \x16\x27\xa8\x0b\x5c\xb8\x78\x51\x80\xe0\x0e\xae\x0a\x50\xb5\x43\ \x3b\x00\xa9\x54\x8a\xd1\xd1\xd1\x26\xfb\x1b\xd5\x03\x3b\x05\xaa\ \xe7\x15\x01\x1c\xc7\x61\x61\x61\x01\x80\x5c\x2e\xc7\xec\xec\x2c\ \xf1\x78\x9c\x64\x32\x49\x3e\x9f\xa7\xbd\xbd\x9d\xd6\xd6\xd6\x62\ \x6e\x34\x1a\x65\x76\x76\x16\x80\xea\xea\x6a\xda\xda\xda\x68\x6e\ \x6e\xc6\x18\x83\xe7\x79\x00\x35\xf6\x6e\xa4\x78\x9e\xb2\xb0\x80\ \xab\x8a\x63\xdb\xcc\xcf\xcf\x93\x48\x24\x18\x1e\x1e\x5e\x9e\x99\ \x99\x59\x01\x62\x40\x1c\x68\xec\xed\xed\xed\x19\x18\x18\x28\x3e\ \xfd\xf0\xf0\xf0\xea\xdc\xdc\xdc\x1f\x80\x02\x4d\xc0\xe1\xd6\xd6\ \xd6\xe0\xe9\xd3\xa7\x43\x81\x40\x00\xcb\xb2\x76\x07\xf0\x1d\x48\ \xaa\x62\xaf\x01\xdc\xbb\x77\x2f\x35\x33\x33\x73\x49\x55\xaf\xfa\ \x71\x22\xd2\xef\xba\xee\x8d\xf9\xf9\xf9\x12\x76\x2f\xa7\xaa\x27\ \x4b\xfb\x13\x91\x6b\x37\x6f\xde\xfc\xbc\xaf\xaf\xaf\xca\xb6\x6d\ \xab\x1c\x07\x60\x79\x99\x24\x60\x22\x11\x62\xb1\x18\xd3\xaf\x5e\ \xa5\x4b\x07\xf7\xe5\xba\x2e\x1b\x00\xb6\xea\xf1\xcc\xd4\xd4\xd4\ \x67\x73\x73\x73\x55\xc6\x98\x32\x00\xd6\xb4\x02\xb8\x99\x0c\xe3\ \xe3\xe3\xd8\x9e\xf7\x64\xab\x98\x74\x3a\xbd\x0e\x20\x97\xdb\xfc\ \x31\x54\xd5\x8c\x88\xc4\xc6\xc6\xc6\x1a\x73\xb9\x9c\x5d\x36\x00\ \x40\xcd\xca\x0a\xa9\x67\xcf\xbc\x08\xdc\xdf\xaa\xbd\x4c\x07\x00\ \xae\x3d\x7f\xfe\xfc\x04\x90\x2a\x1b\xe0\x30\x10\x05\xfe\x86\xc5\ \x9f\xe0\xc6\x56\x31\x1b\x1d\xd8\x0e\x40\x55\x2f\x03\x97\x01\x2a\ \x72\x60\x37\x55\xe0\x40\x51\x7b\x0a\xe0\x79\x1e\xa9\x54\xaa\xa2\ \x1c\xb3\x7b\xc8\xff\xab\xdd\x1d\xf0\xb7\x0d\x5f\x0a\xe4\xb7\x8d\ \xde\xd8\xb2\x69\xe3\xaa\x1c\xc0\xde\x10\x95\x07\xd2\xdb\x46\x6f\ \x5c\x77\xdb\xa3\x96\x0d\xe0\x00\x81\x0d\x43\x6c\x0f\x50\xb1\x76\ \x03\x68\x08\x05\xf0\x4a\x01\x6a\x2d\x2c\x12\x44\xf6\x0a\x60\xb7\ \x49\xd8\x19\xae\xc6\x22\x08\xfe\x15\xaa\x26\x24\x70\x68\xaf\x00\ \x44\x75\xfd\x3c\x19\x14\xf9\xa8\xab\x86\x2b\x75\x36\xf5\x3d\xb5\ \x74\x1e\xa9\xc5\xf6\x4f\xe9\xbe\x5e\xa4\xf8\x67\x3c\x41\x3a\xab\ \xa4\x1f\x2d\x73\x69\x48\xf5\x37\x11\xe9\x07\x7e\x01\x1a\x4b\x42\ \x17\x55\x75\x47\xb7\xb6\x7a\x05\xcd\xa7\x0e\xf0\x7e\xc8\xa6\x76\ \xbb\xa4\x8e\x00\xfb\x3a\xd6\x4e\xfe\x8f\x26\x68\xf1\xeb\x43\xa1\ \x10\xa6\xe4\x84\x9c\xc9\x64\x36\xe5\x96\x03\xc0\x93\x24\xa6\xce\ \x61\x41\xb5\xf0\xe4\x79\x10\xb4\x38\xa5\x45\x15\x14\xc4\xd3\x75\ \xd3\x93\x86\x86\x06\x2c\xcb\x2a\xde\xaf\xf8\x47\xfb\x0a\x01\xee\ \xde\x99\xa6\xa3\x30\xee\x8e\x97\x07\xe4\x87\x4a\xde\x61\x7d\x7d\ \x3d\x8e\xe3\x14\x3b\xfa\x4f\x9f\xe2\x21\x55\x97\xc2\x29\xa7\x52\ \x85\x23\x91\x48\xb0\xd4\x01\xcf\xf3\x72\x22\x12\x52\xd5\x6d\xad\ \xd8\x93\xbd\x40\x44\xa4\xaa\xaa\xea\xc3\xa6\xa6\xa6\xea\x75\x9d\ \xdb\x76\x7e\x62\x62\xa2\x17\x78\xb0\x6d\xee\xc6\x55\x50\x89\x82\ \xc1\xe0\xf9\x83\x07\x0f\x9e\x0f\x06\x83\x91\xae\xae\xae\xaa\xba\ \xba\xba\x75\xa7\x65\x55\xf5\x62\xb1\xd8\xc2\xf4\xf4\xb4\xac\xae\ \xae\x7a\x93\x93\x93\xfd\x5a\xf2\x87\x06\xde\xd2\x81\x50\x28\xd4\ \x79\xfc\xf8\xf1\xf7\x76\x08\xb1\xc2\xe1\xf0\xbe\xee\xee\x6e\x96\ \x96\x96\xe2\x93\x93\x93\x9b\x8e\xeb\x6f\x05\xe0\xba\x6e\x26\x1a\ \x8d\xba\x40\x4e\x55\xf1\xdd\xf4\xcb\xa5\xf7\x89\x44\xc2\x61\xf3\ \x5e\xc1\xbf\x8c\xac\x25\x81\x69\x05\xfe\x35\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x6a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0a\x15\ \x14\x12\x35\xac\x32\x46\x1c\x00\x00\x01\xea\x49\x44\x41\x54\x38\ \xcb\xa5\x93\xbd\x4e\xe3\x40\x14\x85\xbf\xf1\xcc\x38\x32\x72\x11\ \x2d\x4b\x20\x42\x51\xb6\x48\x45\xc3\x4f\x95\x32\xaf\x10\x4a\x9a\ \xec\x3e\x01\x0f\x80\xc4\x6b\x50\xee\xa6\xa0\xc5\x54\xd4\x29\xe9\ \x42\x03\x41\x28\x42\x28\x49\x41\x12\xd8\x18\x14\x61\x1c\xd9\xce\ \x16\xd8\x26\x46\xac\xb6\xd8\x99\x62\xae\xee\xcc\x39\xf7\x9e\xa3\ \xb9\x82\x0f\xab\xde\xaf\x7f\x07\x1a\x40\xed\xc3\x55\x0b\x68\x3a\ \x25\xe7\xd7\x62\x52\x2c\x00\xbf\x01\x0e\xb0\x55\xb1\x2a\x54\xad\ \x2a\x1b\xe6\x06\x00\x57\xb3\x2b\xce\xbd\x73\xba\x5e\x17\xe0\x02\ \xa8\x3b\x25\xe7\x2e\x25\x88\xc1\x6d\x5b\xd9\xf9\xfd\x2f\xfb\xac\ \xcb\x75\xba\x41\x17\x37\x72\x71\x23\x97\x15\xb9\xc2\xb2\xb1\xcc\ \x63\xf4\xc8\xb1\x7b\xcc\x34\x98\xba\xc0\xb6\x53\x72\xee\x8c\xb8\ \x01\xc7\x56\x76\xfe\xf0\xeb\x21\x93\x68\xc2\x99\x77\xc6\x6d\x70\ \xcb\x53\xf4\x84\x42\xf1\x1c\x3d\xd3\x0b\x7a\xf8\x73\x9f\xbd\xfc\ \x1e\xb6\xb2\xf3\x71\xb7\x88\x58\xf3\xcf\x83\xc2\x01\xa3\x68\xc4\ \x7d\x70\x8f\x12\x0a\x03\x03\x25\x14\x32\xde\x69\x2c\x24\xc3\x70\ \xc8\xe9\xe4\x14\xe0\x87\x01\x34\x2a\x56\x85\x25\x63\x89\x61\x30\ \x44\x0b\x8d\x44\xa2\x85\x46\xa1\x50\x42\xbd\xc5\x22\x8e\xd1\x94\ \x55\x99\x55\x73\x15\xa0\x61\x00\xb5\xaa\x55\xa5\x33\xeb\x64\xc0\ \x49\xd5\x84\x44\xf1\x4e\xa4\x85\x66\xd3\xda\x04\xa8\x19\x00\x65\ \x55\xc6\x9b\x7b\x99\xca\xff\x3a\xd7\xd4\x1a\x00\x0a\x60\x3a\x9f\ \xa6\x55\xa4\x90\x28\xb2\x1e\x2c\xea\x57\xc4\xb9\x37\x28\x06\x40\ \x67\xd6\xc9\xb4\x2a\x45\xd6\x83\xd4\x0b\xde\x25\x8c\xc3\x71\x4a\ \xd0\xba\xf6\xaf\x3f\x07\x08\x8d\x29\xcc\x14\xac\x85\x4e\x49\xda\ \x5e\x1b\xa0\x65\x00\xcd\xde\x6b\x8f\x87\xf0\x21\x7d\x68\x0a\x33\ \x7d\x28\x91\x29\x38\xf1\x60\x10\x0c\x18\xf8\x03\x80\x66\xf2\x13\ \xdb\x39\x23\xb7\xb5\x9b\xdf\xa5\x20\x0b\x19\x2f\xa4\x90\xa9\x66\ \x25\x14\xe3\x70\xcc\xd1\xef\x23\x5e\xc2\x97\x0b\xa7\xe4\x6c\x27\ \x3f\xb1\xee\x47\xbe\x7b\xe2\x9e\xd0\x0f\xfa\x19\xbd\x49\x55\x2d\ \x34\xfd\xa0\x9f\x80\x5d\xa0\xfe\xd7\x61\x2a\xe6\x8a\xec\x58\x3b\ \x14\x65\x11\x29\x24\xa3\x70\xc4\xe5\xeb\x25\x37\xde\xcd\xe7\xc3\ \xf4\x3f\xe3\xfc\x07\xac\x2a\xb2\x87\xa2\x48\x91\x8f\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\xc1\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ \x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x0c\ \x1c\x10\x28\x08\x53\x70\x06\xf9\x00\x00\x00\x06\x62\x4b\x47\x44\ \x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x05\x4e\x49\x44\ \x41\x54\x78\xda\xed\x57\x5b\x6c\x54\x55\x14\x5d\xe7\x3e\x66\xda\ \xce\x4c\x5b\x81\x00\x02\x46\x9e\x89\x26\xa0\x89\x1f\x54\xbf\x84\ \x08\xe2\x87\x01\x63\x04\xa4\xb1\xa0\x21\x06\xfd\x01\x25\x48\xa2\ \xf5\x11\x13\x12\x0d\x44\x8d\x11\x08\x91\x28\x20\x6a\x40\x48\xc0\ \x10\x12\x8a\x15\x49\x25\x82\x42\xcb\xa3\x15\x81\x42\x8d\x80\x7d\ \x40\x5b\xda\xe9\xcc\xdc\xd7\x79\xb8\xef\xe9\xad\x69\x2d\xe1\x61\ \x68\xbf\x58\x93\x35\xfb\x4c\x72\xce\xdd\x6b\xef\xbd\xce\x4c\x06\ \x77\x71\x3b\xc8\x38\x7e\x71\x5d\x43\xdb\xd3\x6f\xac\xfb\x65\x24\ \xee\x10\x0c\xdc\x22\x94\x52\xec\x93\x6d\x35\x15\x9c\xf3\x3d\xd5\ \x67\x9a\xea\x27\xce\xdb\xfc\xe2\xa4\x79\x9b\x07\x4f\x00\x41\xed\ \xfa\xf1\xd4\xd4\x58\x61\x02\x4b\x17\x95\x24\xc7\x8e\x88\x6f\x12\ \x81\xf3\xed\xf8\x67\x37\x14\x0d\x8a\x00\xc6\x18\xae\x5e\xbd\x82\ \x9c\x00\x0a\x87\x24\x51\xbe\x6c\x16\x66\x4f\x9b\xb0\x00\xdc\x3b\ \x3e\xee\x99\xb5\x8f\x0d\x46\x07\x20\xdc\x34\xb2\x8e\x8b\x5c\xce\ \x45\xd6\xf5\x31\x73\xc6\x43\x58\xb9\x64\xfa\xb8\xa1\x29\xab\x8a\ \x44\x94\x4f\x78\x6e\xa3\x39\xb0\x02\xbc\x2e\x4a\xee\xc1\x75\x88\ \xae\x07\x87\xd6\xc3\x86\x17\x61\xe5\xab\x33\xad\x92\xc9\x23\x57\ \x29\xc1\x2b\xc9\x1b\x63\x06\x56\x00\x25\xf7\x3c\x1f\x1e\x75\xc0\ \xf5\x88\x14\x7d\x21\x30\xfb\xa9\x87\x51\x36\x7b\xf2\xb4\x82\xb8\ \x71\x62\xd2\xf3\x5b\xe7\xdc\xae\x00\xed\xf2\x90\x37\x14\xe0\x67\ \x49\x80\x4f\x02\x02\x4d\x5f\x47\x4d\x2d\x6c\xcc\xe8\x62\x2c\x99\ \x3b\x65\xe8\xf8\x51\xc9\xdd\x93\xe6\x7f\xb5\x8e\x84\xe4\xdf\xd4\ \x5b\x51\x72\x7c\xba\xa5\xe2\x48\xd5\xb1\x73\x25\x87\x6a\x2e\x80\ \x19\x26\x00\x05\x15\x38\x90\x21\xb9\x43\x6b\x97\xa2\x8b\xd5\x9f\ \x7d\xa4\xf7\x2b\x44\x50\xfa\x7c\x2f\x4a\x5d\x55\xed\xb9\x76\x1c\ \xac\x69\xae\x13\x02\x0b\xea\xb7\x97\xd5\xdd\x54\xc0\x83\xb3\x56\ \xa8\x77\x57\x94\xa2\x23\xeb\x81\x14\x74\x13\x0c\x8a\x11\x11\x51\ \x45\x47\x58\xaf\xe4\xf4\x42\x94\x5c\x4a\x2d\x80\x22\x91\x32\x67\ \x73\x1c\x3f\xfc\xd6\xe2\xb4\x76\x78\x2b\xc0\xd8\xfa\xfa\x6d\x65\ \xd7\x15\xa0\x31\xe4\x91\x97\xd4\xca\x65\x0b\x90\x76\x02\x58\xb6\ \x0d\xcb\xb2\x60\x9a\x16\x0c\xd3\x84\x61\x84\x34\xc0\x58\xc8\x3e\ \x53\xea\x53\xb9\x94\x11\x45\x18\x05\x04\x89\xa0\x05\x6a\x2f\x64\ \x70\xaa\x21\xfd\x3d\x03\x5b\x5c\xbf\x7d\x61\xdb\xf5\x4d\xa8\x04\ \xba\xb2\x2e\x99\x2a\x9c\x29\x27\x0a\xf8\xbe\x40\x10\xc8\x88\x0a\ \x9c\x53\xe4\x14\x85\x26\xad\x7b\x28\x7b\xf6\xe9\x33\x7e\xc0\xf5\ \x33\xb4\x37\x5c\x0f\x63\x47\x18\x78\x7c\x4a\x6a\x4e\x22\xcf\x38\ \x39\x71\xfe\x96\xe9\xe8\x05\x0b\x11\x18\x24\x32\x59\x07\x5c\x1a\ \x50\x20\xaa\x28\x86\xef\x26\x51\x85\x64\x60\x4c\x11\x19\x14\xd0\ \xbb\xf5\x11\x25\x84\x20\x72\x5d\x3d\x45\x0e\x93\xf6\xe7\xe8\xb9\ \x1d\xad\xed\x40\x67\xcb\x68\xce\x8b\x2a\x27\xcc\xfd\xe2\x43\x00\ \xef\x5d\xd8\xb1\x98\xff\x47\x80\x0b\x66\xd8\x00\xb3\x88\x12\x8a\ \x0e\x83\x68\xa2\xc7\x07\xa0\xe4\x44\xf4\xcc\x1e\x90\x61\x90\x80\ \xd0\x0b\x80\x07\x12\xb9\x9c\x8f\xae\xae\x2c\xd2\xe9\x0c\x9a\x5a\ \xda\x90\xcd\x64\xe1\xb9\x61\x77\x1d\x8a\xcd\x86\x9d\x1c\xfe\x56\ \xac\xf8\xbe\x12\x00\x33\xfa\x08\x38\x7d\xf6\x12\x12\x89\x14\x0a\ \x8b\x8a\x90\x4c\x25\x91\x9f\x0f\xc4\xe2\x0c\xb6\xcd\xc8\x0f\x8a\ \xc4\x31\xb0\xc8\x8c\x54\xb1\xae\x96\x8b\x70\x4c\x02\x9e\x1f\x20\ \x4b\x05\x78\x9e\x47\x63\xf0\x10\x50\xf4\x3c\x97\xf6\x81\xce\x19\ \x44\xa6\x69\x5a\x26\x2c\x53\x41\x72\xaf\xef\x08\x00\x89\x8e\xce\ \x2c\x1c\x0f\xf0\xb8\x89\x9c\xc7\x90\x5f\x00\xc4\xf3\x14\x62\x31\ \x41\x87\x4c\x98\xda\x90\x2c\xf2\x6e\xdf\xb6\x93\x27\xb4\x59\xcd\ \xd0\xbc\x61\xfb\x4d\xae\x0d\x4c\xc9\xff\x35\x70\x41\x41\x01\x82\ \xc4\x50\xe1\x49\xfb\x03\x26\x82\xf7\xfb\x09\xa0\x5d\x7a\x23\x1d\ \xd4\x0f\xb2\xec\x18\x55\x6f\x11\x6d\xd8\x96\x16\xa0\xe7\x4f\xec\ \x35\x7b\x41\x9f\x05\x22\x4b\xc0\x24\x41\x66\x94\x3c\x4a\xac\xab\ \x4e\xa4\x12\x68\xeb\x70\x2f\x06\x82\x97\x5d\xae\x7c\xbb\x0a\x84\ \x7e\x02\xf4\x5c\x89\x06\x0b\x5b\x6e\xe9\xab\x68\x13\x63\xb6\x5e\ \xeb\x2e\xb0\xa8\x03\x4a\xf5\x54\x1f\x7d\x06\x20\x95\x8c\xba\x44\ \x8c\xae\x6c\x5e\x41\x1c\xce\xb5\x0c\xae\xb4\x74\xec\x50\x30\x96\ \x34\x55\xad\xbe\xd6\xef\x16\x9c\x6c\xcd\x99\xaf\x2d\x5f\x85\xb4\ \x4a\xa2\x20\x3f\x85\xc4\x3d\x85\x48\x16\x52\x4c\x26\x91\x17\x8f\ \x23\x1e\x8f\xc1\x8a\x3a\x20\x5d\x0e\xa5\xbf\x70\xb4\x07\x74\x12\ \x44\xc9\x85\xd0\xed\xd6\x22\x0d\xd3\x40\x2c\xdf\xc4\xf9\x3f\xea\ \x33\xe9\x74\x76\x29\x75\x62\x53\xcb\xe1\xb5\x08\xd1\x4f\x80\x17\ \x18\x6a\xd4\x88\x61\xbf\xfe\xbe\xff\x60\x89\xe3\xfa\xba\x6d\x1a\ \x32\x00\x84\x0f\x25\x02\x4a\xea\x23\x59\x9c\xc2\x2b\x6f\x6e\x80\ \xf0\xb9\x16\xc0\x8c\xa8\xf5\x61\xdb\x0d\x23\xaa\x1a\x94\x38\x86\ \xd6\xf6\x8b\x38\x7b\xb2\xf6\x98\xe0\xaa\xb4\xb5\xfa\xcb\x7a\x44\ \xb8\xae\x80\xa9\xf7\xe6\xc9\xef\x94\x7a\xf4\x9b\x35\xcb\x71\x23\ \xe4\x15\x4e\x57\x56\x8c\x4c\xa6\x18\x84\x94\x51\x72\x45\x6b\x01\ \xc6\xbb\x2b\x57\x71\x89\x13\x87\x7e\x92\x57\x2e\x35\xae\x01\x33\ \xdf\x69\x3f\xf1\x75\x80\x1b\xc0\x42\x84\x79\x24\xfd\xa6\x08\x7d\ \x11\xb3\x01\xc9\x60\x08\x01\xf4\x1a\x83\x11\xb7\xd0\xdc\x72\x0e\ \x47\x2b\xf6\xfe\xed\x79\x62\x61\xe7\xe9\x5d\x07\x70\x0b\xb0\x70\ \x3b\x30\x6d\xfd\x3b\x11\x99\xbe\x3b\xb9\x01\x78\x71\x85\x9f\xf7\ \xed\x44\x43\x75\xcd\x2e\xc6\xec\x97\xbb\xce\xef\x6b\x03\xe1\xce\ \x0b\x88\xee\x39\x33\x25\x38\x25\x97\x96\x81\x86\xab\x17\x71\x60\ \xeb\xc6\x5c\xb6\xb5\xfd\x75\x66\xe5\x7d\x4e\xc9\xa1\x31\x10\x02\ \x94\xd1\x7d\xa7\x15\x63\xc8\xd8\x12\xfb\x2b\x77\xa2\x76\xef\x9e\ \xe3\xe4\x83\x52\xe7\xf2\xe1\x33\x88\x30\x10\x02\xb4\xeb\xef\x7f\ \xe2\x05\xb4\x1b\x01\xfe\x6a\xae\x47\xc5\xe6\xf5\xb2\xad\xe1\xcf\ \x8f\x99\x61\x94\xbb\x97\x8f\xf8\xf8\x9f\x60\xb8\x45\x34\x66\x15\ \x9b\x5f\xbe\xba\x53\xf2\x20\x55\xbd\x7b\x4f\xa3\x12\x72\x91\xd7\ \x74\xb4\x72\xd0\xfe\x98\x8c\x4a\x30\xd5\x74\xa9\xf1\xc9\x96\xba\ \x33\xa5\x8c\x99\x0f\xe8\xe4\x77\x71\x07\xf0\x0f\xbf\x46\x34\x5d\ \xfd\x18\x88\xd1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x06\x33\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x10\x00\x00\ \x0b\x10\x01\xad\x23\xbd\x75\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd3\x09\x09\x14\x30\x03\x75\x06\x85\x3f\x00\x00\x05\xc0\x49\x44\ \x41\x54\x78\xda\xc5\x97\x4d\x6c\x1b\xd7\x11\xc7\x7f\xbb\x5c\x7e\ \x73\xad\x95\xe4\xc8\x72\x9c\x2a\x52\x80\x26\x46\x9a\xda\x54\x84\ \xd4\x69\x9b\x16\x16\x20\x07\x69\x51\x24\x05\x9a\x22\x40\x0e\x59\ \x03\x86\x7b\xe8\xc5\xe8\xb9\x28\x24\xf4\xd2\xab\xdd\x1e\x7b\xf1\ \xa2\x97\xa2\x48\x51\xb4\x75\x5a\xc4\x68\x2b\xa1\x89\x03\x3b\x85\ \x62\x26\x76\x52\x35\x82\x2d\xda\xaa\xf5\x41\x52\x21\x25\x92\xbb\ \xfc\x58\xbe\xd7\xc3\x92\x14\x29\x92\x26\x9b\x4b\x1e\x30\xc4\xf2\ \xbd\x99\xf7\xff\xef\xbc\xd9\x99\x79\x8a\x94\x92\x2f\x72\x68\x00\ \xa6\x69\x0e\x6c\xb0\xfa\x98\x35\x09\x4c\x4a\xc9\xe9\xc6\x9c\x90\ \x20\x04\x4b\x02\x92\xcf\x6c\x99\xc9\x41\xf7\xb2\x2c\xcb\x23\xd0\ \x6f\xdc\x99\xb0\x0c\xe0\x2c\x60\x22\x88\xb7\x3a\xad\x0e\x8e\x80\ \x79\x80\xdb\xe3\x56\x42\x48\x2c\x29\xb8\x7c\x32\x6d\xe6\x06\xf2\ \x40\x1f\xf0\x05\xe0\x02\x60\xa8\x0a\x44\xc3\x10\xf4\xc3\x89\x47\ \xf3\x44\xc3\x41\x00\xa4\x28\xf3\xde\x5d\x1d\xbb\x04\xc5\x32\xf1\ \x72\x95\x38\x30\x7f\xf3\xb0\x75\x69\x3a\x63\x2e\x7c\x2e\x02\x6b\ \x8f\x5b\x86\x90\x2c\x02\x71\x4d\x85\x58\x18\xbe\x7b\xb2\x4a\x7c\ \x4a\x65\xfa\x09\x1f\xa0\xb7\x68\x07\xf8\x09\xb0\x9e\x11\x7c\xb8\ \x26\x78\xe7\xd6\x2e\xd7\xd6\x46\x0d\xe1\x32\xbf\x3c\x6a\xbd\x02\ \xcc\xce\xec\x74\xf7\x86\xd6\x03\x3c\x5e\x07\x37\xf4\x10\xcc\x3e\ \x5d\xe1\xfb\xa7\x34\x46\x74\x3f\x00\x99\x3d\xc1\xda\x86\x4d\xc5\ \x15\x08\xa9\x34\xed\x9e\x7d\x52\x67\xf6\x84\xca\xec\x89\x51\xde\ \xfe\xc0\xe5\x8f\x37\x4a\x7c\xb2\x15\x8b\x0b\xc1\xda\x0d\xc3\x9a\ \x3d\x95\x33\x13\x7d\x09\xb4\xbc\xb9\xf1\xc4\x61\x87\x1f\x7c\xdd\ \x4f\x7c\x2a\x00\xc0\xc6\x8e\xcb\xd6\x8e\x03\xc0\x8b\x33\x7a\x07\ \xf1\xab\xcb\x79\x00\x9e\x9a\xd0\x79\xe1\x69\x8d\x2f\x3f\x1a\xe1\ \xcd\xa5\x6d\xfe\x74\xfb\x88\x01\x2c\x5e\x1f\xb2\xa6\x9e\xdf\x6d\ \xf7\x44\x07\x81\x06\xb8\x11\x85\x73\x73\x41\x8e\x0c\xab\x38\x55\ \x48\x65\x2b\x14\x8b\x0e\xdf\xf9\xda\x50\xcf\xf3\x6c\x90\xba\xba\ \x9c\x67\xe2\xa8\xce\xa1\xa8\xca\xeb\x67\xc6\xa8\xc9\x14\x57\x6e\ \x8f\x19\xc0\x22\x30\xdd\x6a\xa3\x76\x09\xb8\xb8\x1e\x82\xd7\x9e\ \x77\x89\x86\x54\x0a\x0e\x64\xf3\xa2\x2f\xf8\x41\x22\xf7\x37\xf3\ \x14\x1c\x70\x6b\x0a\x67\x9e\x3b\xcc\xf1\x71\x1b\x21\x89\xbf\x77\ \xc8\x5a\xe8\x4a\xa0\xfe\xa9\x5d\x50\x15\x78\x6e\xaa\xc2\xe4\xb8\ \x86\x53\x05\xa7\x0a\x77\x1e\x14\x3b\xc0\x37\xb3\x70\x6d\x05\xde\ \x59\x81\xeb\xab\x90\x2f\xb5\x93\xf8\xd6\x57\xf5\xa6\x7d\x34\xac\ \xf2\xf2\xa9\x00\x7e\x1f\x08\xc9\x85\x77\x75\xcb\xe8\xe6\x81\xb3\ \x80\x71\x28\x02\x27\xa6\x34\xf2\x0e\x4d\x19\x1f\x6e\x73\x14\x4e\ \x05\x6e\x26\x61\xb7\xbe\xfe\x59\x01\xfe\x9e\xa8\x50\x2c\xb9\x4d\ \x9d\x70\x00\xca\x95\xfd\x3d\x8e\x8e\x68\x3c\xfb\xa5\x3c\x80\x21\ \x24\x67\xbb\x11\x30\x55\x05\xa6\x27\xaa\x80\x8a\x5d\xa2\x29\x41\ \x7f\x3b\x81\x8f\xd7\x69\x5b\xb7\x4b\x9e\x07\xd6\xb7\x9d\x36\x3d\ \xbf\xe6\xad\xad\x6d\xd5\xf8\xd7\xaa\x8b\x1e\x0b\xa0\xa9\x20\x04\ \x66\x5b\x10\xae\x3e\x66\x4d\x22\x88\x87\x43\x30\x14\x53\x29\x96\ \xdb\xdd\x69\x87\x02\xcd\xe7\xb2\x0b\x9f\x6e\x42\xd5\x6d\xd7\xd9\ \xdd\x49\x73\xfc\xf4\xb1\xb6\xb9\x7f\x7c\x58\x25\x99\x56\xb0\x5d\ \xad\x09\x37\x12\x83\x8d\x2c\xf1\xa5\x88\x35\x09\x24\x1b\x2b\x93\ \x52\x7a\x6e\x0b\xf8\x3a\x09\xdc\x49\xf9\xf8\xcb\x4d\x18\x89\xc1\ \xea\x46\xe7\x79\xbb\xf6\x36\xaf\x7c\xd3\x68\x9b\xfb\xf7\x7f\x05\ \x9f\x6c\xfa\x3b\x02\x34\x16\x06\xb2\x20\x25\xfb\x04\x1a\x85\x25\ \xa4\xd5\x28\xd7\x7c\x94\x6b\x9d\x91\xfd\xf1\x7a\x8f\x54\x5a\xd9\ \xe6\x47\xdf\x1b\x25\x1a\xda\xff\xa2\xed\xb2\xe4\xd7\x57\xab\x40\ \xb0\x43\x3f\xe8\x07\x29\x41\x78\x98\x4b\x5a\x6b\x51\x31\x22\x35\ \x8a\x65\xdf\xc0\x95\x31\x50\xbe\xc7\x8f\x5f\x3d\xd6\x01\xfe\x8b\ \xdf\x57\x58\xcf\x05\xbb\xda\x84\x03\x1e\x96\xd7\x06\x28\x5e\x0c\ \x88\x7a\x75\x13\x42\xa1\xe0\x0c\x06\x2e\x4b\x29\x7e\xfe\x46\x77\ \xf0\x95\xad\xe0\xc3\x6d\x5b\xca\xa9\x47\x40\x78\x7f\xb2\xb6\x86\ \xcf\xdf\x1f\x5c\x41\xf2\xd2\x71\xd1\x06\x9e\xde\x93\xfc\xea\x4a\ \x95\x4f\xb7\x83\xa8\x4a\x6f\xdb\x83\xf1\xd5\xd8\x61\x49\xc0\x7c\ \x55\x28\x94\xab\x0f\x67\xee\xd5\x7e\x85\xa7\x26\x22\x6d\x6b\xbf\ \x7c\xab\xc6\xdd\x4c\x00\xad\xcf\x09\x96\xab\x80\x14\x00\x4b\xe0\ \xab\x7b\x00\x92\x8d\x04\xe3\xd6\xc0\xa7\xca\x16\x50\xa5\x79\x44\ \xa0\x34\x7f\x15\xf6\x75\xee\x67\x24\x6b\x69\x0d\x65\x80\xa3\xcb\ \x15\x00\xcf\x36\xd9\x4c\x44\xcf\x6c\x99\x49\x21\x49\xec\xd9\xa0\ \x2a\x1e\x68\x43\xc0\x9b\x3b\x28\x99\xc2\xfe\xab\x2e\xdf\x55\xba\ \xea\x74\x93\xd4\x1e\x00\x89\xb9\xca\xb9\x64\x5b\x35\x94\x02\xab\ \x2c\x88\xdb\x25\x17\x23\xd6\xbf\x53\xfb\xdd\xfb\x31\x36\xf2\x50\ \x2c\x79\x35\x21\x30\x40\x73\xb7\x99\x75\x71\xbd\x04\x66\x75\x2b\ \xc7\x97\x81\xf9\xf5\x1d\xd5\x38\x32\xdc\x7f\x33\xbb\xf0\x19\x46\ \xc0\x4f\x48\xba\x8c\x0f\xe9\x64\xed\xfe\x0c\xfe\xb3\xa1\x00\x32\ \x57\xc7\x6a\xaf\x05\x27\xd3\x66\x4e\x48\x2e\x15\x2b\x2a\xd9\xdd\ \x02\xe1\x00\x3d\xc5\x27\xf2\xfc\xec\x87\x7e\x5e\x9c\xd1\x79\xf9\ \x1b\xc3\xfc\xf4\x55\x0d\x23\xca\x43\x6d\xb6\x32\x79\x9c\xb2\x04\ \xc4\xa5\xb9\xca\xb9\x5c\xd7\x7e\xa0\xde\x40\x26\x3e\x7a\x10\xa3\ \x54\xcc\xe2\xd7\xe8\x2e\x8a\xcb\xe3\x47\xf5\xb6\xe4\x32\x39\x46\ \x4f\xfd\xbd\xdc\x0e\xd7\xef\x84\x01\x91\x98\xab\x9c\x5f\xe8\xd9\ \x90\xd4\xc7\xac\x10\xe4\xfe\xb6\x32\x4c\xa5\x90\x26\xe8\xa7\x43\ \xc2\x91\x30\x4e\xe5\xc0\x91\x94\xe8\xaa\x6b\xef\xa5\x78\xeb\xd6\ \x10\x20\x72\xc0\xec\x41\xb0\x0e\x02\x33\x3b\x66\x4e\x48\x66\xa5\ \x24\x77\xe5\xf6\x23\x64\x52\xa9\x0e\x77\xea\xb1\x10\xbf\xbd\xe6\ \x55\xc5\x7b\x69\xf8\xc3\xfb\x50\x72\x3b\xdd\xbe\xb9\xb9\xc9\x9b\ \xcb\x23\x4d\xf0\xb9\xca\xf9\xdc\x40\x5d\xf1\xa9\x9c\x99\xb8\x3e\ \x64\x4d\x09\xc9\xe2\xdb\x2b\x63\xf1\xc3\xf7\x6d\xce\x7c\xa5\xc0\ \xe8\xe8\x58\x53\x67\xcf\x86\xbf\x7e\xb0\x6f\xd3\x92\x14\xc9\xa4\ \x1e\xf0\xe7\x8f\x86\x48\x17\x1e\x01\x44\xa2\x17\xf8\x43\xef\x05\ \xf5\xee\x75\xfa\x5d\xdd\x5a\x48\x15\x23\x17\x7e\x73\x23\x62\x1c\ \xd3\xf3\xcc\x4c\xec\x32\x36\x1c\x24\x14\x0c\x11\x8d\x79\x71\x50\ \x2c\xe6\x71\x1c\x87\xad\x4c\x89\x1b\xf7\x0c\x36\xf6\x8e\x00\xe4\ \xbc\x80\x3b\xff\xf9\x2e\x26\x8d\xf1\x42\xde\x5c\xf8\x67\xcc\xba\ \x08\x9c\x5d\xdf\xd5\xcd\xf5\x5b\x7a\xbc\x5e\x4e\x5b\x0a\x4b\x0c\ \x64\xa4\x91\xe1\x12\xde\x77\x2e\x2e\xf7\x7a\xeb\xff\x8b\x00\xc0\ \xb7\x0b\x66\x0e\xb8\x08\x5c\x5c\x0c\x7b\x97\x53\xe0\x74\xb3\xaa\ \x35\x73\x3b\xc9\x46\x86\x1b\x74\x28\x5f\xf4\xf5\xfc\x7f\x92\x93\ \xb2\xba\x6d\x79\x43\x86\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x06\x3f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x05\xbc\x49\x44\ \x41\x54\x78\xda\xc5\x57\xcd\x8f\x14\x45\x14\xff\x55\x75\xf7\x7c\ \x2d\xbb\x0b\xeb\x80\x2b\x2c\x20\x71\x23\x7e\x20\xb8\x06\x02\x09\ \x07\x49\x38\x70\x20\x1e\x4c\x4c\xbc\x90\x18\x0f\x86\x9b\x37\x13\ \x4f\x1a\xe3\x81\x70\x37\xfe\x03\x7a\x30\x78\xd0\x4d\xe0\xc2\x45\ \x49\x44\xc4\x20\xa8\x17\xc3\x02\xd9\x04\x23\x1f\xbb\xec\xee\xb0\ \x33\x4e\xcf\x74\x77\xbd\xb2\x5e\x75\xa5\x52\xd9\x95\x9d\xf1\x64\ \xed\xbe\xa9\xcf\xae\xf7\xab\xdf\xfb\xd5\x9b\x1e\xa1\xb5\xc6\xff\ \x59\xe2\xb0\x23\x4c\x99\x9e\x9e\xfe\xed\xd0\xa1\x43\xfb\x0c\x30\ \x62\x8b\xe2\x98\x9a\x7b\x8f\x09\xc8\x84\x14\x29\x00\x52\x6b\x01\ \x4d\x24\x00\x98\x05\x10\xa4\x89\x5b\xae\x40\x98\x39\xd2\x8a\x50\ \x76\x4d\x5f\x01\x7a\xb1\x95\xf6\x97\x97\x16\x3e\xfb\xe5\xdc\x27\ \x67\xd7\x02\x08\xcb\x9e\x99\x99\x99\x57\x4e\x9f\x3e\xcd\xed\xc8\ \xe0\x89\xa4\x94\x88\xa2\x08\x5c\x9b\xbe\xad\xb9\xf0\x18\xf7\x01\ \xf0\x18\x5b\xd0\x5f\xbf\xf6\xd2\xb5\x39\x9c\xb9\x30\x76\x78\x23\ \x06\xb8\x6c\x9e\x9d\x9d\xc5\xfc\xfc\xbc\x77\xc0\x9b\x3c\x7f\xfc\ \x3d\x24\xa3\x93\xa8\xd5\x6a\x58\x5d\xed\x82\x00\x68\xa5\x41\xe0\ \x03\x02\x05\x09\x83\xd6\x52\x88\xbc\x50\xd0\xc4\x33\xc2\x58\x19\ \x5e\x52\x05\xf2\xbc\xc0\xb6\x4a\x77\x3f\xd6\x94\x50\x03\xec\x70\ \x06\xc0\x75\x76\xc4\x25\xcf\x73\x0b\xe2\xf0\xbb\x9f\xe3\xe0\xd1\ \xe3\x4c\x09\x16\xdb\x05\x1e\xae\xb2\x63\xfb\xef\x8b\x34\x73\xbb\ \x9b\x11\xfe\x5c\x52\x20\x5d\x82\x01\x57\x80\x5b\x6b\x40\x4a\x05\ \x95\xd7\x26\xce\x7f\xb8\x6b\xc5\x3f\xb7\x06\x90\xb2\xb4\xc4\xb1\ \xa7\x91\x2d\x2f\x34\xee\x2e\x13\xba\x19\xe1\xb9\x6d\x15\x48\x61\ \x1d\xfa\x79\x6e\xc3\xd8\xc3\xc7\x1a\x93\xe3\x11\x84\xe4\xb1\xd2\ \x44\x50\x6b\x1d\x23\xa9\x59\x78\x78\x12\x00\xe2\x8f\x24\x49\x7c\ \x08\xb8\xe6\x0d\xd2\x4c\x63\xb5\x07\xb4\x7b\x84\x9d\x4f\xc5\x6e\ \x63\x6b\xde\x61\xa6\x60\xc7\x93\x48\xc0\xcf\x4b\xdb\xf6\xeb\x54\ \xa3\x9a\x6d\xa4\x01\x0f\x80\x8b\x17\x58\x54\xb2\xd1\xea\x6a\x54\ \x62\x8d\x67\x9b\x31\xee\xb5\x72\x4c\x3f\x5d\xc5\x4b\x53\x35\x6c\ \x1d\x8b\x11\x4b\x81\x07\x2d\x0e\x4f\x0e\xd2\x29\x1e\x75\xb0\x26\ \x4c\x0c\x04\x68\xdd\xbf\x99\x01\xcf\x3c\x11\x80\xa5\xa7\x52\xa9\ \x80\x88\x3c\x03\x16\x44\x19\x53\xb3\xb1\xc6\x8e\x2d\x02\x1f\xbd\ \x39\x89\x5d\xcd\x0a\xe6\x17\x33\x7c\xff\x47\x07\x2b\x1d\x85\xfd\ \xbb\xeb\x78\xfb\xc8\x16\xf4\xf2\x71\x7c\xf9\x43\x0b\x73\x0f\xfa\ \xa1\xbe\x78\x73\xfd\xdd\xc7\xc7\x8a\x8d\x18\x50\xbc\x90\x19\x28\ \x8a\x82\x2f\xb2\xd3\x82\xd3\x03\x80\x46\x55\xe2\xad\x23\x4d\x4c\ \x4d\x24\x38\x77\xb5\x85\x8b\xbf\xb7\xfd\x51\x6f\x3d\xcc\x70\x79\ \xee\x6f\x7c\x70\x72\x1b\xde\x3f\xd1\xc4\xd9\xf3\x8b\xf8\x6b\x39\ \xf7\xa7\x37\xfb\x59\x8d\x6d\xa4\x01\x1d\x9c\x9a\x1f\x70\x1a\x90\ \x3e\x86\x07\x76\xd5\x8d\xd0\x12\x28\x02\xb2\xbc\x08\xb5\x60\xdb\ \x0b\x8f\x15\xae\xdc\xee\x22\x89\x05\xde\x78\x6d\x0c\x22\xd0\x81\ \xf9\x28\x86\x01\xc0\xb7\x80\x1d\x7b\x00\x60\xd5\x3b\xa1\x6d\x1d\ \x4f\x7c\xac\x5e\xdc\xd1\xc0\xc4\x88\x17\xa1\x07\x79\x7f\x85\xd9\ \x03\x76\x4e\x24\x81\x08\xd9\x30\x90\x01\x0a\x32\x5f\x68\x7e\x93\ \x1b\xf3\x29\xc8\xe5\x8e\x9b\xf7\x33\x8c\x54\xa5\xb1\xd0\x89\xb0\ \xda\xe0\x72\x67\x21\x87\x40\x70\x1d\x81\x7c\x50\x26\xd4\xec\xcc\ \x31\xe0\x45\x28\x00\x2f\xc2\x85\x36\xe1\xd3\x6f\x17\x51\x4d\x24\ \xee\x99\xf8\x8e\xd5\x81\x24\x92\xa0\x58\x23\x27\x60\xbc\x1e\xe1\ \xe0\x9e\xba\x65\xe8\xa7\xdb\x29\x2a\xb1\x44\x41\x65\x5e\x52\x40\ \x31\x34\x80\xf0\xf4\x5a\x53\x29\x42\x97\xd6\x96\x3a\xa6\x0f\xb2\ \x74\x77\xfa\x02\x13\x0d\x80\xa8\x9c\x3f\x75\x74\xdc\x32\xf2\xf5\ \xcf\x6d\xcb\x40\x25\x12\x20\x4f\xb7\x18\x8e\x81\x30\x04\x96\x01\ \x22\x66\xc0\xa7\x54\x20\xbc\xe3\x06\x44\x06\x54\x63\xe0\xc8\x74\ \x1d\x7b\xb7\x57\xf1\xcd\xb5\xb6\x11\x62\xcf\x3e\x43\x5a\x20\x96\ \x5c\x6b\xe8\x61\x00\xb0\xc3\xb5\x00\x2c\x03\x2c\xa6\x20\xa1\x04\ \xe9\x05\x4a\x03\x23\x35\x81\x13\x07\x36\xe1\xca\x5c\x6a\xae\x62\ \xe9\xdc\x16\xc7\x9c\x64\xce\xa4\xe8\x0f\x66\x20\x14\x9d\x6b\x43\ \x68\xde\xd0\x3b\x74\xff\xde\x01\xb7\x8f\xbf\x3c\x8a\x7b\x2b\x39\ \x66\xaf\x77\x8c\x3e\x80\xbc\xb0\x8b\x1c\x60\xed\x6a\x91\x0f\x75\ \x0d\x01\x78\x01\xba\xbe\x53\xb8\xf4\x57\x4e\x94\xe6\xdb\xfb\xa6\ \x2a\xf8\xea\x6a\xd7\x8a\x53\x91\x30\xe2\xb3\xeb\x1d\x70\x59\x5e\ \x63\x88\x6c\x10\x03\x9e\xfe\x10\x84\x77\x18\x1c\x5d\x04\xa7\x67\ \x67\xfd\x42\xa3\x9d\x6a\x44\xd2\x7e\x19\x59\xe5\x1b\x2c\x50\x3a\ \xd0\x8c\x18\x32\x04\xec\xcc\x59\x98\x03\xbc\x43\x2e\xa1\x20\xb7\ \x8c\x44\xb8\xbb\xa4\xdc\x57\x2e\x20\xa4\x46\x1c\x01\x44\x12\x31\ \x83\x70\x80\xcd\xf4\x70\x0c\x84\xce\xd9\x84\xa3\xde\xcb\x30\xf8\ \xe0\x2a\x57\xc0\x8f\xb7\xfa\x0e\x24\x4a\xe5\x47\xda\xce\x6a\xde\ \x13\xb0\xb5\x94\x51\x6f\x68\x06\xc2\x70\xc8\xb8\xc2\x69\xd9\x87\ \x85\xd8\x8f\xd6\x3e\x24\x8f\x53\x32\xc6\x73\xce\xcc\x9f\x22\x06\ \x21\x40\x04\x2f\x5e\x21\x68\x78\x00\x21\x03\x32\x32\x00\x08\xd0\ \x56\xcd\x1a\xc2\xc5\x95\x40\xd8\x54\x91\x78\xfd\x85\x32\xf3\x5d\ \xbd\xd3\x43\x2b\xd5\x90\x28\x55\x9f\x6b\x3e\xb5\x46\xd9\x95\xfc\ \xec\xc0\x4c\x88\x38\xf6\x43\x01\x03\x55\x28\x9b\x8c\x80\xf2\xdc\ \x64\xc3\xc2\xe5\xe4\xab\x0d\x93\x7a\xab\xb6\xdd\xdc\x24\xf1\xc5\ \xe5\x36\xb4\x70\xe4\xf3\x7a\x72\xda\x81\x3b\xc1\x20\x06\x82\xd7\ \x69\x9f\x88\x10\x25\x20\x4d\xc6\x00\xe1\x63\x4f\x96\x8d\x7a\xc5\ \x1d\xd0\xd8\x68\x4d\x80\x4a\xaa\x7c\x18\xc9\x31\xc6\x5d\x8e\xc1\ \x7f\x12\xa1\xbf\x92\x32\xb1\x0c\x78\xdd\x07\x0c\x5c\xb8\xd1\xc6\ \xe6\x86\x44\x35\x16\x38\xff\x6b\x07\x4a\x31\x4a\x1d\x5e\x53\xdf\ \x8e\xa4\x1c\x00\xc0\xad\xcd\xb2\xcc\xbe\x92\x13\x91\x7d\x33\x02\ \x34\x94\x22\x2f\xc2\xb2\xa1\x18\x8e\xb9\x7e\x19\xce\xcc\x2e\xf2\ \x78\xa9\xf4\x20\xfd\xc2\xb5\x7d\x13\x83\x43\xb0\xdc\xeb\xf5\xa8\ \xdd\x6e\x4b\x53\x5b\x10\x69\x9a\x22\x2f\x08\x91\x22\xde\x6b\x7d\ \x3a\x76\x83\xee\x13\xb4\xde\xb1\x0f\x5b\x22\xb5\xdc\x10\x80\xd6\ \xba\x3f\x39\x39\xf9\xa0\xd3\xe9\x6c\x67\x00\x4a\x29\x0b\x80\x54\ \x8e\x42\x29\xe7\x58\xff\x9b\x63\xae\xd7\x83\x0a\xd6\x70\x29\xe4\ \xc6\x0c\xf0\x03\xf1\xe8\xe8\xe8\x45\x29\xe5\x3b\x06\x80\x7f\x89\ \x4c\xdb\x8f\xd0\x27\x19\x0b\x11\xf1\x6e\x4e\xac\x0c\x18\xc1\x77\ \x85\xb4\xe3\x01\x30\x46\xea\xc7\xa5\x20\xa5\x62\x5c\x12\x62\x6a\ \x0c\x40\xd7\xec\x5d\xf8\x9f\x66\x66\x13\xe9\xc0\xd4\x8c\x35\x8c\ \xd5\xd9\xdc\x58\xe2\x6b\x6f\xe1\xb8\xff\x45\x55\x38\xcb\xbd\xf9\ \xbe\x9f\xeb\x3a\x4b\x8d\xf5\x19\xc4\x3f\xde\x21\x68\x33\xad\x41\ \xbd\x0c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xe0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ \x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x0c\ \x1b\x16\x05\x11\x8e\x6b\xb0\xdd\x00\x00\x00\x06\x62\x4b\x47\x44\ \x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x06\x6d\x49\x44\ \x41\x54\x78\xda\xcd\x57\x5b\x6c\x54\x55\x14\x5d\xf7\xde\x99\xb9\ \xf3\xe8\xf4\x01\x08\x04\x8a\x52\x3e\x4a\x55\x62\xa6\x10\xc4\x86\ \xa2\x12\x22\x90\x48\x48\x30\x8d\xa1\xbc\x0a\x82\x3c\x52\xa8\x06\ \x13\xd0\x0f\xe5\xcb\x98\x88\x06\x43\x0c\xef\xc4\x2f\xf8\x20\x24\ \x02\xf1\xc3\x47\x08\x2a\x4a\x30\x80\x96\xd2\x82\xb4\xb4\xbc\x9f\ \xe9\xcb\x4e\x87\x99\x7b\xe7\x3e\xdc\xfb\xf4\xe6\xdc\x19\x5b\x22\ \x1f\x10\xdd\xc9\xea\x39\x3d\x67\x9f\xbd\xd6\xde\xfb\xcc\x99\x0c\ \xfe\x6b\x53\xe0\x59\x2b\xcd\x8b\xc3\xe1\x90\x13\x8f\xeb\x41\x4d\ \x53\x95\xc7\x4c\xe4\x12\xac\x68\xd4\x55\x3a\x3b\x33\xbd\x7d\x7d\ \x66\x39\x2d\x49\x01\xbd\x34\x5a\x75\x75\x09\x65\xd4\xa8\x7d\xbd\ \x27\x4f\x26\xb2\xf7\xef\xab\xde\xa1\xfc\x20\x72\x1c\x7a\x4d\xce\ \x1f\xb2\x17\x9b\x30\xc1\x1d\x5e\x5d\xdd\x68\x36\x35\xad\x8c\x1e\ \x3c\xd8\x58\x4c\xcb\x01\x76\x48\xeb\xba\x1e\x28\x2d\xdd\x17\x98\ \x3d\x7b\xb2\x56\x55\x05\x55\x51\x06\x67\xf0\x38\xca\xad\x52\xe4\ \xc2\xc2\xca\xcc\xb5\x6b\x7b\x15\x5d\xaf\x86\x61\x64\x84\x80\xac\ \xaa\x46\x6e\x1d\x39\x92\x88\x57\x54\xc0\x34\x4d\x3c\x49\x73\x28\ \xb9\xd6\x63\xc7\x2a\x9f\x27\x4e\x00\x03\x02\x6c\xd7\xd5\x7a\x9a\ \x9b\x55\x3d\x99\x84\x8d\x27\x6b\xb6\x61\xa0\x8f\x5a\xcc\x9c\x20\ \x1b\xa8\x80\xeb\xaa\x0e\x00\x2b\x93\xc9\x13\xd0\x4d\xce\x6d\xe1\ \x30\x82\xe9\x34\x12\xba\xce\xad\x79\xb4\x2c\x5d\x17\x8d\x74\x36\ \x1b\x89\xa0\x9c\x62\x96\xe8\xba\x2f\x20\x9b\xe5\x84\x05\xa7\x14\ \x40\xe4\xaa\xcd\x9b\x39\x02\xfe\xb2\x6d\x38\x89\x04\x16\x55\x57\ \x23\x4d\x02\x7e\x3c\x74\x08\x65\xc9\x24\x8b\xf8\x57\xf2\x2b\xf1\ \x38\xe6\xd5\xd6\x22\x42\x02\x7e\x3b\x71\x02\x3d\xe7\xce\xa1\x50\ \xd3\x06\xf6\x4d\x93\xdb\x20\x38\x01\xef\x8f\xe3\x38\x2c\x80\x2b\ \x20\x11\xa5\xcb\x38\x8d\xc8\x15\x72\x8e\x46\xa3\x78\xb5\xa6\x06\ \xb7\x4a\x4a\x90\xe5\xfd\xa1\x21\xf6\x6e\x16\x17\xb3\x2f\x9f\x11\ \x67\xa7\xcd\x98\x81\x48\x55\x95\xf4\x71\xb8\x02\x1e\xa7\x14\x60\ \x3b\x8e\xdf\x02\x0f\x65\x45\x45\x50\x55\xb1\x0d\x97\xb2\xd2\xa9\ \x8c\x2f\xcd\x9f\x8f\xae\xd2\x52\xe9\x27\xe1\x91\x77\x8e\x1d\x2b\ \x7c\x42\xa1\x10\x13\x80\x8d\x63\x94\x91\x28\xe9\xcb\x15\xf0\x38\ \xa5\x00\xcb\x6f\x81\x54\xda\x7a\xe0\x00\x1e\xb4\xb7\xc3\xab\x90\ \x40\x30\x18\x44\xe5\xdc\xb9\x48\x4d\x9c\x08\xcb\x30\x64\x50\x9e\ \xa7\xca\xcb\x91\x98\x33\x07\x81\x40\x00\xb6\x6d\x33\x84\xf0\x07\ \x1d\x1d\x68\xdb\xbf\x3f\xaf\x02\xdc\x02\xe6\xf4\x2b\xe0\x5f\x42\ \x89\x6c\x2a\x85\x96\xbd\x7b\x91\x6a\x6b\x93\x22\x38\x20\x13\x3c\ \x37\x6b\x16\x9c\x29\x95\x50\x6c\x43\xc0\x9e\x9c\x40\xc5\xcc\x99\ \xd0\x34\x2d\x9f\xfc\xf2\x65\xb4\xec\xd9\x03\x33\x95\x1a\x24\xc0\ \xce\xbd\x84\x36\xa0\x88\x45\xc3\xe0\x0d\xff\xc6\x12\xce\xef\xd8\ \x81\x49\x6b\xd6\x20\x58\x56\x26\x2b\x21\xca\x3a\x7d\x06\x6e\x93\ \x18\xc0\x45\xe9\x8b\x55\xbc\xc6\xc4\x3c\x8a\xde\x1b\x1d\xed\xb8\ \xb0\x7b\x0f\x1c\x5a\xcb\x35\xdb\x13\xc0\x9c\x42\x80\xac\x00\x07\ \x30\x4d\x11\x44\x1a\xb9\xd0\x32\x2e\xee\xdc\x8e\x67\xd7\xd6\x43\ \x7d\xa6\x4c\x56\x82\x89\x46\x4f\x9d\x06\xcf\x64\xcf\x99\xdc\xb9\ \x76\x05\x97\x76\xef\x80\x63\x5a\xd4\xeb\x9c\x67\x94\xf6\xf4\xe2\ \x22\xe2\x73\x04\xa7\x7f\x07\x7c\x01\x7e\x1b\x8c\x0c\x5c\x33\x03\ \x35\x9b\x81\x92\xe9\x47\xfb\xce\xcf\xe1\x5e\x6d\x63\x02\x59\x09\ \xef\x82\xf2\x5c\x0a\xd7\x6e\x5e\x41\xc7\xae\x6d\x80\xd1\x0f\xc5\ \xca\x50\xcb\x34\xc4\xc7\x8d\x43\x64\xc4\x08\xb8\xe4\x77\x66\xeb\ \x56\x98\x19\x03\xd6\x3f\xdf\x01\x57\x55\xd0\x7d\xa1\x05\x4a\x38\ \x82\x50\x3c\x8e\x60\x38\x84\x80\x4e\xe5\x74\x07\x54\x2a\x06\x70\ \x7d\xd7\xa7\x78\x7a\xf5\x46\xb8\x63\x64\x3b\x58\x00\x43\x08\x8b\ \x27\xbb\x71\xf7\xf0\x7e\xe8\x31\x1d\x0a\x47\x4d\x1b\xe8\xbb\x7e\ \x19\x1d\x47\x0f\x23\x9d\x4c\x83\x2d\x18\x8b\x82\xb8\x78\x37\x4f\ \x80\xc2\x15\x48\xde\xb8\x8e\x4c\xff\x03\x68\x9a\x82\x48\x2c\x84\ \x58\x61\x04\x91\x02\x1d\xe1\x68\x08\x7a\x38\x08\x27\x12\xc2\xb1\ \x1f\xbe\x47\xd5\x92\x55\x92\x38\x57\xc4\xaf\xdf\x7e\x83\xe8\xd7\ \x5f\x51\xf5\x2c\x98\x59\xc0\xf0\xa0\x10\x34\xa2\xb3\x99\x88\xc9\ \x5d\x55\x70\x4a\x01\x42\x84\xea\x35\x1c\xec\x4c\x3d\xb6\x0d\xb8\ \x29\x03\x36\x1d\xb6\xfa\xc9\x5b\xd7\xd0\xf6\xda\x22\x54\xd7\x2c\ \x91\x6d\xc8\x05\x5b\xd9\xdc\x05\x68\xee\xba\x8f\x91\x47\xf7\x01\ \x60\x61\x10\xe0\x6d\xee\x10\x8f\x8a\x46\xe4\x39\x17\x5d\xcd\xfd\ \x96\x62\x75\xac\x21\xa0\xf9\x08\xf2\x18\xd2\x70\xe7\xf5\xe5\x78\ \xa5\xe1\x03\xc4\x62\x31\x78\x26\x6f\x3c\x67\xcf\x77\x80\x3f\x86\ \x2f\x2c\x5d\x87\xee\x37\xd6\x8a\x33\xc1\x40\x7e\x2c\x72\x17\x1c\ \xae\xa2\x0c\x16\xc0\x7d\x61\x75\x1a\xed\x69\x39\x22\x34\x0a\xd4\ \xb5\x60\x35\x5e\xde\xf0\x3e\x0a\x0a\x0a\x98\x50\x92\x0f\xbf\xd1\ \x88\xa7\x6e\x36\xf2\x5c\xb6\x83\xdf\x89\x44\x5d\x3d\x52\xb5\x0d\ \x7c\xd6\x8f\xc3\x50\x21\x7c\x1d\x75\x68\x01\xb2\x02\xc2\x91\x41\ \xe9\xa7\x16\xae\x27\xf2\xcd\x9c\x39\x93\x33\x38\x53\x22\x3f\x0b\ \xfb\x8b\x65\x70\xb6\xaf\xc0\xe8\x3b\x4d\xfc\x4a\x32\x39\xef\x89\ \x67\x7b\xca\x5b\x1b\xe0\xae\xd8\xc4\x31\xf2\x62\x2a\x94\xa1\x3b\ \x94\x00\x56\xc5\x9b\x14\x5f\x40\x0d\x68\x14\x60\x23\x91\x6f\x62\ \x72\x56\xce\x10\x24\xc5\x57\x4f\x0b\xf2\xb0\x6a\x0a\x28\x5f\xae\ \xc0\x98\x7b\xe7\x11\x0e\x87\xa5\x10\x9e\x4f\x7d\xbb\x01\x91\xfa\ \x0f\x45\x2c\x11\x93\xa1\x29\xc4\x85\x21\xef\x00\x11\xf8\x02\x62\ \xeb\x36\xa3\xba\xfe\x3d\x49\xce\x99\x71\xe0\x58\xdb\x29\x64\x3e\ \x5b\x82\xa0\x6b\x42\x0f\x01\x61\x42\x10\x26\xb2\xdb\x96\x53\x55\ \xfe\x18\x2c\x62\xd5\x7a\x0c\x7b\x77\x8b\x88\x09\x16\xf0\xf0\x3b\ \xc0\xff\xf9\x1b\x55\x8b\xeb\x44\x00\x32\x49\x1e\x6c\xf9\x05\xbd\ \x1f\x2f\x02\xb2\x26\x06\x99\x65\x22\xf9\xc9\x52\x44\x5b\x4f\x71\ \x0b\x58\x04\xb7\x4b\x9c\xab\xac\x59\x28\xdd\x14\x55\xe0\x61\x97\ \x10\xf2\xa3\x73\x7a\x65\x0d\xd0\xdf\x27\x9f\x57\xfb\xf7\xe3\xb8\ \xfd\x51\x2d\x6c\xc3\x14\x9f\xe7\xac\x05\xd0\x14\x19\x02\xcf\x6d\ \x1b\xe2\x25\xbd\xbb\x65\x31\x70\xee\x67\xf9\x55\xce\x31\xce\x50\ \x2c\x8e\x09\x86\x77\xd7\x86\x68\x81\x20\x92\x02\x7a\x5a\xce\xe3\ \xcc\xb2\x79\x50\x93\xbd\x48\x9f\xfc\x0e\xed\x9b\x16\xc2\x22\xb6\ \xac\x0d\xf9\xc8\xa4\x0d\x21\x40\xc0\xb4\x40\x7b\x04\x52\xd5\x41\ \xbe\x7c\x86\xcf\x9e\xad\x9b\x47\xb1\x9a\x44\x4c\xc7\xf5\xb2\xf7\ \xf9\x11\xc8\x6f\x81\x70\x12\x19\x3a\x04\x3e\xf8\xd3\xf4\xf1\x88\ \x84\x20\xfa\xad\x12\xbc\xf6\x09\x3f\xcd\x93\xcf\xfe\x96\xc5\x22\ \xbc\x91\x2a\xd1\xdc\xf0\xe6\x80\x38\x83\x63\xf9\x31\x21\x12\xcd\ \x6f\x01\xaf\xd9\x6a\xc1\x30\x37\x3a\xb2\x90\x1d\x05\x2c\xdb\x47\ \xd6\x62\x88\xcc\x05\x0c\x2f\x70\xda\x43\x86\xc1\xeb\xde\x3e\xfb\ \x5a\x02\x32\x86\x8c\x1b\x1d\x59\x44\xeb\x8a\xc3\x9c\xb2\x02\x2e\ \xd0\xad\xc7\xe2\x97\xe2\x93\xc6\x57\x68\xd1\x10\x34\xc7\xe2\x57\ \xcc\x7b\xc9\xfc\x51\x23\x28\x04\xae\x96\x45\x90\x99\x70\xdb\xf8\ \x99\x25\xa8\x84\xa0\x4d\x73\x8b\xce\xd0\xa8\xd3\x18\xf5\x12\xb0\ \xb5\x20\xac\x78\x09\x94\x0b\xf7\x2e\x31\xa7\x14\xa0\x00\x3d\xa1\ \x8b\x7f\x36\x74\xf4\xf6\x6c\xef\xe9\xea\x2c\xcf\xa6\xd3\xea\xa3\ \xff\x0c\x7b\x74\x0b\x45\xa2\x4e\x58\xbd\x71\x69\x74\xb2\xff\x1d\ \xe6\x44\xee\x75\x38\x3e\xd0\x8e\x12\xc2\x30\x6e\x2f\x9e\x80\x79\ \x65\xe7\xcc\x7b\x66\x02\x0e\xfe\x0f\xf6\x37\x83\x76\xd2\x44\xe2\ \x1d\x68\x05\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xe3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x01\x06\ \x14\x0d\x02\xa1\x61\x85\xe6\x00\x00\x06\x63\x49\x44\x41\x54\x58\ \xc3\xed\x96\x6b\x8c\xd4\xd5\x19\xc6\x9f\x73\xfb\x5f\xe7\xb2\x37\ \x76\x17\x76\xd9\x0b\x50\xa8\x50\x5a\x7b\x51\x16\x68\x37\x28\x41\ \xed\x07\x63\x5c\x8d\x55\xd3\xa4\xf6\xa2\xa4\xb5\x36\x69\xd2\x34\ \xb6\xb4\x4d\x6a\x9b\x50\xd2\x58\x5b\xd0\x36\x26\x4d\x34\x56\x54\ \x6a\x82\x60\xaa\xb0\x2b\x0b\xac\x22\x25\x94\x05\xba\x0b\xbb\x3b\ \x7b\x71\x96\xdb\xcc\xec\x6d\x76\x66\x67\xe6\x3f\xf3\xbf\x9e\x7e\ \x58\xc5\xfa\x01\xed\x2e\xdb\x4f\xed\x93\x9c\x9c\x9c\x9c\x2f\xbf\ \x3c\xcf\xfb\xbe\xe7\x00\xff\xeb\x22\xd7\xba\x38\x78\xf0\x38\x28\ \xa5\x00\x00\x4d\x53\xa1\x69\x0a\x1c\xc7\x45\xa1\x50\x02\x20\x21\ \xa5\xc4\x1d\x77\x6c\x58\x78\x80\xfd\xfb\xba\x00\x4a\x60\x11\x1d\ \xcb\xc3\x0e\xb1\x3c\x6a\x78\x3e\x0c\xcd\xd0\xa9\xaa\x29\x28\x5a\ \x25\x14\xad\x92\xcb\xa8\xcc\x5b\x4e\xe0\x78\xae\x87\xb6\xb6\x5b\ \xe6\x0d\x40\xff\xfd\xf0\xca\x9e\x4e\xe4\x5d\x60\x8a\x98\x30\x8b\ \x63\xd1\x44\x9e\xdd\x99\xf1\xc4\x0b\x36\xe3\x49\x57\xca\x94\xeb\ \x7b\x29\x9f\x20\xe5\x73\xfe\xcf\x12\xf8\x36\x02\x72\x63\x50\x2c\ \xb1\x57\x5e\x7e\xeb\xfa\x1d\x78\xf1\x2f\x6f\xc2\x21\x02\x6e\xa8\ \x12\x55\x5e\x76\x95\xcb\xc4\xe3\x52\x51\x1f\xa2\xaa\x0a\x23\x24\ \xa0\xc2\x86\x40\x00\xc2\x05\x3c\x70\xf8\x45\x1b\x6e\xb1\x34\xe9\ \x58\xf6\x76\xdf\xf2\x9e\xcd\x59\x56\xe1\x5b\xdf\xb9\x73\xfe\x0e\ \x58\x25\x07\x25\x2d\x82\x68\x71\xaa\x39\xeb\xd2\x5d\x8e\xa2\x3f\ \x14\x2d\x57\xd1\xb8\x88\x60\x49\x08\x58\x14\xd1\x51\x16\x0d\x23\ \xa4\x09\x54\x99\x0c\x35\xd5\x26\xaa\x6a\xa3\x55\x5a\x44\x7b\xd2\ \x86\xf7\xa4\x28\x84\xf9\xd3\xbf\x7f\x7d\xce\x00\x1c\x00\x76\xee\ \xdc\x83\xbc\xd4\xd0\x50\x1a\x13\x69\x4f\xfc\x84\x95\x45\xb7\x2c\ \x5e\xa4\xa0\xd2\x14\x50\x54\x05\x9c\x0b\x00\x12\xae\xeb\x81\x52\ \xc0\x76\x5c\x28\x42\x20\x12\xd2\x61\xe8\x2a\xa4\xef\x6f\x1d\x4d\ \x5f\x8a\x3b\xa5\x60\xc7\xbc\x1c\x70\x5d\x17\x32\x1c\x45\x72\xc6\ \x5f\xef\x10\xf1\x70\x4d\xb5\x8e\x0a\x93\x43\x33\x74\x84\x43\x06\ \x22\x21\x1d\x61\xd3\x40\x10\x04\x30\x4c\x1d\x86\xae\x5d\xed\x10\ \x53\x57\xd1\xd4\x5c\x8b\x8a\x9a\xc8\x77\x6d\x4b\xae\x9d\x17\x40\ \xb1\x68\xa3\xbe\x2e\x02\xc7\x75\xbf\xc7\x23\x11\x2c\x32\x01\xce\ \x05\x74\x55\x81\xa6\xaa\x30\x55\x15\xa6\xae\x81\x09\x0e\x0a\x82\ \x90\xa9\x43\xd7\x55\xa8\xaa\x02\xca\x28\x42\x61\x13\x0d\x4d\xb5\ \x8b\x8b\xce\xc4\xd7\x7f\xf8\xd8\xae\xb9\x47\xa0\xaa\x02\x61\xee\ \xc2\xb5\xed\xb6\xba\xba\x08\x08\x3c\x30\x4a\xc1\x18\x05\x67\x0c\ \x9a\xae\xc3\x73\x1d\x40\xce\x82\x71\x4e\xc1\x18\x03\x25\x1f\x76\ \x71\x59\x79\x19\x2b\xab\x8e\x34\x3c\xf1\xeb\x6f\x12\x00\x72\x4e\ \x0e\x08\x21\xa0\x51\x09\x5d\x13\x22\xc4\x3c\x10\x4a\x11\xc8\x00\ \xae\xeb\xc2\xf5\x7c\xe4\x0b\x16\xae\x4c\x4c\xc1\xd4\x15\xe8\xaa\ \x02\xc1\x39\x04\x63\xe0\x9c\xcf\x2e\xc6\x60\xe8\x0a\xa9\xac\x88\ \x56\x6f\xb9\xf5\x47\x4b\xe6\xec\x40\x2a\x35\x89\x35\x41\x80\x20\ \x08\x20\x88\x04\x08\x85\xe7\x07\x98\xce\xe4\x91\xcb\x17\x41\x39\ \x85\xa1\xe9\x30\x74\x1d\x0a\x67\x70\x3c\x0f\x9c\x73\x50\x42\x40\ \x00\x04\x52\x82\x11\x02\xc7\x2e\x51\xc7\xf9\xe8\x6c\xf9\x8f\x00\ \xd2\xe9\x19\x64\x2d\x17\x89\xc4\x24\x3c\x49\xa0\x83\x40\x06\x12\ \xaa\x2a\x20\x04\x87\xa6\x2a\x50\x14\x01\x46\x29\xbc\x20\x00\x63\ \x6c\x36\x02\x00\x84\x10\x48\x00\x81\x1f\x20\x99\x4c\x65\xbb\x8e\ \x9d\x1f\x9f\x73\x11\x3a\x8e\x8b\xa1\xd8\x45\xe4\xf2\xd6\xdb\xc9\ \xd4\x34\x14\x95\xc1\xf7\x7d\x38\xae\x87\x20\x00\xa4\x94\x90\x12\ \xf0\x7c\x1f\x12\x00\xa7\x14\x82\x52\x28\x1f\x44\xc1\x28\xa6\xa7\ \xb3\x7e\xcf\xd9\xd8\x05\xe0\x80\x3d\x8f\x36\xf4\x31\xdc\x33\x8c\ \x52\xc9\xdd\xde\x77\x26\x06\x5f\x42\x0a\x45\x00\x52\x22\x08\x7c\ \xf8\x41\x80\x20\x90\x20\x00\x18\x21\x20\x94\x82\x32\x06\xfe\xfe\ \x52\x85\x8a\xce\x43\x87\x93\x83\xb1\xf4\xf3\xf3\x6a\xc3\xdd\xbb\ \x7f\x85\xc2\x4c\x1e\x56\xc1\x7e\x37\x75\x39\xf5\xc6\xb9\x9e\x21\ \x62\x1a\x9a\x54\x14\x01\x42\x08\x08\xa1\x57\x07\xf7\xd5\xf2\x96\ \x12\xbe\x94\x60\x8c\xe1\x60\x7b\x3b\xe2\x23\x13\xe4\xfe\xfb\xdb\ \xd8\xbc\x47\xb1\xef\x01\x42\x91\xb9\x4c\x3a\xff\xcb\x93\xc7\x7b\ \x2e\x8e\x0c\x5f\x20\xaa\xaa\x82\x31\x06\x19\x48\x48\xc8\xd9\x5d\ \x4a\x04\x41\x00\xdf\xf7\xa1\x70\x8e\x03\x07\xdb\xd1\x75\xe4\x14\ \xd6\xaf\xdf\xa0\xf6\xf4\xf6\xd6\x5c\xd7\x73\x7c\x4f\xdb\x36\x28\ \x9a\x8b\xfc\x8c\xbd\xa5\x61\x79\xe5\x9f\x6e\xdd\xd2\xb2\x6c\xe5\ \xca\x66\x62\x18\x06\xb8\xe0\xb3\xd9\xbf\x5f\xfd\x9e\xeb\xa1\xeb\ \xc8\xd1\xd2\xd9\x33\x43\xa2\xb5\x75\x93\x4c\x24\x26\x50\x5b\xa5\ \x9e\xa9\x4a\x3c\x3b\x48\xa6\xce\xf4\x49\x28\x7f\x5c\xf7\xb3\x58\ \xe6\x93\x00\x3e\x62\x59\x7f\xff\x3b\x58\xd1\x7c\x17\x28\x9d\x79\ \x2f\x1e\x9b\x3c\x34\x3a\x12\x33\xb2\xd9\x69\x53\x4a\x68\x56\xa1\ \x20\xad\x7c\x5e\x4e\x8e\x4f\x79\xfd\x7d\xb1\xec\xde\x57\xf7\x5d\ \x78\xab\xe3\xc4\xae\xdb\x6e\xfb\x6a\xa1\xbb\xbb\xaf\xeb\x73\x6b\ \xea\x6f\x50\xd3\xc7\x97\x55\x7a\xdd\x9f\x15\x32\xbf\x39\x57\x94\ \xfe\x7d\x1b\x1a\x4e\xed\x3e\x36\x66\xcf\xeb\x47\xb4\xf9\x96\xc7\ \x11\x0a\xe7\x30\x9e\xca\xaf\x53\xb4\x99\x0d\x4b\x1b\xaa\xc3\xba\ \x6e\x94\x65\xd2\xe9\x6c\x32\x99\x8e\x67\x73\xc6\xdb\xbd\xbd\x7b\ \x46\x1f\x7c\xf0\x17\x78\xe9\xa5\x27\xf0\xdc\x4f\xef\x3d\xdf\xba\ \xb1\x76\x75\x5d\x53\x2d\x4a\xc3\x87\x30\x3a\x10\xc7\xe5\x09\xf6\ \x9b\x44\xa6\x7c\xc7\x23\x7f\xee\xce\x5c\xe7\xc7\xe9\x61\xdc\xfc\ \xa5\xc7\xae\x09\x2c\xf7\x6d\x26\xfb\x7f\xbc\xfa\xe8\xa5\xce\x47\ \xa5\x2c\x1c\x08\x4a\xfd\xbf\x95\xe9\xd7\x36\xc9\xd3\xdb\x97\xca\ \x17\xb7\x36\x3f\xbd\xad\x6d\x63\x05\x00\xbc\xf0\xc8\x9a\x8f\x8f\ \xe0\xda\x3a\x8d\x2b\x89\x93\xd7\xbc\xfd\xc6\x4d\x95\x78\x6f\xdc\ \xe9\xc9\x4e\x4d\xad\xd5\xb9\xdd\x50\xb1\xaa\x45\x52\xb5\x9c\x84\ \xe8\x24\x84\x33\xfe\xc5\xdc\x74\x71\xf1\xe2\x8a\xb5\xc7\x7e\xbe\ \xf7\x94\xf5\xd4\x03\xab\xd0\x7e\x6e\x6a\xae\x00\x1f\xaf\x3f\x74\ \x24\xd0\xa8\xe8\xc9\x62\xce\xea\xce\xa7\xc7\x3f\x5f\x1e\x91\xf5\ \xe5\x2b\x37\x02\x22\x82\x10\xcb\xd2\xb0\x4c\xdc\x90\xcd\x5a\x8d\ \xd1\xf0\x8d\x47\x9f\x6a\xef\x2e\xfe\xee\x6b\xab\xd1\x7e\x7e\x62\ \xe1\x00\x00\xe0\xc4\xa5\x19\xac\x88\x18\x63\x89\xcb\x76\x77\x31\ \x73\xa9\x65\xc9\x12\x51\x1b\x5d\xde\x0a\x30\x1d\x21\x5e\xe0\x61\ \x99\x58\x59\xca\xe5\xea\x97\x46\x9b\xde\xd9\xd1\x71\xae\xb8\xa0\ \x0e\x7c\xa0\x53\x57\x72\x30\x4b\x48\x8d\x8c\x90\xf3\x2c\x3f\xd8\ \xd2\xb4\xcc\xa8\x32\x9b\x5a\x09\x11\x1a\xa8\x37\xc3\xaf\xa4\x8a\ \xe6\xf0\x78\x59\xe7\xed\x9f\x36\x13\x7f\x8f\x4f\x2e\x3c\x00\x00\ \xc4\x2d\x1b\xb1\x6c\xf6\xa2\x9d\x08\x0d\x07\xd3\x7d\xeb\xea\xea\ \xb5\x4a\x94\x7d\x06\x9d\x47\x52\x18\xf1\x6e\x9e\xac\x6f\x7d\xe0\ \xaf\xd3\xb1\xe3\xa9\x7f\xc4\x93\xff\x1d\x00\x00\x78\xb4\x65\x05\ \x79\xb9\x3f\x3e\xcc\x33\x91\xc1\xf1\xd1\x81\x2f\x4c\x8e\x4d\x05\ \x03\x13\x8d\x33\xa2\x76\xcd\xc9\x37\xf7\x77\xec\xbd\xe9\xf6\xbb\ \x73\x9d\x87\x5f\xff\xf0\x39\x5e\x68\x3d\x73\x62\x58\xfe\x60\xe3\ \xa7\xc8\xce\x77\x87\x3a\xca\xa2\x8d\xdf\xee\x1d\x3a\x57\xd3\x74\ \xcf\xdd\x6e\xc7\xdf\x0e\x0f\xdc\x77\xef\xa6\xc4\xe9\xb3\xc3\x9f\ \x3c\x88\x16\x52\xdf\xff\xf2\x72\xf8\x2c\x8c\xca\xaf\x6c\xc5\xc0\ \xe0\x65\xe4\x32\x19\xb4\x77\x3c\x83\xff\x0b\x00\xfe\x05\xad\x0c\ \xd1\xf3\x26\x19\x06\x61\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x04\x21\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x12\x00\x00\x00\x12\x08\x03\x00\x00\x00\x61\x10\x7e\x65\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\x00\x00\xfa\ \x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\ \x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x01\xdd\x50\x4c\x54\ \x45\x00\x00\x00\x1c\x15\x03\x55\x44\x16\x0e\x0a\x02\x14\x0e\x00\ \xa0\x80\x23\xf1\xdb\x6e\x78\x5c\x14\x09\x06\x00\x01\x01\x00\x6a\ \x4c\x0d\xec\xd3\x64\xdf\xbd\x4d\x37\x28\x06\x01\x00\x00\x26\x19\ \x00\xc6\xa0\x3b\xa9\x82\x24\x17\x0f\x01\x08\x05\x00\x27\x19\x01\ \x40\x2d\x06\x77\x55\x14\xba\x93\x36\xf2\xd7\x73\xf0\xd2\x6d\xac\ \x86\x2d\x72\x52\x13\x3a\x28\x03\x25\x17\x00\x07\x04\x00\x02\x02\ \x00\x8b\x63\x14\xd0\xa4\x44\xe0\xbb\x5b\xf1\xcd\x69\xf0\xcd\x68\ \xdf\xba\x59\xce\xa1\x40\x6d\x4f\x13\x09\x05\x00\x02\x01\x00\xb0\ \x80\x1f\xf1\xca\x6a\x87\x65\x23\x0a\x06\x00\x36\x22\x02\xca\x98\ \x2d\xb8\x8c\x2f\x27\x19\x03\x00\x00\x00\x44\x2b\x02\xd2\xa2\x2d\ \xbe\x8c\x19\x29\x1a\x01\x03\x02\x00\x6d\x47\x05\xef\xc3\x37\xdf\ \xa6\x04\x41\x2b\x01\x5a\x38\x01\xe7\xad\x05\xd9\xa4\x01\x2c\x1d\ \x00\x5d\x38\x01\xeb\xb3\x01\xda\xa8\x01\x2b\x1c\x00\x5a\x32\x00\ \xf2\xb9\x01\xdb\xbf\x01\xb9\xa0\x00\xdf\xcb\x01\xdc\xab\x01\x2a\ \x1c\x00\x56\x30\x01\xe3\xad\x03\xcb\x99\x01\x8a\x64\x01\x45\x2b\ \x00\x20\x15\x00\x48\x2c\x00\x95\x6f\x01\xd0\xa5\x01\xd2\xa0\x03\ \x2a\x1c\x01\x20\x13\x02\x4a\x30\x04\x2c\x1a\x00\x0c\x06\x00\x01\ \x01\x00\x0e\x08\x00\x31\x1e\x00\x49\x30\x03\x10\x0b\x01\xf8\xf4\ \x8a\xf7\xe6\x80\xf8\xe8\x82\xf7\xe5\x7f\xf7\xe1\x7e\xf7\xe2\x7e\ \xf7\xe2\x7f\xf6\xd8\x75\xf8\xdc\x79\xf8\xdd\x79\xf8\xde\x79\xf6\ \xd8\x74\xf3\xc9\x67\xf7\xd2\x73\xf7\xd5\x72\xf8\xd8\x72\xf8\xda\ \x72\xf8\xdc\x72\xf8\xdb\x72\xf8\xd9\x72\xf7\xd7\x73\xf7\xd5\x73\ \xf6\xcc\x65\xf8\xd3\x6a\xf8\xd7\x6a\xf8\xd9\x6a\xf9\xdb\x6a\xf9\ \xdc\x6a\xf9\xda\x6a\xf8\xd5\x6a\xf7\xd2\x6c\xf8\xd2\x61\xf8\xd7\ \x62\xf9\xda\x62\xf9\xdd\x62\xf9\xdf\x62\xf9\xdd\x64\xf9\xd6\x59\ \xf6\xc8\x42\xf8\xd1\x44\xf9\xd7\x42\xf9\xdc\x40\xfa\xdc\x3b\xfa\ \xd9\x30\xf9\xcf\x17\xf8\xc4\x09\xf8\xc3\x06\xf9\xce\x05\xfa\xd7\ \x02\xfb\xdc\x00\xfa\xdb\x00\xfa\xd5\x00\xf9\xcc\x00\xf8\xc8\x00\ \xfa\xd6\x00\xfb\xe3\x00\xfc\xec\x00\xfc\xea\x00\xfb\xe0\x00\xfa\ \xd4\x00\xf9\xc6\x00\xf7\xd4\x00\xf8\xe0\x00\xfb\xd5\x00\xe6\x7d\ \x8c\x4b\x00\x00\x00\x5f\x74\x52\x4e\x53\x00\x1d\x5a\x0f\x17\xac\ \xfa\x81\x09\x01\x75\xf8\xec\x3d\x01\x2c\xd6\xbb\x1a\x09\x30\x4d\ \x88\xce\xfd\xfd\xc0\x83\x45\x2c\x08\x03\xa2\xe4\xf0\xfd\xfc\xef\ \xe2\x7f\x0b\x03\xcd\xfd\x9c\x0d\x44\xe8\xd5\x32\x01\x57\xf0\xe1\ \x34\x04\x90\xfe\xf8\x54\x79\xfd\xf6\x3a\x83\xfe\xf6\x3c\x89\xfe\ \xfd\xf9\xfe\xf7\x3d\x85\xfb\xed\xb8\x70\x34\x7e\xc5\xf0\xf5\x3c\ \x2e\x68\x40\x12\x02\x17\x48\x66\x16\x76\xa2\xfd\x6c\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\ \x82\xcc\x00\x00\x00\xd4\x49\x44\x41\x54\x18\xd3\x63\x60\xc0\x09\ \x18\x99\x98\xd1\x44\x58\x58\xd9\xd8\x39\x50\x44\x38\xb9\xb8\xe3\ \x79\x78\xf9\x90\x85\xf8\x05\x12\x12\x93\x04\x85\x60\x5c\x61\x11\ \x51\x31\x71\x89\xe4\x94\x54\x49\x29\x69\x19\x59\x39\xa0\x88\xbc\ \x82\xa2\x92\x72\x5a\x7a\x46\x66\x66\x46\x96\x8a\xaa\x9a\xba\x06\ \x03\x83\xa6\x56\x76\x4e\x6e\x5e\x7e\x41\x41\x41\x61\x51\x71\x89\ \xb6\x8e\x2e\x50\x99\x9e\x7e\x69\x59\x79\x45\x65\x55\x55\x75\x45\ \x4d\xad\x81\x21\xc8\x2c\x23\x63\x93\xba\xfa\x86\xc6\xa6\xa6\xe6\ \x96\x56\x53\x33\x88\xad\xe6\x16\x96\x6d\xed\x1d\x9d\x5d\xdd\x3d\ \x56\xd6\x9c\x50\x3b\x6d\x6c\x7b\xfb\xfa\x27\x4c\x9c\x34\xd9\xce\ \x1e\xe6\x0c\x07\xc7\x29\x53\xa7\x4d\x9f\x31\x73\x96\x93\x33\x4c\ \xc8\xc5\x75\xf6\x1c\x37\x77\x8f\xb9\xf3\x3c\xbd\x60\x42\xde\x3e\ \xbe\x7e\xfe\x01\x81\x41\xc1\x21\xa1\x30\xa1\xb0\xf0\x88\x48\x06\ \x86\xa8\xe8\x98\xd8\x38\x06\xa2\x01\x00\xbb\x19\x34\x4e\xf5\x39\ \x32\xd1\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\ \x72\x65\x61\x74\x65\x00\x32\x30\x31\x32\x2d\x30\x34\x2d\x32\x32\ \x54\x31\x31\x3a\x31\x38\x3a\x30\x36\x2b\x30\x39\x3a\x30\x30\x62\ \xc5\xf3\x7e\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\ \x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x32\x2d\x30\x34\x2d\x32\ \x32\x54\x31\x31\x3a\x31\x38\x3a\x30\x36\x2b\x30\x39\x3a\x30\x30\ \x13\x98\x4b\xc2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x0d\x1b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x10\x06\x00\x00\x00\x23\xea\xa6\xb7\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x37\x5c\x00\x00\x37\x5c\ \x01\xcb\xc7\xa4\xb9\x00\x00\x00\x09\x76\x70\x41\x67\x00\x00\x00\ \x20\x00\x00\x00\x20\x00\x87\xfa\x9c\x9d\x00\x00\x00\x06\x62\x4b\ \x47\x44\xff\xff\xff\xff\xff\xff\x09\x58\xf7\xdc\x00\x00\x0c\x78\ \x49\x44\x41\x54\x78\xda\xc5\xd6\x67\x58\x54\x77\x1a\x05\xf0\x77\ \xe6\x82\x08\xae\xd1\x60\x2f\x89\x51\x63\x25\x96\x55\x37\x09\xb1\ \x83\xd8\x88\x0a\x08\x52\x64\x0a\x20\x52\x05\xa4\x28\xc4\x35\xa3\ \x86\x55\xb1\x82\x48\xef\x02\x46\xc1\x00\x71\xac\x31\x46\x89\x22\ \x28\xd6\x48\x04\x6b\xd4\x35\xd6\x95\x95\x18\x14\xc5\xb9\xef\xce\ \xd9\x7b\x35\xcf\x26\xbb\x1f\xf2\xac\xd1\xf3\xfb\x70\x1e\x60\x86\ \x7b\xcf\x7f\xee\x87\xa1\xd7\x95\xb9\xff\x0e\xd1\xc2\xe5\x40\x34\ \xab\x0c\x48\xa9\x9a\xa0\x1a\xac\xb2\x24\x9a\x13\x3c\xc7\x77\x8e\ \xbb\xd2\x35\xf0\x52\xe0\xd5\xc0\x4c\xa2\xe0\x9d\xc1\x25\xc1\x31\ \xe6\x1b\x3c\x33\x3c\x27\xce\x6e\xd6\x64\x7a\xed\xf2\x9a\xee\xd5\ \xf1\x1b\xdf\xc8\x92\xc8\x83\x91\x95\xf5\x4d\xba\xee\xba\x0f\x74\ \xb6\x62\xa7\x75\x55\xeb\x0e\xad\x3b\xd8\xb4\x2a\x6b\x4e\x96\x7f\ \x56\xc0\xc8\xe2\xec\xb8\xec\x55\xd9\xab\x89\xd2\x43\x40\x69\x99\ \x36\x19\x88\x32\x74\x40\xaf\x2f\x73\x7d\x80\xc8\x67\x01\x90\x99\ \x4b\x13\x10\xb9\xb7\x72\x6f\xe9\x6e\xaa\x74\xb5\xb9\x61\x53\x6b\ \x73\x98\x48\x53\xaf\x69\xd0\xfc\xd3\x6e\x90\x77\x3b\x6f\x4b\xef\ \xae\xb5\x83\x17\x0e\x59\xb8\x2f\xfa\x7d\xe6\xd4\xdc\x74\x43\xa6\ \x35\xbf\x97\x59\x9b\x33\x39\x77\x31\x77\x4e\x0a\x4f\xda\x98\x94\ \xc3\xbc\x6d\xe6\xb6\x09\xdb\xc6\x45\x39\xe7\xc5\xe5\xf5\xcf\x53\ \x18\x87\xc6\x66\xf8\x65\xcc\x56\x38\x35\xe7\x00\x99\xef\xb2\x83\ \xd7\x39\x7c\x06\x10\xf9\x0e\x07\x52\xaa\x2b\x81\x68\xb6\x25\x28\ \x03\x66\x14\xcf\xd8\x33\xe3\x34\x91\xfa\xb6\xfa\xa9\xa6\xab\x67\ \x74\xf0\xe3\xe0\x0b\xc1\x9b\x99\x73\x6d\xf3\xba\x6d\x5a\xca\x77\ \x0f\x9e\x3b\xdc\xab\x2a\xd5\x50\xa6\x5f\xb8\x2b\x69\x8f\xa1\xb9\ \x2a\xeb\xad\xac\xe5\x59\xdb\x98\x2b\x76\x55\xc4\x54\xf8\x86\x9e\ \x49\xb6\x4e\x0a\x4b\x6a\x47\x94\x70\x35\x61\x4d\x82\xb7\xe2\x32\ \xc9\xb9\xf2\x0e\x10\xd5\x2e\x06\xea\x9f\xed\x01\xca\x2e\xf4\xaa\ \xe3\xbb\x16\x88\xfc\xca\x81\xc8\x27\x11\x14\xbb\x3c\x32\x80\x48\ \xab\xd6\xaa\xb4\xaa\x21\x43\x03\x3b\x04\x76\x0c\xec\xdc\x98\x54\ \xde\xbd\xbc\x73\x79\x3b\xe6\x13\x25\x27\x2a\x4e\x5c\x36\x0c\x2d\ \xed\x5e\x36\x6f\x7b\x0a\x4f\x4a\x1b\x9b\x16\x95\xf6\x88\x79\xbf\ \xff\x7e\xd3\xaf\x3f\x0f\x9b\x16\xd7\x7b\x65\xaf\x15\x7d\x89\xd6\ \xd7\xad\x4f\x58\xaf\x16\xbe\x65\x46\xa8\x6f\xd3\xc1\xa6\xea\xa6\ \x33\x44\xf2\xcf\x03\xf5\x7b\xf5\x5b\xf4\xb9\x8a\x7f\xb8\xbe\xef\ \xda\xc9\xb5\x25\x39\xd2\xab\x8e\x5f\x1e\x10\x6d\xf8\x04\x48\x70\ \xec\x03\x8a\xed\xef\x9d\x04\x22\xf7\x4b\x50\x7a\xac\xa4\x9b\x51\ \x57\xe6\x7b\x15\xf7\x8e\xdc\xab\x7a\xf6\x6d\xf5\xca\xea\x65\xd5\ \x8b\xc4\x59\x19\x47\x32\x36\x65\x78\x33\x17\x8c\x29\x18\x58\xa0\ \x88\x16\x16\x58\x45\x55\x44\x39\x11\xa5\xaf\x49\x77\x4f\xef\x25\ \x34\xca\x43\x3b\xc9\x4d\x72\xdb\xe9\x37\xe9\x57\xeb\x75\x8a\x98\ \xfa\xeb\xf5\x3f\xd4\x5f\x56\x86\xe6\xfa\xc2\x68\xfd\xab\x7f\x02\ \xca\x81\x48\x5b\x05\x8a\xf5\x0e\x03\x81\xc8\xb9\x11\x7a\xaf\x0d\ \x0f\x81\xc7\x36\xf7\xc3\x81\xb9\xa1\x1b\x88\xfb\x6a\x26\xd7\x4c\ \xa9\xb1\x67\x4e\xe8\x9d\x60\x95\x60\xdd\xa0\x4a\x6c\x9f\xd8\x37\ \x71\x6c\x47\x31\x34\x21\xf4\x60\xe8\x23\xa2\xfc\xf2\xfc\x9a\xfc\ \x7b\x8a\xe1\x35\x1e\x35\x11\x35\x6b\x5f\x0c\x7f\x27\x45\x9f\x92\ \x90\xb2\x48\xf8\x26\x3a\x3f\x3a\x2c\xda\x95\x48\xbf\xcf\xf8\x04\ \x64\x2f\xe8\x19\xef\x12\xef\x18\x3f\xe3\xe7\x03\xf4\xaa\x13\x78\ \x1d\x88\xbc\x4b\x40\x59\xef\x60\x01\x44\x2e\xb5\xe0\x98\x97\x38\ \x08\x58\x8e\x61\x45\x53\x2a\xf0\xd9\x7b\x61\xc0\x4f\x13\xff\x66\ \x14\xcb\xec\x17\xe2\x37\xcf\x2f\x68\xf8\x58\xcf\x34\xcf\x54\xcf\ \x64\xa2\xc8\x77\x8c\x7a\x98\x8c\xcf\x1b\x95\x37\x35\xcf\x89\x9a\ \xd2\x34\x69\x7d\xd3\xcc\x85\x07\x99\xbb\x32\x38\xa3\x90\xe8\x94\ \xfe\xd4\xfc\x53\x2e\x61\xb7\x52\x63\x53\xb3\x52\x8b\x98\x75\xdf\ \xe9\xee\xea\x1a\x9f\x3e\xa4\x57\x9d\x85\x7d\x81\x28\xb4\x2d\x08\ \x36\xea\x3e\x40\x34\xc7\x15\xbc\xba\x16\x98\x02\xf3\xe3\x2d\xf0\ \xec\xee\xe3\x6a\x60\x16\x19\x0c\x2b\x0f\xef\x00\xe6\x48\x1d\x6c\ \x73\xfe\xd5\xa3\x5e\xb4\xa1\x70\xc3\xa0\x84\x3d\x8a\x2b\x85\xfd\ \x0a\xfa\xe7\x7b\x13\x95\xef\x28\x77\x3c\xf8\x64\x7e\x49\xce\xca\ \x9c\xa6\xdc\xb7\x98\x33\x13\xb3\x9f\xe6\x0e\x64\x8e\xfe\x39\x86\ \x62\x5a\xfc\xc3\x8f\x5e\x55\x1c\x0c\x40\xb4\xa2\x02\x88\x96\x18\ \x40\xf9\xe5\xfc\x50\x20\x8a\x38\x06\xf6\x4e\x85\xa5\xc0\x7c\x7b\ \x3a\x18\xae\xfc\x18\x0b\xcc\xcd\x4b\x81\xd9\xe0\x0c\x62\x4a\xe5\ \x75\x60\xfe\xa4\x0b\x94\x9a\x05\xbd\x17\x64\x15\x34\x60\xf0\xa5\ \xa5\x0d\xcb\xfa\x2d\x0b\x79\x23\xa8\xe0\x48\xc1\xce\x82\x0d\x31\ \xf7\xd2\xe2\xd3\x8e\xa7\xdb\x32\x6f\x37\xec\xea\xbc\xe7\xb3\xe6\ \x5d\x19\x16\x59\x1e\xd9\xe9\xcc\x7e\xe1\x7e\x16\x73\x4f\xef\x2b\ \xa3\x3f\x3a\x8e\x25\x40\x64\xa3\x03\x52\xf8\x77\x00\xa2\x85\x27\ \x41\xe1\xa0\x36\x00\x51\xf8\x24\xe8\x5c\x9a\x3a\x13\x1e\xe8\xae\ \xd9\x03\xf3\x99\x64\xe0\xde\x77\x1c\x81\xf9\xe9\xb7\xc0\x72\xc4\ \x05\xc7\x1a\x81\x39\xe1\xa1\xd1\x4f\xcd\x35\xf1\xe7\xe2\x7f\x88\ \xbf\xff\xd3\x5b\x19\x43\x33\xcc\xd3\x2b\xb9\xa6\xf4\xe3\xb2\xcf\ \xb7\x9f\x10\xbd\xca\x37\x1c\xbe\x71\x54\x6b\x48\xf9\xe4\xe4\x22\ \xef\x45\xf7\x98\x55\xf3\x54\x9d\x3d\x8f\x79\x8f\xfa\xe3\x86\xdf\ \x05\xa2\x51\x83\x80\x14\x1d\x1c\x81\x9e\xe7\xcd\xa2\x70\x10\x52\ \xbf\x0b\x00\xa2\xd8\x93\x30\x7f\x77\x49\x13\x30\x1f\xef\x03\x3c\ \xf1\x52\x0f\xe0\xef\x8f\xae\x04\xe6\x3b\xc5\xc0\x86\xe7\x07\x21\ \x3a\x81\x21\xe0\x5e\xa1\x51\x81\x78\xbd\xc6\xa2\xa6\x55\x4d\x6b\ \xe6\xe3\xf3\x8f\xcf\x3b\x3e\x57\xb4\x3f\xb1\xf6\x44\xde\x89\xdd\ \x86\x0f\xb2\xde\xcd\x6e\x9d\xb3\x8a\xd9\x4b\xe9\x65\xee\xd5\xf9\ \xec\xe0\x08\xa7\x88\x7e\xe1\x27\x2d\x4c\xe8\x65\xc7\x69\x14\x10\ \x8d\x18\x09\xa4\xa0\xff\x8c\x69\xa1\x05\x08\xbb\x77\xce\x00\xa2\ \x4f\x37\x43\xe8\xe2\x03\xb9\xc0\x5c\x99\x0a\xdc\xa5\xa6\x2d\xf0\ \x85\xc6\x1f\x81\xf9\x82\x1a\xf8\xab\x53\x75\xc0\xfd\x6f\x7a\x01\ \x73\xd3\x5e\x30\x76\x19\x70\x65\x83\x7b\x83\x5b\x83\x9b\x78\xea\ \xce\xf9\x3b\x17\xee\x5c\x34\x98\xee\x1e\xb7\x7b\xf4\x6e\x6b\xd1\ \xd9\xbf\xd8\x7f\xbd\xbf\x27\xb3\xd6\xd5\x68\xa6\x7d\x99\x87\x89\ \x3b\xbb\xff\xfc\x32\x87\xcf\x03\xa2\x7e\x8e\xf0\xcb\x70\x66\x84\ \xa8\xc0\x01\x84\x8a\xd2\xbf\x82\x71\xf8\x3c\x08\x0a\x3b\x24\x00\ \xf3\x4e\x11\x0c\x9e\x5b\xa7\x00\x47\xdc\x3f\x03\xcc\x77\x83\x81\ \xb3\xce\xe6\x83\xd8\xa2\xae\x04\x98\xaf\x6d\x06\xc3\xb9\x87\x4a\ \x78\x96\xcb\x8c\x18\x9c\xea\x8f\x00\x5b\x6d\xa9\x33\xaa\x65\xf6\ \xbd\xe1\xfb\xa3\xef\xad\xa7\x82\xc6\x44\xd3\x51\x33\x42\x5b\x35\ \x75\xd2\xd4\x61\x53\xbb\x11\xb9\x69\xdd\x9c\xdc\x6c\x94\x1e\xf4\ \xff\x66\xa6\x16\x88\xda\x77\x80\xff\x32\x7c\x30\x08\x27\xb7\x85\ \x01\x91\x6e\x35\xf8\xc5\x1c\x72\x00\xe3\x70\x3d\x18\xe2\x8b\xe6\ \x02\xcf\xbe\x56\x08\xcc\x8f\xeb\x80\xb5\xa7\x2f\x01\xf7\x8f\xbb\ \x0c\x4f\x8b\x52\xff\x9d\x07\xa7\x36\x89\xc0\x9c\x3f\x0b\xf8\xd3\ \xe4\x28\x60\x5e\x60\x03\xcd\x2b\x3c\x6e\xc0\xee\x07\xea\xbd\xea\ \x3d\xea\x3d\x43\x3b\x7d\x6c\x66\xd4\x92\xc8\xd3\xcc\xa8\x85\x32\ \xc2\x3d\xd9\x3d\xc9\x3d\xe9\xff\x19\x7e\x07\xe8\x45\x7e\x3d\x3c\ \x7f\x35\x08\x67\xb7\xae\x03\xa2\x25\x67\xc0\x27\xfe\x50\x32\x18\ \x87\x2f\x07\x43\x45\x51\x30\xf0\xa4\x6b\x47\x80\xb9\xe9\x3d\xe0\ \xa0\xf3\x7f\x01\x83\xd9\x92\x77\x81\xd9\x69\x34\x44\x3d\xde\xe8\ \x0c\x6d\x3a\x46\x9e\x80\x69\x9b\x03\x7b\x82\xef\x9b\x2a\x1f\x98\ \xf5\x85\xeb\xfb\xd0\xa7\x0d\xc9\x99\xf0\x26\x50\x80\xf7\x2a\x50\ \x5a\x2f\xeb\x00\xd4\x62\xa1\x2f\xd0\xef\x8f\x76\x24\xfc\x66\xb0\ \x42\x6e\xda\x3c\x00\x84\xda\xcd\xd5\x40\xb4\xac\x3b\x68\x72\x0e\ \xdd\x04\xe3\x70\x47\x30\x88\x45\x9f\x01\x0f\xbb\x76\x14\x8c\xc3\ \x47\x01\xbb\xd6\x1d\x03\xc3\x87\x3a\x35\x30\x3b\xdc\x82\x88\x28\ \xb7\x6a\x20\x0a\x74\x01\xc5\x86\xe7\xd7\x9b\x74\x03\x88\x34\x23\ \x80\x5a\x69\xfa\x03\xd1\xec\xa9\xa0\x54\x7a\xd9\x83\xb2\x93\x2a\ \x11\x88\x54\x6a\x20\x33\x87\xad\xf0\x7b\x86\x47\xc2\x6f\x86\x2b\ \x9f\x79\x82\x71\xf8\x18\x10\x6a\x0b\x6e\x02\xd1\x67\x6a\x98\xbd\ \xe7\xf0\x60\x60\xcb\x9d\x6f\x83\x38\xaa\x68\x3d\x70\xf7\x6b\xc7\ \xc0\x38\x5c\x03\x3c\xbe\xae\x00\x0c\x41\xba\x68\x60\x76\x7c\x07\ \x42\x07\xb8\x3c\x04\x22\x4d\x28\x08\xc9\x4b\x77\x80\xe2\xa3\xa5\ \x2d\x40\x59\x19\xde\x00\x82\xbb\x7f\x1d\x08\x96\x3e\x6d\x41\x51\ \xa8\x8a\x00\xea\xec\x1e\x00\x44\x9a\x00\x20\x85\x56\x07\xbf\x63\ \xb8\xd7\x7c\xf8\xcd\x70\xe1\x56\x17\x30\x0e\x77\x02\xa1\xa6\x70\ \x39\x10\xc5\x6d\x03\xb7\x37\x0f\x7f\x0f\x86\xcb\x3b\xae\x83\xb8\ \xa8\x28\x1f\xd8\xf4\x5a\x15\x18\x87\x47\x00\x5b\xd5\x85\x83\x21\ \x5f\x97\x08\xc6\xe1\xe6\x10\x78\xd1\x25\x06\x88\x34\xd1\x20\xec\ \xed\xf0\x16\x50\xcf\x31\xdf\x01\x91\x5d\x33\x90\x72\x8a\x27\xd0\ \xcb\x8f\xf7\x60\x78\x31\x98\x1e\x5f\x00\x32\x39\xd7\x0c\x44\x85\ \xdf\x81\x70\xf2\xf3\x28\x20\x5a\x3b\x1d\x9c\xb5\x15\xa5\xf0\xac\ \x54\xbf\x10\xc4\x7d\x45\xb9\x20\xd6\x5f\xab\x03\xe3\xf0\xd5\xc0\ \xed\xeb\xec\xc1\x70\x51\xb7\x03\x98\x1d\x9a\x60\x6e\x92\xf3\x12\ \x20\xd2\x44\x80\x70\x94\xa4\xb4\xff\xd0\x1b\x88\x6c\xee\x00\x29\ \x27\x77\x07\x7a\xf9\xd1\x2c\x81\x5f\x86\x5f\xb4\x04\x32\x3d\xea\ \x00\x44\x9b\xea\x41\xa8\x2a\xa8\x06\xe3\xf0\x43\xe0\xf0\xc5\xa1\ \x0c\x68\xb6\x2f\x2b\x04\x16\xb6\xe4\x83\x78\xee\x6a\x30\x18\x87\ \x07\x83\xf8\xac\xce\x1c\xc4\xee\xba\xab\xc0\xe7\x1d\xce\x81\xb7\ \xb7\xf3\x5c\x20\xd2\x38\x81\x70\x86\xa4\x98\xff\x39\x13\x88\xc6\ \xc5\x01\x29\x26\x35\x03\xbd\xfc\xb8\xfd\x05\x88\x1a\xcf\x02\x51\ \xc5\x25\xa0\x16\xfb\xb5\x40\x94\xad\x03\xe1\x40\x5e\x3e\x10\xad\ \x89\x84\x69\x3d\x0f\xdc\x83\x27\x97\xbf\x50\x02\x4f\xdd\x9c\x0e\ \xe2\x37\x57\x46\x03\xf3\x23\x1f\x10\xff\x5e\x37\x1c\x44\xed\x12\ \x15\x88\x39\x0e\x09\xa0\xb6\x9a\x39\x16\x88\x34\xbe\x20\xd4\x3d\ \x3f\xf8\x9e\x77\x80\x68\xa4\x25\x90\xc2\xee\x34\xd0\xcb\x8f\x4b\ \x15\x10\x1d\x9f\x0b\x44\xfa\xde\x40\x2d\xca\xbe\x06\xa2\x54\x37\ \x10\xf4\x99\xeb\x80\x28\xce\x17\xa6\xc4\x7e\x55\x0c\x4d\xea\x2d\ \xd1\xc0\xc9\xf9\xc7\x40\x2c\xbc\xa8\x05\xe6\x9f\xdb\x83\x58\x5d\ \x3b\x1d\xc4\x9c\x15\x1e\x60\x08\x77\xd1\x81\x47\x17\x4f\x11\x88\ \xe6\x98\x83\x70\xe5\xf9\x70\xe5\x20\x20\x1a\x7e\x03\x48\x31\x61\ \x17\xd0\x1f\x97\x6d\xb1\x40\x94\x3b\x08\xc8\x6c\x53\x08\x10\xc5\ \x8f\x03\xa1\x30\x29\x05\x88\x62\xcf\x83\xdd\x13\xfd\x97\xf0\xe8\ \x9b\x4d\x95\xc0\xb7\x72\x87\x80\xb8\xa6\xb6\x04\x98\x1b\x5a\x82\ \xf8\x65\x4d\x25\x88\x77\x57\x76\x84\x67\x26\xaa\x2d\x30\xeb\x43\ \xad\x03\x10\xf9\x0e\x03\xe1\xe2\xb7\xf9\x40\x2f\x62\xb5\x03\x8c\ \xc3\x83\x80\xfe\xf8\x24\xe8\x81\x5a\x26\x5d\x05\xa2\x95\xbd\x41\ \xc8\x58\xf3\x08\x88\x3e\x9d\x05\x36\xd9\xc5\x56\xd0\xd8\x26\xf3\ \x5d\x60\xce\xa8\x00\x31\xfc\x6c\x7b\x60\xbe\x3f\x0e\xc4\xe4\x33\ \xf6\xc0\xd6\xcb\xef\xc2\xd3\x55\xea\x33\xe0\x34\x4a\xeb\x09\xc6\ \xe1\xb9\x20\xd4\xc9\xdf\x13\x5e\xa4\x8b\x13\x10\x8d\xd7\x00\xbd\ \xba\x2c\xf5\x00\xa2\x98\x14\x10\xf2\x96\x5e\x02\xa2\xc8\xa5\x30\ \xd6\x26\xf7\x00\x3c\x0c\xde\x18\x08\xcc\xc9\x5b\x41\x74\x3b\x51\ \x0a\xcc\xb7\xf5\x20\xfe\xf5\xf8\x3e\xe0\xd8\xd8\x1e\xf0\xc4\x42\ \x1d\x00\xd3\x55\xea\x37\x80\x28\xf0\x32\x08\xdf\x27\x99\xc0\x2f\ \x5f\xa0\xfe\x74\x1b\x88\xa6\x4d\x01\x7a\xf5\x09\x6b\x0f\xc2\xda\ \x05\xfb\x80\x68\xfe\x40\x18\xe9\x94\x62\x80\x07\x37\xd7\x14\x01\ \x73\xfc\x7c\x10\x47\x57\xaa\x80\xf9\xef\x51\x20\x6a\x2b\xad\x81\ \xcf\xeb\xb6\xc2\xe3\xe9\x9e\xa3\x61\xea\x67\xb3\x5b\x01\x51\x40\ \x3d\x08\xd5\x2b\xdb\x00\xd1\x11\x3b\x20\x25\xc9\x71\x58\x04\xf4\ \xfa\xe2\x3b\x12\x88\x7c\x3e\x05\x1b\xdb\xc5\x91\xd0\xf8\x43\x62\ \x57\x60\x5e\xb7\x00\xc4\x23\x07\x6d\x81\xf9\xf2\x01\x10\x9d\x0e\ \xfe\x0d\x98\x63\xf4\xd0\x18\xe7\xb6\x15\x26\x96\xcc\x6a\x05\x44\ \xfe\x7f\x06\x61\xef\xe2\x1b\x40\x94\x63\x01\x64\xc2\x8c\x10\xcd\ \xbc\x0c\xf4\xfa\xa3\x76\x87\x31\xa7\x82\xad\x61\x4b\x91\x97\x0f\ \x58\xc7\x6b\x7c\xc1\x6e\x49\xf1\x57\x70\x51\x7d\xf6\x11\x30\xef\ \xfe\x09\x78\x62\x78\x2f\x78\xf8\xc4\xe9\x01\xd8\xce\x98\x11\x01\ \x44\x1e\xdb\xc1\xc4\x92\xa4\x74\x30\xdd\x0c\x14\x45\x52\xc2\xe4\ \x0e\x95\x7b\x9e\xdc\xfe\x72\xfb\xc8\xed\x29\xb7\x8b\xdc\x1f\xcb\ \x6d\x2b\xb7\xb5\xdc\x43\xe5\xee\x23\x77\x77\xb9\xdb\xc9\xdd\x4a\ \x6e\x53\xb9\x15\xf4\xeb\xa8\xa2\xa1\xdc\xcd\xc5\x1b\xfa\x86\x0c\ \x56\x03\x51\xf1\x15\x20\xda\xd4\x03\x26\x7f\xb8\xd1\x1a\x98\x03\ \x0e\xc1\x3f\x57\x7f\xfc\x35\x8c\xd1\x4f\x6c\x02\xa2\x05\x71\xa0\ \xdc\xb2\xcc\x14\x88\xca\xb6\x03\x99\x6e\xdd\x04\x44\xdc\x0d\xe8\ \x75\x45\xf1\xab\x03\x69\xfd\xe2\x60\x34\x8b\xe0\xd2\x34\xcb\xfd\ \xd0\xfa\x00\xc9\x09\xab\x05\xa2\xe0\x64\x18\x69\xae\x0a\x83\x46\ \xad\xad\x06\x46\x3b\x39\x37\x00\x51\xcf\x81\x60\x6e\x9c\x88\x98\ \xb5\xa6\x59\xd0\xb2\x8e\x08\x31\xbf\x2d\xb5\x45\xa9\x7c\xfd\x3e\ \x72\x8f\x91\x7b\x80\xfc\xf7\x63\x72\x8f\x90\xdf\x17\x22\x75\xcb\ \x45\xf2\xff\x8d\x91\xba\x85\x46\xbe\xef\x51\x52\x9b\x74\x91\x5a\ \xc9\x72\x2b\xe5\xbd\xef\x92\x94\xf9\x72\x9b\xd1\xff\xca\xbc\x75\ \x70\xda\x2d\x6c\x33\x6c\x0c\x1b\x11\x07\xed\xda\x0e\xd9\x01\x23\ \x1a\xec\x52\x60\x7b\x88\x55\x1d\xcc\x95\x6f\x68\xa0\x9f\x89\x3d\ \xd8\x5d\x20\x42\x26\x99\x91\x05\x4c\xb9\x48\x84\x4c\x91\x07\x4d\ \x2e\x96\x7a\xa2\x7c\xb0\x13\x3e\x92\x7a\xbc\xa3\xd4\x63\xfa\x49\ \xfd\x51\x8d\xd4\x1f\x8c\x96\x7a\x78\x82\xd4\x43\x0e\x4a\x6d\xf5\ \xa3\xd4\xfd\xee\x4b\xdd\xfb\xa6\xd4\x3d\x6a\xa5\xee\xb6\x5f\xea\ \x4e\xeb\xa4\x6e\xa7\x95\xba\xcd\x10\xf9\xa0\xbb\xca\xe7\x30\x58\ \x6a\x61\x21\x49\x39\x4a\xfe\xe3\xa0\x7f\xba\xff\x11\xa8\x19\x3b\ \xf3\x26\xdc\xd6\x8c\x7a\x1b\xaa\x8a\x87\xcd\x81\x89\x01\xf2\x27\ \xd3\x64\xa6\x87\x5e\xc3\x88\x90\x5e\x2a\xea\x00\xfd\xde\x20\x42\ \x06\xc4\xcb\x07\xf4\x40\xbe\xf1\x10\xb9\x6d\xe5\xdf\x6f\x94\x5f\ \x17\x20\x0f\x92\x87\xf7\xf9\x41\x1e\x56\x2a\x75\x4f\x6b\xa9\xdf\ \x4e\x92\x07\x9e\x91\xba\xf3\x1d\xa9\x3b\xfc\x24\xb5\x25\x1a\x43\ \x1b\xff\xf3\xc9\xb6\xe8\x2b\x0f\xfe\x44\x6a\xd3\xb6\x52\x2b\x9f\ \x48\xad\x98\x40\x52\xc6\xff\x0b\xf5\xf3\x60\xd2\xba\x20\xca\x44\ \x00\x00\x00\x22\x7a\x54\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x00\x78\xda\x2b\x2f\x2f\xd7\xcb\xcc\xcb\x2e\x4e\x4e\x2c\x48\ \xd5\xcb\x2f\x4a\x07\x00\x36\xd8\x06\x58\x10\x53\xca\x5c\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x08\x4a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x7f\x00\x80\x00\x81\xf9\x4b\ \x64\x57\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x11\x00\x00\ \x0b\x11\x01\x7f\x64\x5f\x91\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd3\x0a\x0c\x0a\x38\x10\x5f\xa7\x4a\x71\x00\x00\x07\xd7\x49\x44\ \x41\x54\x78\x9c\xed\x97\x5d\x8c\x64\x45\x15\xc7\xff\xa7\xea\xde\ \xdb\xf7\xf6\xed\xee\xe9\x99\x9d\x19\xe6\x83\x61\x67\x17\x58\x09\ \x11\x15\x14\x10\x43\x84\x88\x06\x12\x50\xa3\x32\x9a\x28\x24\x4a\ \x0c\x24\xa8\x2f\x26\x8a\x18\x91\x90\xf8\x22\x89\xc4\x07\xd4\x84\ \xa8\xd1\x07\x04\x9c\x20\xd9\x75\x41\x42\x56\xa4\x13\x13\x45\x98\ \x9d\x5d\x58\xf6\x7b\x60\x67\x77\xbe\x7b\xba\x67\x7a\xba\xfb\x7e\ \xd5\xc7\xf1\x61\x66\x07\x66\x67\x88\x80\xbc\xe9\x49\x2a\xb7\x1e\ \xaa\xee\xf9\xd5\xbf\x4e\xd5\x39\x05\xfc\xdf\xfe\xd7\x8d\xde\xcd\ \xe0\x9f\xfc\xea\xf1\x2b\xf3\xb9\xe0\x06\xc7\x73\xae\x96\x42\x0c\ \x03\xc8\x03\x88\x2c\xf8\xb4\xce\xcc\xbf\x92\x34\xd9\x77\xef\x5d\ \x23\x2f\xbe\xef\x00\x0f\xfe\xe6\xa9\xeb\x0a\x41\xee\x9e\x9c\xe7\ \x5e\xe3\xb9\x9e\x2f\xa5\x70\x40\x44\x00\x03\x00\x98\x01\x6d\x8c\ \xd1\x4a\xa7\x71\x9a\xbd\xd8\x6c\x45\x3f\xbd\xf7\xae\x5b\xf7\xbd\ \x2f\x00\x3f\xff\xfd\x9e\x1f\x85\x79\xff\x7b\x7e\xce\x2b\x48\x21\ \xe8\xad\x53\xd8\xda\xd5\xef\xd9\xc6\x0c\x6b\x2d\xa7\x59\x96\xb5\ \xdb\xf1\xcf\xbe\x7b\xc7\x17\xee\xc3\x59\xca\xf7\x02\xf0\xd0\xef\ \x76\x3f\x5c\x0c\x83\x6f\x38\x52\xfa\x6c\x2d\x19\x66\xb2\x96\xdf\ \x74\xcc\x0c\x5e\xfb\x3d\xaf\xf9\x21\x22\x26\x22\x36\xc6\xe8\x28\ \x4a\x1e\xfb\xfe\x9d\x4f\xdc\x01\x8c\xda\x77\x0d\xf0\xe0\xaf\x9f\ \xbc\x2f\xcc\x07\x3f\x20\xc0\x57\xda\x90\x36\x9a\x8c\xb1\xd0\xda\ \xc0\xda\xd5\x35\xdb\x75\xe7\xab\x26\x00\x08\x41\x10\x42\xb0\x23\ \x05\x5b\x66\x9b\xa4\xd9\x43\xcf\x57\x8f\xfd\xb0\xf2\xc0\x03\xe6\ \x1d\x03\xfc\xf8\xe1\xc7\xae\xcd\xe7\xdc\xbf\x80\x29\x50\x5a\x89\ \x34\xd3\x94\x69\x83\x54\x19\x28\x65\x61\xac\x5d\x5b\x3d\xaf\x7b\ \x27\x22\x08\x49\x90\x52\xc2\x11\x02\xae\x23\xd8\x91\x02\x00\xd2\ \x24\x51\x5f\x1e\x7f\x6e\xf2\x99\x4a\x65\x33\x84\xb3\x15\x40\x96\ \x66\xf7\x68\x63\xf3\xb5\x85\x05\x0a\xcf\xd7\x84\x1c\x80\x1c\x20\ \xb1\xda\x8e\x2f\x2f\xbc\x9d\x70\x08\x85\x8f\xa2\x09\x00\x0d\x7a\ \x63\x62\x1a\x17\x0f\x7e\x24\x07\xc6\xbd\x1f\xb8\xbe\xf8\x42\xa5\ \x77\xa4\x8d\xd1\x8d\xdb\xb1\x49\x81\x6f\xde\xf7\x8b\x2b\x3c\xd7\ \xfb\xab\x65\xee\x48\x33\x4d\x2b\x4b\x8b\xd8\x7e\x59\x80\xaf\x7e\ \xee\x66\xf4\x95\x8b\xa8\x66\x0b\xa8\x66\x0b\x68\xaa\x36\x5a\x69\ \x82\x24\xc9\xd0\x48\x52\x2c\x67\x19\x5c\x84\x28\xb5\x03\x54\x4f\ \x34\xf0\xd2\x81\xd7\xd0\x15\xec\x80\xe3\x3a\x2c\x84\x48\x05\xe1\ \xb6\xc6\x42\xfc\xf4\x9e\xdf\xde\x93\xe2\x2d\x81\x29\xcf\x05\xd8\ \xf5\xb1\xcf\xdc\x6e\x2c\xdf\x98\x69\x2d\x33\xa5\x09\xc2\xc1\xf4\ \xeb\x4b\x98\x6b\x9d\xc1\xce\xe1\xed\xe8\x2b\x74\x83\x41\xc8\x8c\ \x46\x62\x52\x48\x2b\x91\x17\x21\xf2\x5e\x80\xa0\x21\x31\x7d\x6c\ \x11\x63\x07\x8f\x22\x2f\x06\x60\x99\x61\x8c\x21\xa5\x35\x69\x65\ \x32\xd7\x11\x95\xc0\xec\x48\x66\x67\xc7\xd6\x01\xc4\x39\xfe\xa9\ \x15\xb7\x6f\x88\x92\xc4\x31\x66\x6d\x8f\x09\x08\x4b\x9d\x38\xfa\ \xd2\x32\x1e\xdd\xfd\x34\x4e\xd7\xea\xe8\xf1\x7a\xd0\xed\xf6\xa0\ \x2c\xca\xe8\x70\xba\xe0\x4b\x1f\xb2\x0d\x9c\x78\x65\x16\xfb\x0f\ \x9e\x40\x5e\x0e\x02\x44\x67\x8f\x25\xb4\xd2\xa2\x1d\x45\x57\x5a\ \xc7\x76\x62\x27\xbc\xb7\x2a\xbf\x51\x81\x91\x11\x71\x69\x61\xf0\ \xdb\x52\xca\xc1\xb5\xc9\x64\xad\x85\xb5\x16\xd2\xf1\x30\x75\xb2\ \x8e\xc5\x78\x06\x17\x5c\x70\x3e\x06\x8a\xdd\x60\x23\x91\x93\x3e\ \x92\x46\x82\xf1\x97\x27\xf0\xea\xa1\x53\xc8\x71\x2f\xd8\x5a\xf0\ \xda\x71\x3d\xab\x02\x03\xc4\x96\xf7\xc0\x88\xc6\x64\x97\x93\x61\ \x72\x92\x37\x29\x70\xd1\x78\x53\x18\x63\x5c\x66\x06\x09\x42\xdc\ \x5e\xc1\xf6\x4b\x08\x3b\x2e\x15\xd8\xf9\x41\x89\xcb\x3e\xd1\x8d\ \xe6\x72\x03\x4f\xfc\xf9\x59\x9c\xaa\x55\xd1\x17\x9e\x07\x47\x49\ \x3c\x5f\x19\xc7\xc1\x03\xa7\x10\x0c\xe7\x51\xbc\x50\x63\x60\xd8\ \xc5\xc0\xb0\x83\x84\xe6\x21\x88\x40\x44\x60\x6b\x3d\x65\xed\x36\ \x6d\xb2\xe0\xa2\xe9\x60\x5d\x81\x0d\xa7\xa0\xdd\xe1\x08\x29\x25\ \x39\x8e\x03\x22\x41\x85\x52\x17\x8e\xef\xaf\x63\xd7\x15\xc5\x0d\ \x41\x78\x64\xf2\x30\xfe\xf4\xcc\x3e\xdc\xf2\xe9\xeb\x70\x70\xff\ \x71\x1c\x3d\x3a\x83\xab\xbf\xbe\x6b\x53\x10\x86\xce\x20\x04\x11\ \x60\x08\x96\xad\xd5\x99\x2a\x29\x4b\x7e\xbb\xc3\x11\x5b\x02\xf4\ \x74\x95\x49\x4a\xa7\x26\xa5\x03\x41\x80\x65\x46\xb1\xa3\x0b\x27\ \xf6\xd7\xf1\x07\x3c\x8d\xaf\x7d\xfe\x66\xf4\x97\xfb\x80\xed\x02\ \x5d\xbd\xbd\xd8\xbb\xbb\x02\x00\xb8\xed\x3b\x9f\x44\xcc\x06\xa6\ \x6a\x71\xfa\x78\x15\xfb\x0f\x9e\x40\xd1\x1d\x5a\xbd\x1b\x88\x00\ \x10\x83\xd1\xcc\x32\xed\x93\x11\xae\x8e\x83\x75\x80\x0d\x31\xb0\ \x6d\xe8\x5a\xb7\x50\xce\x5d\xec\x08\x71\x4d\x3e\xf0\x45\xce\x73\ \xe1\xb9\x0e\xc2\x42\x01\x8b\x67\xda\x38\x55\x9f\xc0\xf9\x43\x83\ \xe8\x2f\x6c\x83\xb5\x40\xcf\xf6\x10\x43\xc3\xbd\x00\x08\xaa\xa9\ \x70\x74\x6c\x06\xaf\x1c\x7a\x1d\x7d\x1d\xbb\xe0\x3a\xab\x73\x85\ \x90\x30\x46\x73\x92\xc4\xc7\x99\xf9\x80\xd6\xfa\x34\x94\x5d\xae\ \x9d\x19\x37\x9b\x14\x70\xbc\x15\xd6\xba\xe7\x1f\x20\xa4\xbe\xe7\ \x38\x81\xef\x82\x88\x60\x19\x28\x86\x3e\x1a\xa7\xea\xf8\xe3\xde\ \x67\xf1\x95\xcf\xde\x84\xc1\x72\x2f\x58\x0b\xa4\x8e\xc2\xfc\x42\ \x15\xc7\xc6\xa7\xf1\xda\x91\x53\xb8\xb8\xff\xc3\x60\x30\x98\x09\ \x00\x23\x49\x15\xb2\x54\x18\x40\xbc\x21\x08\x46\x08\x87\xa5\xdb\ \x04\xd6\xee\x82\x0d\x41\x58\x6f\x26\x9c\x42\xbd\x2a\x09\x47\x7c\ \xdf\xe5\xee\x72\x01\xbd\xdb\x4a\xe8\x2e\x17\xb0\xad\x23\xc4\xd0\ \x50\x3f\xf4\xbc\xff\xb6\x41\x78\xf9\x85\x57\x21\xcc\x7b\x28\x04\ \x39\x84\x81\x8b\x20\xe7\x42\x0a\xc0\xc2\x2e\x48\xcf\x9d\x24\x21\ \x13\x30\xab\xa5\x56\xbc\x7e\x1b\x6e\x50\xa0\xb4\x42\x56\xa4\x22\ \x4e\xb5\x7e\x9c\x80\xcb\x3a\xcb\x25\xaf\x98\xcf\x11\x33\x41\x1b\ \x0d\xad\x0d\xfa\xba\x3b\xb1\xb8\x30\xbf\x29\x08\x6f\xba\xea\x06\ \x18\xb3\x9a\x27\xac\x65\x64\x4a\x23\x4e\x32\x58\xb6\x9a\x99\xc6\ \x1d\x21\x23\x03\xb5\x02\x81\x24\x6c\xe8\xad\x01\x0e\x1f\x86\x2d\ \x7f\x68\x29\xd1\x59\xf0\xf7\xe5\x66\xf4\x9c\xd2\xf6\xc6\xce\x8e\ \x92\x1b\xf8\x1e\x11\x11\x8c\x31\x50\xca\x60\xa8\xbf\x17\xcc\x8c\ \xbd\xfb\xfe\x06\x00\xb8\xfb\x4b\xb7\x41\x19\x03\xad\x0d\x94\xd2\ \x48\x33\x85\x56\x14\x71\x3b\x4a\xad\xd1\xe6\x55\xdf\x73\xdf\x48\ \xb3\xac\x41\x24\x6b\x2a\x8d\xe3\x93\x83\x31\xe3\xe4\x16\x00\xc0\ \x28\xd7\xa2\x3b\x92\x9e\x4e\x5b\x53\x59\xf6\xe8\xc4\xe9\xb9\xbe\ \xae\x8e\xe2\xe5\x9d\xa5\x50\x16\xc3\x80\x84\x14\xb0\xd6\xc2\x18\ \x0b\x06\x70\x7b\xdf\xad\xeb\xfd\x37\x57\x9d\xa2\xd5\x8e\x59\x29\ \x6d\xe3\x54\x4d\x84\x81\xff\x52\x14\x67\x4d\x4d\x62\x1e\xd2\x2c\ \xd6\xe3\x7a\x8c\x4a\x65\x5d\x81\x4d\xb9\x60\xb8\x20\x38\xe8\xbe\ \x04\xe5\x72\xc1\x2b\xe5\x73\x0b\x51\x92\x96\x19\x7c\x9e\x23\xa5\ \xc8\xfb\x1e\x42\xdf\x23\xc7\x91\x70\xd7\x5a\xce\x71\x91\x73\x5d\ \xf8\x39\x07\x00\x38\x8a\x33\x9e\xaf\x2d\xd9\x33\x73\xf5\x43\xae\ \x14\xff\x34\x96\x5b\xda\x98\xe9\x4c\x67\xc7\x97\x56\x96\xa7\x0e\ \x4c\xbe\xdc\xc2\xec\xec\xd6\x5b\x00\x00\x63\x63\x63\xf6\xba\x9d\ \xb7\xb4\xc9\xda\x29\x47\x3a\xa5\x30\xf0\x77\x2f\xad\xb4\xa7\x9b\ \xed\xf8\xe3\x73\xd5\x7c\x7f\x31\x0c\x84\xe7\xb9\x42\x08\x41\x67\ \x73\x9a\x65\x46\x92\x26\x76\xa5\x19\x9b\xfa\x4a\xab\x9a\x69\xf3\ \x4a\x4f\x57\x71\xba\xd9\x8a\xdb\x99\xd6\x73\x24\x79\x22\x33\x7a\ \x6a\x61\x65\xa9\x89\xb1\xb1\x0d\xe9\x78\xab\x7a\x80\x2b\xa3\x87\ \xb3\xce\x6f\x5d\x5e\xeb\xea\xea\x9a\x30\x64\xdd\xee\x52\x07\x97\ \x8b\xf9\xa9\x28\x4e\xb6\xcf\xd5\x1a\x43\x5a\x9b\x6e\x63\x6d\x68\ \x2d\x4b\x41\x64\xa4\x14\x6d\x21\x50\x2f\x04\xc1\xdc\xf0\x60\x5f\ \xb5\x15\x27\xaa\xd9\x6a\xb7\x55\xa6\xe7\x5c\x57\x9e\x30\x10\x27\ \x1b\x75\xb5\x78\x6c\x4f\x33\xc3\x39\x35\xe2\x96\x05\x09\x30\x6a\ \x97\x0e\x2d\xc4\x0b\xa5\x2f\xce\x16\x3a\x03\x44\x49\xa2\x7c\x4f\ \x26\x1d\x61\x3e\xee\xef\x2e\x4f\x7b\x9e\xeb\x01\xec\x30\xb3\x60\ \x26\x30\x5b\x30\xc3\x6a\x6b\x4d\x9c\x64\x99\x23\x44\x53\x08\x9a\ \x67\xb6\xaf\x2b\x63\x26\x9a\xb5\x78\xb6\x32\xf3\x42\x04\x54\x36\ \xd5\x86\x6f\x03\x00\x54\x2a\x15\x03\x5c\x1f\xe5\x8b\x62\xc6\xa3\ \x81\x54\x80\x1b\x46\x9b\xa1\x4c\xfb\x3d\xae\x14\x25\x21\x45\x9e\ \x41\x2e\xd8\x0a\x80\xac\x65\xab\xb4\xb6\x89\xd2\xba\x11\xa5\x49\ \x35\x4a\xd5\x54\xa2\xec\xd4\xdc\xfc\x52\xed\xa9\x23\xad\x08\x95\ \xca\x3b\xaf\x09\x37\xda\xfd\x74\xf7\xfd\x3d\xb9\x1d\x43\xe5\x30\ \xef\x85\x9d\x5e\x2e\xd8\xe6\xe6\xdc\xb2\x10\xa2\x20\x19\x3e\x33\ \x49\x22\x36\xcc\x48\x8c\xd5\xed\x24\x53\x4b\xed\x58\xd5\x1b\x49\ \xb4\x54\x9d\xab\xb5\x7e\xf9\x40\x25\x7b\x4f\x55\xf1\xb9\xe3\x3e\ \x7a\xe7\x9d\xe2\x53\x1d\x17\xba\x6e\xff\x80\xef\xba\x8e\xef\xba\ \x94\x0b\x72\xae\x43\xda\x11\xd2\x81\x4d\x52\xad\x8d\xca\xd2\x96\ \xd2\x89\x9a\x9d\x49\x9e\x6f\x4c\xa8\xb1\x47\x1e\xb1\xf8\x6f\xde\ \x05\x5b\x8d\x1f\x19\x19\x21\xe0\x52\x91\xcf\x83\x72\xb9\x01\x42\ \x3f\x80\x59\x20\x4d\x67\x38\x8a\xc0\xc0\x61\x3b\x3a\x3a\x7a\xf6\ \xad\xf2\x1f\xed\xdf\x53\x71\x75\xd6\xe0\x43\x89\x28\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x23\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01\x42\x28\ \x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0b\x1a\x07\x21\ \x0d\x0b\x38\xbf\x7d\x00\x00\x01\x65\x49\x44\x41\x54\x28\xcf\x6d\ \x8f\xbf\x8a\x53\x41\x18\xc5\x7f\x67\xe6\xcb\x66\xc3\x46\x71\xb5\ \x13\x2d\x14\x04\x15\x11\x3b\x0b\x2b\x1b\x05\x0b\x2d\xad\x6c\xd4\ \x7d\x00\x6b\xf1\x09\x04\x3b\x1b\xc1\x87\xc8\x13\xac\xa5\xc2\x36\ \xa2\xe2\x56\x8a\x88\xee\xfa\x27\x92\x9b\x9b\xcd\xcd\xcc\xbd\x33\ \x63\x61\xc2\x36\x9e\xea\x70\xf8\x9d\x8f\xef\x88\xff\xea\xfe\xd5\ \x37\xe7\x42\x3a\xe2\x1f\x7c\xb1\xc3\x70\x5b\xd7\xcb\xca\x9f\x7c\ \xfd\x9c\x09\x7d\x76\xb0\x57\x5b\xa3\x4b\x75\x7b\xca\xee\xbe\xbb\ \xf0\xf2\x10\xde\x67\xd8\xcd\xbd\x67\x4f\xf6\xfe\xc5\x1d\x6a\x06\ \x8c\x60\x09\x64\x1c\xb1\xfc\xa1\xc2\x88\xc5\xbe\x96\x13\x0a\xac\ \x75\xbf\xfd\xaa\xed\x80\xa0\x19\xb5\x8c\x88\x8d\xf5\x81\x05\xeb\ \x8c\xdb\xe2\x1f\x3e\xda\xce\x89\xad\xfe\xe3\x67\x37\xc2\xd4\x4f\ \x31\x22\xb6\xc9\x59\x1a\x86\x4c\xaa\xcb\xf7\x9e\x3c\xbd\x45\x24\ \x71\x65\xef\xe8\xb4\xde\x9c\x61\x44\x9c\x96\x87\x3d\xdf\x73\x4d\ \x4b\x4b\xc5\x38\x67\x2a\x66\x2c\xc8\x98\xa0\x20\x51\x10\x0d\x10\ \x68\x98\x13\xf8\xc5\x1a\x15\x3f\xb0\x92\x71\xff\x9e\x17\x07\x64\ \x02\x81\x42\x87\xf1\x8d\x09\x60\x38\x0a\x02\x39\x47\x43\x62\x01\ \x78\x32\xbb\x88\x75\x84\x01\x5a\xed\x4f\x1c\x94\xa0\x0e\x8f\xe8\ \x93\x8b\x2d\x01\x00\x0a\x1b\x7c\x22\x69\x41\x64\x88\xe8\xd1\xc9\ \x23\x4c\xa8\x08\x21\x49\x73\xba\x22\x06\x72\x72\xea\x91\x8b\x47\ \xb2\xc0\x4f\xb5\x34\x16\xd5\x8b\x43\x1a\x89\x0d\x52\x1c\xc8\x1b\ \x38\x3c\xba\x79\x6d\xff\x8c\x4f\xe6\x8f\x7f\x3c\xb6\xfb\xf6\x76\ \x8f\x02\x9c\x1e\xed\x5c\xac\xcf\x5b\x92\xef\x7f\xfe\x0b\x77\x89\ \x91\x68\x78\x9c\xb5\x57\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x01\x17\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\xb9\x49\x44\x41\x54\x78\xda\x62\ \xfc\xff\xff\x3f\x03\x25\x80\x89\x81\x42\x30\xf0\x06\xb0\x80\x4d\ \x61\xc2\x30\x67\x3a\x94\xce\xc4\xa7\xf9\xdf\xbf\x7f\x58\x5d\x20\ \x0f\xc4\xbf\x80\x58\x02\xca\x26\xd9\x0b\x2e\x40\x7c\x12\x88\x59\ \xa1\x6c\x92\x0d\xb0\x07\xe2\xe3\x50\x43\xec\x49\x35\x40\x09\x88\ \x7f\x03\x31\x3f\x10\x3f\x06\x62\x59\xa8\x18\x0c\x4c\x00\xe2\xfd\ \x50\x1a\x02\x40\x09\x89\x91\x91\x11\x86\x73\x81\xf8\x28\x1a\xce\ \x45\x92\x07\x61\x37\x20\x5e\x03\x62\x83\x13\x21\x2c\x25\x42\x25\ \x37\x03\xb1\x0a\x92\xe2\x2e\xa8\x18\x4c\x4d\x06\x10\x2f\x06\x62\ \x29\x74\x03\x38\x80\x78\x15\x10\x3f\x84\xd2\x52\x40\xec\x0e\xe5\ \x23\x8b\x6d\x41\x12\xb3\x02\xbb\x1e\xea\x05\x0e\xa8\x21\x1c\x04\ \x12\xd7\x7f\x68\x18\x81\xa2\xf9\x13\xdc\x80\xa1\x9d\x17\x00\x02\ \x0c\x00\xa8\x4c\x3f\x1b\xc7\x14\x68\x1e\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\xd3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x30\x00\x00\x00\x34\x08\x04\x00\x00\x00\x66\x9a\x73\x1a\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\x00\x00\xfa\ \x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\ \x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x02\x62\x4b\x47\ \x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\x48\x59\x73\x00\ \x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x03\xcc\ \x49\x44\x41\x54\x58\xc3\xb5\x98\xc1\x6b\x13\x41\x14\xc6\xb5\x55\ \x0f\x1e\x2a\x9e\x84\x11\x15\x2b\x62\xc1\x43\x3d\x28\x88\x20\x2d\ \x42\x6a\x69\x29\xc1\xf6\xd0\x06\xda\x80\x07\x0f\x9e\x44\xe8\xc5\ \x5b\x21\x14\x42\x28\x24\x90\x04\x21\xa1\x87\x84\x48\x49\x0e\xe5\ \xfd\x5b\xfe\x15\xe3\x9b\x99\x9d\xd9\xf7\xde\xcc\x26\x81\xc6\x7e\ \x6c\xb7\x34\xe1\xf7\x7d\xf3\xcd\xdb\x85\xdd\x5b\xea\x87\xd2\x37\ \xd7\xd3\xbf\x4f\xfe\xa8\x5d\xf5\x40\xdd\xbd\x25\x7f\x94\x3e\xd5\ \x70\x63\x0d\xf4\x37\xfd\xca\x58\x3d\x53\xf7\xd5\x92\x30\x98\x1f\ \x53\xd5\xd7\x05\x9a\xa0\x45\x47\x1f\x18\x8b\xe7\xc2\x62\x7e\x03\ \x03\x82\x02\x83\xa1\xfe\x89\x9f\xf5\xf4\x6e\x6c\x31\x9f\xc1\xb5\ \x4d\xef\x8f\x94\xc1\x77\xfb\xbd\x8e\xfe\x24\x2d\x66\x1b\x78\x08\ \x90\x83\xd7\x63\x0a\xda\xc3\xff\x4f\xf0\xf8\xa5\xdf\x73\x0b\x35\ \x07\xbc\x9a\x3c\x4f\x88\x06\x7a\x07\xbf\x3d\xb2\x16\x5f\xf5\x07\ \x6f\x71\x7b\xaa\x01\x4d\x09\xec\x3c\xb1\x69\xa9\x2e\xf5\xa6\x6e\ \xeb\x0a\xc2\xf7\xf4\x11\x06\xf8\xa8\xd5\x6f\xf5\x58\xdd\x2b\x34\ \xc8\xd1\x34\xf5\x09\xa2\x4e\x32\xe4\x89\x30\xd8\xd0\x2f\xf4\x6a\ \xa6\x97\xc6\x40\xab\x37\x78\x5d\x2c\x25\x0c\xe4\x06\x42\x56\x07\ \x90\x63\xc2\x56\x31\xd6\x7d\xd4\x01\x9a\xbc\xd5\xaf\xf5\x1a\x5e\ \x11\xab\xc6\x60\x53\x3d\x52\xcb\xc2\x80\xa3\xab\x01\xe5\xf2\x1e\ \x93\xdf\x46\x15\x0b\xbf\x42\x99\xf6\x87\xa8\x06\x7e\x5a\xd5\x65\ \x34\x41\x83\x2d\x2c\x89\x1a\xc8\xc9\xe0\x29\x21\xfa\x3d\x41\xb0\ \xd9\x58\xa3\xa1\x3d\x06\x99\xda\xae\xa2\xcf\xc4\x20\x46\x9f\x10\ \xf0\x31\x49\xec\xcf\xa3\x4c\x15\x9b\x7c\x40\xf0\xa6\xae\x12\x37\ \x90\x43\x27\xd3\xd3\xde\xc7\xa8\x51\x48\x6e\x80\x10\xd0\x97\xa8\ \xbe\xd5\x0e\x37\x90\xe8\x63\x06\xf5\xb9\xc7\xf8\xd7\x38\xe4\x1e\ \x05\xec\x00\xb7\xf7\x92\xc0\xe7\x30\xe0\xe9\xc7\x59\x6e\x9a\x7c\ \x18\x72\x3b\x34\x10\x78\x0f\x35\xc5\xa0\xc2\xd0\x2e\xb5\x9b\x13\ \x97\xdb\x6f\xe6\x61\x80\xbb\xe4\xd5\x00\x9f\x61\x30\x09\x79\xc7\ \x19\x1a\xc2\x86\x8e\x58\xdf\xc0\x4a\xe9\xdb\xbb\xa9\x51\x17\x55\ \x60\x50\x61\xe0\xab\x90\xd9\xe7\x3e\x0c\x70\x77\x61\xd1\x52\x8c\ \xf6\x2d\x3c\x69\xe0\xc1\x10\xea\xc8\x33\x0f\xc9\x08\xf2\xd4\x10\ \xd0\x3e\x39\xe0\xd1\x41\x09\x03\xd7\x35\x07\x9b\xcc\x47\x04\x6e\ \xba\x3e\x10\x5b\xb9\x4f\xd0\x4e\x1d\xbc\x8a\xdb\xba\x25\x0d\xae\ \xb2\xac\x39\xda\x0b\xc4\x56\x02\xab\xa4\x67\x13\xe7\xf0\xb6\x85\ \x43\x6c\x50\x61\xb9\xbd\xe4\x9c\xf4\x31\x31\xc7\x77\x31\xaf\xab\ \xc4\xc3\x9d\xca\xd2\xc0\xa7\x1f\xb2\xbe\xe3\x39\xe1\xad\x3b\x34\ \x08\x78\x4b\x37\x51\x91\x01\x47\x0f\x44\xdf\xfd\x30\x25\x79\xe7\ \x9d\x4c\x65\x82\x36\xf0\x0b\x2b\x61\x30\x60\xca\xd3\xf2\x42\xf2\ \xce\x7d\x29\x0e\x0a\xd9\xf9\x82\xa8\xc0\x20\x6f\xfb\x40\xa0\xdd\ \x36\x7e\xc9\xf0\x2d\xa6\x32\x83\x37\xac\x22\x03\x79\xb3\xea\x91\ \xb6\xe9\x9c\x80\x80\xbb\xe4\x10\xc0\x8d\xb4\x81\x84\xef\x47\x70\ \x57\x49\x39\x01\x37\xda\x15\xf8\xba\x34\xe8\x47\x17\x3d\x44\xf0\ \x36\xeb\x9b\x76\x6e\x90\x40\xe0\x75\x7d\x9e\x36\xe8\x91\x59\xe1\ \x70\xda\xb6\x1b\x43\xde\x78\x23\x5b\x83\x41\x3b\x09\x83\xd4\x1d\ \xc5\xc1\x5b\x62\x08\x21\xc0\x1b\x42\x40\xf0\x49\x83\x2e\x9b\x94\ \x78\x2b\x4d\xee\xbd\x24\xda\xd5\xb2\x4d\xf0\x91\x41\x97\x09\x92\ \xf0\xa6\xe8\x9a\x77\x6e\x04\xf3\x18\x94\xa7\xc0\x1b\x89\x69\xa1\ \xa9\xb7\xa7\x1b\xc8\xeb\x52\xc2\x1b\x62\x05\xe7\x09\x41\x91\x41\ \x9b\x4d\x49\x8e\x6e\x6a\x79\xf9\xd0\x4a\x62\x6d\x17\x19\xe4\x99\ \x21\xa0\x9b\xc9\xcd\x84\x42\x38\x5f\x43\xc2\xc0\xcc\xc8\x74\xb8\ \x9c\x94\x94\x4a\x78\xd4\x50\xc2\xc0\x63\x61\xca\x18\xc6\x93\x92\ \x52\x0d\xbf\x91\x34\x30\xf7\x93\x59\xf0\xf3\x19\x2b\xa8\x59\x95\ \xf4\x19\x4a\x18\xb8\x6b\x13\x12\xe8\x7a\x41\xc7\x69\x78\xcd\xc2\ \x21\x65\xb0\x9b\x40\xc7\xd3\xb2\x3d\x13\x6e\x54\x8a\x0d\xfc\x84\ \xd7\x89\xa6\x4f\x49\x11\xfc\x2c\x5b\x83\x30\xd8\x61\xe8\xe2\x39\ \x2f\xcd\x01\x77\x6b\x10\x06\x75\x7b\x4c\x43\xcb\x15\x14\xc3\xcf\ \xe2\x4d\x3e\x9d\x13\xee\x57\x30\x0b\x6e\xb4\x4e\x0d\x8e\xd0\x6f\ \xb1\x5a\xc7\x67\xcd\xfc\x21\x70\x21\xef\x8b\x12\x1a\xa8\x0d\xfb\ \x18\x8b\x8f\xe2\xef\xf0\x89\x76\x0b\x17\xb4\x48\x6d\x21\x7e\x4d\ \xad\xd8\xf7\x15\xea\x21\x3a\x29\x5c\xce\x22\xa5\x90\xb9\xa2\xee\ \xb8\xd7\x21\x4b\x6a\xf9\xbf\xc8\xbe\x6d\xf9\x07\x94\x57\x3e\x19\ \x02\x67\x1a\x7b\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\ \x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x31\x2d\x31\x32\x2d\ \x31\x35\x54\x31\x36\x3a\x34\x30\x3a\x35\x36\x2b\x30\x39\x3a\x30\ \x30\x5a\x76\x29\x10\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\ \x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x31\x2d\x31\x32\ \x2d\x31\x35\x54\x31\x36\x3a\x34\x30\x3a\x35\x36\x2b\x30\x39\x3a\ \x30\x30\x2b\x2b\x91\xac\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x05\xa9\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x05\x26\x49\x44\ \x41\x54\x78\xda\xbd\x96\x79\x4c\x54\x57\x14\xc6\xdf\x30\xc3\x6a\ \xdd\xb1\x55\x54\x04\x64\x66\x98\x61\x40\x04\x44\x40\x04\x63\x8a\ \xb5\x9a\x46\xd3\xd6\xb4\xa9\x89\x25\x69\x6b\x9b\xb4\x49\x5b\xd3\ \x3f\xf9\xc7\x2a\x5a\xb5\x8c\x16\x37\x16\x05\x91\x45\x45\xa9\x5a\ \x04\xd1\x82\x46\x94\x1a\xda\x10\x4b\x08\x69\xb4\x31\x4d\x1a\x11\ \x59\xb5\xca\xaa\xe2\xd7\xfb\xdd\x4c\x9f\x6f\x00\x17\x44\x3a\xc9\ \x8f\xfb\xce\x39\xf7\x9d\xef\xbb\x67\x86\x99\xa7\x00\x70\xc2\x6e\ \xb7\x43\x0b\x73\x2f\x4a\x69\x69\xa9\xc7\x80\x7e\x7d\x03\xf7\x28\ \xca\x42\xe5\x33\x25\x4e\x29\x93\xc4\x2b\xe5\x1d\x1d\x1d\xd0\xc2\ \xdc\x8b\xe2\xb5\xc4\xeb\xac\xb6\x57\x73\x4b\x73\xbf\x5a\xa7\x1e\ \xb5\x95\x05\xca\x39\xc3\x36\x03\xf4\xa9\x7a\x18\x36\xe9\xd1\xd0\ \xd0\xe0\x44\x74\x9e\x0d\x2b\xca\xe3\xb1\xba\x72\x09\x3e\xb9\xb4\ \x12\x5f\xfd\xf6\x1e\x92\xeb\x3e\xc4\xc6\x3f\xd6\x22\xf5\xcf\x2f\ \xb0\xe3\xfa\x97\x72\x4d\x11\x71\x72\x5d\x12\xbe\x16\x75\xee\x5b\ \x7d\xee\x0d\x24\x1e\x89\x76\xea\x75\xa5\xfe\x0a\xdc\xb7\xb8\xc2\ \xd5\x6e\x80\x21\xd5\x00\x6a\x2b\xf2\xcf\x77\x0a\x94\x6d\x82\x24\ \x05\x69\x69\x69\x4e\xe8\x57\xb9\x20\xec\xc8\x34\xc4\xfc\xe8\x8b\ \xc5\xa7\x66\x63\xf9\x99\x20\xac\x3a\x1f\x82\x35\x97\xc2\xb1\xf6\ \xd7\x28\x7c\x5e\x1b\xc3\x95\x31\xf3\xac\x73\x9f\xdc\xef\xf9\xb1\ \xbb\x53\x2f\xfb\x0e\x3b\x74\xab\x74\x30\xd8\x5d\xa0\x7c\xaf\x38\ \x0c\xc4\x29\xe7\xa5\x81\xad\x0a\x5c\xbe\xd1\xc1\x12\x63\x81\x65\ \xbe\x05\xd6\x48\x0b\x6c\x31\xc1\xf0\x49\x1e\x8b\xd0\xc3\x53\x11\ \x55\x3c\x03\x09\x3f\xf9\x63\xe9\x69\x13\x56\x56\x04\xe3\xfd\x0b\ \x73\xa4\x68\xd2\x2f\x11\x5c\x19\x33\xcf\x3a\xf7\xc9\xfd\x7e\x29\ \x93\x10\x1c\x6b\x45\xb0\xec\xc7\xbe\x41\x70\x5b\xa7\x87\x9e\x06\ \x78\x60\x6a\xcb\x3f\x9b\x45\xb0\x45\x18\x48\xd5\xc1\xe3\x07\x03\ \xc6\xed\x72\xc7\x94\xf4\x31\x98\xb9\x7f\x3c\x02\x73\x27\x23\xb8\ \xf0\x35\x84\x17\xf9\x20\xf6\xf8\x2c\x79\xba\x37\xcb\xcd\x58\x51\ \x61\xc5\x3b\xe7\x6c\x3c\x35\x57\xc6\xcc\xcb\xfa\x5b\xa7\xe7\xe1\ \xf5\x93\xa1\x88\x2b\xb6\xca\xfb\x23\x0e\x99\x31\x27\xcf\x84\x80\ \xfd\xd3\xd9\x9f\x3a\x3c\xb0\xc6\xc0\x26\x05\x9c\x02\xc7\xe2\xb6\ \x5d\x8f\x31\x3b\xdd\x30\x69\x8f\x27\xa6\x65\x8d\x85\x5f\xce\x44\ \x98\xf3\xbc\x11\x72\x68\x2a\x22\x8f\x4e\x97\x26\x16\x95\x04\x20\ \xb1\xcc\x88\xa5\xe5\x26\x8a\x72\x65\x2c\xf3\x9f\x5e\x78\x1b\x05\ \xd7\x32\x71\xf8\x5a\x0e\x0a\xaf\x66\xe3\xdd\xd2\xa5\xc8\xa8\xdf\ \x85\xdc\x86\x6c\x64\xd5\xa7\xc3\x63\x87\x2b\x75\x78\x60\x67\x03\ \x84\xae\xf4\x76\x1d\x3c\x35\x53\x98\xbe\x6f\x1c\xfc\x0f\x4c\x44\ \x50\xfe\x14\x9a\x90\x93\x98\x5f\x3c\x13\x0b\x84\x91\x85\x27\xfd\ \x10\x7f\xd2\x9f\x2b\x63\x99\xb7\xff\xbe\x1e\x3f\xff\x7d\x0a\x25\ \x7f\x1d\x13\x06\x72\xb0\xa1\x26\x19\x25\xd7\x4f\xa0\xe8\xea\x21\ \xec\xab\xcf\x84\x3b\x0d\x6c\xe5\x81\xb5\x06\x36\x8a\x20\xe5\xf1\ \x14\x5c\xb7\xbb\xc0\x2b\xcd\x15\xe3\x77\x7b\x60\x4a\xc6\x63\x13\ \x26\x31\x09\x6b\xc1\xab\xf2\x33\x31\xf7\x88\x0f\x22\x8a\x04\x62\ \x2a\x5c\x19\x33\xff\xc1\x99\xe5\x58\x77\x71\x2d\x12\x8f\xcf\x97\ \xf7\x2d\x3b\xb1\x18\x1f\x9d\x5d\x83\xb9\xf9\x21\xa2\xaf\x5e\xf6\ \x97\x3a\x9b\xb5\x06\x36\x88\xe0\x5b\x39\x05\x39\x1a\xdd\x7f\x6f\ \x85\xc3\x04\x27\xe1\x23\xde\x0e\xdf\xec\x09\x08\x38\x30\x09\xc6\ \x83\x93\xe5\x44\x2c\xc2\x0c\x0d\x71\x65\xcc\x3c\xeb\xdc\xc7\xfd\ \xbc\x8f\xf7\xb3\x0f\xfb\xe9\x52\xd9\xdf\xa1\x93\xe2\x30\x20\x5e\ \x09\x8f\x1e\x3d\x42\x7f\x7f\xff\xff\x0a\x35\xa9\x3d\xaa\x06\xee\ \xf6\xdd\x26\x83\xf2\x0f\x1f\x3e\x94\xab\x6a\xc0\x91\x7c\xa9\xdc\ \xe9\x69\x47\xd8\x1e\xa3\x20\x10\xb7\xc5\xb5\xa6\x36\xfa\x06\x28\ \x18\x2a\x84\x95\x64\x45\x62\xdb\x15\xc0\xdc\xd3\x0d\x3c\x78\xf0\ \xe0\xa5\xd0\xd1\xdd\x06\xdb\xde\x00\x28\xeb\x15\x15\xcb\x6e\x7f\ \x74\x74\xb5\x69\xf7\x8d\x8e\x81\xf6\xae\x56\x58\xd3\xfd\xf9\x09\ \x57\x31\xef\xf1\x43\x9b\xc8\xb3\xfe\x4c\x03\xf7\xef\xdf\x7f\x61\ \xda\x3a\x5b\x10\x94\xe1\xc7\x2f\x19\x15\xe3\x5e\x5f\xb4\x76\x36\ \x0f\xb9\x9f\x6f\x83\x6a\x80\xc1\x48\xc4\x5b\x85\xb8\x25\xd3\x8f\ \x5f\x60\x2a\xa6\x8c\x59\x68\xb9\x27\xc5\x47\x6e\xa0\xaf\xaf\xef\ \x89\x50\xc4\x9a\xe5\x8f\x57\x76\xba\xa9\x98\x85\x99\xe6\xbb\xb7\ \x9e\x76\xdf\x20\x03\x43\x6e\x6a\xbb\xd7\x82\x56\xc1\x13\xc5\x85\ \x88\x6d\x5f\x00\xbc\xd3\xbd\x54\x2c\xc2\x8c\x2a\x3e\x12\x03\x3c\ \xd9\xbc\x5c\x33\x22\x73\x4d\xe2\x7a\x70\x43\x8a\xcc\xc9\x0e\xe4\ \x4f\xb6\x4a\xc8\xfe\xd9\x68\xfa\xa7\x09\xbd\xbd\xbd\xcf\x84\x9f\ \x39\xd5\x00\x03\x6d\x91\x27\x8b\xce\x0b\xe2\xcf\xb0\x24\xea\xa0\ \x19\xb7\x34\x8d\x79\x1d\x7e\xc0\xc8\x9a\x4a\x58\x4e\x20\x9a\xee\ \xdc\x64\x7d\xe4\x06\x78\xba\x98\x02\x2b\x1f\xc5\x54\xa2\x84\x21\ \x9e\x8e\x44\x0a\x43\xda\x5a\x84\x98\xd2\x4d\x87\x78\x4f\x4f\xcf\ \xf3\x30\xc8\xc0\xa0\x0d\x3c\x65\x6c\x41\x30\x1f\x40\x54\xa2\xf3\ \x2d\x62\x32\x16\xa7\xdc\xbc\x83\x41\x14\x1f\x2c\x32\x52\x03\x84\ \x23\x8d\x2f\xb4\xf1\x69\x67\x48\x62\xf3\xad\xcf\x2d\xde\xdd\xdd\ \xad\x85\xff\x5d\x34\x10\x2f\x0d\x30\x60\x72\x28\x1a\x6f\x37\x62\ \xd1\xe1\x50\x3e\x70\x3a\x91\x50\x18\xc2\x1a\xf7\x0c\x83\xe1\x1b\ \x50\x4d\x24\x1e\x0d\xc3\xea\x8b\x73\x25\x89\x45\x61\x68\xec\x18\ \x9e\x78\x5d\x5d\x1d\xca\xca\xca\x50\x59\x59\x89\x9a\x9a\x1a\x54\ \x55\x55\xdd\x12\xda\x13\x54\x03\x5d\x5d\x5d\x4f\xe5\x46\xfb\x0d\ \x2c\x3b\x16\x41\x78\xcd\xdc\xb0\x28\x29\x29\xe1\x43\x08\xcd\xd0\ \x40\x97\xb7\xb7\xb7\x2f\x00\xe5\xb9\x0d\x90\xc6\xf6\x46\xc2\xeb\ \x61\x53\x51\x51\x81\xce\xce\x4e\xd4\xd6\xd6\xf6\x9a\x4c\xa6\x70\ \x8a\x13\xbe\xe2\xf9\xc5\xc2\xe2\x68\x72\xf9\xf2\x65\x9e\xbc\xdb\ \x68\x34\x46\x52\xd8\xc9\x80\xfa\x4d\x38\x8a\x54\x57\x57\x37\x8b\ \xb1\x5b\x28\x3a\xd0\xc0\x4c\xc1\x02\x07\x71\xa3\x04\x7b\xcf\xa0\ \xe0\x40\xfe\x05\xae\x93\x7b\x67\xdf\x08\x23\x9a\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x08\x87\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x08\x04\x49\x44\ \x41\x54\x58\x85\xc5\xd7\x7b\x70\x54\xd5\x1d\xc0\xf1\xef\xb9\x77\ \x1f\xd9\x6c\x76\x37\x09\x61\x21\xe1\x15\x82\x01\x12\xb3\x2a\x4f\ \x93\x48\x08\x18\x8d\xe2\x60\xad\x8a\x8e\xd6\x5a\x1f\x23\x23\xb6\ \xb6\x8d\x6d\x7d\xfe\x61\x92\xfa\x1e\x6d\xa5\x84\xea\x8c\x0f\x7c\ \x8c\xd3\xa2\x30\x20\x55\x64\x40\x16\x50\xd0\xaa\xa0\x13\x07\x51\ \x41\x5e\x01\x12\x02\x9b\x64\x37\xbb\x9b\x6c\xf6\xee\xbd\xe7\xf4\ \x8f\x90\x75\x11\xc7\xb1\x42\xa7\xbf\x99\x3b\xbb\xb3\xe7\xec\xef\ \x7c\xee\xd9\xdf\x39\xf7\xac\x50\x4a\xf1\xff\x0c\xed\x74\x13\xac\ \xf6\x78\xfc\x5b\xae\xbc\x72\xe3\x2a\x87\xa3\xf2\x87\xfa\xbd\x91\ \x9d\xfd\xdb\xe5\xe3\xc7\x37\x9d\x51\xc0\x0a\x21\x86\xcb\x78\x7c\ \xe3\xb8\xda\x29\x75\x9a\xc3\xb6\x7e\x95\x10\xdf\x8b\x58\x29\x44\ \x53\x61\x65\x60\x49\xc9\xec\x19\x8d\x2b\x85\x78\xfa\x8c\x00\x56\ \x08\x31\x5c\x42\xb0\xfc\xd7\xbf\x0c\x14\xf5\xe9\x54\x3f\xf1\xb0\ \xd7\x74\xbb\xd6\xbf\x2a\xc4\x05\x99\xfd\x96\x0b\xd1\xe4\xaf\x99\ \xd6\x18\xa8\x9b\x4f\xf9\xd4\x2a\xc6\x5d\x3d\xaf\xe1\xf5\x0c\xc4\ \x4f\x06\x24\xe1\xc9\xf1\x97\xcf\x0a\x0c\x73\x16\xd0\x1b\x0a\xc1\ \xde\xc3\x54\x36\x3d\xe0\x3d\xee\x72\xac\xbf\x5b\x88\xf9\x00\x8b\ \x85\x78\xbc\xe0\xfc\x40\x63\x69\x6d\x3d\x46\xa8\x9b\xfe\x03\x6d\ \x94\xce\x9d\x87\x6f\xea\xa4\x86\xd7\x84\xb8\xf4\xb4\x00\x29\x58\ \x77\x78\xfb\x4e\xd9\xd5\x7d\x84\x48\x38\x4c\xa4\xa7\x87\xc4\x17\ \x7b\xb9\xf4\x9e\x06\x77\x22\xcb\xbe\xe2\x01\x21\x56\x95\x4c\x2f\ \xbb\x77\xfc\x05\x73\x88\x1d\x6a\x27\x12\x0e\x13\xed\xeb\xa3\x27\ \x1e\xe2\x58\xeb\x9e\x36\x09\x3b\x01\xc4\xe9\xac\x82\x17\x85\xb8\ \xd1\x3d\xd2\xf7\x72\x59\x4d\xb5\xa6\x06\x6c\x83\x30\x21\x10\x13\ \xfc\xb4\x6d\xdb\x46\xd9\xd4\x4a\x8c\x8e\x6e\x00\x84\x10\x30\x22\ \x8b\x1d\x2f\xae\x38\xa4\xa4\x9a\x73\x9b\x52\x07\x7e\x14\xa0\xb9\ \xb9\x59\x0b\x79\x66\xcf\x97\xd2\xaa\x90\x88\x5d\x85\x7d\xdb\xde\ \x6a\x6c\x6c\x94\x43\xed\xcf\x08\xf1\x2b\xdf\x48\xef\x4b\x65\x33\ \xa7\x68\xa9\xf0\x89\x8f\x35\x8d\xec\xd1\x7e\xfa\x0f\x75\xa2\xd9\ \xed\xe4\x94\x95\x31\x60\x75\xf3\xf1\x73\xaf\x1f\x36\xa5\xaa\xbd\ \xf3\xc4\xe0\x3f\x08\xb8\x65\xf1\x7b\xb9\x1e\x25\x1b\x34\x21\x6e\ \x03\x46\x49\xa5\x90\x0a\x4c\x53\x1e\x93\xc8\x7f\x26\x65\xea\xd9\ \x57\xee\xbb\x6c\x0f\x40\x8b\x10\x37\xfb\x46\x78\x5e\x2c\x9f\x5a\ \xa1\x09\xcb\x03\x76\x3b\xc2\x6e\x47\xea\x3a\xc9\x78\x9c\xfe\xbe\ \xbd\xec\xfe\x70\xff\x11\x53\xaa\xda\x06\xa5\xf6\x67\x8e\x73\x0a\ \xa0\x61\x69\xb0\x4c\x28\xdb\x3d\x1a\x5c\x03\xb8\xa5\x1c\x6c\xb7\ \x14\x48\xa9\x90\x96\xc4\x52\x0a\x25\x95\x32\x95\xfa\xa0\x27\x66\ \x3c\xeb\x70\x26\x56\x56\x36\x5d\xfb\xc6\x84\x19\xe3\xae\xc8\xf9\ \xe6\x38\xc9\x48\x22\x9d\xcf\x33\x63\x2c\xad\x5f\x74\x62\x26\x8c\ \xeb\xef\x52\x6a\xf9\x77\x6f\x34\x0d\xb8\x7b\xe9\xd6\xd9\x52\xaa\ \x07\x35\x8d\x39\x0a\xa5\x0f\xb9\x32\x01\x4a\x9a\x20\x41\x2a\x49\ \xca\x12\x58\x4a\xd1\x1b\x4f\x52\xb0\xe1\xe5\x44\xd5\xf1\xf7\x5c\ \x93\x5c\x76\xcc\xdd\x9d\x28\x40\x02\xfa\xd0\x28\xd5\xa5\x7c\xf2\ \xe9\xc1\xa8\x4c\xa6\xea\xff\xa4\xd4\xc7\xa7\x00\xae\x6d\x5c\x37\ \xdb\xeb\xb2\xad\xcd\xcd\x71\x86\x40\x8d\x02\x1c\x4a\xc1\xe0\xa5\ \x4e\x40\x0c\xa6\x15\xbb\x39\x67\x42\x01\x29\xd3\xe2\xeb\x23\x51\ \x76\x1d\x8a\x93\x5c\xb9\x8c\x73\xda\x36\x32\xcd\x69\x47\xed\xee\ \x18\xc4\xea\x1a\x7d\xa5\x85\xe4\x7c\xdd\x9e\x5e\x66\x03\xb3\xca\ \xd8\xba\x63\x5f\x34\x35\x60\xd4\xdf\x9f\x81\xd0\x00\xdc\x36\x7d\ \x59\x2c\x6e\xb4\x3c\x75\xe7\xec\x92\x94\xa9\x6e\xfa\xbe\x9a\x18\ \xe3\x53\xcc\x9d\x3e\x96\x91\x7e\x1f\x63\x8a\xf2\xb9\x78\x66\x31\ \xd5\xfb\xde\x21\x70\x78\x0b\xb3\x5c\x2e\x3c\xbb\x3b\xf0\x02\x1e\ \x5d\x67\x47\x55\x80\x86\xde\x01\x62\x53\x26\xe1\x05\xbc\x80\x7f\ \xdb\x57\xd4\x55\x9f\xe7\x15\xd9\xce\x0d\xcf\x96\x97\xd7\x9e\x04\ \xc8\xf5\x3a\x35\xa9\xa9\xa3\x00\x3d\xd1\xe4\xee\x94\x29\xc9\x2c\ \x0d\x65\x9a\x94\x16\xe5\xe0\x74\x3a\x41\x1a\x08\xa5\xd8\xfe\x4c\ \x0b\xdd\xeb\xd7\x50\x9f\x95\x43\xfe\x57\x87\x06\x07\xb7\xdb\xf8\ \xb4\xb6\x92\x57\x77\xec\xa5\xa4\xa8\x86\xa6\xce\x30\xb1\x19\xe7\ \xa5\x11\x63\x37\x7d\xc2\xe5\x35\x55\x5e\x7b\xb6\xeb\xed\xc7\x3c\ \x9e\xf2\x34\x60\xe4\xb0\xec\x90\x4d\x68\x8f\x5c\xfb\xe0\xda\x97\ \x92\xa6\xf9\x66\x28\xd2\x4f\xdf\x80\x91\x06\x64\xe9\x09\x26\x97\ \xf8\x01\xc8\xe9\xfa\x0c\xcf\xc1\xb7\x89\xed\x6b\x65\xf8\xa8\x22\ \xbc\x3d\x11\x5c\x80\xcb\x6e\xa3\xf5\xc2\x1a\x9e\xff\xf4\x0b\x1e\ \x5d\xf5\x16\x57\x3c\xd4\x48\x79\xf5\xf5\xdc\xdf\xde\x49\xac\x6a\ \x26\x2e\x5d\xc7\x25\x04\xf9\x3d\x51\x1c\x36\x9b\x5b\x9a\x66\x41\ \x1a\x10\xe9\x4d\xfc\xb5\xa8\x20\xc7\xa3\xc1\xcd\x1a\x8c\x95\x12\ \x7a\xe3\x06\xdd\xd1\x04\xa6\x69\x31\x3a\x0f\x7c\x5e\x0f\x4a\x9a\ \x98\x29\x89\x69\x09\xe6\xdd\x70\x21\xc7\xa2\x5d\x7c\x10\x28\xc7\ \x1a\x3b\x9a\xcf\xeb\xe7\xd2\xf2\x49\x2b\xcb\xb6\x6e\xa5\xfa\xe2\ \x1a\xae\xaf\x0f\xf0\xd8\xcb\x8f\x71\xdd\xc2\xdf\xf3\xd4\xb1\xe3\ \x84\xe7\xcc\x22\x5a\x39\x83\x35\xa1\x2e\x82\xae\x8a\xbe\xe0\xc2\ \x7f\xf4\x02\xe8\x4d\x4d\x4d\x5c\x34\x73\xdc\xae\xfd\x1d\xbd\x0b\ \x8f\x84\xe2\xde\xcc\x65\x69\x59\x8a\x78\xb4\x87\xda\x8a\x7c\x46\ \x15\xfa\x91\x52\x62\x6a\x2e\xa4\x9e\x85\xb0\x65\x51\x3c\xf3\x6c\ \x76\x6c\xd8\xcc\x01\x6f\x3e\xab\x5b\x3f\xe7\xcf\x4f\xdf\x4f\xc1\ \xe4\x0a\xec\xde\x7c\x74\x5d\xc7\xe9\xb0\x73\xee\x9c\x59\xf8\x1c\ \x4e\xd6\xbe\xfb\x2e\x07\xa3\x31\xfe\x5d\x5c\xcf\x91\xc0\xa5\x0e\ \x21\x54\xce\x4d\xf3\xca\x57\xdb\x86\x06\xeb\x4f\x1a\xcf\x95\x8e\ \xca\x6d\xde\x7f\x34\x82\x91\x4a\x6f\x74\xe4\xdb\xe3\x4c\x3e\x6b\ \xcc\x60\x2d\x20\x90\xae\x7c\x94\xbb\x00\x69\x26\xb1\xfb\xba\xb8\ \xfc\xc9\x87\xd8\xb3\x66\x2d\xf7\xde\x58\x8f\x3b\xd5\x43\xf4\x5f\ \x4b\xe8\xf3\xfa\xc9\x9e\x38\x9d\xec\x73\xe7\xa2\xbb\x5c\x5c\xb0\ \x68\x11\x23\x27\x4e\xa4\xb7\x27\xc6\xf6\x7d\x6e\xe8\xe8\x05\x45\ \x16\x40\x1a\x20\x6c\xa9\x27\xfd\x79\xd9\x7f\x8c\x25\x0c\x6f\xac\ \xcf\x20\x3e\x60\x90\x32\x92\x94\x14\x39\xf1\xf9\x7c\x9c\xb2\x63\ \x3a\x5c\x08\x57\x31\x4e\xff\x78\x02\xe3\x02\xc8\xf0\x51\xe4\xf1\ \x76\x64\xac\x1b\x33\xd4\x4e\xf8\xfd\xb7\xe8\xde\xbc\x0a\xe7\x98\ \x32\xbc\x33\xeb\x98\x50\x57\x47\x62\xc0\xc4\xb6\xe4\xbd\xa1\x9b\ \xf9\x32\x5d\x03\x00\x7f\x58\x50\x95\xd0\x34\xd6\x64\x39\x6c\x78\ \xdc\x0e\xfc\xb9\xd9\xe4\x64\xe9\x78\xb2\x9d\x83\x0f\x12\x48\xbf\ \x66\x62\x14\x02\x3c\x05\xd8\x8a\xcf\xc5\x31\xa5\x0e\x57\x60\x36\ \xae\x8a\x1a\x5c\x93\xa7\x63\x1b\x36\x9a\xfe\x03\x5f\x73\xe4\xf9\ \x47\x49\x76\xb6\xd3\xd1\xdd\x47\xa8\xb7\x1f\x40\x0a\x29\x96\x9d\ \x34\x03\x00\xbb\x3a\x42\xf7\x9d\x35\x3c\xff\xba\xb6\xce\xa8\x5d\ \x08\x81\xc7\xed\xa2\x2b\x1a\x21\x1c\x0e\x93\x97\x97\x87\x94\x32\ \x0d\x18\xba\x32\x43\x73\xba\xd0\x8a\x26\x90\x35\x76\x12\xc4\x7a\ \x48\x1d\x3d\x44\x7f\xdb\x5e\x84\xae\xe3\x1c\x39\x8a\x9d\xef\x7f\ \x43\x6f\x3c\x09\x82\x60\x70\xe9\x55\x6d\x27\xcd\x00\x40\xcb\x6f\ \x2e\xea\x30\x52\xf2\xb5\x2c\xa7\x7d\x30\xa1\xcd\x41\xa7\x31\x8c\ \xe5\xef\xec\x60\xcb\xb6\xcf\x08\x87\x23\xa7\xcc\xc4\x10\x62\xe8\ \xbd\x65\x59\x58\x52\xa2\xe5\x0e\xc7\x1d\x38\x9f\x82\x4b\x16\x90\ \x5f\x3b\x9f\x70\xb4\x9f\x0d\xdb\x0f\x0f\xee\xae\x88\x17\xd2\x68\ \xbe\x13\x77\xdf\x30\xfd\x56\x94\xba\x57\x2a\xf6\xa3\xc0\xe6\x70\ \x73\x5c\x8e\x60\xf3\x1e\x93\x57\xd6\x7d\xc9\xdb\x5b\x5a\xd9\xdf\ \xd6\x8e\x61\x18\xa7\x00\xa4\x94\x69\x84\x69\x9a\x98\xa6\x89\xb0\ \x3b\xd1\xdd\x1e\x76\xee\xeb\xe2\xe0\xd1\x5e\x80\xee\x82\x7c\xf9\ \x66\xba\xf6\x7e\xe8\x3c\x70\xc7\x5f\x36\x5d\xa8\x0b\x16\x69\x82\ \xf9\x4a\xe1\x52\x00\x52\x82\x99\xa0\x70\x98\xc6\xd9\x63\xf2\x08\ \x4c\x2c\xc4\xeb\xc9\xc1\x66\xfb\xf6\xd7\xd4\x34\x0d\x4d\xd3\xb0\ \xd9\x6c\xe8\xba\x8e\x65\x59\x3c\xfd\x7a\x2b\xc1\xcf\xda\x01\x16\ \x07\x97\x2c\xb8\xeb\x47\x01\x86\x62\xd1\x13\x41\x9f\x26\xd4\xad\ \x42\x13\x37\x83\x38\x47\xa1\x06\x9f\x78\x56\x0a\xa7\xb0\xa8\x28\ \xf6\x30\x6d\xb2\x9f\xd1\x23\xf2\xb0\xdb\xed\x08\x21\x10\x42\xa0\ \x69\x1a\xba\xae\xb3\xbb\xad\x8b\x47\x5e\x6b\x25\x12\x4f\xa1\xa4\ \xa8\xd8\xb4\xf4\xea\x5d\xff\x15\x20\x33\x6e\x7f\x3c\x38\x0d\x5d\ \x2d\xd2\x10\x0b\x94\x52\xb9\x52\x81\x61\x5a\x58\xa6\x41\x89\xdf\ \xc5\xb4\x89\x79\x54\x4c\x18\x8e\x37\x27\x1b\x5d\xd7\x49\xa5\x4c\ \x96\x6f\xda\xcb\x9a\x0f\xdb\x11\xa8\x8f\x36\x2e\xb9\xa6\x2a\x33\ \xdf\x4f\x3e\x13\xfe\xae\x65\x9d\xb3\xbf\xdf\x7e\x83\x80\x5b\xa4\ \x52\xd5\xa6\x65\x69\x86\x21\x91\xd2\xc2\x2e\x4c\x66\x4c\xcc\x67\ \x98\xd7\xc9\xb1\x88\x41\xf0\xf3\x2e\x92\x29\x09\x82\x85\xc1\xbf\ \x2d\x78\x21\x33\xcf\x69\x1d\x4a\x87\xe2\xd6\x87\xdf\x2d\xb5\x84\ \xbc\x5d\x29\x7e\x61\xa4\xcc\xc2\x78\x7f\x8a\x44\xd2\x44\x13\x20\ \xbf\x4d\x1f\x97\x96\x2a\xdc\xfc\xf7\x6b\xe2\x67\x1c\x30\x14\xcd\ \xcd\xcd\xda\x37\xea\xfc\x9f\x25\x8c\xe4\x2d\x91\x78\x6a\x1e\x60\ \x3f\xd1\x64\xa0\xf8\x79\xb0\x65\xc1\xba\xef\x7e\xe7\x8c\x02\x32\ \xe3\x92\x3b\x56\xfb\x4d\xbb\x79\x99\x50\xe8\x96\xd0\x77\x6d\x5e\ \x72\xd5\x47\xdf\xd7\xef\x7f\x06\xf8\xb1\x71\xda\xff\x8e\x4f\x37\ \xfe\x03\xa3\x99\xc7\xf6\x54\x0b\xa0\x82\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x08\xcd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x08\x5f\x49\x44\x41\x54\x78\xda\x62\ \xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x21\x4a\x11\x0b\x0b\x93\ \xa4\xa4\xa4\x8b\x90\x90\x90\x01\x23\x04\x80\xc4\x18\xfe\xfe\xfd\ \xcb\xf0\xf9\xf3\x67\x86\xdf\xbf\x7f\x33\x70\x73\x73\x83\xc5\x60\ \x1e\x02\xd1\x40\x75\x6c\x40\xfa\x17\xb2\x59\x40\xb1\xff\xaf\x5e\ \xbd\x3a\xf5\xe2\xc5\x8b\x03\x20\x3e\x40\x00\x11\xe5\x00\x29\x29\ \xa9\xe0\xda\xda\xda\x55\x3e\x3e\x3e\x0c\x1f\x3f\x7e\x64\x78\xfb\ \xf6\x2d\xc3\xbd\x7b\xf7\x18\x9e\x3c\x79\xc2\xc0\xca\xca\xca\x20\ \x23\x23\x03\x66\xfb\xf9\xf9\x31\xb0\xb1\xb1\xc1\x1d\x80\x4e\x83\ \x1c\x0e\xa2\x97\x2f\x5f\xfe\x85\x93\x93\xd3\xf2\xfb\xf7\xef\x57\ \x00\x02\x88\x28\x07\x30\x33\x33\x6b\x71\x71\x71\x31\x5c\xb9\x72\ \x85\xe1\xf1\xe3\xc7\x0c\xfc\xfc\xfc\x0c\x2a\x2a\x2a\x0c\xae\xae\ \xae\x0c\x62\x62\x62\x0c\x4c\x4c\x4c\x0c\x1b\x36\x6c\x00\x87\x80\ \x82\x82\x02\x41\xf3\xf4\xf5\xf5\x79\x80\x66\xca\x00\x99\x57\x00\ \x02\x08\xab\x03\x80\xc1\xc9\x01\xc4\x3a\xd2\xd2\xd2\x76\x9a\x9a\ \x9a\xf6\x25\x25\x25\xb6\xc2\xc2\xc2\x60\x9f\x5a\x5a\x5a\x32\xf0\ \xf0\xf0\xc0\xd5\xc2\x7c\x28\x21\x21\xc1\x70\xe3\xc6\x0d\x06\x25\ \x25\x25\x14\x5f\xc3\xd8\x30\xdf\x83\x1c\xfb\xeb\xd7\xaf\x7f\x40\ \xfe\x5f\x90\x38\x40\x00\xc1\x1d\x20\x20\x20\xa0\x00\x8c\x63\x6b\ \xa0\xcf\xec\x4a\x4b\x4b\x6d\x0d\x0c\x0c\x54\x80\x2e\x65\x95\x93\ \x93\x03\x85\x00\x8a\x03\xff\xfd\xfb\x07\x0f\x52\x50\x3a\xf8\xf9\ \xf3\x27\x03\xc8\x81\x20\x07\x80\xe4\x40\x96\x20\xab\x01\xd1\x40\ \x4b\xc1\xea\x40\x51\x06\x62\xc3\x00\x40\x00\xb1\x00\x7d\x69\xe8\ \xe1\xe1\xd1\xd9\xd7\xdf\x6f\xae\xa7\xa7\xc7\xa7\xae\xa6\xc6\xc0\ \xcb\xcb\x8b\x11\x2a\xe8\xbe\x82\x59\xfe\xf5\xeb\x57\x70\x22\x04\ \x7a\x00\xcc\xff\xf0\xe1\x03\x03\xd0\x23\x70\x5f\xff\xf9\xf3\x87\ \xe1\xc7\x8f\x1f\x60\x35\x20\x47\xa1\x7b\x06\x20\x80\x58\x80\xa9\ \x3b\xbc\xa7\xb7\xd7\x55\x50\x00\x64\x29\x33\x51\x59\x07\xe6\x2b\ \x60\x22\x02\x5b\x0a\x02\x20\x9f\x81\xd2\xc6\xc5\x8b\x17\x19\xac\ \xad\xad\xc1\x89\x11\xe4\x63\x90\x1a\x90\xc5\xc8\xa1\x07\xd2\x0f\ \xc2\x20\x00\x10\x40\x2c\x40\x97\xbd\x07\x29\x12\x64\xfa\xc3\xc0\ \xf0\xed\x1b\x03\x83\xb8\x2c\xc8\x06\x74\xef\x63\x38\x02\xe4\x2b\ \x90\xef\x60\xa1\x02\x62\x03\x73\x0b\xc3\xe1\xc3\x87\x81\xc6\x7c\ \x63\x90\x97\x97\x87\xa7\x07\x74\x0c\xf3\x04\x08\x00\x04\x10\xd3\ \xc3\x47\x8f\x0e\x9f\x3d\x7b\xf6\x1f\x03\x3b\x07\xd0\x1b\xc0\x2c\ \xf4\xfb\x27\x66\xf0\x43\x74\x30\xfc\x07\x6b\x62\x04\xc7\x21\x28\ \x48\x91\xa3\x04\xe6\x00\x90\xf8\x84\x09\x13\x18\x72\x72\x72\xc0\ \xea\x60\xa1\x05\xf2\x39\x0c\x83\xc4\x40\xe9\x04\x04\x00\x02\x88\ \xe9\xe3\x87\x0f\x17\xce\x9e\x3e\x7d\x8f\x81\x9d\x1b\x62\xdb\x9f\ \xdf\x98\x0e\x00\x59\xfc\xf1\x2d\x03\xe3\x83\x1b\x0c\x7f\x99\x80\ \x0e\x60\x60\xc4\xf0\x15\xc8\x60\x60\xde\x06\x67\xcb\x93\x27\x4f\ \x32\xdc\xba\x75\x0b\x1c\xfc\xc8\x8e\x44\x76\x00\x0c\x00\x04\x10\ \x13\x50\xe2\xdb\xa9\x33\x67\x0f\x7f\x7f\xfb\x86\x81\xe1\xc1\x75\ \x06\x86\xab\xa7\x19\x18\xbe\x7e\x46\xf5\xfd\xbf\xbf\x0c\x8c\xd7\ \xcf\x32\x30\x9e\xdd\xcf\xc0\xb8\xa4\x97\x81\xf1\xc9\x5d\x86\xff\ \x9c\x3c\x10\x83\xa1\xa9\x1d\x64\x30\x28\x3d\x18\x1b\x1b\x83\xcb\ \x08\x0b\x0b\x0b\x06\x3e\x3e\x3e\x06\x76\x76\x76\xb0\x3c\x48\x0e\ \xa6\x06\x39\x04\x00\x02\x08\x4c\xde\xbe\x73\xe7\xd0\xed\x5b\x37\ \x80\x16\x01\xe3\xf4\xcb\x47\x48\x54\x40\xe3\x1e\xec\x80\xe7\x0f\ \x19\x18\xee\x5d\x05\x3b\x8c\x65\x7e\x1b\x03\x77\xae\x0f\x03\xcb\ \x89\x9d\x0c\xff\x38\x79\x19\xfe\x81\x42\x03\xea\x08\x50\xf0\x8b\ \x8a\x8a\x32\x38\x3a\x3a\x32\x3c\x7c\xf8\x90\x21\x22\x22\x82\x61\ \xd2\xa4\x49\xf0\x44\x88\x2d\x0d\x00\x04\x10\xd8\x01\x2f\x9e\x3d\ \x3d\x73\xe7\xf5\x87\xdf\x0c\x5a\xa6\x0c\x0c\x32\xca\x0c\x0c\x6c\ \xec\x70\xdf\x83\x30\xe3\x3d\x60\xc8\x7c\xfa\x00\x8c\x86\x77\xc0\ \xd4\xf7\x9d\x81\xe9\xe1\x7d\x06\xde\xaa\x08\x06\xb6\x83\xeb\x19\ \xfe\x01\xd3\xce\x7f\xa4\x28\x01\xf9\x0c\x58\x78\x31\x9c\x3b\x77\ \x8e\x61\xcb\x96\x2d\x0c\x15\x15\x15\x0c\xab\x56\xad\x62\xe0\xe0\ \xe0\x80\x87\x14\x48\x0d\xcc\x01\x00\x01\x04\x76\xc0\x97\x2f\x5f\ \xee\x5c\x3a\x77\xf6\x16\x03\xb7\x00\x03\x83\xaa\x1e\x6a\xdc\x7f\ \xfe\xc8\xc0\x78\xeb\x3c\x03\xc3\xcf\x6f\xe0\x74\xc0\xf0\x17\x18\ \x4a\x9c\x40\x47\x01\xf3\x3f\x7f\x4d\x1c\x03\xcf\x8a\x7e\x86\x7f\ \xcc\x2c\x70\x47\x80\x2c\x00\x15\xc7\xaa\xaa\xaa\x70\x73\x66\xcf\ \x9e\x0d\xae\x43\x60\xd9\x10\x39\x04\x00\x02\x88\x09\x1a\x34\x3f\ \x4e\x9f\x3e\x7d\x10\x94\x7d\x90\x0b\x1e\x90\x52\xc6\x1b\x67\x18\ \x18\x9e\xde\x07\x66\x51\x60\xba\xf8\xfa\x09\x91\x25\x59\x81\x72\ \xdf\x7e\x33\x30\xbd\x7f\xcd\xf0\x1f\x5c\x0b\x42\x12\x18\x28\x1a\ \x80\x85\x1b\x83\x86\x86\x06\xdc\x2c\x60\xed\x07\x4f\x90\xe8\x0e\ \x00\x08\x20\x26\x98\xa2\xbb\x77\xef\x1e\xba\x73\xe7\x0e\xaa\xef\ \x7f\xfe\x60\x60\x3a\xb6\x03\x92\x2e\xbe\x7c\x82\x44\xc1\x7f\x68\ \xa1\x02\x2c\x7f\xfe\x8b\xf2\x30\x7c\x71\x8b\x66\xf8\x0f\xb4\x14\ \x9c\x0e\xa0\x16\x80\x0a\x21\x50\x62\x84\x01\x13\x13\x13\x70\xe9\ \x0a\xca\xaa\xb0\x68\x82\x25\x42\x80\x00\x82\x3b\x00\x98\x68\x8e\ \x5c\xbb\x76\xed\x13\x72\x08\x80\x0c\xfc\x2b\xa5\x04\xf4\x39\xd0\ \x01\xef\x5f\x41\xa2\xe0\xdf\x7f\x50\x51\x00\x74\x1c\x30\x39\x58\ \xb8\x33\xfc\x96\x53\x03\x97\x1d\xb0\x34\xf0\x97\x15\x98\x7e\x98\ \x98\x19\xb4\xb4\xb4\x18\xc4\xc5\xc5\x19\x6c\x6c\x6c\x18\x80\x55\ \x39\xc4\xcd\xd0\x9c\x80\x1c\x02\x00\x01\xc4\x84\x54\xb2\x3d\x03\ \x26\x9c\xd3\x48\x65\x26\xc3\x7f\x60\xdc\xfe\x0a\x4a\x67\xf8\x15\ \x59\xc4\xf0\x8f\x8b\x0f\x98\x5a\x81\xb9\xe1\xef\x7f\x48\xca\xe4\ \x60\x64\xf8\xea\x1c\x0e\x76\x0f\xd8\xf7\xa0\xe2\xf5\xe7\x77\x06\ \xa1\xf5\xd3\x19\xfe\x7f\x78\xc3\x20\x28\x2a\xc6\x30\x79\xf2\x64\ \x86\x65\xcb\x96\x81\xa3\x04\x14\x35\xa0\x90\x81\x65\x43\x18\x00\ \x08\x20\x26\x24\x1f\xff\x07\x86\xc0\x59\x50\x0b\x07\x5e\xf9\x80\ \xca\xf9\xdf\xbf\x18\x7e\x59\x79\x32\x7c\xcb\xef\x65\xf8\x2b\xa7\ \xce\xc0\xf0\x1d\xe2\xfb\x3f\x72\xca\x0c\x3f\x35\x80\xb9\xe6\xd7\ \x77\x78\x7a\x61\xf8\xf5\x93\x81\xfb\xca\x31\x06\xae\x93\x3b\x18\ \x78\xf8\x05\x18\xb8\xa1\xd5\x36\x28\xe8\x41\xe9\xe0\xe8\xd1\xa3\ \xe0\xca\x08\xb9\x2e\x00\x08\x20\x26\xe4\x12\x0f\x98\x0e\x8e\x82\ \x5a\x3a\xf0\x44\x08\x2d\x68\x18\xbe\x7d\x61\xf8\x2b\x22\xc5\xf0\ \xb1\x65\x25\xc3\x8f\xb0\x04\xa0\x45\x40\x77\x58\xfb\x30\xfc\xe1\ \xe5\x67\xf8\x0f\x74\x24\x24\xba\x80\x85\x0b\x30\xa1\x7e\x55\x33\ \x06\xa7\x53\x9e\xcf\xef\x18\x7e\x00\x7d\x0d\xaa\x2d\x41\x85\xd1\ \x89\x13\x27\x18\xd6\xac\x59\x03\x6e\xc2\x21\xa7\x01\x80\x00\x42\ \x71\xc0\x83\x07\x0f\x8e\x03\xeb\xf4\x37\xc8\x85\x06\x2c\x6b\xfd\ \xff\xf1\x8d\xe1\x1f\x0f\x3f\xc3\xc7\xa2\x7e\x86\x0f\xcd\xd3\x19\ \xbe\x3a\x86\x00\x43\xe2\x27\x24\xaa\x40\x36\x02\x7d\xf9\x87\x9b\ \x8f\xe1\x83\x95\x37\x03\xe3\xaf\x1f\x0c\x2c\x8c\xff\x81\x41\xce\ \x0e\xb6\xf0\xd3\xa7\x4f\x60\xac\xac\xac\x0c\x6e\xca\x81\x5a\x4e\ \xb0\x10\x00\x08\x20\x14\x07\x00\xb3\xca\x6b\x60\x76\x3c\x09\x8a\ \x2f\xf4\x0a\x04\x14\x1a\xa0\x20\x06\xd6\x30\x0c\x5f\x5d\x23\x18\ \x7e\x4b\x03\x0b\xac\xdf\x3f\x20\x85\x15\x38\xa4\xfe\x32\xfc\xe6\ \x13\x66\xe0\x3b\xb5\x93\x41\x6a\x72\x2b\x83\xc2\xa4\x5c\x06\xbe\ \x7f\x3f\x19\x3e\x02\x43\x00\x14\xec\xa0\x74\x00\xaa\xae\x41\x0d\ \x17\x58\x7b\x02\x04\x00\x02\x88\x09\xbd\xe2\xb9\x7c\xf9\xf2\xc1\ \x37\x6f\xde\x80\x83\x08\xd9\x11\xb0\x5c\x01\x8e\x92\xef\x5f\x19\ \xfe\xff\xf9\x0d\x0e\x6a\x78\x48\x81\x34\x03\xd3\x0b\x28\x1a\x40\ \x09\x14\x94\x85\x39\x04\x84\x81\x6e\x86\xb4\x7e\xb6\x6f\xdf\x0e\ \xce\x0d\xc0\x42\x0f\x25\x0d\x00\x04\x10\x86\x03\xae\x5f\xbf\x7e\ \x00\x18\x4c\x7f\x61\x0e\x40\x89\x06\x24\x1a\x56\xfe\xc3\x31\x88\ \x0f\x74\xd4\xf3\xd0\x02\x86\xfb\x65\x13\x19\x9e\x07\xe6\x00\x13\ \x02\x3f\x03\x17\x3b\x1b\x38\x27\xac\x5d\xbb\x16\x6c\x7e\x55\x55\ \x15\x38\x47\xc0\x5a\x46\x00\x01\x84\xe1\x80\x67\xcf\x9e\xdd\x00\ \x96\x09\x2f\x90\x1b\x1b\xe8\x15\x09\xae\x46\x27\xb0\xa6\x66\xf8\ \x07\xac\x2b\x9e\xeb\xd8\x32\xdc\x57\x31\x65\x78\x05\xac\x33\x40\ \xf1\x0d\x6c\x5b\x82\xeb\x07\x50\xab\x09\x54\x51\x81\x12\x25\x03\ \xa4\x34\x61\x00\x08\x20\x0c\x07\x00\x2d\xfe\x0c\x6c\x56\x1d\x87\ \x39\x00\xd9\x42\x98\xef\x61\x16\x82\x0c\x07\xf9\x04\x94\xb7\x41\ \x89\xec\xd5\xab\xd7\x0c\xef\xdf\xbd\x63\xf8\x0d\xac\x3f\xb8\xd9\ \x58\x19\xe4\x80\xad\x22\x11\x11\x11\x06\x60\x03\x97\xa1\xbe\xbe\ \x9e\xa1\xa0\xa0\x80\x21\x35\x35\x15\xdc\xd1\xf9\x0f\x35\x08\x20\ \x80\xb0\x36\xcb\x81\x0e\x38\xf8\xfe\xfd\xfb\x10\x50\x43\x13\xb9\ \x11\x0a\xb2\x10\x56\xa7\x83\xca\x76\x60\xef\x86\xe1\xe9\xd3\xa7\ \x9f\x80\x15\xcd\x2f\x60\xb0\x32\x82\x6a\x3c\x10\x06\xa9\x83\x39\ \x18\x86\x41\xe2\xa0\xb6\x22\xa8\xcd\x08\x6c\xb0\x9c\x7b\xfe\xfc\ \xf9\x75\x90\x1a\x80\x00\xc2\xea\x00\x60\x56\x3c\x08\xec\xe9\xfc\ \x05\x16\xa5\xcc\xb0\x16\x0c\x28\xde\x40\x89\x13\xd8\x31\xf9\x01\ \x34\xe4\xfa\xf9\xf3\xe7\x4f\x02\x13\xec\xe1\xfb\xf7\xef\x9f\x07\ \xaa\xf9\x01\x0b\x52\xe4\x68\x41\x6e\xc4\x22\x03\x60\x63\xf5\x2d\ \x50\x0d\xb8\x7a\x04\x08\x20\xac\x0e\x00\xfa\xea\xc6\xa9\x53\xa7\ \x4e\x00\xb3\x8c\x35\xd0\x97\x7f\x81\x16\xde\xbe\x7a\xf5\xea\x65\ \x20\x3e\x05\x2c\x2d\x8f\x02\xbb\x66\x37\x81\x06\xbc\xa3\x46\xe7\ \x14\x20\x80\x18\x71\xf5\x8e\x81\x2d\x1b\x15\x60\xde\xb5\x7e\xf9\ \xf2\xe5\x63\x20\xbe\x0a\x54\xf7\xea\x3f\x0d\xba\xd2\x00\x01\xc4\ \x38\xd0\xdd\x73\x80\x00\x03\x00\x50\xd0\xf3\xb1\x8f\x69\x75\x10\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x53\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x03\xd0\x49\x44\ \x41\x54\x78\xda\xc5\x57\x4b\x6f\x53\x47\x18\x3d\x33\xbe\xd7\x8f\ \x24\x24\x0b\xa2\xc2\x06\x22\x16\x2d\x85\x05\x6a\x05\x91\x5a\x04\ \xc4\x41\x14\x3b\x49\x91\x50\x97\x65\x81\x04\xe2\xb1\x6a\x0b\x5d\ \x34\x95\x2a\x55\x2d\x12\x08\x09\xa9\x42\x08\x44\xbb\x80\xfc\x81\ \xae\x2a\xc7\x85\xaa\xbc\x55\x55\x8d\xaa\x76\xc3\x02\x2f\x22\xc8\ \x02\xf2\x28\xa5\x71\x82\xe3\xeb\xb1\xef\x65\x3c\x19\x7b\xae\x87\ \x3b\x4c\x50\x8a\x38\xf2\xa7\x79\x58\xf7\x9e\x33\xdf\x7c\x73\x3c\ \x26\x00\x28\x8f\x95\x3c\x7a\x78\xb8\x78\x35\x60\x3c\x1e\xf0\x78\ \x1c\x04\x81\x8f\x10\x1c\x49\xba\x96\x31\x36\xc6\x03\x84\x10\x70\ \x44\xb6\x36\xf0\x97\x47\xb6\x8e\xe3\xc0\x75\xdd\x2d\x00\x8a\x3c\ \x3c\x4d\x80\x40\xbc\x4e\x5e\x2e\x97\x41\x29\x15\x64\xe1\xe0\x08\ \xf7\x9b\x63\x41\xa0\xc8\xc3\xc4\x7a\x08\x0e\x48\xe8\x02\x48\xf8\ \xa5\x85\xfb\x8f\x50\x9c\x2f\x19\x56\xae\x8d\x15\x79\xe4\xb8\xb3\ \xa3\x0d\x6f\xf6\xac\x0e\x3f\x43\x9e\x17\xa0\xa1\x52\xa9\x22\x19\ \x8f\x6b\x02\x0c\xe4\x1a\xa9\xde\xf7\x3c\x86\xe9\xff\x16\xf0\xe5\ \xc8\x75\xc4\xfb\xbf\x39\xc5\xe6\xa6\xf7\xcb\x5a\x40\x58\x51\x92\ \xc7\xbb\xa5\x52\xe9\x37\xcf\xf3\x30\x3e\x31\x25\x88\x6e\xdf\xbc\ \x0e\xf0\x76\x47\x5f\x3f\x6e\xf1\x7e\x88\xbc\x39\xa7\x63\xfb\x8e\ \x74\x8b\x88\xc7\x73\x1e\x8e\x5d\xfe\x13\x47\xf7\xbe\x8f\x00\xc0\ \xe7\xe7\xf3\x85\x6a\xd5\xef\xab\x5d\x3d\x3e\x69\x14\xf0\x70\xfa\ \x5f\xf3\xea\x55\xdf\xbc\x72\x89\x99\xd9\x32\x8e\x5e\xf8\x1d\x47\ \xf6\xbe\x87\xde\xb7\x56\x89\xb9\xb1\xc2\x14\xbe\xb8\x78\xf5\x1e\ \xab\xfa\xe9\xea\x95\xcf\x26\x5b\x04\x2c\x2c\x2c\x08\x01\xf3\x4f\ \xcb\xa8\x54\xab\x06\x52\xd1\x5a\xab\xff\x9f\xa2\x87\x03\x67\xef\ \xe0\xc0\x9e\x5e\x6c\x5a\xd7\x8d\x20\xb4\xda\xbf\xc7\x67\xf0\xd5\ \x0f\xbf\xde\x63\xb5\x5a\x9a\xe5\x3f\x9d\xd4\x05\x84\xab\xff\x45\ \x27\x22\x8a\x5c\xc4\xd4\x93\x12\x3e\x3a\xf1\x0b\x3e\xce\x6c\xc2\ \xc6\xb5\x2b\x05\xb9\xbe\xe7\x77\xef\xcf\xe0\xeb\x4b\x37\xb8\x08\ \x3f\x4d\xa1\xc1\x52\x70\x56\x7f\x38\x7c\xee\x0e\x0e\x7e\xb8\x19\ \x6f\xaf\xe9\x86\x1f\x10\x04\x3c\x3c\x16\xd4\x43\x8c\x6b\x3c\x36\ \xf4\xbc\x81\xd3\x47\x76\xad\x77\x9d\x58\xce\x31\x91\xe4\xf3\xf9\ \xf0\xaa\x45\x36\x86\x86\x86\x90\xcb\xe5\x5a\x48\x07\x07\x07\x31\ \x3a\x3a\x2a\xfa\xd9\x6c\x16\x5d\xed\x49\x7c\xf7\xe3\x1f\x40\x20\ \x3e\xe8\xee\x4c\x60\x78\xdf\x36\xd4\xf1\xed\xc8\x4d\x5e\x1b\x25\ \x34\xd2\x92\x74\xdd\x09\x7d\x0b\x54\xda\xed\x5b\x11\x69\x3a\xbe\ \xef\xb7\x8c\xdf\xf9\xe4\x27\x9c\x3c\x94\x46\x1d\xc3\xdf\x5f\xc3\ \xf8\xc8\x3e\x62\xf4\x01\xfb\x56\xd8\xa1\x1c\x52\x8d\xab\xbe\xec\ \x53\x82\x48\x23\xd2\x9d\x70\x76\xee\xa9\x61\xaf\xed\xa7\x40\x77\ \x42\x42\x28\x6a\x3e\x24\xe8\x8b\x05\x48\xf7\xd2\x9c\xd0\xd8\x46\ \x12\xeb\x4e\x08\x42\xc0\x6a\x8d\x05\xda\x05\x20\x95\x70\x45\x7b\ \xfb\xd6\x0d\xd1\xf6\xa5\x77\x4a\x27\x84\x04\x69\xce\xa9\x54\x07\ \xd2\x09\xfb\x23\x84\xc4\x44\xe5\x2f\x59\x40\x32\xb9\x28\x60\x77\ \x66\x77\x63\xa5\xa2\xaf\x67\x20\x93\xcd\x68\x44\x86\x96\x12\xde\ \xaa\x2d\xb6\x0a\xe8\xea\x68\x87\xc7\xd8\xff\xb2\x05\x71\xc7\xe1\ \xfc\x14\x3e\x5e\x22\x03\x2b\x3a\x52\xe8\x24\x6d\x86\xe3\xa7\xe6\ \x24\x22\x8f\x5e\x78\x8e\x80\xa0\xc2\xb0\x58\x07\xb6\x0c\x88\x07\ \x08\x89\x18\x5b\x7f\xfb\xcd\x73\x94\x8a\x1a\xe0\x0d\x08\x8d\x19\ \x05\xe8\x50\x4e\xa8\xc2\xe4\x84\x62\xae\x8e\x81\x81\x01\x5d\x90\ \x48\x7b\xc2\x75\x16\xfb\xd6\x63\xa8\x56\x2d\x5e\xa6\xa7\x5e\x12\ \xea\x59\x12\xc2\x1a\x69\x7f\x1e\x14\x49\x37\x06\xc0\xbe\x05\xf6\ \xd4\xab\xe2\xd3\x8b\xd0\xb8\x15\x84\x72\x01\x71\x99\x01\x6a\xcf\ \x40\xf3\x4e\x68\x77\x41\xbb\x1b\x76\xad\x68\x17\xcf\x24\x9c\x46\ \x06\x96\xee\x84\xcb\xba\x90\xc8\xbe\x74\xc2\x18\x7f\x5f\xcc\x56\ \x03\x2a\x8d\xdc\x09\x6d\x77\x42\xe9\x84\xd7\xe4\x73\xc6\x3b\x61\ \xb3\x08\xdb\x12\x4e\xf3\x27\x5d\x61\x19\x77\xc2\x97\xb9\x19\x9f\ \xf9\xf9\x09\xc6\xc6\x8b\xc2\xad\xcb\x8c\xe5\x0b\xe7\x3f\x18\x34\ \x0b\x50\x77\xc2\x65\x5e\xcb\x95\x13\x76\xb4\x27\x91\x48\x24\x90\ \x4a\xa5\xb6\x02\xf8\x8b\x7f\x57\xd6\xb7\x20\xd0\x9d\x90\x13\xe9\ \xb1\xd4\x1a\x88\x8c\x10\x02\x53\x0d\x54\x5c\xd7\x6d\x10\x58\x57\ \x2f\xc7\x46\x57\xd4\x45\x39\x8e\x23\x38\x10\x81\xd7\xfe\xef\x98\ \x48\x53\xa1\x92\x9c\xe0\xd5\x20\xe0\xc1\x14\xb9\xc2\x33\x85\x55\ \x8a\x6f\x5f\x16\xc6\xec\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x06\x69\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x05\xe6\x49\x44\ \x41\x54\x78\xda\xb5\x97\x59\x68\x1d\xd7\x19\xc7\xff\xdf\x99\x33\ \xdb\x9d\xab\x7b\x2d\xc9\x92\xea\xd8\x52\x64\x59\x38\x76\x49\x88\ \xd3\xcd\x4e\x5d\x91\x2e\x90\xa4\x94\xd6\x0f\x5d\xe8\x43\x08\x6d\ \x70\xe8\x42\x21\x7d\xd1\x5b\x69\x5e\xd2\x17\xd3\x36\xd0\x36\x10\ \x08\x86\x42\x69\x30\x94\x52\xfc\xd2\x42\x9a\x12\x28\x8d\x4b\xda\ \xd8\xd9\xdc\xca\x56\x65\x29\x96\x2c\x45\x57\x57\x57\xd2\xdc\x6d\ \xd6\xf3\x7d\x65\x94\x57\x93\xf4\xde\x5a\xbf\x39\xdf\xe1\x2c\x03\ \xf3\xe3\x63\x38\x0b\x89\x08\xfa\x62\x76\x5c\xc9\x63\xfe\x71\x06\ \xfb\xd6\x21\xef\x4d\x0c\x5f\xcd\xd1\x07\xbd\x09\x5c\x39\x5a\xcd\ \xc3\xf0\xa7\xc8\xf4\x69\xe5\x4d\x1f\x84\x77\x97\x83\x82\x78\x35\ \xe7\xee\xc2\xba\x38\xf9\x3f\xad\x91\xca\xac\xba\x6f\x61\xf5\x8e\ \x0b\xf0\xdf\xc7\xbf\xc6\x4d\xfe\xa5\x9a\x7a\xaa\x42\x07\xce\x68\ \xe8\x32\x40\x4a\x50\x20\x4c\xc8\xdb\x90\xb5\x8b\x46\x16\x9e\x8d\ \xa4\x6a\x3d\xad\x4f\xdf\xfa\xd5\x1d\x13\x30\x7f\x19\x79\x11\x31\ \x7d\x09\x1f\x7b\x4e\x50\x9e\x16\x51\x8a\x09\x04\x10\x09\x76\x11\ \x82\x48\x21\xa2\xd0\x9c\xb7\xf0\xc6\x0f\x48\x6c\x73\x59\x3f\x18\ \x7c\x1e\x03\x2b\x8c\x0f\x40\xe1\x43\xe0\xbf\x1d\x3c\x2b\xdd\xe8\ \x91\x6c\xea\x4c\x8d\xbd\x72\x9b\xb9\xde\x16\x53\xeb\xb2\xa9\x75\ \x38\xaf\x75\xdf\x8f\x8d\x0e\x9b\x7a\x11\x6d\xf6\x2b\xad\x7c\xf2\ \xcb\x1b\x14\xc5\x27\xf2\x2b\xf9\x4f\xf0\x21\x68\x7c\x00\xf2\xe6\ \x91\x31\xd9\x09\x9f\xc9\xaa\xc3\x6b\xe2\x5a\x31\x99\x75\x26\x26\ \x00\x04\xa2\xdb\xbc\x2f\xbb\x35\xd8\x73\x3a\xf9\xc0\xb0\xd1\x61\ \xe3\xbb\x7c\x79\xea\xb7\xea\xe3\x8b\x57\xfb\x12\xe0\x8d\x9d\xf3\ \xc6\x29\xa5\x34\xf1\x75\x31\xd9\xf5\xb6\x95\x2e\x10\x94\xaf\xa0\ \x08\x02\x92\xdb\x28\x40\x4c\x2c\x2c\x4b\xa1\x9a\x78\x54\xc9\xca\ \xab\x83\xa8\xaf\xfd\x06\xc0\x03\x7d\x09\x20\x4d\x4e\xc8\xe1\xaf\ \x34\xd5\xc0\x27\x02\xda\x79\x6b\xc3\x44\xaf\x6d\x2b\x7b\xc4\x26\ \x2b\xb0\x88\x14\x00\x2a\x8a\xa0\x40\x84\xc4\x74\x0c\x9b\x46\x46\ \xc5\x6c\xf0\x80\x8b\xa9\x7b\x52\x7a\xfb\x99\x23\xf8\xf7\xa4\x8f\ \x8f\xbe\x1b\xf5\xf4\x0f\xc8\x1b\x47\xc7\xc8\x70\x99\x06\x3f\x65\ \x43\x36\xbb\x84\x8c\x2d\xef\xb0\x47\x24\x4c\xd2\xcc\x48\xda\x19\ \x61\x27\x25\xd9\xce\x48\x5a\x39\x21\x31\xa4\x48\x2c\xef\x78\x60\ \x39\x13\x9e\x50\x98\xa8\xe1\xcf\x78\x28\x1f\x26\x6e\xd3\xa9\x9e\ \x33\x20\x69\xf4\x59\xb6\x75\xa2\xbc\x43\x0e\x9b\xe5\x8e\xd2\x81\ \xb2\x06\x9f\x9c\xb6\xec\x11\x17\x60\x08\x3c\x4d\xe8\xa4\x22\x29\ \x83\xaa\x2e\x29\x57\x41\x32\x16\x8e\x0d\x77\xfe\x74\xcb\x74\xfe\ \xb1\x4d\x95\x6f\xda\x52\x39\x6a\xa4\x7b\xe9\x21\x00\xaf\xf4\x24\ \x80\x2c\x3f\x02\x6d\xc7\x92\x6f\x44\xa4\x8c\x90\x74\xb2\xb4\x71\ \xfe\x86\xe3\x56\x2c\x28\xc5\x49\xea\xd9\x8e\x4d\xa2\xb4\xa7\x1a\ \x8d\x1d\x1a\x1e\xa8\x35\x85\x1c\x15\xc7\x64\x39\x74\xb3\x4b\x54\ \xd6\x20\x4d\x28\x4d\x30\xc2\xbf\xde\xdd\x73\x06\x48\x59\xf3\x20\ \x90\x69\xbd\xd2\x20\x3b\xee\x82\x04\x5a\xe6\x9b\x8d\xc6\x50\x69\ \xb8\xda\x89\x5c\x08\xe6\xae\x71\x50\x2d\x4b\x56\xad\x04\x02\xd3\ \x4d\xe2\xc4\xd6\x96\xe5\x2a\x42\x62\x60\x8d\xb9\x62\x36\x63\xa4\ \x9b\x44\xb6\x75\xb3\xf7\x75\xa0\xe2\x5c\xa1\x2c\x73\x90\x2c\xa4\ \x62\xb6\x73\x22\x08\x29\x80\x60\x84\x90\x33\x11\x73\xa5\x82\x74\ \xab\xc3\x7a\x20\x88\x92\x62\xae\xdd\xd5\xb6\xa3\x5b\x29\x08\x80\ \x74\x73\x89\xe7\x9a\x68\x5d\x07\x59\x34\xd7\xb3\x00\xdd\xbb\xb8\ \x48\x5a\xd5\xad\xb8\xeb\x13\x33\x08\x02\x02\x64\xb0\xd2\x8a\x96\ \xd7\xc4\x27\x12\x71\x3d\xe2\x72\xd9\xcd\x8b\x76\x37\x12\xe5\xd8\ \xc6\x00\x82\xa2\x8f\x6c\x23\xe3\xd5\x9f\xad\x53\xf8\xaf\x8c\x2c\ \xfc\xa1\xaf\x95\x90\x4a\xfe\xaf\xd5\xd6\xd6\x98\xca\x53\x1b\x80\ \x14\x45\x11\x0b\x33\x76\xbb\x54\x3c\x6a\x77\x5c\xde\xdb\xc8\xdd\ \x7d\x95\x24\x01\x89\xa0\xc0\xa4\x4a\xed\xd4\x86\xe0\xdb\x7f\xc6\ \xc9\x95\xb4\x3f\x81\xac\xf4\x0b\xca\x93\x9c\x5a\x61\x15\x9c\x2b\ \x40\xa4\x88\x03\xa3\x1c\xcf\x2f\x46\x5e\xd1\x26\x30\xa2\x94\x95\ \xb6\xc0\x04\x16\x2a\xc4\xc4\x80\x3a\xad\x40\xb5\xc2\x0a\x05\xfe\ \x6c\xff\x7b\xc1\xe7\x6e\x64\x54\x1d\x98\x55\x5b\xf5\x83\x94\xc4\ \x2e\x84\x77\x1d\x3c\x57\x78\xbd\xb9\xdf\xbf\xb1\xea\x97\xae\xae\ \xba\xa5\x6b\xef\x96\xca\x93\x87\x54\x24\x22\x10\x61\x48\x12\x3b\ \xaa\x5e\x3b\x08\xdf\x7f\x01\x27\x57\x6a\xff\xf7\x6e\x28\x2f\x0f\ \xbd\xc4\x41\x70\x80\x3f\x72\xd7\xaa\x72\x9c\x1c\x44\xd2\xea\x6a\ \x5d\x29\x73\x4e\x20\x34\x42\x6d\x0f\x55\xb3\x0c\x85\x40\x66\x14\ \xd5\x6b\xa3\x54\xdf\x28\xd1\x4c\xe5\x3e\x04\xbd\xed\x86\xb7\x67\ \x60\xe0\xac\x6a\x86\xc3\x94\x25\xb6\x08\x0b\x84\xa1\x2d\xc3\xd7\ \x16\xed\xe0\x9d\xff\x38\x41\x37\x11\x05\x66\x48\x11\x79\xa2\xb1\ \xbd\x35\x4a\x03\xfe\xec\x6d\x3e\xde\x9f\x00\x9d\xbc\xb9\x0c\x6d\ \xbf\x45\x61\xb8\x0f\x79\xae\x44\x18\x4b\xab\x96\x3f\x34\x98\xa4\ \x7e\x39\xe1\xeb\x4b\x2a\x10\x31\x00\xe7\x44\xdd\x4e\x89\xb2\x2c\ \xc2\xe9\xf5\x3f\xa2\xe0\x4e\x08\x14\x50\xe0\x3d\xaf\xc2\x70\x3f\ \x38\xb3\x00\x96\x02\x16\x46\x51\x5b\xea\xfd\x9e\xe4\x99\xa2\xed\ \xed\xfd\x54\xf2\x7e\x8f\x82\x3b\x29\x80\x53\xab\x17\x29\xcf\x73\ \x15\x25\x3e\x01\xa4\xd4\xae\xd6\x6e\x90\x82\x50\x31\x68\x72\x9b\ \x3a\x9d\x0a\x4a\xde\xcf\xf1\x3f\xa2\xd1\x0b\xbe\xf3\x32\x35\xc3\ \x07\xe1\xe8\x54\x1b\xe5\x20\x31\x36\x62\xd2\xae\xb0\x45\x71\xe4\ \x51\xb3\xb9\x8f\xb4\x35\x87\x4f\x2e\x37\xf6\x44\xe0\xf5\xe5\x91\ \x8b\xe3\x6a\xe3\x5b\x58\xde\xbc\xd7\x93\x16\x19\x5b\x23\x20\x42\ \x99\x81\xce\x9c\x81\x24\xdd\x3c\xf6\x27\x9f\x1e\x05\xb0\x27\x02\ \x3f\x7e\x71\xa2\xb6\x76\x8b\x9d\xa7\x9e\xfc\x2a\x46\x87\x3c\xcc\ \x5f\x7e\x15\xcc\x06\xc7\x4f\xcc\xe0\x8b\x8f\x3e\x8e\xc7\xce\xfe\ \x50\x7f\xe1\xe1\x33\x97\x9f\xd8\x2b\x01\x36\x66\xa5\xd5\x89\xf9\ \xed\x85\x1d\x35\x39\x75\x18\xf9\xfe\x87\x40\x20\x94\x0e\x9d\xc4\ \xca\x96\xc2\x76\x33\x41\x14\x45\xb7\xd0\x03\x0a\xbd\x40\xc8\xe3\ \x24\x41\x9a\xa6\xf0\x3d\xbf\x30\x82\xa5\x35\xee\xbf\xff\x04\x5a\ \xcd\x26\xea\xf5\x3a\xda\xed\xb6\x83\xbd\xca\x00\x81\x52\x93\x1b\ \x8a\xa2\x18\x49\x9a\x60\x79\x79\x19\xda\xf5\x01\x02\x4a\x41\x00\ \x4b\xa9\x22\x03\xf6\x9e\x65\xa0\x38\x02\x79\x9e\x97\x95\x82\x12\ \x0a\x1e\xff\xf6\x13\xa8\xee\x1b\x02\x33\x63\x69\x69\x09\x8d\xad\ \x86\x10\x51\x73\xcf\xee\x86\x05\xa7\x3f\x7d\xea\xd8\x4e\xd8\x7c\ \xe9\xd8\xb1\x63\xe3\x41\x29\x80\x14\x62\x5a\x23\x6c\x36\xbb\xb6\ \x6d\xff\xe8\xc2\x85\x0b\xcf\xee\xa9\x40\x81\xef\xfb\x77\x7f\xff\ \x7b\xdf\x79\xee\xc8\xf4\xf4\xd8\xf0\xf0\x08\xb9\xae\xbb\x79\xee\ \xdc\xb9\xd9\x4b\x97\x2e\xbd\xd3\xe7\xed\xb8\x77\xce\xbf\xf0\xfc\ \x81\x34\x37\xdf\xa8\x56\x07\xed\x99\x99\x99\xdf\x8d\x8f\x8f\xdf\ \x44\x1f\xfc\x17\x08\xb9\x31\x14\x4f\x04\x70\x6c\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x8d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x02\x73\x42\x49\x54\x08\x08\x55\xec\x46\x04\x00\x00\ \x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\ \xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\ \x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\ \x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x04\x0c\x49\x44\x41\x54\ \x78\xda\x7d\x55\x4d\x68\x5c\x55\x14\xfe\xee\x7d\x6f\xfe\x5e\x32\ \x51\xe3\x0f\x33\x30\x56\x05\x41\x07\x75\x23\xd4\x11\x44\xac\x6d\ \x56\x5d\xa4\x05\xc1\x5f\xdc\x77\xe3\x42\x5c\x88\x32\x44\x0c\x51\ \x71\xa1\xd9\x2b\xb8\x32\x98\x56\x14\xdb\x45\x37\x9a\x50\xbb\x10\ \x42\x36\x4a\x29\xb3\x89\xb8\xb0\xf0\x02\xf1\xaf\xce\x64\xe6\xbd\ \x99\xf7\xee\xf1\xf3\xbc\x4b\x42\x1d\xc9\xfb\x38\xcc\xbd\x73\xcf\ \xf9\xce\x77\xff\xce\x35\x82\xe9\xef\x83\x8a\x3b\x65\x16\xd1\x46\ \x93\x00\x62\xa2\x27\x97\xec\xc6\x5b\xe9\xb4\xef\x14\xc1\x4a\x53\ \x96\xf0\x8a\xab\x0b\x1c\x04\xde\x09\x16\xb4\x3e\xd6\xcc\x72\x37\ \x3e\x82\x60\xb9\x2a\x5d\xbc\xee\xa2\x0c\x13\xa4\x18\x23\x27\x09\ \x18\x1c\xa0\x8c\x0a\x4a\x08\x61\x87\x58\x35\x2b\x4b\xc9\xff\x12\ \xbc\xd3\x90\x6f\xa4\x93\x23\xc1\x3e\x2c\xb5\xb7\x50\xc7\x0c\xc0\ \x5e\x1f\x37\x10\xc3\xb1\x57\x25\x99\xd9\x32\x67\xdf\xdd\x9d\x22\ \xe8\x3e\x26\x97\x5d\x6b\x8c\x21\x09\x8e\xe3\x21\xdc\x86\xaa\xe6\ \x04\x75\x8c\x89\x11\x7e\xc2\x36\xff\x8b\xa8\xc6\xde\x30\xa7\x57\ \xae\xdd\x42\xf0\x76\x43\xb6\x5d\x2b\xc1\xdf\x98\xc7\x09\x1c\xc3\ \xed\x94\x6c\x14\x80\x20\x27\x32\x2a\xd9\xc5\x65\xfc\x81\x39\xd2\ \x90\xe2\xf8\xfb\xbb\x07\x04\x6f\x56\xe5\x8a\xeb\x50\x3a\x1e\x67\ \xf6\x06\x6a\xcc\x1c\x10\x86\x10\x00\x8e\x98\x50\x45\xca\x04\x3f\ \x60\x5b\xa7\x62\xb7\xcc\x89\x0f\x13\xc0\x02\x14\xd9\x75\x9d\x14\ \x37\x19\xde\xc1\xbd\x98\xe5\x70\x85\x28\xab\xb1\xad\x56\xc3\x0c\ \x71\x07\x9e\xc1\x13\xf4\x4c\xe1\x3a\x79\xd7\x2b\x78\xa3\x29\x3b\ \x59\x34\x40\x1d\x2f\xe1\x98\x9f\x79\x00\xab\xf9\x8b\x4f\x14\x99\ \xaa\x18\x51\xc5\xa7\xb4\x59\x84\x43\xf3\xe0\x47\xb1\x65\xfe\xa5\ \x2c\x4a\x90\x60\x01\x2d\x86\x97\x3d\x01\x29\x0e\x10\x28\x4a\xaa\ \xab\xc6\xd0\xe7\x90\x10\x59\x94\x2f\x01\xe6\xb5\x8a\xec\x4d\xea\ \x37\xf1\x14\x9e\x45\x83\xe1\x21\x1d\x3f\x63\xb6\x54\x31\x66\x2b\ \x07\x54\x8d\xc5\x7b\xfa\xff\x08\xfb\xd8\xc4\x06\xf7\xa9\xd4\x37\ \x77\x87\xee\xa4\xab\x8f\x19\xd4\xc6\xbc\xcf\x64\x00\x95\x3a\xa4\ \x8d\x94\x42\x8a\xe3\xa4\x56\x22\xe1\x04\x4f\xe2\x2a\x47\x6c\xdd\ \x9e\x0c\xf3\x33\x8e\xac\xf7\xeb\xc6\x85\xde\x2d\xe3\x60\xe2\x29\ \xc6\x98\x78\x82\x92\xaa\x08\x89\x32\x22\x3c\x80\x1d\xfe\x23\x67\ \xac\x6b\xe7\x4a\x20\xd8\xa7\x59\xcd\x4f\x02\x22\x55\x8a\x01\xf6\ \x89\x91\xce\xba\x98\x4a\xa0\x6b\xf4\x30\xc7\x73\xb8\x76\xe8\x9a\ \x39\x03\xe6\x94\x3f\x87\x00\xfa\x5b\xdc\x86\x44\x35\xe4\x80\x06\ \xc9\x01\x81\xa5\xdd\xa5\xab\x63\x9a\x24\x70\x6c\xcc\xaa\xfc\x22\ \x3f\xf0\x23\x43\x27\x5e\xc5\x90\x66\x38\x5a\x45\x0d\xf0\x14\x96\ \x98\xd7\xab\xe6\x9a\xa1\x80\xf0\x03\x50\x03\x25\xff\x8e\xbe\xc7\ \x80\xe4\x75\xc2\xa0\x0c\x78\x0a\x1a\x21\x0a\x2b\xb1\xb0\x33\x28\ \x68\xd4\xe0\x73\x04\xba\x5c\x75\x9a\x1e\x2c\x42\x3f\xef\xf7\x57\ \x41\x11\x5b\xf7\x2f\x01\xbb\x19\x28\xc8\xd3\x94\x74\xbb\x78\x8c\ \x99\x7d\x8e\x56\x1c\xaf\xc0\x87\x8b\x7a\xee\x29\x81\x8b\xad\xf4\ \xc0\xa1\x5f\x30\xd1\x39\xe5\xea\xc0\x5b\xe0\x4f\x3f\xe5\xd3\x66\ \xd8\xae\x10\x1a\xee\xfd\x7a\x4a\x28\x3d\x2b\x17\x85\xcd\x1d\xdd\ \x94\xcc\x13\x54\x74\xc9\x22\x0d\x9f\x53\x8a\x88\xfd\x6a\x41\xe0\ \xfd\xae\x33\x8a\xbd\x8b\x56\x36\xd1\x0f\x30\xc2\x36\x86\xe0\xa9\ \x23\x1c\xaa\x3e\x3b\x09\x14\xb3\x5e\x05\x25\xab\xc7\x18\x57\xe9\ \x4d\x05\x7d\xd9\x0c\x3f\x4f\x5f\x5e\xb3\xe7\x2a\xf8\x0e\x8f\x22\ \xd2\x99\x5a\x7c\x4c\x33\xf8\xcf\xa7\xe1\xb9\x6e\xef\x6f\xf8\x8a\ \x2a\x2d\x64\x6d\x2d\xb5\x80\x2c\xcb\x90\x6c\x58\xe7\x25\x4d\x30\ \xf6\x17\xc8\x41\xa6\x82\x33\x1d\x4d\xf0\x09\x84\x89\x64\x28\xcb\ \x5a\x50\xbe\x88\xb1\x1a\x90\xf1\x57\x5c\xc1\x00\x23\xa4\x04\x97\ \x54\xe1\x14\x45\x7b\xa2\x23\x23\x6a\xfd\x99\xde\x4c\xb9\xca\x48\ \x84\xc5\x63\x80\x85\xa0\x53\xc3\xb7\x30\x58\x28\x02\x6e\x29\x6a\ \xbe\x2a\x82\xd9\x19\xfe\x35\x6a\x60\xf8\x16\xa3\x0e\x8b\xea\x8b\ \x2c\xaa\xa2\x35\xf9\x3e\xbc\x8a\x16\xca\x44\x78\x70\x78\xa8\x42\ \xc3\xf7\x58\x8b\x76\xb4\x2e\x1b\x16\xd5\xf5\xc3\xa2\xaa\x14\x2c\ \xeb\xd2\xca\x90\xd2\x79\x11\x4f\x23\xf2\x55\x89\x0a\xbc\xa6\xef\ \xf1\x25\x8c\x5e\x7a\x86\x9f\x5e\xbf\x36\xf5\xb0\xbc\xd0\x00\x1f\ \x16\xa7\x42\x67\x78\x5d\x1f\xc1\x3d\xb8\x93\x21\x7f\x32\xf3\x75\ \x62\xa0\x27\x92\x94\x5b\x38\x7b\x7e\xfa\x61\x51\x0a\x7d\xda\x24\ \x2a\x96\x2c\x2b\x76\xc2\x97\x91\x52\xb1\x26\xfa\xb4\x9d\x4f\x8e\ \x78\x5c\x9f\xd7\xc7\x55\xea\x87\x97\xcb\xa8\x11\xfa\xb8\x5e\x38\ \xe2\x71\x3d\x24\xa9\xc8\x29\x2c\x9a\xb6\xf8\xe7\xdd\xc4\xd2\xc3\ \x25\xb3\x71\x21\x9d\xf6\xfd\x07\x43\x0c\xf2\x3f\x4b\xf9\x60\x0d\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x8d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x02\x73\x42\x49\x54\x08\x08\x55\xec\x46\x04\x00\x00\ \x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\ \xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\ \x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\ \x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x04\x0c\x49\x44\x41\x54\ \x78\xda\x7d\x55\x4d\x68\x5c\x55\x14\xfe\xee\x7d\x6f\xfe\x5e\x32\ \x51\xe3\x0f\x33\x30\x56\x05\x41\x07\x75\x23\xd4\x11\x44\xac\x6d\ \x56\x5d\xa4\x05\xc1\x5f\xdc\x77\xe3\x42\x5c\x88\x32\x44\x0c\x51\ \x71\xa1\xd9\x2b\xb8\x32\x98\x56\x14\xdb\x45\x37\x9a\x50\xbb\x10\ \x42\x36\x4a\x29\xb3\x89\xb8\xb0\xf0\x02\xf1\xaf\xce\x64\xe6\xbd\ \x99\xf7\xee\xf1\xf3\xbc\x4b\x42\x1d\xc9\xfb\x38\xcc\xbd\x73\xcf\ \xf9\xce\x77\xff\xce\x35\x82\xe9\xef\x83\x8a\x3b\x65\x16\xd1\x46\ \x93\x00\x62\xa2\x27\x97\xec\xc6\x5b\xe9\xb4\xef\x14\xc1\x4a\x53\ \x96\xf0\x8a\xab\x0b\x1c\x04\xde\x09\x16\xb4\x3e\xd6\xcc\x72\x37\ \x3e\x82\x60\xb9\x2a\x5d\xbc\xee\xa2\x0c\x13\xa4\x18\x23\x27\x09\ \x18\x1c\xa0\x8c\x0a\x4a\x08\x61\x87\x58\x35\x2b\x4b\xc9\xff\x12\ \xbc\xd3\x90\x6f\xa4\x93\x23\xc1\x3e\x2c\xb5\xb7\x50\xc7\x0c\xc0\ \x5e\x1f\x37\x10\xc3\xb1\x57\x25\x99\xd9\x32\x67\xdf\xdd\x9d\x22\ \xe8\x3e\x26\x97\x5d\x6b\x8c\x21\x09\x8e\xe3\x21\xdc\x86\xaa\xe6\ \x04\x75\x8c\x89\x11\x7e\xc2\x36\xff\x8b\xa8\xc6\xde\x30\xa7\x57\ \xae\xdd\x42\xf0\x76\x43\xb6\x5d\x2b\xc1\xdf\x98\xc7\x09\x1c\xc3\ \xed\x94\x6c\x14\x80\x20\x27\x32\x2a\xd9\xc5\x65\xfc\x81\x39\xd2\ \x90\xe2\xf8\xfb\xbb\x07\x04\x6f\x56\xe5\x8a\xeb\x50\x3a\x1e\x67\ \xf6\x06\x6a\xcc\x1c\x10\x86\x10\x00\x8e\x98\x50\x45\xca\x04\x3f\ \x60\x5b\xa7\x62\xb7\xcc\x89\x0f\x13\xc0\x02\x14\xd9\x75\x9d\x14\ \x37\x19\xde\xc1\xbd\x98\xe5\x70\x85\x28\xab\xb1\xad\x56\xc3\x0c\ \x71\x07\x9e\xc1\x13\xf4\x4c\xe1\x3a\x79\xd7\x2b\x78\xa3\x29\x3b\ \x59\x34\x40\x1d\x2f\xe1\x98\x9f\x79\x00\xab\xf9\x8b\x4f\x14\x99\ \xaa\x18\x51\xc5\xa7\xb4\x59\x84\x43\xf3\xe0\x47\xb1\x65\xfe\xa5\ \x2c\x4a\x90\x60\x01\x2d\x86\x97\x3d\x01\x29\x0e\x10\x28\x4a\xaa\ \xab\xc6\xd0\xe7\x90\x10\x59\x94\x2f\x01\xe6\xb5\x8a\xec\x4d\xea\ \x37\xf1\x14\x9e\x45\x83\xe1\x21\x1d\x3f\x63\xb6\x54\x31\x66\x2b\ \x07\x54\x8d\xc5\x7b\xfa\xff\x08\xfb\xd8\xc4\x06\xf7\xa9\xd4\x37\ \x77\x87\xee\xa4\xab\x8f\x19\xd4\xc6\xbc\xcf\x64\x00\x95\x3a\xa4\ \x8d\x94\x42\x8a\xe3\xa4\x56\x22\xe1\x04\x4f\xe2\x2a\x47\x6c\xdd\ \x9e\x0c\xf3\x33\x8e\xac\xf7\xeb\xc6\x85\xde\x2d\xe3\x60\xe2\x29\ \xc6\x98\x78\x82\x92\xaa\x08\x89\x32\x22\x3c\x80\x1d\xfe\x23\x67\ \xac\x6b\xe7\x4a\x20\xd8\xa7\x59\xcd\x4f\x02\x22\x55\x8a\x01\xf6\ \x89\x91\xce\xba\x98\x4a\xa0\x6b\xf4\x30\xc7\x73\xb8\x76\xe8\x9a\ \x39\x03\xe6\x94\x3f\x87\x00\xfa\x5b\xdc\x86\x44\x35\xe4\x80\x06\ \xc9\x01\x81\xa5\xdd\xa5\xab\x63\x9a\x24\x70\x6c\xcc\xaa\xfc\x22\ \x3f\xf0\x23\x43\x27\x5e\xc5\x90\x66\x38\x5a\x45\x0d\xf0\x14\x96\ \x98\xd7\xab\xe6\x9a\xa1\x80\xf0\x03\x50\x03\x25\xff\x8e\xbe\xc7\ \x80\xe4\x75\xc2\xa0\x0c\x78\x0a\x1a\x21\x0a\x2b\xb1\xb0\x33\x28\ \x68\xd4\xe0\x73\x04\xba\x5c\x75\x9a\x1e\x2c\x42\x3f\xef\xf7\x57\ \x41\x11\x5b\xf7\x2f\x01\xbb\x19\x28\xc8\xd3\x94\x74\xbb\x78\x8c\ \x99\x7d\x8e\x56\x1c\xaf\xc0\x87\x8b\x7a\xee\x29\x81\x8b\xad\xf4\ \xc0\xa1\x5f\x30\xd1\x39\xe5\xea\xc0\x5b\xe0\x4f\x3f\xe5\xd3\x66\ \xd8\xae\x10\x1a\xee\xfd\x7a\x4a\x28\x3d\x2b\x17\x85\xcd\x1d\xdd\ \x94\xcc\x13\x54\x74\xc9\x22\x0d\x9f\x53\x8a\x88\xfd\x6a\x41\xe0\ \xfd\xae\x33\x8a\xbd\x8b\x56\x36\xd1\x0f\x30\xc2\x36\x86\xe0\xa9\ \x23\x1c\xaa\x3e\x3b\x09\x14\xb3\x5e\x05\x25\xab\xc7\x18\x57\xe9\ \x4d\x05\x7d\xd9\x0c\x3f\x4f\x5f\x5e\xb3\xe7\x2a\xf8\x0e\x8f\x22\ \xd2\x99\x5a\x7c\x4c\x33\xf8\xcf\xa7\xe1\xb9\x6e\xef\x6f\xf8\x8a\ \x2a\x2d\x64\x6d\x2d\xb5\x80\x2c\xcb\x90\x6c\x58\xe7\x25\x4d\x30\ \xf6\x17\xc8\x41\xa6\x82\x33\x1d\x4d\xf0\x09\x84\x89\x64\x28\xcb\ \x5a\x50\xbe\x88\xb1\x1a\x90\xf1\x57\x5c\xc1\x00\x23\xa4\x04\x97\ \x54\xe1\x14\x45\x7b\xa2\x23\x23\x6a\xfd\x99\xde\x4c\xb9\xca\x48\ \x84\xc5\x63\x80\x85\xa0\x53\xc3\xb7\x30\x58\x28\x02\x6e\x29\x6a\ \xbe\x2a\x82\xd9\x19\xfe\x35\x6a\x60\xf8\x16\xa3\x0e\x8b\xea\x8b\ \x2c\xaa\xa2\x35\xf9\x3e\xbc\x8a\x16\xca\x44\x78\x70\x78\xa8\x42\ \xc3\xf7\x58\x8b\x76\xb4\x2e\x1b\x16\xd5\xf5\xc3\xa2\xaa\x14\x2c\ \xeb\xd2\xca\x90\xd2\x79\x11\x4f\x23\xf2\x55\x89\x0a\xbc\xa6\xef\ \xf1\x25\x8c\x5e\x7a\x86\x9f\x5e\xbf\x36\xf5\xb0\xbc\xd0\x00\x1f\ \x16\xa7\x42\x67\x78\x5d\x1f\xc1\x3d\xb8\x93\x21\x7f\x32\xf3\x75\ \x62\xa0\x27\x92\x94\x5b\x38\x7b\x7e\xfa\x61\x51\x0a\x7d\xda\x24\ \x2a\x96\x2c\x2b\x76\xc2\x97\x91\x52\xb1\x26\xfa\xb4\x9d\x4f\x8e\ \x78\x5c\x9f\xd7\xc7\x55\xea\x87\x97\xcb\xa8\x11\xfa\xb8\x5e\x38\ \xe2\x71\x3d\x24\xa9\xc8\x29\x2c\x9a\xb6\xf8\xe7\xdd\xc4\xd2\xc3\ \x25\xb3\x71\x21\x9d\xf6\xfd\x07\x43\x0c\xf2\x3f\x4b\xf9\x60\x0d\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x34\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\ \x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd7\x0c\x1f\x00\x2a\x14\x7b\xd4\x34\xaa\x00\x00\x05\xc1\x49\x44\ \x41\x54\x78\xda\xed\x57\x69\x6c\x54\x55\x14\xfe\xee\x7d\xf7\x4d\ \xa7\xcb\x40\x17\x04\xd9\x62\x59\xa4\xe2\x82\x88\x80\x8a\x60\x50\ \x50\x11\x37\x7e\xb8\x10\x5c\x21\x90\xb8\x24\x26\x46\xd1\x88\x11\ \x13\x97\x1f\x92\xa8\x11\xb5\xc6\x68\x30\x4a\x8c\x89\x1a\x56\x35\ \xa6\xe0\x82\xad\x46\x41\xa8\x2d\x58\x88\x95\x52\xa5\x0b\xdd\x66\ \xda\x4e\xdf\xcc\x5b\xee\xe2\xbd\x6f\x66\x4c\x31\xfa\x07\x68\x7f\ \xf9\x4d\xbe\x9c\x33\xf3\xf2\xde\xf7\x9d\xf3\xce\x79\x93\x87\xff\ \x31\x18\xae\x2f\x4a\x5f\xd9\x76\xfc\xca\xe5\x1b\x0e\x8d\xc6\x30\ \x81\xe6\x12\xa5\x94\xdd\xdc\xe9\x56\x33\x8a\x9a\xa6\x76\xe7\xe8\ \x8c\x87\x6a\xee\x9f\xf1\xe0\x9e\x61\x33\x60\xc0\x9f\xfd\xb0\x69\ \xda\x65\xe7\x45\xf0\xd0\xcd\xa3\x8a\x26\x8e\x62\xef\x49\xc9\x3f\ \xba\x70\x4d\xd5\xc8\x61\x31\x40\x08\x51\x0d\x4d\x5d\xe8\x4e\x3a\ \x3a\xf7\x70\xf7\xb5\x25\x58\x74\x71\x6c\xb9\x12\x7e\xed\xf9\x2b\ \x77\x5e\x31\x1c\x1d\x00\x4f\xc7\x91\x4a\xfb\xf0\xfc\x00\xc9\x94\ \x8b\x8b\xa6\x46\xb1\x72\xe9\xb8\x49\xc5\xf9\xea\xbb\x8a\x7b\x3e\ \x7d\xba\xe2\xee\x8f\xad\x21\x35\x10\xa4\x12\x24\xe5\xfa\xf0\xbd\ \x00\xbe\xcf\xe1\xea\x18\xcd\x53\xb8\xe7\x86\x09\x6c\xe6\xe4\xc2\ \x17\x94\xe0\xbb\xcf\x5d\xbe\x79\xc2\x10\x76\x20\x81\xb4\x1b\x20\ \x08\x04\x02\x9f\xff\xcd\xb4\xef\x63\xde\xcc\x52\x2c\xbb\x6a\xdc\ \xc2\x7c\x1b\xbf\x4c\xb9\xed\xdd\x65\x67\xcc\x80\x52\x8a\x18\x66\ \x0c\xf4\x66\x0c\x70\xa1\x29\xb3\x14\xc6\x50\xf8\x7b\xc9\x48\x0b\ \x77\x5e\x57\x5e\x76\xce\xd9\x85\x5b\x27\x2d\xab\xac\x2c\xbf\xe5\ \xf5\x7c\x9c\x26\xac\xb2\xe9\x4b\xab\x37\x6c\xda\xf5\x4e\x7f\xb4\ \xe2\x59\xe9\x25\xad\x59\xb3\x2e\x80\x90\x0a\x4a\x53\x6a\x0a\xc3\ \x5c\x2e\xa4\x8e\x12\x93\xc7\x17\xa1\x28\x9f\xcd\x69\x39\xd1\x77\ \x6b\x6c\xca\xe2\xea\xbe\xc6\xaa\x4e\x9c\x22\xc8\xdc\xbb\x36\xf2\ \x07\xef\x5a\x60\x75\xf5\xa5\xe0\x05\x5a\x40\x85\x1b\x81\x41\xcf\ \x87\x2c\x65\xd6\x94\xd0\x94\x61\x74\xd3\x1c\x7b\xf6\x35\xa7\xbb\ \x7a\xfa\x1f\x57\x4a\x54\xb6\xee\x5a\x8f\xff\x42\xee\x5a\xc0\xc9\ \xd7\xb7\xc8\x59\x97\xac\xbf\x60\x7a\x39\xed\x77\x82\x50\x5c\xfd\ \x4d\xa2\xbf\x9f\xdc\x09\x23\x2c\x84\x02\x17\x3a\x72\x11\x9a\x2a\ \x1f\x1b\xb3\x09\xd4\x8d\x1d\xdd\xfd\x97\x14\x95\xcf\xdf\x35\xd0\ \x5c\x9d\xc6\x3f\x30\x75\xf9\x07\xe3\xc6\x5f\x7a\xe7\x2b\x9d\x09\ \xaf\xf2\xc8\x9f\xbd\x4f\xf6\x95\x2e\x9e\x9b\x37\xe5\xa6\x83\xf1\ \x43\x5b\xbb\xa9\x0c\x74\xe5\xbe\xa9\x9c\x40\x68\x86\x51\x9a\x1c\ \x90\x26\x4a\x64\x28\x00\x9e\x15\xe7\xb9\xf9\x30\xb3\xe1\x05\x98\ \x38\xb6\x08\xf3\x67\x4d\xbc\xb5\x30\x6a\xd5\x8d\x59\xb0\xf6\x6a\ \x0c\xc2\xa4\x65\x6f\x8e\x43\x90\xfe\x69\xf6\xb4\xc2\xd5\x65\xc5\ \xfe\x04\xa0\x7f\xcc\xec\x69\x05\xb7\x5b\xca\xdb\xab\xe7\xe8\x62\ \x0a\xe1\xc1\xe7\xca\x88\x65\xa8\xa8\x66\x2e\x37\xa4\x27\x9b\x30\ \xe4\x4a\x8b\x4b\xf8\x9a\x04\x08\xd7\xd6\x75\x52\x28\x64\x62\x3c\ \x84\xbf\x7b\xf4\xbc\x47\x5e\x3c\xeb\xf2\x87\x19\x34\x84\xe7\x3c\ \x57\x31\xde\x9a\x50\x52\xe0\xe2\xd8\x1f\x6d\x68\x3c\xd6\x02\x19\ \xf4\x62\xd6\x94\x48\x4c\x1f\x7b\x8d\x41\xb8\x08\x04\xa0\xb4\x10\ \x45\x46\x9c\x20\x03\x65\x3e\x12\x19\x53\x52\x01\xa0\x99\x7b\xef\ \x71\xa4\x1c\x17\xc9\xa4\x83\xae\x9e\x04\x9c\x01\x07\x9e\xe7\xc2\ \x75\xd3\x20\xc2\x35\x9b\xb5\x4e\x81\x5e\x5e\x36\x7b\xf5\xa2\xbc\ \x22\xba\x24\x42\xd3\xe8\xed\x8b\x60\x44\x71\x09\x08\xa1\x48\xe9\ \x6d\x53\x41\x12\xe0\x03\x0b\x98\xb6\x83\x78\x9f\x0f\x66\x59\x60\ \xcc\x02\xa5\x14\x84\xe4\xe6\x20\x33\xf9\x9c\x0b\x5d\x2d\x47\x3a\ \x6d\x44\x3c\xf8\xbe\x87\x40\xd3\x88\x4a\x09\x50\x6a\x99\x0b\x6b\ \x12\x58\x96\x29\x43\xc1\xf3\x05\xd3\x01\xcc\x4a\xb3\x43\x0d\xed\ \xa8\x98\x7e\x11\x46\x8c\x2a\x85\x1d\xb1\xe1\x25\x02\xb4\x77\xb5\ \x22\x70\xba\xb5\x1a\x04\xd1\x1a\x5a\xc0\x9c\xa4\xe0\xfa\x52\x57\ \x98\x8b\xd2\xcc\x87\x39\x16\xde\x7f\xa2\x85\x2c\xc6\xc0\x2c\x06\ \x6a\x72\x23\x4c\xa9\x26\x09\xc5\xa3\xd1\x3c\x58\x36\x93\x9e\xcf\ \x5f\x52\x4a\x2c\xee\xd9\xff\x2e\xda\xea\x0e\x7c\x33\x62\xd4\x08\ \x30\xbb\x00\xb1\x58\x31\x4a\x8a\xcb\x00\x1a\x85\x47\x14\x52\x89\ \xb6\x9f\x19\x81\x44\x24\x12\x01\x81\x71\x6f\x2a\x21\x26\x0f\xdb\ \x2f\xb3\x6b\x47\x88\x80\x81\x0a\x2b\x92\x10\x16\x07\xb5\xb2\xe2\ \x84\x86\xe7\xe5\x17\xd8\x38\xd1\x1e\x6f\x71\x5d\xf7\xde\xf8\xfe\ \x4d\xdf\x0c\x7a\xba\xae\x6f\xaa\xad\x59\x12\x1b\x3b\xba\xb8\x0b\ \x3e\x6c\xae\xd0\xe9\xb5\xa3\xa1\xa6\xca\xe7\x01\x7f\x8c\x81\x90\ \xb0\x2d\x44\x65\x0c\x50\x4a\x00\x63\x40\xe5\xd6\x2e\xfb\x1d\x80\ \x54\x46\xdc\x02\x35\xcc\xb6\x3c\x5a\x10\x81\xe3\x24\xd0\xd6\xd2\ \xba\x45\x0a\xb9\x26\x7e\x60\x53\x1c\x83\xe0\x34\x7f\xdb\xc8\xc7\ \xcc\x98\x77\x60\xc7\xe6\x97\x9b\xea\xab\x17\x53\xdb\xb6\xfa\x8f\ \x1f\xff\xd1\x4b\xf6\x3c\xe1\x9e\xa8\xfb\x9e\x95\x96\x16\xa1\x60\ \x64\x01\x28\x32\x95\x48\x8f\x9b\xdd\xcf\xdd\x7f\x23\x92\xad\xde\ \x98\xa1\xd9\x19\xd1\xd1\xa2\xb0\xf3\x2d\xfc\xf6\x6b\x83\xd3\x17\ \xef\x7b\x14\xc0\x3b\xf1\x03\xef\xe1\xdf\xe0\x75\xd4\x1f\xf6\x3a\ \xb0\xb4\xe4\xdc\xa9\xcc\x77\x06\xe8\xa2\x67\xbe\xf2\x3f\xb9\x83\ \xc0\x80\x2c\xbc\xe3\x91\xbd\x47\x8e\x34\xce\x71\x07\x12\x28\x28\ \x8a\x62\xcd\x53\x6f\x41\xfa\x32\x34\xc0\x85\x80\x6e\x13\x02\xce\ \xe1\xfb\x99\xbf\x69\xcf\xf3\x20\x94\x40\x5b\xdb\x51\x1c\xae\xad\ \xad\xe5\x81\x58\x91\xf8\x65\xf3\x11\x9c\x22\xd8\x8d\xd7\x2c\x98\ \x5b\xdf\xd0\x6a\x23\x42\xc1\xa5\xe3\x32\xdb\xa6\x30\xd5\x4a\x09\ \x03\x25\x55\x98\xe7\xa6\x1c\x79\x0a\x75\xdf\x7f\x2b\xdb\x9b\x5b\ \x5e\x05\x21\xeb\x7a\xeb\x3f\xf2\x71\x1a\x60\x6b\x1f\xb8\xdd\xc4\ \x00\x1a\xa3\x67\x5e\x0f\x16\xce\x83\x00\x15\x02\x50\x59\x71\x4e\ \x40\xf3\x18\x3a\xba\x1a\xb1\xf7\xcb\xcf\xdb\xdd\xb4\x7f\x5f\xff\ \xe1\xed\xbb\x70\x06\xc0\x30\x08\xc4\xce\x83\xee\x00\xa8\x24\xd0\ \xc8\xce\x00\xe0\xeb\xaa\x6b\xaa\xb6\xe0\xe8\xbe\x7d\x9f\x29\xc2\ \x56\x0d\xfc\x5e\xd5\x05\x8d\x21\x31\x60\x45\x18\x28\xcf\x3c\xf3\ \x25\xa3\x68\xee\x69\xc5\xd7\x9b\xdf\x4e\x27\x3b\xbb\xd7\x12\x16\ \xad\xd4\xe2\x0a\x1a\x43\x63\xc0\x8a\x28\xb3\x09\x20\x1c\x8e\xad\ \xb0\x7b\xcf\x0e\xd4\xef\xdc\x76\x50\x0a\xb1\x22\xf5\xe7\x0f\x87\ \x86\xfa\xbd\x40\x6f\x41\x0c\x71\xca\x71\xb0\xbb\x19\xef\x6f\x7c\ \x4e\xd5\x6d\xdf\xba\x51\x49\xcc\x1d\x2a\x71\x03\x92\x4b\xda\x93\ \x8a\xac\x78\xfe\x8d\x84\x52\x72\xe4\xfe\x6d\x5f\x74\x28\x11\xac\ \x1a\x68\xfa\xfa\x8b\x61\x7b\x31\x19\x1b\x23\xaa\xa3\xb5\x73\x69\ \xe7\xaf\xbf\xdd\x4b\x29\x3b\x2f\x14\xff\x1f\xc3\x80\xbf\x00\x90\ \x3c\x92\x18\x9f\x70\x27\x8d\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x05\xe8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x03\x00\x00\x00\x44\xa4\x8a\xc6\ \x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01\ \x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\ \x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\ \x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\xb2\x50\x4c\x54\ \x45\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x20\x20\ \x22\x22\x22\x20\x20\x20\x29\x29\x29\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x1a\x1a\x1a\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x0c\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x09\x09\x09\x18\x18\x18\x00\x00\x00\x00\x00\x00\x06\x06\x06\x0a\ \x0a\x0a\x0d\x0d\x0d\x0c\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x0a\x0a\x0a\x00\x00\x00\x02\x02\x02\x00\x00\x00\x00\x00\x00\ \x09\x09\x09\x0a\x0a\x0a\x02\x02\x02\x00\x00\x00\x03\x03\x03\x00\ \x00\x00\x02\x02\x02\x00\x00\x00\x00\x00\x00\x05\x05\x05\x00\x00\ \x00\x08\x08\x08\x00\x00\x00\x10\x10\x10\x11\x11\x11\x21\x21\x21\ \x04\x04\x04\x12\x12\x12\x13\x13\x13\x10\x10\x10\x2c\x2c\x2c\x1a\ \x1a\x1a\x33\x33\x33\x38\x38\x38\x14\x14\x14\x18\x18\x18\x20\x20\ \x20\x27\x27\x27\x2a\x2a\x2a\x40\x40\x40\x01\x01\x01\x2b\x2b\x2b\ \x3b\x3b\x3b\x46\x46\x46\x64\x64\x64\x74\x74\x74\x26\x26\x26\x34\ \x34\x34\x51\x51\x51\x52\x52\x52\x69\x69\x69\x1d\x1d\x1d\x28\x28\ \x28\x2b\x2b\x2b\x3a\x3a\x3a\x45\x45\x45\x6c\x6c\x6c\x71\x71\x71\ \x72\x72\x72\x7d\x7d\x7d\x87\x87\x87\x98\x98\x98\x00\x00\x00\x02\ \x02\x02\x04\x04\x04\x06\x06\x06\x08\x08\x08\x09\x09\x09\x0a\x0a\ \x0a\x0c\x0c\x0c\x0d\x0d\x0d\x0f\x0f\x0f\x10\x10\x10\x11\x11\x11\ \x16\x12\x10\x16\x16\x16\x18\x18\x18\x19\x19\x19\x1a\x1a\x1a\x1b\ \x1b\x1b\x1c\x1c\x1c\x1d\x1d\x1d\x1f\x1f\x1e\x1f\x1f\x1f\x20\x1f\ \x1f\x20\x20\x20\x21\x21\x21\x22\x22\x22\x23\x23\x23\x24\x11\x04\ \x24\x24\x24\x25\x24\x24\x26\x26\x25\x27\x27\x27\x28\x12\x00\x28\ \x13\x00\x28\x28\x28\x29\x29\x29\x2a\x2a\x2a\x2c\x2c\x2c\x2d\x19\ \x0f\x2d\x2d\x2d\x2e\x2e\x2e\x33\x33\x33\x34\x23\x17\x34\x23\x18\ \x34\x34\x34\x35\x35\x35\x36\x36\x36\x37\x37\x37\x38\x38\x38\x3a\ \x1e\x0c\x3a\x3a\x3a\x3c\x25\x0f\x3c\x3c\x3c\x3d\x28\x1e\x3d\x35\ \x2e\x3d\x3d\x3d\x41\x41\x41\x43\x43\x43\x44\x44\x44\x45\x45\x45\ \x47\x47\x47\x48\x48\x48\x4b\x32\x26\x4b\x4b\x4b\x4c\x4c\x4c\x51\ \x51\x51\x52\x2c\x0b\x53\x53\x53\x55\x55\x55\x56\x42\x38\x56\x56\ \x56\x57\x32\x12\x58\x58\x58\x59\x29\x02\x59\x2f\x09\x59\x59\x59\ \x5b\x5b\x5b\x5c\x2d\x07\x5c\x5c\x5c\x5d\x5d\x5d\x5e\x33\x0c\x5e\ \x5e\x5e\x5f\x2f\x0b\x62\x4f\x3e\x65\x48\x36\x65\x65\x65\x66\x38\ \x0e\x68\x68\x68\x69\x69\x69\x6a\x6a\x6a\x6d\x33\x00\x6e\x35\x02\ \x6e\x6e\x6e\x70\x46\x20\x73\x73\x73\x75\x38\x06\x75\x75\x75\x78\ \x78\x78\x79\x79\x79\x7e\x7e\x7e\x7f\x7f\x7f\x80\x80\x80\x82\x4b\ \x21\x83\x56\x3a\x83\x83\x83\x84\x3e\x05\x87\x60\x47\x88\x60\x45\ \x8b\x60\x44\x8b\x8b\x8b\x8c\x42\x00\x8e\x49\x11\x8e\x4a\x12\x8e\ \x8e\x8e\x8f\x59\x2b\x94\x51\x18\x94\x65\x3e\x95\x4d\x11\x96\x60\ \x38\x98\x75\x5e\x99\x64\x3b\x9b\x66\x3e\x9b\x9b\x9b\x9c\x77\x5f\ \x9d\x9d\x9d\xa0\x6d\x45\xa1\x4c\x00\xa2\x87\x6f\xa2\xa2\xa2\xa4\ \x50\x02\xa5\x76\x53\xa8\xa8\xa8\xaa\xaa\xaa\xab\x55\x03\xae\xae\ \xae\xb0\x55\x00\xb6\x93\x75\xbf\x9c\x82\xc0\xc0\xc0\xc3\xa4\x8c\ \xc4\xc4\xc4\xe6\x7c\xac\xe6\x00\x00\x00\x59\x74\x52\x4e\x53\x00\ \x01\x02\x04\x04\x08\x0d\x0d\x12\x14\x1e\x26\x31\x36\x3d\x4c\x4c\ \x50\x5c\x5e\x71\x7b\x8d\x8e\x96\x96\x9b\x9b\xa0\xa1\xa2\xa3\xa3\ \xa4\xa5\xa7\xb0\xb4\xb4\xbc\xc2\xc9\xcb\xcb\xcc\xce\xd3\xdd\xdd\ \xe0\xe8\xe8\xe9\xeb\xf1\xf2\xf3\xf4\xf5\xf5\xf5\xf6\xf7\xf8\xf8\ \xf8\xf9\xfa\xfa\xfa\xfa\xfa\xfa\xfb\xfb\xfb\xfb\xfb\xfe\xfe\xfe\ \xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\x56\xdc\x65\xac\x00\x00\x02\x43\ \x49\x44\x41\x54\x38\xcb\x63\x60\x18\x59\x80\x51\x48\x5d\x53\x94\ \x15\xc4\x62\x15\xd5\x54\x17\x62\xc4\x50\x20\x6c\x13\x1e\xe6\x24\ \x05\x62\x49\x39\x85\x85\xdb\x08\x63\x18\xa0\x11\xb2\x73\x5a\x90\ \x31\x1b\x03\x03\xbb\x51\xd0\xb4\x9d\x21\x1a\xa8\x46\x30\xf2\x89\ \x5b\x77\x67\x25\xc5\x58\xa8\x1a\x1a\xaa\x59\xc4\x24\x65\x75\x5b\ \x8b\xf3\x21\x29\xe1\x52\xb1\xf4\x88\x58\xb7\xbd\x3d\xde\x6d\xea\ \xe3\x3b\x53\xdd\xe2\xdb\xb7\xaf\x8b\xf0\xb0\x54\xe1\x82\xc9\x73\ \xe8\xf9\x5e\x3e\x76\xea\xee\xee\xc6\xe4\xa5\x9b\xf6\xcd\xdd\xb4\ \x34\xb9\x71\xf7\xdd\x53\xc7\x2e\xfb\xea\x71\x40\x15\x28\xbb\xef\ \xda\x7b\xf5\xfe\xd3\x9b\x13\x93\x93\x93\x37\x4c\x05\x12\x13\x6f\ \x3e\xbd\x7f\x75\xef\x2e\x77\x65\x88\x3c\xa7\xc9\x9e\xc9\x93\x67\ \xae\xab\xab\x5e\x32\x21\x39\xbe\x38\x2e\x3e\x79\xc2\x92\xea\xba\ \x75\x33\x27\x4f\xde\x63\xc2\x09\x76\xa0\x92\x6b\x6b\x5b\x7b\xc7\ \xa4\x19\x45\x69\xf3\x7b\x23\x63\x23\x23\x7b\xe7\xa7\x15\xcd\x98\ \xd4\xd1\xde\xd6\xea\xaa\x04\x72\xa8\x88\x5d\xe7\x9c\x4d\x5b\x37\ \x2e\x9f\x52\x9b\x92\xbe\xb0\x49\x50\xb0\x69\x61\x7a\x4a\xed\x94\ \xe5\x1b\xb7\x6e\x9a\xd3\x69\x27\xc2\xc0\xc0\x6d\x1a\xb8\x62\x42\ \x46\x6a\xc1\x92\xad\xdd\x89\x29\x79\x4b\x18\x18\x96\xe4\xa5\x24\ \x76\x6f\x5d\x52\x90\x9a\x31\x61\x45\xa0\x29\x37\x83\x88\xfd\xac\ \xfc\x96\xbe\x79\xd3\xeb\xcb\xe6\x24\xc4\x15\x15\x32\x30\x14\x16\ \xc5\x25\xcc\x29\xab\x9f\x3e\xaf\xaf\x39\x7f\x96\xbd\x08\x83\xa2\ \x57\x63\xc9\xda\xc3\x07\x8e\x5e\xe8\x6a\x28\x8e\xde\x58\xca\xc0\ \x50\xba\x31\xba\xb8\xa1\xeb\xc8\x95\x03\x87\xd7\x96\x34\x7a\x29\ \x32\xe8\x04\x64\x56\xae\x3e\x7f\xf1\xf6\xa3\xfd\x49\x49\x51\x35\ \x15\x0c\x0c\x15\x35\x51\x49\x49\xfb\xaf\x3d\xb9\x74\x7e\x75\x55\ \x66\x80\x0e\x83\xae\x7f\xce\xa2\x9e\xb3\x27\xcf\x9c\x3b\x94\xe4\ \xe7\x6c\x20\xc6\xc0\x20\x66\xe0\xec\x97\x74\xe8\xdc\x99\x13\x3b\ \xd6\x2c\xcb\xf1\xd7\x65\x90\x73\xa9\x9b\x7d\xfa\xc6\x96\xe3\xd7\ \x17\x67\x7b\x4a\x43\x02\x46\xda\x33\x7b\xf1\xf5\xe3\x9b\xb7\x3d\ \x5c\x50\xe7\x22\xc7\xc0\x6b\x36\xa3\x7c\xe5\xad\x07\xf7\xd6\xe7\ \x4e\x31\xe7\x81\x28\xe0\x31\x9f\x92\xbb\xfe\xde\x83\x5b\x2b\xcb\ \x67\x98\xf1\x32\x30\xc8\x3a\xae\x9a\xd4\xd8\xdf\x3d\x65\xa9\x83\ \x0c\x2c\x72\x64\x1c\x96\x4e\xe9\xee\x6f\x9c\xb4\xca\x51\x16\xc8\ \x63\x96\xb7\xf2\x0e\x3e\x18\xea\x63\xab\xc0\x02\x53\xc0\xa2\x60\ \xeb\x13\x7a\x30\xd8\xdb\x4a\x9e\x19\xc4\x65\xe2\x97\xd0\xd2\xd7\ \x96\x14\x60\x42\xc4\x3f\x93\x80\xa4\xb6\xbe\x96\x04\x3f\xd3\x10\ \xc9\x2f\x00\x31\x63\xd4\xa9\x4c\x9b\xd1\x58\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0a\x1c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x09\x99\x49\x44\ \x41\x54\x78\xda\x9d\x56\x09\x54\x93\xc7\x1a\x75\xc1\x05\x95\xba\ \xd4\x85\xa8\x54\x51\x14\x15\x05\x14\x77\x6d\xdd\xde\xf3\x9d\x8a\ \x55\x6b\xa5\xb5\x20\xe8\x43\xe4\x89\x22\x0a\x88\x56\xad\xd5\xfa\ \xac\x22\x2e\xc8\xd1\x63\xab\xa2\x96\x1a\x96\xb0\xc5\x48\x12\x30\ \x09\x86\x2d\x61\x0b\x9b\x2c\x21\x12\x08\x24\x10\x59\x84\x20\xa0\ \x3e\x17\xb8\x6f\x26\x4d\x7a\x90\xda\x73\x2c\xff\x39\xf7\xfc\xf3\ \xcf\x3f\x73\xef\x9d\x99\x6f\x66\xbe\x3e\x00\xfe\x36\xc8\xd3\x9f\ \x60\x04\xc1\x27\x14\x86\x72\xff\xde\x70\x7d\x88\x58\x3f\x02\x53\ \xfa\xee\x56\x37\x9c\xcd\x7e\x20\xd1\xe9\xda\x40\x41\xcb\xb4\xee\ \x7d\x7d\x7a\x6d\x80\x3c\x7d\x09\x86\xfa\xf8\xf8\xad\x49\x4d\xcd\ \xcd\xdd\xbb\xf7\x80\x03\xf9\x36\x31\xfc\x1b\xcb\x64\xc6\xcb\x61\ \x78\x68\x99\xd6\x19\xfe\x99\xd0\xb6\xb4\x0f\xed\x4b\x39\x28\x57\ \x6f\x0c\x98\x72\x38\x82\xd8\xfa\xfa\xe6\x4e\x00\x48\x4c\x4c\x7d\ \x4c\xea\xcc\x09\x06\x13\x58\x47\x46\xde\xab\x36\x1a\xa0\x65\xfb\ \x1d\x56\x2b\xfd\xa4\xdb\xd7\x8c\xb7\x19\x69\x41\xdb\x02\x00\xed\ \x4b\x39\x28\x57\x6f\x0c\x8c\x3a\x7d\x3a\x98\xf7\xf6\x6d\x27\xba\ \xba\xba\xd0\xd6\xf6\x1c\x57\xaf\x86\xfe\xc6\xe7\x8b\xb9\xf9\xf9\ \xa5\x0d\x72\xad\xa2\x2b\x4c\x7d\x05\x27\xe4\xde\x08\x52\x1e\xc2\ \x2d\x6d\x10\x58\x4d\x57\x11\x55\x7f\x0d\x37\x55\x81\x60\xd6\x5c\ \x84\xf4\xe9\x03\x50\x0e\xca\xd5\x9d\x3b\x42\x7b\xc5\xe4\x43\x0c\ \x0c\x1a\x36\x6c\xc4\xaa\xc2\xc2\xf2\x37\xaf\x5f\xbf\x05\xc5\x8b\ \x17\xff\xd3\xbf\xe3\x6b\x99\xd8\x59\xb4\x11\x57\xea\x7e\x40\x9c\ \x2e\x04\x31\xba\x40\xc4\xb7\x05\xe2\x7e\xc7\x79\x24\xbd\x08\x46\ \xfa\xab\xdb\x10\x3e\xbf\x89\xe0\x5a\x3f\x6c\x4d\x5e\x58\xb0\x29\ \xd2\x66\xaa\x91\xd7\xb3\x60\xa1\x3f\xe7\x49\x68\xd7\xfe\xe2\x4f\ \x07\xd3\xef\x9e\xc1\x36\x98\x0a\xd3\xb2\x01\x56\x37\x6e\x30\x55\ \x2f\x5f\xbe\x02\x85\x5a\xa7\x86\x67\xe6\x56\xec\x2f\xdb\x8e\x73\ \x35\xfe\x38\xa7\xde\x8f\x0b\x44\x24\x44\x1b\x80\x6b\x4f\x8e\xe0\ \x66\xc3\x31\xdc\x69\x3a\x01\x66\xf3\x29\xb0\x74\x3f\x21\xbe\x3d\ \x10\x51\x2d\xe7\x71\xb4\xdc\xe5\xe5\xb6\x6c\x7b\x8f\xed\xd2\x79\ \xff\x0d\xaa\xd9\x87\x0b\x1a\x6f\x78\x17\x2c\x1e\xd1\xd3\x80\x59\ \x5c\x1c\x9f\x99\x94\x94\xca\xb5\xb7\x5f\x34\x93\x7c\x33\xc2\xc2\ \xa2\xd9\x4d\x4d\x3a\x74\x74\xbc\x40\x4b\x5b\x2b\x3e\xe7\x2e\x83\ \x4f\xe9\x0e\xec\x2d\x73\xc6\x7e\xb9\x2b\xfc\x15\x3b\x70\xb8\x62\ \x27\x8e\x29\x3d\x71\x52\xe5\x85\xd3\xd5\xde\xef\x35\x15\xde\x74\ \x06\x41\xd5\xbe\x38\xab\xf2\xc1\xbd\xf6\x20\x9c\xaa\x72\xc7\x6e\ \xa3\x01\x63\xe4\x3a\x3b\xbb\x7e\xae\x54\x6a\x3a\x75\xba\x76\x94\ \x97\x57\xbf\xe2\xf1\x92\x15\x24\x88\xf0\xec\x59\x87\x1e\x7e\xc2\ \x3d\x70\x92\xac\xc7\x96\xbc\x75\xd8\x9a\xbf\x1e\xdb\x0a\x36\x62\ \x7b\xd1\x66\x38\x17\x6e\xc4\x12\xa9\x03\xa6\x8a\x27\x61\x62\xf2\ \x78\xcc\x4a\x9d\x86\xb5\xb9\xcb\xe1\x53\xee\x82\xd3\xaa\xbd\x08\ \xac\xf1\xc1\x45\x8d\x2f\x2e\xd7\x1e\xc4\x55\xed\x21\xfc\x52\x7f\ \x14\x87\x1f\xbb\x60\x4b\xd4\x9c\xd1\xdd\x0d\x7c\x14\x15\x95\x90\ \xd9\xdc\xfc\x0c\xef\x43\x62\x19\x1f\xab\xd8\x8b\xb1\x52\xba\x14\ \x6b\x32\x97\x63\x6d\xe6\x0a\x7c\x91\xf3\x4f\xd8\xa6\xcd\x42\x3f\ \x6e\x3f\x7c\xcc\xfd\x08\x96\x9c\x71\xb0\xe1\x4e\xc6\x64\xbe\x39\ \xc6\x26\x99\x61\xa2\x60\x04\xbe\x20\x46\x8e\x28\xdc\x71\xbc\x62\ \x17\x4e\x56\xee\x26\x23\xdf\x83\x33\x64\x96\x7c\xe5\x5f\x63\xd1\ \x01\x0b\x8b\xee\x06\x86\x58\x5a\x5a\x6d\x08\x09\xb9\xa5\xa9\xae\ \x7e\x82\xc6\x46\xdd\x3b\x58\x14\x6c\x8f\x45\x29\xf3\x61\x97\x32\ \x07\x0e\xa9\x76\x58\x92\xb1\x00\x0c\x91\x39\x86\x70\x4d\x31\x35\ \xc4\x1c\xd3\xf7\x98\xd7\xd8\x6d\xb3\xd6\xcd\xdb\x3c\x1b\xf3\x3d\ \x67\x63\xd1\xa5\xa9\x70\x48\xb4\x84\x8d\x68\x1c\x56\x67\xcc\xc1\ \x81\x52\x17\xf8\x95\x6d\x43\x80\x7c\x3b\x0e\x95\xef\xc0\x9e\x92\ \xcd\x58\x71\xd2\x92\x41\xb5\xbb\x07\xa0\x19\xc1\x3c\x27\x27\xd7\ \xfb\x6a\x75\x03\xb4\xda\xa7\x7a\x64\x95\xe4\x63\xf6\x4d\x2b\x4c\ \x16\x4e\xc2\x14\x91\x25\xa6\x89\xa6\x76\x4e\x49\xb6\xec\x1c\xc8\ \x1b\xf0\xc6\xfa\x97\xf1\x1d\xd6\xe7\xc7\x38\x18\xe3\x68\xdd\xba\ \x0d\xbe\x2b\x56\xac\x7e\xbd\xd6\x71\x3d\x56\x87\xd8\x60\xb9\x78\ \x0a\x16\x8b\x3f\xc1\x57\x59\xcb\xb1\xbb\xf0\x2b\xec\x2e\x72\x82\ \x17\x81\x47\x91\x23\xbe\xe6\xdb\xea\xb7\x66\xcf\x93\x6f\xd4\xd9\ \xb3\x21\x09\x1a\x4d\x23\x8c\x38\x78\xfb\x30\x66\x47\x4e\x07\x83\ \xc7\x80\x79\x22\xa3\x75\x82\x60\x42\x6b\x7f\x5e\x7f\xad\x55\x9c\ \xb9\x72\x46\xd8\x98\xb5\x3d\xb7\xef\x37\xdf\x7c\xeb\xb3\xf2\xd8\ \x02\x38\x8a\x6d\xf1\xaf\x74\x6b\x7c\x29\x59\x00\xb7\xdc\xb5\xd8\ \x21\x73\x84\x5b\x9e\x23\x5c\x65\xeb\xe1\x92\xbb\x0a\xae\xa9\xf3\ \x46\xd2\xf6\xc6\xd1\x0f\x31\xcc\xc0\xb4\xd8\xd8\x44\xfd\x32\x50\ \xa8\x54\x5a\x38\x5d\x76\x82\x5d\xcc\x2c\x98\xb3\x19\x2f\x86\xf0\ \x87\xe6\x0e\xe3\x0f\xcb\xef\xc3\xed\x23\xb6\x67\x5b\xc4\x3b\xc8\ \xfe\x7c\xc4\x7e\x2b\x5b\xec\xe0\x94\x3b\x1f\x6e\x59\x4b\xe0\x9e\ \xb5\x1a\xee\x39\xff\x80\x5b\xce\x1a\x7c\x9d\x45\x62\x27\xc3\x16\ \x0b\xd3\x26\xe3\xf3\x14\x1b\x38\x78\x4f\x18\x67\xd0\xee\x33\x5c\ \x20\x48\x97\x08\x85\x19\x45\x64\x0b\x2a\xf3\xf3\x15\x9d\x4a\x65\ \x1d\x28\x4a\x4a\x94\x70\xfa\x79\x13\x66\xc4\xce\xc4\x70\xf6\xf0\ \xf2\xbe\xbc\xbe\xf1\x24\xe8\x42\x3f\x16\x9a\x85\x4d\xfb\x6d\xcc\ \x8f\xef\x3b\xc0\xfc\xe5\x8e\xd6\x5f\x46\x2f\xcd\xda\x78\xed\x53\ \x6c\xf9\x65\x15\xfe\xcd\xdc\x88\x5d\xe1\x5b\xe0\x15\xf1\x0d\xf6\ \x45\xbb\x74\xf9\xdf\xdf\xde\x76\x9e\xfb\xa3\x86\x6a\x52\x6d\x6a\ \x60\xba\x48\x24\x43\x4e\x8e\x1c\x8f\x1e\x55\x92\x2d\xa8\x86\x42\ \xf1\x3b\x0a\x0b\xe5\xf0\xb8\xee\x81\xcf\x62\x96\x75\x0d\xba\x3f\ \x28\x8e\x8c\xfc\x2a\xc1\xe9\xc1\x89\x03\x8e\xda\xc7\x58\x1c\xfe\ \xab\x53\xd4\xc7\xc7\xe7\x93\x93\x27\x7f\xea\xbc\x72\x25\x14\xc9\ \x0f\xd3\x21\xcb\x2b\x45\x71\x71\x05\xe4\xf2\x1a\xaa\xa1\xd7\xa2\ \x9a\x54\x9b\x1a\x98\x19\x1e\x2e\x84\x11\x11\x11\x22\xc4\xc5\xa5\ \x81\xcb\x95\x22\x23\xa3\x00\xa7\xc2\xcf\xc2\x85\xb5\xa5\x6b\x28\ \x67\xe8\x35\x22\xfe\x3d\x81\x0f\x81\xa7\x03\x6f\x92\xeb\xac\xa4\ \x51\xef\xbd\x64\x82\x83\x83\x19\x4c\x26\xeb\x2d\x27\x41\x80\xb4\ \x0c\x19\x12\xb8\x12\xc2\x99\x4a\xb8\x0d\x3a\x06\x50\x6d\x6a\xc0\ \xc2\xdb\xfb\x48\x8e\x97\xd7\x21\xe5\x9e\x3d\x47\x6a\x6f\xdc\x60\ \x77\x46\x46\x26\xeb\x1b\x70\x38\xe9\xb8\x27\xe6\xc1\x3f\xd6\x07\ \x0e\xf1\x0e\x2c\x22\xfc\x1f\x02\xe7\xbe\xdc\x3e\x9b\xed\x53\x27\ \x38\xce\x17\x4d\x98\xd7\x27\xfa\xcf\xf7\x49\x58\x58\x98\x7b\x02\ \x57\x80\x74\x69\x36\xe2\x39\x62\x30\xc3\x05\xa0\x9c\x94\x9b\x6a\ \x50\x2d\xaa\x49\xb5\xa9\x81\x81\x04\x13\x09\xa6\x10\x2c\xfb\xee\ \xbb\x40\x95\xd1\x00\x7d\x2b\x2a\x54\xb8\x94\x78\x0e\xee\x9c\x9d\ \x55\x44\xdc\x89\x88\xaf\x33\xe5\x0f\x58\x33\x32\xc9\x74\xf9\xba\ \xdc\x39\x0e\x2b\xd3\xac\xcc\x17\x3f\x9c\xf8\x4e\x30\xc6\xc5\xb3\ \x73\x24\x99\x32\xc8\x1f\x57\x20\x32\x5a\xf4\x87\x01\xca\x4d\x35\ \x0c\x5a\x13\xa9\x76\xcf\x6d\x38\x7a\xdb\x36\xaf\xe8\xa8\xa8\x64\ \xd2\x41\x84\x98\x18\x31\x6a\x6b\x1b\x11\x9b\xc1\xc6\xcf\x29\xd7\ \xba\x9c\x79\x2e\x67\x07\xf3\x4d\x96\x12\xf1\x05\x0c\x81\x99\xad\ \xa5\x68\xa4\xb5\xa3\x6c\x36\xc3\x39\x7f\x81\x99\x5b\xf6\x82\xa1\ \x2e\xe2\x79\x03\x39\x7c\x8e\x9b\x44\x9a\xd3\x55\x5a\x56\x89\xda\ \xba\x06\xc4\xc5\xa7\x80\x15\x9d\x0c\x16\x2b\x19\x94\x9b\x6a\x74\ \x4f\x50\x7a\xe6\x79\x8c\x80\x80\xe3\x77\x63\x63\x53\xf4\x6b\x76\ \xef\x5e\x3a\x84\x42\x19\x5a\x74\x6d\x10\x15\x93\x59\x91\x86\xbf\ \xfc\x41\x78\xfc\xf0\x38\xc1\xb0\xe9\x93\x45\x23\xa7\xcc\x7c\x38\ \x76\x92\x7d\xca\xf8\x51\x8b\xd2\x2c\x4c\x3f\x4b\x9f\x32\x20\xe9\ \x61\x92\x5b\x56\x4e\xce\x73\xb5\xa6\x01\xad\xad\x1d\x78\xf8\x90\ \xac\x7f\x82\x44\xcf\xc3\x66\xa7\x21\x20\xe0\xc4\x5d\xaa\x61\xcc\ \x1f\xdf\xb9\x8c\x48\xfa\xb4\x38\x3a\x9a\x5f\x48\x1a\x13\xf1\x14\ \x3c\x78\x90\x03\x3e\x3f\x13\x02\x41\x36\xd9\x8e\x95\xa8\x6b\x6c\ \x44\x51\x4d\x31\xd2\x4a\x33\xba\x12\xa4\xf7\x0b\x6e\xa7\xdc\xf0\ \x3b\x2c\xf2\x9e\x7d\x59\x78\x76\xaa\x30\xf5\xc1\x2e\x69\x56\x66\ \x6e\xb9\x42\xd9\x55\xdf\xa0\x83\x4e\xd7\x81\xd2\x52\x15\x92\x93\ \x65\x84\x27\x5b\xff\xa6\xbc\x5c\xae\x84\xcc\x2a\xbf\x90\x6a\x51\ \xcd\xee\x06\x46\x5c\xbe\x7c\x5b\x4c\xa7\x9d\x8e\x9e\xc3\xc9\xd0\ \x77\x4c\x4d\xcd\x87\x58\x9c\x87\xf4\xf4\x42\x3c\x7e\xac\x46\x7d\ \x4b\x23\x54\x4f\x34\x78\x5c\x57\x85\xe2\x4a\x39\x0a\xe5\x45\x6f\ \x4b\xe4\x65\x6f\xab\x54\xb5\x78\x52\xdf\x4c\xee\x8d\x67\x68\x6f\ \x7f\x81\x8a\x0a\x0d\xa4\xd2\x47\x48\x4b\x2b\x20\x7d\x8b\x20\x12\ \xe5\x82\xc7\x93\x52\x13\xfa\x65\x0d\x09\xb9\x2d\xa6\x9a\xdd\x0d\ \x0c\xb6\xb2\xb2\xde\x12\x16\xc6\x7b\x43\x1b\xfd\xfa\x2b\xfb\x95\ \xaf\xef\x31\xb5\x44\x52\xa4\x27\xca\xce\x2e\x81\x4c\x26\x27\xa3\ \xaa\x44\xb3\x8e\xdc\x90\x6d\x3a\x34\xea\x9a\xa1\x6d\x6c\x42\x43\ \x13\x19\x71\x6b\x3b\xc9\x19\x5e\xea\xaf\xed\xb2\x32\x15\x0a\x0a\ \x14\xc8\xcd\x2d\x23\xfb\xbd\x04\x99\x99\xc5\xf0\xf7\xff\x5e\xcd\ \x64\x72\x5e\xd1\xad\x1d\x1e\x9e\xf8\x86\x6a\x51\x4d\xaa\xdd\x3d\ \x00\x27\xee\xdc\xb9\x2f\xda\xd3\xd3\x57\x60\x66\x66\xb6\x89\x46\ \xab\xbb\xbb\x17\xbf\xb0\x50\x41\x0e\x0f\x25\x41\x05\x21\xaf\x84\ \x42\x51\x8d\xca\x4a\x35\x09\xb0\x7a\x34\x3d\x6d\xd1\xa3\x8e\x04\ \x5b\x55\x55\x2d\x19\x79\x0d\x39\xc8\x54\xd4\x28\x85\xfe\xf0\xf1\ \xf0\xd8\xcb\xa7\x5c\x94\x73\xf7\x6e\x3f\x81\x87\xc7\xfe\x68\xaa\ \x45\x35\x7b\x06\xa1\x09\xc1\x58\x43\xe6\x6b\x6a\x48\xcd\xec\x83\ \x82\x2e\x29\xe4\xf2\xaa\x3f\x04\x54\x64\xba\xd5\x6a\x2d\xd9\x1d\ \x4f\x88\x70\x3d\xb4\xda\x06\xfa\xd6\x7f\xd7\xd4\xd4\x91\x76\x1a\ \x72\x8f\x68\xc9\x92\xd5\xe0\xc2\x85\xcb\x0a\xca\x61\xe0\x32\xa5\ \xdc\x06\x8d\x0f\x4a\x4a\xfb\xd9\xd9\xd9\xcd\x95\x48\xf2\x9e\x53\ \x03\x4a\xa5\x9a\x8a\x91\x75\x7e\x8a\xa7\x4f\x9b\xdf\x41\x73\x73\ \x0b\x81\x0e\x4d\x4d\x2d\x24\x15\x6f\x22\x06\xf4\x66\xc9\xd2\x15\ \x3c\xa7\x1c\x94\xab\x37\x69\xf9\xb0\x88\x88\xe8\x18\x32\xed\x44\ \x9c\x8e\x5c\x03\x57\x57\xb7\xa4\x83\x07\x03\x52\xa2\xa2\xa2\xea\ \x35\x1a\x4d\x67\x7b\x7b\x3b\x28\x68\x99\xc5\x62\xd5\x07\x04\x1c\ \x4a\x71\x73\x73\x4b\xd2\x68\xb4\xd4\x84\x7e\x16\x58\xac\xb8\x18\ \xca\xd5\x1b\x03\x23\xcf\x9c\xb9\x10\x9e\x97\x57\xfc\x86\x4e\xfb\ \xad\x5b\x77\xca\x48\xdd\x5c\xc3\xf1\xb9\xf4\xee\xdd\xbb\xe5\xad\ \xad\xad\xa0\xa0\x65\x5a\x67\xf8\x37\xf7\xce\x9d\xb0\x32\xba\x24\ \x45\x45\x65\x6f\x02\x03\x2f\x86\x53\xae\xde\x18\x30\xa1\x84\x33\ \x66\xcc\xf0\xbc\x7e\x3d\x34\xdb\xd6\xd6\x76\x03\xcd\x1b\x0c\x01\ \xcb\x88\x88\x88\xc8\x36\x1a\xa0\x65\x5a\x67\xf8\x37\x84\xb6\x0d\ \x0d\xbd\x95\x4d\xfb\x1a\x4c\x99\xfc\x5d\x03\x3d\x53\x35\x86\x51\ \xdc\x50\x3f\x9a\x2c\x83\xd0\x68\x80\x96\x69\x1d\xfd\x67\x34\x61\ \xe8\x63\x66\x5c\xff\x5e\x18\xf8\x6b\x18\xa2\xda\x86\x60\x83\x01\ \x36\xb4\xae\x37\x5c\xff\x07\x37\xc4\xb3\x43\x85\xe9\xf3\x64\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\xfa\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x01\x0a\x69\x43\x43\x50\x50\x68\x6f\ \x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ \x6c\x65\x00\x00\x78\xda\xad\xd0\x3d\x4a\x03\x41\x00\xc5\xf1\xff\ \x44\xd4\x46\xd4\x22\x58\x4f\xa9\x85\x0b\xc6\x6a\xcb\xcd\x87\x8b\ \x60\x9a\xcd\x16\xd9\x74\x9b\xd9\x21\x59\x92\xdd\x1d\x66\xc6\x98\ \xdc\xc1\x43\x78\x04\x8f\xe0\x0d\x52\x08\x5e\x44\xb0\xb6\x08\x12\ \x2c\x05\x7f\xd5\xe3\x35\x0f\x1e\x88\xd7\xa8\xdf\x1d\xb4\xce\xa1\ \xaa\xbd\x8d\x93\x28\x1b\x67\x13\x79\xbc\xe5\x88\x03\x00\xc8\x95\ \x33\xc3\xd1\x5d\x0a\x50\x37\xb5\xe6\x37\x01\x5f\x1f\x08\x80\xf7\ \xeb\xa8\xdf\x1d\xf0\x37\x87\xca\x58\x0f\xbc\x01\x0f\x85\x76\x0a\ \xc4\x09\x50\x3e\x79\xe3\x41\xac\x81\xf6\x74\x61\x3c\x88\x67\xa0\ \xbd\x48\x93\x1e\x88\x17\xe0\xd4\xeb\xb5\x07\xe8\x35\x66\x63\xcb\ \xd9\xdc\xcb\x4b\x75\x25\x6f\xc2\x30\x94\x51\xd1\x4c\xb5\x1c\x6d\ \x9c\xd7\x95\x93\xf7\xb5\x6a\xac\x69\x6c\xee\x75\x11\xc8\x68\xb9\ \x94\x49\x39\x9b\x7b\x27\x13\xed\xb4\x5d\xe9\x22\x60\xb7\x0d\xc0\ \x59\x6c\xf3\x8d\x8c\xf3\xaa\xca\x65\x27\xe8\xf0\xef\xc6\xd9\x44\ \xee\xd2\x67\x8a\x00\xc4\xc5\x76\xdf\xed\xa9\x47\xbb\xfa\xf9\xb9\ \x75\x0b\xdf\xbf\x06\x40\x2a\xe2\x79\x76\x40\x00\x00\x00\x20\x63\ \x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\ \x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\ \x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x03\x6a\x49\x44\x41\x54\x78\ \xda\x84\xd5\xcb\x6f\x55\x55\x14\x06\xf0\xdf\xd9\xfb\x9c\xde\xb6\ \xb7\x85\x52\x2e\x20\xf2\x0a\x0f\x13\xcb\x04\x89\x71\x40\xd4\x68\ \x34\x0e\x48\x4c\x8c\x89\xc1\x01\x89\x1a\xff\x01\xfe\x18\xc6\x4e\ \x98\x90\x40\x9c\x38\x50\xa2\xf1\x85\x04\x1f\x51\x63\x8a\x5a\x40\ \x94\x08\x86\x82\x14\x79\x5d\x8a\x70\xef\xdd\xdb\x41\x0f\x97\x6a\ \x6f\xe3\x5e\x39\xd9\xfb\x24\xe7\xfb\xce\xfa\xd6\xfe\xb2\x56\x91\ \x2d\xac\xa2\xde\x5f\x9d\xc8\xad\xdc\xc8\x32\xb2\x24\x21\xf7\x43\ \x27\xcd\x76\xda\x27\x32\x7d\xdc\x62\x82\x7d\x23\x69\x7f\xde\xf7\ \x80\x20\xcb\x92\x4c\x9f\x24\xd1\x49\x97\xf2\xb1\x35\x07\x8f\xe4\ \x01\x04\xfb\x47\xd2\xd1\x6a\xef\x64\x18\x16\xa9\xa1\xb9\x0f\xcd\ \x0a\x49\xd7\x6d\x7f\x99\x3f\x5c\x1c\xf8\xf0\xea\x02\x2e\xe8\xaf\ \xb0\x7f\x74\xef\xa6\xb0\x4a\x43\x14\x44\x51\xe8\x47\x59\xbf\x35\ \x4c\xda\x6c\xf8\x95\xf0\x7a\x1f\xf5\xe0\xf0\xf6\x44\xb9\xef\x91\ \x30\xae\x32\xa4\x52\xf6\x23\xd6\xe0\xa8\x61\x87\x31\xd1\xb0\xf5\ \xa3\xd5\x1b\x0f\x70\xe5\x83\x43\x6c\xe5\xd6\x0a\xa5\x54\xc7\x42\ \xda\x59\x36\x69\x8d\x39\x77\x3d\x6b\xbb\x77\x5d\x90\x8d\x18\x9a\ \x5a\x42\x50\x36\x72\xa3\x29\xe9\xd5\x9a\x93\xac\x27\x4b\x1a\x5e\ \x73\x4b\x70\x45\xc7\xb8\x28\xab\x54\x63\x4b\x33\x40\xa9\x27\xd4\ \x7f\xee\xc9\x82\x24\xb9\xe9\x96\xd3\x3a\xee\xd8\x6d\x9b\x73\x92\ \xf8\x10\xf6\xf0\x54\x49\x4a\x51\xae\xb3\x88\xb5\x8c\xa4\x70\xdf\ \x4a\xd7\xac\x70\xc5\x4e\xab\x7c\xe4\xf2\x20\x82\x28\x2a\x65\x49\ \x10\x17\x09\x49\x76\x18\xf5\xa7\x71\xc1\x6a\xd1\x84\xa6\x28\x2e\ \x25\x38\x2b\xda\x20\xd4\xb7\x10\xfa\x32\x2a\xdb\x14\xb6\x28\xcc\ \x1b\x71\xdc\xcf\xba\x83\x25\xbc\x27\x58\x21\x1a\x52\x19\x35\x61\ \xad\x20\x48\x98\x76\x46\xf6\xb4\x96\x73\x7e\x55\x28\xf5\x06\x65\ \x40\x52\xe8\xea\x48\xae\xf9\x5d\x34\x69\xbd\x31\x4d\x77\xb4\x25\ \x9f\xd8\xe3\x27\xc1\x90\x24\x0d\xca\x60\xa1\x0e\x41\x12\x24\x85\ \x2c\xfa\x51\xc3\x4a\xab\xad\x53\x6a\xfb\xd2\x2d\x65\x7d\xbd\xd5\ \x72\x04\x59\x21\x2b\x04\x4f\x78\xcb\x2f\x0e\x99\x35\x6b\xc6\x7a\ \x5b\x04\x55\xdf\x1f\x0f\x25\x84\xc5\x04\x65\xed\xfa\x28\xda\xe3\ \xbc\xcd\x9e\x53\x0a\x92\x8b\xbe\x37\xa3\xa3\xac\x6d\x5e\x0d\x26\ \x88\xaa\xda\xfb\x63\xa6\xfc\xe0\x03\x2f\x99\x52\x0a\xa2\xbf\x5d\ \xf4\x99\x69\xb7\xeb\x2f\x06\x4a\x08\xd4\x12\x76\x6a\x6b\xbb\x65\ \xda\x9b\x7e\x93\x64\x73\x4e\xb8\xe2\x0f\xd7\xac\xb3\x7d\xb9\x22\ \x96\x82\x75\x26\xec\x34\xe5\x8c\xae\xd2\x49\x59\x14\x15\x5e\x36\ \xea\xb0\xec\x9e\x0b\x2e\x2c\x47\xd0\xf0\x94\x67\x0c\x9b\x35\xed\ \x82\x86\xa0\xeb\xa4\xae\xae\x8d\xa6\x9c\x15\xd1\x93\xdd\x70\x6a\ \x30\xc1\xa8\xc7\x25\xdf\xba\xa9\x23\x68\xba\xaf\xe7\xbe\x8e\x96\ \xbd\xde\x37\xa3\x94\xea\x5a\xdd\x1b\x5c\xc4\x7b\x8e\x2b\xed\x32\ \x69\xa4\x8e\x61\xc3\x9a\x9e\x77\xc9\xd7\x82\xa8\xac\x4b\x1a\x96\ \xbb\x85\x4b\xde\x71\xc6\x93\xb6\x1a\x33\xa6\xa9\xa9\x69\x5c\xcb\ \x57\x52\xbf\xc9\x45\xb1\xdf\x93\x07\x18\x69\xde\xc7\x46\x6c\x72\ \x5d\x47\xd4\x15\x75\xdc\xb6\xd5\x69\x09\x85\x20\x2b\xfa\x43\x60\ \x89\x91\x16\x3a\x42\x5b\x69\xcc\x98\xb5\x36\x98\x34\xee\xb2\xdd\ \x4a\x51\xb5\xc4\x46\xcb\x58\xb9\x12\x35\x95\xd6\xa9\xb4\x5d\xd7\ \x36\xae\x65\xae\x2e\xe1\xbf\x33\x28\x17\x55\xf0\x5e\xdb\xb8\x20\ \xa9\x54\x1e\x95\x7c\xee\xb4\xc7\x6c\xb5\xd9\x7d\x59\xa5\x27\x29\ \x24\x3d\xdd\xf6\x52\x82\x39\x73\x17\xed\x92\x70\x43\xe5\xa6\x2f\ \xcc\xc8\xbe\x33\xad\x85\xbb\x02\xa2\x9e\xa0\xed\xce\xcc\x52\x82\ \x1b\x8e\x7c\xfa\x62\x2b\x6c\x54\x38\xed\xa2\x6b\x3a\x75\x8b\xeb\ \xb9\x2c\x09\x0a\x3d\x19\xd7\x7d\x33\x3f\x7f\xc8\x80\xd9\x38\x52\ \x1d\xdd\xb8\xf7\x85\xb0\xc5\xca\x7a\x2a\xfc\xf7\xe9\x69\x3b\xe7\ \x94\xf3\x87\x1d\xc8\x57\x07\x0c\x57\x23\xf6\xdb\xa7\xa5\x61\xb9\ \xd5\x71\xc9\x31\x07\xe5\x81\xd3\x19\x4c\xfc\x0f\xc1\xac\xb6\x45\ \xe3\xfd\x9f\x01\x00\x77\xe0\x66\x1f\xbf\x12\x01\xbe\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0a\xca\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ \x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ \x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ \x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ \x46\x00\x00\x0a\x40\x49\x44\x41\x54\x78\xda\x62\x64\xa0\x01\x90\ \x0a\x3f\x20\xf0\xef\xcf\xef\xa4\xbf\x3f\xbf\x3e\x7e\xbd\x25\x60\ \x13\x50\xe8\x37\x10\xff\xc3\xa6\x16\x20\x80\x98\xa8\x6d\xb9\x4c\ \xf4\xc1\x44\x41\x5e\xd6\x0b\xc9\xfe\x1a\xbd\x02\x7c\xbc\x73\x81\ \x42\x92\xa2\xde\x2b\xdc\x44\x7c\xb7\x16\x03\xd9\xec\x40\xcc\x8c\ \xac\x1e\x20\x80\x98\xa9\x65\xb1\x7c\xe2\x11\x47\x7e\xbd\xc4\x8d\ \x2e\x66\xd2\x69\xf6\x0e\x7a\x02\xf7\x7e\xf1\x31\xbc\x7d\xf7\x8b\ \x9d\x41\xd2\xc5\xd1\xce\x44\xa5\x98\x9f\x9b\xc3\xf1\xcd\x6f\xd9\ \x5b\xbf\x9e\xed\x7f\x08\x0d\x91\xff\x20\x7d\x00\x01\xc4\x42\xa9\ \xc5\xca\xe9\xc7\x14\xff\xff\x63\x5a\x60\xa0\x2c\x60\xe7\x68\xab\ \xc2\xf0\xf4\x27\x33\xc3\xdd\x77\x0c\x0c\x0f\xef\xbe\x64\x10\x60\ \xff\xc1\x50\x9a\x67\xa3\x7e\xf2\xd6\xcf\xf3\xfb\xce\x3c\x16\xf9\ \xf3\xe5\x89\x38\x50\x0b\x3f\x10\x7f\x83\x45\x09\x40\x00\x91\xed\ \x00\x8d\x82\x0b\x02\xff\xff\xfe\x9d\x28\x25\xc8\x1e\x17\xe7\xad\ \xca\xf0\x82\x89\x8d\xe1\x31\xd0\xd8\xbb\xf7\x3e\x33\x3c\xbb\xf7\ \x98\xc1\xd7\x48\x98\x81\x89\x53\x9f\x21\x73\xda\x93\x9f\x7f\x7f\ \xbd\x7e\xcf\xf3\x87\x59\x8c\x99\x57\xcd\x18\xa8\x75\x2b\x34\xe4\ \x41\xa1\xc0\x00\x10\x40\x38\x1d\x60\x33\xe9\xb1\xe1\x9f\x9f\x3f\ \x85\x3e\x3f\xbc\x78\xe9\xea\x94\xe0\xb7\x30\x17\xeb\x56\x5c\x15\ \xf8\xfb\xfb\x77\x91\xac\x20\x7b\x5e\xa0\x9d\x0c\x3f\x87\x18\x0f\ \xc3\x8b\x2f\x0c\x0c\x8f\x9f\xfd\x61\xb8\x74\xe9\x31\x83\x9d\x12\ \x2b\x83\x97\xa7\x16\xc3\xdc\xc3\x0c\x0c\xef\x81\xe2\x2c\xac\x1c\ \xfc\x7f\x7f\xb3\xb0\x30\xff\x65\x61\xfc\xcf\xcc\x2d\x06\x4d\x07\ \x70\x7b\x01\x02\x08\xc3\x01\x0e\xb3\x5e\x3a\xfe\xfb\xf3\xbf\xc1\ \x48\x86\xc3\x4e\x56\x40\x88\x61\x0b\x1b\xdb\xa7\x7f\x99\xeb\x12\ \xaf\x4f\x0f\xda\xa1\x57\x75\x25\x82\x8f\x9d\xb9\xcf\xcd\x46\x92\ \x5f\x47\x53\x90\xe1\xcd\x4f\x06\x86\xa7\xc0\xe0\x3e\x75\xe9\x15\ \x83\x30\xe3\x77\x86\x54\x27\x59\x86\x63\x0f\x58\x18\x76\x1f\x62\ \x60\xf8\xfe\x13\x62\x1e\x3b\x17\x17\x03\xc3\x57\x1e\xf9\xff\xbf\ \xff\x7e\xff\xcf\xc0\x29\x01\x14\xe2\x40\xb6\x17\x20\x80\xe0\x0c\ \xc7\x59\x2f\x14\x19\x99\x59\x26\x18\x4a\x71\xf8\xc5\x98\x70\x33\ \xc8\x89\x30\x30\x7c\xfa\x0b\xf4\xb1\x32\x17\xdf\xea\xc3\x9c\x6b\ \xcd\xcc\x9e\x31\x48\xf0\xb1\x30\xf8\xdb\x8a\x32\x3c\x03\x06\xf5\ \x3b\x20\x3e\x73\xed\x33\xc3\xeb\x17\x1f\x18\x82\x8d\x45\x18\xde\ \xfd\x11\x63\x58\x73\x85\x81\xe1\xcb\x57\x60\xea\xfa\x8f\xf0\x10\ \x0f\x3f\x17\xc3\xdf\x17\xcc\xe2\xc0\x6c\xf9\x8c\x91\x45\x58\x13\ \x3d\x04\x00\x02\x08\xcc\x70\x9a\xf3\xca\x90\x8f\x93\x6d\x7f\xae\ \x0d\x3f\xbf\xb5\x1c\x03\xc3\x67\xa0\xd8\x0f\xa8\x02\x39\x51\x06\ \x86\x6c\x5f\x11\x86\xef\xc0\x18\xfb\xfe\x0b\x18\xac\x40\xfa\xca\ \x83\xdf\x0c\x17\x6e\xbe\x65\x70\x55\xe7\x66\x90\xd6\x92\x65\xd8\ \x76\x0d\xa8\xe7\x1b\xc4\xe2\x7f\xff\x51\x1d\xc0\x0c\x8c\x6d\xb6\ \xff\x2c\x1c\x3f\xff\xfc\x67\x65\x64\x60\xfb\xc5\x2a\x13\xa8\xfd\ \xfb\xc9\xfa\x7b\x40\x29\x46\x50\x4e\x00\x08\x20\x48\x39\xc0\xc8\ \xd4\xd0\xee\x09\xb1\xfc\x27\x81\xc4\xb7\xfb\xc2\x57\x86\x9f\x9f\ \xbe\x30\xe4\xbb\x49\x30\x7c\x62\xe2\x65\x38\x78\x0f\x61\x29\x32\ \x86\x83\x2f\x20\x47\xb0\x31\xfc\xfd\xcb\xc4\xff\xff\x37\xdb\x2f\ \x26\x1e\x15\x75\xe4\x50\x00\x08\x20\xb0\x03\xfe\xff\xfb\xcb\x24\ \xc6\x07\xcd\x98\x78\xc0\x0f\xa0\xef\x1f\x03\x53\x5c\x8a\x83\x20\ \xc3\xe9\xe7\xc0\xbc\xf4\x1b\x61\x21\xc8\x11\xff\xfe\x41\x1d\x03\ \xd3\xf0\x07\xc8\xfe\xfc\x9d\x81\x09\xe8\x80\xff\x0c\xcc\x3c\xff\ \x7e\x72\xfe\x62\xe4\x90\x50\x06\xca\x70\xc2\x1c\x00\x10\x40\x60\ \x07\xfc\xfb\xfd\xe3\xea\xab\x4f\x84\xb3\xde\xf3\xf7\xc0\xb4\xa2\ \xc6\xc3\x70\xe5\x15\x6a\x70\x63\xc3\xe0\x3c\xf3\xf1\x37\xc3\xbf\ \x3f\xff\x18\xfe\xfd\x05\x85\x02\x3b\x13\xc3\x5f\x5e\x26\x46\x0e\ \x51\x3d\xa0\x0c\x30\x65\x32\xb0\x82\xcc\x04\x08\x20\x16\xa7\xb9\ \xaf\x1d\xf9\x38\x58\x33\xc4\xf9\x08\x3b\xe0\xfa\xe3\xaf\x0c\x6e\ \xca\x6c\x0c\xb7\x3e\x42\x2d\x87\xfa\xf8\xdf\xd7\x2f\x0c\x4c\xb7\ \x36\x33\x28\x32\x3c\x67\x90\xe1\xfd\xc1\xa0\xa8\xaa\xc8\xf0\xe3\ \xc7\x0f\x86\xe7\x9c\xcf\x19\xce\xdf\x66\x66\x78\xf4\x53\x8d\xe1\ \x31\x9b\x09\xc3\x4f\x16\x16\x81\xff\xff\x45\x78\x58\xc4\xec\x55\ \xfe\xbc\x3a\x08\x2a\x11\x19\x01\x02\x88\x05\xe8\xdc\xc0\x24\x33\ \x3e\x7e\x7e\x60\x62\xf9\x85\xc3\x62\x50\xe2\x5b\x70\xe0\x13\x03\ \xdb\xdf\x3f\x0c\x0a\x12\xdc\x0c\x37\x3f\x41\x7c\xf9\xf7\xd7\x7f\ \x86\x2f\x27\xe7\x32\x98\x4a\xff\x62\x70\x4b\x76\x63\xf8\xfc\xf9\ \x33\xc3\xc3\x87\x0f\xc1\x18\x04\x4c\x4d\x4d\x19\x02\x02\xa4\x19\ \x7e\xfd\xfa\xc5\xb0\x66\xfd\x72\x86\x1d\xc7\x85\x58\xa4\x54\xd5\ \x99\x76\x7d\xb1\x77\x06\x3a\xe0\x04\x50\xc9\x7b\x80\x00\x62\xf9\ \xf2\xf8\xea\xb4\x43\x77\xcd\x72\x7d\x55\xb8\xb0\x5a\x7e\xfc\xce\ \x7f\x86\xad\x67\xdf\x33\x84\xe9\xf3\x32\xc8\x49\xb2\x32\x1c\x7d\ \x0c\xf1\xf5\xf7\x37\x2f\x19\xbe\x1f\x9f\xce\x50\x9f\x95\x08\xb6\ \x70\xc9\x92\x25\x0c\xdf\xbe\x7d\x43\xd1\xfb\xf4\xe9\x53\x30\x2d\ \x2c\x2c\xcc\x90\x95\x1e\xcb\xe0\x68\x77\x9d\x61\xfe\xb2\x0d\x4c\ \x1c\x3c\x72\xfa\xc0\xc4\x0e\x0a\x73\x36\x80\x00\x62\x7e\x7a\x70\ \xe1\x47\x16\x8b\x0c\x37\x3f\x23\x7e\x19\x36\x60\x8a\x00\x46\x17\ \x18\xbf\x04\xa6\xde\x49\xfb\xbf\x31\xfc\xfe\xfe\x87\xa1\xd2\x83\ \x8f\xe1\x1b\x30\x3f\x81\x4a\xbc\x9f\xc0\x84\xf7\xed\xcb\x7f\x86\ \x57\xfb\x7a\x18\x9a\xaa\x0a\x19\xce\x9f\x3f\xcf\x70\xe2\xc4\x09\ \x60\x1c\x33\x33\x70\x70\x70\x60\xc5\xff\x80\xa9\xf3\xc2\x85\x0b\ \x0c\x16\x16\x16\x0c\xc6\xfa\xea\x0c\x97\xcf\x1f\x93\x7e\xf2\x8e\ \xfd\xc0\xbf\xaf\x0f\x1e\x03\x04\x10\xa8\x4c\xfe\x2f\x69\x1b\xcf\ \xc1\xca\x2e\xe0\x65\x24\xc3\x02\x4a\xb8\x0c\x27\x9f\x30\x30\xcc\ \x38\xf8\x99\x21\xcf\x86\x87\xc1\x54\x9d\x95\xe1\xc9\x57\x48\x34\ \x80\x2c\x07\xe1\x7b\x07\x56\x30\x44\x7b\x59\x32\x7c\xfa\xf4\x89\ \xe1\xe2\xc5\x8b\x28\x96\x89\x8a\x8a\x32\xc8\xca\xca\x32\x88\x89\ \x89\x31\x30\x32\x32\x32\xb0\xb2\xb2\xc2\xe5\xee\xdd\xbb\xc7\x60\ \x65\x65\xc5\xc0\xcd\xfc\x91\xe1\xce\xc3\xb7\x7f\x5e\x3e\xba\x74\ \x14\x20\x80\x40\x59\xe1\xff\x89\x4a\x83\xb9\x82\x33\x9f\xb5\xc5\ \x9a\x4b\xf2\x82\x82\xec\xe1\xbb\xbf\x0c\x65\x8e\xbc\x0c\x5c\x42\ \xc0\x84\xfc\x03\x9a\xd0\x90\x52\x3d\xfb\xa7\xdb\x0c\xba\xba\x41\ \x0c\x9b\x36\x6d\x62\xe0\xe7\xe7\x07\x07\x33\xc8\x22\x33\x33\x33\ \x06\x45\x45\x45\x30\x1f\xe4\xeb\xdf\xbf\x7f\x83\x1d\x78\xeb\xd6\ \x2d\x78\xb4\x5c\xbe\x7c\x99\xc1\xc5\xc5\x85\x61\xcb\xf6\xfd\xfa\ \x97\x18\x18\x04\x00\x02\x08\x56\x24\xfe\x7c\xf3\xf2\xe5\xec\x63\ \x77\x44\x8b\x2c\x54\x20\x42\x9f\x7f\x81\x4a\x30\xcc\xec\xf5\xfe\ \xe1\x3d\x06\x19\x09\x11\xb0\xe1\x30\x9f\x81\x00\xc8\x62\x09\x09\ \x09\x86\xef\xdf\xbf\xc3\x2d\x7b\xff\xfe\x3d\x83\xb8\xb8\x38\xc3\ \xcf\x9f\x3f\x19\x3e\x7c\xf8\x00\x16\xfb\xfa\xf5\x2b\x38\x74\x34\ \xd5\xe4\xb4\x40\x55\x33\x40\x00\xc1\x1c\xf0\xef\xeb\x8b\xdb\xf3\ \x66\x1c\x90\x28\x72\x54\x91\x60\x90\x17\x62\x66\xb8\xf2\xf4\x37\ \x83\xa3\x38\x2b\x4a\x5e\x07\xb1\x7f\x01\x09\x09\x5e\x5e\x70\xca\ \x86\xf9\x1e\x5c\x98\x01\x15\x3c\x7f\xfe\x1c\x85\x0f\xca\x15\x20\ \x87\x82\x42\x07\x59\x2d\x48\x4c\x40\x40\x00\xc4\xe4\x04\x08\x20\ \x78\xa5\x70\x6d\x5a\xd8\x2d\x8e\xba\x0b\x6b\x76\xdf\x10\x0a\xd1\ \x52\x65\x63\x58\x7f\xe6\x3b\x83\x8f\x31\x2b\xc3\x07\xa4\xe0\xff\ \xf9\x07\x92\xf7\xdf\xbd\x7b\x07\xb6\x00\x6a\x08\x18\x3c\x7b\xf6\ \x0c\x1c\xe7\xc8\x0e\xf8\xf3\xe7\x0f\x98\x66\x67\x67\x07\x87\x04\ \xb8\xe4\x63\x62\x62\x78\xfb\xf6\x2d\xc3\xab\x57\xaf\xc0\x55\x05\ \x40\x00\x21\x57\xc7\x7f\x3e\xdf\x3f\xd5\xbc\xe9\xac\x44\x88\xbd\ \x86\x38\xc3\x8f\x3f\xff\x19\xfe\xff\x41\xf8\xfe\x0f\xb4\xd0\xe1\ \x10\x56\x64\x78\x76\xfc\x19\xd8\x00\x50\xf6\x02\x59\x02\x02\x2f\ \x5f\xbe\x04\x87\x00\xc8\x42\x74\xac\xad\xad\x0d\x0f\x01\x90\x63\ \x6e\xdf\xbe\x0d\x52\xfb\x18\x14\xf2\x00\x01\x84\xd2\x26\x7c\x77\ \x69\xf3\xbb\x9f\x2a\x61\x5a\x76\xda\x92\x5a\xbf\x81\x2e\xfd\xf5\ \x83\x91\x81\x93\x07\x48\x03\x53\xfe\x57\x60\x62\xfc\x09\x4c\x17\ \xbf\xff\x31\x32\x3c\xbd\x75\x95\xe1\xd7\xc7\x67\x0c\x6a\x6a\x6a\ \x0c\x3c\x3c\x3c\xe0\x74\x00\x8a\x57\x50\x9c\xdf\xbf\x7f\x9f\xe1\ \xcb\x97\x2f\x60\x0c\x72\x9c\x96\x96\x16\x83\x8e\x8e\x0e\x58\x0d\ \x28\x2a\xde\xbc\x79\xc3\xb0\x67\xcf\x1e\x86\x53\xa7\x4e\x6d\x7b\ \xf4\xe8\xd1\x09\x80\x00\x42\x6f\x94\xfe\xe7\x96\x31\xba\x71\xff\ \xbb\x58\x66\x9c\xbd\x30\xc3\xf6\x0b\x9f\x18\xf4\x14\x38\x18\x3e\ \xff\x84\x64\x43\x50\x65\x24\xc5\xcd\xc0\x10\xe9\xa4\xc3\xb0\x69\ \xdd\x2a\x70\x82\x03\x05\x2d\x28\x24\xf8\xf8\xf8\xc0\x0e\x32\x36\ \x36\x06\x27\x48\x5d\x5d\x5d\x06\x0f\x0f\x0f\x06\x05\x05\x05\xb0\ \xe5\x7f\xff\xfe\x65\x78\xf0\xe0\x01\xc3\xe1\xc3\x87\x41\xe5\xc6\ \xe3\xed\xdb\xb7\x4f\x04\xda\xf7\x04\x20\x80\x30\x5a\xc5\x1f\xae\ \x6e\x7d\xf7\x4f\x35\x54\xcb\x44\x49\x58\x6b\xd7\x0d\x60\xd9\xaf\ \xc3\xc3\xf0\x1e\xe8\x80\xff\xc0\xd2\xc9\x4c\x8a\x81\xc1\x56\x1a\ \x98\x74\xb9\xd9\x80\x41\x2a\xc0\xb0\x75\xeb\x56\x70\xea\x06\x19\ \xce\xcd\xcd\xcd\xc0\x05\x6c\xfd\xb0\xb0\xb0\x80\xd3\x06\x2c\x7d\ \xc0\x12\xe7\x99\x33\x67\x18\x8e\x1c\x39\x02\xca\x96\xdf\x4e\x9e\ \x3c\x39\x11\x18\x5a\x37\x80\xd2\x0f\x00\x02\x88\x11\x4b\xe9\xcb\ \x28\x66\x9b\x27\xa7\x68\x97\x72\xd9\xd7\x5a\x86\x57\x47\x96\x9b\ \x41\x52\x8a\x8d\xc1\x04\x58\x26\xa0\x77\x22\xae\x5f\xbf\xc9\x30\ \x6d\xda\x34\x60\xd0\x32\x33\xc8\xc8\xc8\x30\x48\x4b\x4b\x33\x08\ \x09\x09\x81\x1d\x03\x02\x1f\x3f\x7e\x04\xa7\x95\x17\x2f\x5e\x80\ \x1d\x01\x0c\xf2\xbb\x7b\xf7\xee\x9d\x06\x2c\xc0\x80\x6d\x27\x86\ \x3b\xa0\xd2\x1a\x20\x80\xb0\x35\x4a\xff\xbf\x3a\x3c\xe9\x29\xaf\ \x9a\xcf\xdc\x57\xaf\x04\x0a\xb6\xbf\xfd\xc9\x30\x43\x47\x02\x43\ \x11\xd0\xd3\x0c\x4b\x80\x15\xd4\xa6\xdb\x1a\xef\x6c\x45\x8e\x0a\ \x81\x52\xf6\xf5\xeb\xd7\xc1\x21\x00\x2b\x7e\x41\xd9\x0d\x94\x5d\ \x41\xd1\x00\xb4\xfc\xd9\xc6\x8d\x1b\xfb\x81\x39\xe5\x15\xd4\xf2\ \x17\x40\xfc\x0b\x20\x80\x70\xb5\x8a\xff\xdc\x9d\xeb\x56\xb7\x85\ \xf1\xb0\xa7\x94\xbc\xb8\xfa\xfb\x1f\x12\x0c\x82\x1c\x08\xc9\xf3\ \xb7\x3f\x31\x94\xcc\xbe\xc5\x70\xfe\xc8\x96\xed\x1f\x4f\xb6\x6c\ \xbe\x63\x6a\x6a\xa2\xa7\xa7\x97\x04\x8a\x02\x41\x41\x41\x06\x29\ \x29\x29\x06\x25\x25\x25\x70\xb1\x0c\x62\xf7\xf6\xf6\xfe\x00\xd6\ \x19\x4b\x80\x96\xbf\x01\x62\x50\x73\xec\x15\xb4\xd5\xf7\x1f\x20\ \x80\xf0\xf5\x8c\xfe\x72\xc9\xd9\x3e\xfd\xcd\x2c\x14\xce\xcc\xc6\ \xc6\x60\x09\xac\x2d\x81\x8d\x1b\x86\x96\x15\xf7\x18\xca\x67\x9c\ \x7d\x7c\x7b\x5f\x4f\xcf\xe7\x4b\x73\xb6\x01\xf3\xf5\x2b\x60\xf0\ \x9e\x01\xfa\xf8\x26\x30\x2d\x08\x01\x53\xba\x24\xc8\x11\xa0\xf6\ \xc0\x81\x03\x07\x7e\x00\xa3\xe8\xfc\xce\x9d\x3b\xe7\x03\xd5\x5c\ \x03\x5a\xfe\x04\xa8\xee\x1e\x30\x5d\xc0\x3a\x26\xff\x01\x02\x88\ \x91\x40\x1b\x84\x43\x2e\x72\xf3\x0c\x49\x25\xa5\xf8\x09\x71\x72\ \x0c\x65\x0b\xee\x32\xdc\x3a\x77\x60\xd3\xcb\x9d\x05\xcb\x40\x59\ \x1f\x54\xfe\x00\xf1\x6b\x56\x50\x22\x00\xd6\xba\x40\x83\x25\x80\ \x58\x18\xc8\xe6\x86\x76\x3e\xfe\x43\x1a\x66\x0c\x1f\x41\x29\x1e\ \x68\xf9\x13\xa0\xfc\x17\x68\xa7\x04\x54\xe9\x32\x00\x04\x10\x21\ \x07\x30\xf1\xeb\x27\xcb\x09\x19\x86\x2f\xf8\xff\xf7\x07\xe7\xab\ \x83\x9d\xcb\xbe\x3d\x3a\x7a\x17\x6a\x31\x08\x83\x0a\x78\x58\x3b\ \x86\x05\xe8\x43\x4e\x20\xe6\x81\x36\x3a\x99\x20\x99\xe0\xff\x1f\ \xa8\x8f\xbf\x43\xd5\xfe\x81\x3a\x0c\xdc\x74\x04\x08\x20\x46\x22\ \x7a\x61\xa0\x74\x22\x02\xea\x75\x43\x7d\x05\xea\x25\xbd\x01\xd5\ \x2b\x30\x5f\xc0\x72\x0f\x12\x46\x36\xfb\x3f\x12\xfd\x9f\x01\xad\ \xed\x0b\x10\x60\x00\x43\xe6\x61\xe0\xaa\x5d\x5d\x5b\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x11\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\xa3\x49\x44\x41\x54\x28\xcf\x63\ \xf8\xcf\x80\x1f\x32\x10\xa9\xa0\x3c\xa1\xfc\x7d\xf9\xff\xd2\x7e\ \x08\x2f\x71\x7d\xf4\xff\x90\x02\x34\x13\xca\xf7\x97\xfc\x87\xb1\ \x23\x05\x82\xcf\x63\x58\x51\xbc\x3f\xef\x3f\xc2\x60\xaf\xfd\x18\ \x0a\x72\xf7\x67\x20\x29\x70\xc4\x54\x90\xbe\x3f\x11\x49\x81\x05\ \xa6\x82\x84\xfd\x91\x48\x0a\xf4\x31\x15\x44\xec\x0f\x44\x52\xa0\ \x86\xa9\xc0\xbf\xdf\xfb\xbf\x63\x00\x84\xad\xe2\x20\xd7\x8f\xa1\ \xc0\x4d\xc1\xfe\xbd\xc5\x79\x43\x85\xff\x0c\xca\x0e\x32\xe7\xc5\ \x14\xb0\x84\xa4\x99\x82\xfe\x7c\x8d\xfd\x8a\xfb\xa5\xfb\x45\x0c\ \x48\x0f\xea\xff\x0c\xda\xff\x55\xfe\xcb\xfd\x17\xff\x2f\xf4\x9f\ \xe7\x3f\xfb\x7f\xe6\xff\xa4\x9b\x80\x0b\x02\x00\xcf\x22\xfd\x6e\ \xde\x79\xee\x9f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x05\x28\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x04\xef\x49\x44\x41\x54\x78\xda\xc5\x95\xcf\x73\x13\x65\ \x18\xc7\x3d\xa8\xcc\xe8\x81\x71\x86\x51\x0f\x78\xf0\x8e\x07\x19\ \xf0\xe0\xff\xa0\x57\x3d\x78\x73\x3c\x3a\x1e\xe4\xd0\x19\x11\x45\ \x40\x2c\x05\xd4\xd4\x22\x2d\xd0\x94\x06\x2a\x20\x0d\x0d\x69\xd3\ \x36\x25\x26\x81\xb6\xa9\x49\x49\xda\x34\xcd\xef\xa4\xf9\xbd\x9b\ \xdd\xfc\xd8\x5f\x49\x36\x4d\xe9\xd7\xf7\xdd\x32\x65\x3c\x54\xa0\ \x24\xe3\xe1\x33\xef\x9b\x77\x77\xdf\xe7\xf3\x3e\xcf\x93\xdd\x97\ \x00\xfc\xaf\xec\xea\x21\xd3\xaf\x47\xdf\xb7\xe9\x8f\x5f\xb0\x0d\ \x9e\x88\x38\x87\x4f\x2f\xda\x87\xbb\x4f\x4c\x1b\x7a\xde\xec\xb8\ \x80\x45\xf7\xe5\x1e\x9b\xfe\x07\xa3\xa9\xb7\x0b\x63\xba\x2e\x4c\ \x5f\x39\x85\x07\x37\x7a\xe1\x36\x5d\x86\xdb\x7c\x79\x63\xc1\x78\ \xa1\xab\xa3\x02\xd3\x97\xbe\x37\x99\x2f\x7c\x8b\xbb\xbf\x7d\xa3\ \xe1\xb8\x76\x1e\x9e\x71\x3d\xc2\xf7\xc7\x10\x77\x59\xe0\xb7\xdd\ \xc4\xc2\x6d\xdd\x17\x1d\x11\x70\x5e\x3d\xf9\x29\x3d\xf5\xc8\x4f\ \x5f\xc1\x44\x82\x9b\xfb\x8e\xc2\x66\xe8\x81\xc7\x3c\x88\xa0\xd3\ \x88\xc4\xdf\x93\x58\xb5\xdf\x86\xfb\xee\xa5\x96\xd5\x70\xe4\xf5\ \xb6\x0b\xd8\xf4\x27\x1d\x37\x7b\xbe\xc6\x92\xe5\x12\xee\xdf\xec\ \x85\x79\xe0\x14\x6e\x9c\x3b\x82\xe9\xa1\x1e\xcc\x19\xfb\x31\x6f\ \xbc\x48\xe8\x87\x8b\x8c\x7f\x5d\x3b\xfd\x49\xdb\x05\xc6\x7f\x3f\ \x56\x0d\xce\x0c\x41\x0a\xdb\xa0\xa4\x3c\x68\x30\x41\x94\x93\x3e\ \x82\x17\x8d\x62\x8c\x10\x45\xc2\x65\xc6\xe4\xc0\x09\xd8\x0d\x3f\ \xea\xdb\x2e\x30\x71\xf1\x3b\x95\x7b\x78\x07\x72\xcc\x89\x5a\x76\ \x09\x0d\x36\x0c\x95\x8b\x41\x2d\x25\xd1\x2c\xa7\xa0\xf2\x09\x6d\ \xcd\x67\xb9\x8a\xd9\x91\x33\x33\x6d\x17\x70\x8c\xf4\xf0\xd5\xc0\ \x04\xe4\xc4\x2c\xea\xf9\x15\x12\x2c\x42\x04\xe2\x5a\xf0\x66\x35\ \x4b\x47\x2d\x0b\x19\xaf\x15\x9e\x51\xdd\x1f\x6d\x15\x48\x38\xae\ \x1d\x8e\x39\x0c\x1e\x71\x75\x92\x08\xcc\xa1\x5e\x08\x6c\x09\xf0\ \x8f\x05\x2a\x99\x6d\x01\x71\x6d\x11\x71\x87\xe1\x61\x7b\x05\x66\ \x6e\xed\x65\xbd\x26\xaf\x18\xb0\x6c\x09\xe4\xfc\x8f\x4b\x10\xa7\ \xa9\xa7\xc1\x69\x29\x88\x40\x84\x94\xc7\x87\xcc\xc2\xad\xa1\xb6\ \x97\x20\xeb\x1e\x35\x0b\xab\x16\x28\x54\x20\xbf\x0c\xb5\x48\x05\ \xa2\x68\x96\xe2\x04\x22\xc1\xc5\xe8\x1a\x6d\xd0\x4a\xfa\xc1\xf5\ \x83\x6d\x17\x88\xd8\x47\xf6\x09\xcb\xa6\x55\x39\xe6\x40\x3d\xed\ \x81\xca\x06\x08\x41\x1a\x94\x10\x22\x73\x02\xb3\x0a\x29\x31\x77\ \xb6\x63\x6f\xc2\xea\xd2\x68\x97\x14\xb2\xa2\x96\x78\x80\x7a\x86\ \x48\x14\x7c\x84\xa5\x2d\xf2\xcb\x44\xcc\x0d\x39\x68\x3f\xd0\x31\ \x01\x65\xc5\xf4\x16\xef\xbb\xb3\x29\x47\xef\x6d\x49\xa4\x17\xd0\ \xc8\x2e\x52\xb4\x79\x62\xee\x76\xbd\xe3\x5f\x43\xbf\x55\x1f\x17\ \x49\x2f\xc8\x91\x7b\x50\xe2\x0e\x2a\x42\xb8\x0f\x21\x34\x03\x9f\ \x75\x64\xbc\xe3\x02\x09\xcf\xf4\xf0\xaa\x75\x10\x62\x60\x1c\x52\ \x68\x0a\x72\xc8\x4a\x64\xac\x70\xfc\xf9\x0b\xc2\x0b\x96\xe3\x1d\ \x17\xc8\x07\xe7\xf5\xf9\xe0\x2c\x3c\x93\x7a\xb8\x27\x06\xe0\xba\ \xf3\x1b\x6c\x23\x3f\x23\xe1\xb5\x22\xe5\xbd\xd7\xd5\x71\x01\x36\ \xec\x1a\x53\x98\x08\xf8\xa4\x0f\x2b\x4e\x23\xe6\xcd\x83\x64\x1c\ \x05\x13\x5e\x40\xda\x6f\xef\xee\xa8\x40\xab\xb5\xf1\x1a\x97\x4b\ \xb5\xea\x5c\x02\x42\x26\x80\xd0\xbc\x99\x64\x62\x18\xc1\x59\x13\ \x58\x22\xc0\xa4\x62\x02\xb9\x67\x6f\xdb\x05\x38\xbe\x71\x20\x9b\ \x2f\x0f\xe5\xd9\xaa\xc4\x70\x02\x44\x3e\x8f\x4a\xda\x8f\x80\xd3\ \xb8\x25\x30\x37\x8e\x42\x66\x0d\xa5\xb2\x8c\x7a\xa3\x29\x8b\x52\ \xfd\x4a\x49\x92\x0f\xbe\x90\xc0\xfa\xfa\xc6\xcb\x79\x46\xf8\x3c\ \x95\xe5\x16\xb9\x92\x84\xaa\x50\x23\x01\x24\x94\x2b\x32\x04\xb1\ \x06\xbe\x24\x23\x9d\x66\x90\x4c\x31\xda\xba\x24\x37\x40\x9e\xd9\ \x46\x55\xd7\xd1\x68\xac\xcf\x37\x1a\x1b\x9f\x91\xdf\xaf\x3e\x97\ \x40\x81\x97\x0e\x05\xc2\xb9\x4a\xa5\xaa\xd0\x60\xda\xe6\xb5\x9a\ \x4a\x37\x44\xbd\xae\xa2\xd9\x6c\x6d\x43\x02\xd1\xf1\xdf\x6b\x14\ \x95\xde\xdb\xa4\x19\x81\x52\x53\xf9\x5a\xad\xf1\xe1\x33\x09\x08\ \x82\xb4\x3f\x18\x63\x4a\xa5\x8a\x84\x8a\x40\x83\x93\xc0\x2a\xdd\ \x54\x83\xcc\xd7\xe9\xf8\x4c\xd4\x88\x80\xa2\xa8\x50\x88\xb4\xac\ \xa8\x3c\x59\x7b\xf7\xa9\x02\x5e\xff\x9a\x8f\x2d\x0a\x5a\xaa\x45\ \xb1\xae\x9d\x5a\x55\x35\xc8\xbc\x49\xc7\x67\x86\xca\x92\x93\x43\ \x92\x35\xa8\xcc\xec\x7f\x0a\x14\x9b\xad\x37\x56\x42\xd9\x47\x0c\ \x27\x82\x2b\x89\x34\x75\x74\x93\x17\x42\x21\x59\x10\xa4\xba\x56\ \xca\x72\x55\x7e\x54\x15\xc4\xfd\x3b\x0a\x24\x93\xdc\xb1\x3c\x5b\ \x01\xed\x74\x96\x20\x2b\xa4\xf6\x0d\x95\xd6\x71\xd7\x28\x64\x0f\ \xda\x4b\x1a\x82\x8c\xaa\x20\x1f\xd9\x51\x60\x35\x94\x63\x0b\x45\ \x81\x0a\x50\xb4\xce\x57\x68\x1d\x6b\xbb\x97\x10\xe5\x3a\x0d\x4e\ \x4f\xaf\x51\xe4\x45\xcf\x8e\x02\xfe\x50\x66\x93\xaf\x48\x60\x88\ \x04\x15\x29\xf2\x92\xf6\x97\x2a\x55\x64\xda\x50\xbb\x82\x36\x32\ \x5f\x96\x48\x49\x89\x00\x15\xa9\x28\xad\x1d\x05\x06\x0c\xf6\x0f\ \x9c\xae\x50\x21\x9a\x2c\x52\x53\xb0\x04\x2a\xc0\xb0\x5a\x39\x1e\ \xa3\x6a\x48\xda\xfc\x09\xd2\x93\x6b\xdb\x6b\x34\x73\xf4\x1d\xc2\ \x72\x22\x32\xb9\x0a\x66\xdd\xb1\x8c\xfe\xba\xf3\xbd\xa7\xbe\x07\ \xce\xf4\x4d\xbc\x3d\x36\xf5\xf0\x9c\xcb\x1b\x5f\x89\x26\x59\x21\ \x9d\x2b\x6f\x90\xde\xd8\xcc\x16\x2a\x48\x67\xcb\x58\xcb\xf0\x88\ \xaf\x15\x11\x4d\x30\x08\xc7\x0b\x88\xc6\x19\x44\xc8\x18\x4f\x71\ \x48\xae\x71\x9b\x89\x34\xf7\x88\x5c\x5b\x0f\x84\x72\x65\xb7\x37\ \xbe\x3c\x36\xe5\x3d\x75\xb6\xdf\xbc\xaf\x2d\x1f\x23\x9d\xce\xb2\ \xe7\x5c\xdf\xf4\x3b\xa7\xfb\x26\x0f\x9f\xbf\x38\xf5\xf1\xd9\x81\ \xc9\x8f\xba\x7b\x27\x0e\x75\xeb\x2c\xfb\xfb\xfb\x17\x5f\x79\xde\ \xfd\xfe\x01\x44\x3d\xde\xea\xb7\x54\xae\x21\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x30\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\xc2\x49\x44\x41\x54\x28\xcf\x63\ \xf8\xcf\x80\x1f\x32\x50\x4b\x41\x79\x42\xf9\xf9\x92\xff\x05\xef\ \xb3\xeb\x53\xd7\x27\xbc\x8f\x9c\x1f\x2c\x80\x61\x42\x71\x7d\xe6\ \xff\xac\xfd\x20\x56\xc4\xfc\x90\xff\x5e\xe7\x31\x14\xe4\xd6\xa7\ \xfe\x4f\x06\x2b\xf0\xaf\xf7\xfb\xef\xf8\x1f\x43\x41\x7a\x7d\xfc\ \xff\x68\xa0\x02\x5f\x01\xb7\xfb\x6e\xff\x2d\xe6\x63\x28\x48\xa8\ \x8f\xfc\x1f\x7c\xdf\xa7\xde\xf5\xbc\xcb\x7f\xb3\xfd\x58\x7c\x11\ \x51\x1f\xfc\xdf\x0b\x2c\x61\x32\xdf\xe2\xbf\xda\x79\x79\x01\x34\ \x05\xfe\xf5\xbe\xff\x1d\xc1\x0a\xb4\x05\xd4\xfe\xeb\xfe\x17\x2f\ \x40\x53\xe0\x56\x0f\xb4\x19\x6a\xb4\xcc\x7f\xcd\xff\x02\xf5\x68\ \x0a\x6c\xeb\x1d\xfe\xeb\x83\x3d\x27\x5d\xa0\xf2\x9f\xff\x3d\x97\ \x02\x8a\x02\x9b\x04\x93\xf5\xba\xfb\xd5\xf6\xcb\xf7\x4b\xf6\x0b\ \xef\xe7\xed\xe7\x54\xa0\x7a\x5c\xe0\x86\x00\x4a\x5a\xfc\x7a\x13\ \x90\xf5\x5f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xec\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\x82\xcc\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0b\x1d\x03\x20\x2e\x2a\ \x9a\x6f\x2b\x00\x00\x01\x70\x49\x44\x41\x54\x28\xcf\x55\xcf\x3d\ \x4b\x95\x01\x1c\x86\xf1\xdf\xff\xf1\xfd\x8d\xa2\x45\x07\xbf\x82\ \xd2\x14\xb4\xd5\xd0\xa1\x3e\x80\x89\xd8\xa6\xbb\x4b\x43\x20\x35\ \x14\x6e\x2d\xad\xa1\x5b\x16\x95\x53\x25\xc4\x09\x0b\x82\xd6\x0a\ \xfd\x0a\x12\x1e\x90\x7c\xef\x1c\xf3\x79\x9e\x7f\x83\x20\x74\x2d\ \xd7\x72\xdd\xc3\x1d\x3c\x92\x9e\xf8\x32\x5a\x2f\x66\x23\xc7\x89\ \xed\x68\x16\x4b\x37\x5b\x0f\x85\xc7\xe2\x81\xd2\x53\x9f\x96\xeb\ \xb9\x63\xfd\xfa\xd1\xd1\x31\xac\x58\xb9\x35\x7f\x5f\xb7\x58\xf0\ \xcc\xc7\xcd\xf6\x44\x91\x57\x5d\x8a\x02\xa5\x93\xfc\xa9\x8c\x81\ \xad\xdb\x93\x0b\xb0\xbe\xbc\x96\x5f\xeb\xa3\x6c\xe7\x69\x9e\xe5\ \x59\xfe\xcd\x93\x3c\xcc\x6f\xf5\x5a\xae\x2f\x13\x1f\x46\xab\x9d\ \x2a\x1b\xd1\xad\x0f\x89\xc0\xa9\xd2\x46\x8a\xae\xb1\xa2\x5a\x3c\ \x74\x4d\x8f\x3e\x1b\xde\x09\xe1\xa5\xe7\xfa\x74\xb9\xee\x50\xb5\ \x58\x94\x8d\x21\x83\x11\xa8\x75\x40\xed\x04\xdd\x86\x62\x44\xd9\ \x28\xaa\xf1\x41\xe7\xfc\xb6\x0f\xda\x0e\x51\x08\x23\xaa\xf1\xee\ \x94\x02\xfc\xd2\x02\xc7\xda\x20\x84\x5a\x91\xdb\x27\x6a\x89\x5e\ \x43\x5c\x38\x71\xc0\x76\xa1\xb9\xaf\x9d\x25\x0a\xbd\x5c\xb8\xd6\ \xc9\x5d\x9a\xf1\x6a\xb4\xda\xe9\xcd\x3b\xd1\xf3\xdf\xcd\x52\x7a\ \x9f\xed\xe8\x1a\x2b\x66\x5a\xc5\xca\x51\xfc\xc8\x4a\x47\x29\xa5\ \xca\x99\xf4\x3d\xf7\xa2\x58\x99\x69\xc5\xb4\xd7\x56\x37\x3b\x13\ \x23\x79\xc3\x70\x9c\xef\x3b\xf9\xd9\x5e\x0c\x6c\xcd\x4e\x4e\x8b\ \xbb\xd2\x5b\xab\xcb\xf5\xdc\x1f\x57\x5c\xc6\x81\x5d\x43\x8a\x95\ \xd9\xf9\x29\x21\x38\x4f\x5e\x8c\x5a\xac\x1b\xc6\xb1\x5d\x34\x2d\ \xdd\x6b\x4d\x09\x6f\xfc\x03\xc9\xef\xa7\x13\xc8\x35\x03\xd6\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xcc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ \x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ \x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ \x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ \x46\x00\x00\x06\x42\x49\x44\x41\x54\x78\xda\x62\xfc\xff\xff\x3f\ \x43\x7e\x7e\xfe\x05\x79\x45\x45\xb5\x1f\xbf\xff\xfc\x61\x64\x60\ \x60\x00\x61\x10\xf8\x0f\x26\xfe\x33\x60\x05\xff\xa1\xf2\x58\x05\ \xfe\x23\x91\x0c\x28\x0a\x19\x81\xe0\xff\xbf\x3f\xff\x9f\x3d\x7d\ \x7a\x75\xea\xd4\xa9\x96\x00\x01\xc4\x02\x12\x64\x66\x64\x64\x0f\ \xcc\x29\xe0\x7c\xf7\x9b\x81\x41\x9e\x8d\x81\xe1\xc5\x2f\x06\x86\ \xe7\x3f\x19\x18\x98\x90\x0d\xf8\x8f\xc6\x26\xc4\x47\xb3\x18\x06\ \x98\x80\x86\xea\xf2\xfd\x66\xa8\x2d\xc9\xe5\x04\xf1\x01\x02\x88\ \x05\xa6\xf2\xdf\x3f\x06\x86\xad\xef\x19\x18\x8a\x24\x18\x18\x96\ \xbd\x60\x60\x68\xbf\x07\x35\x00\x28\xce\xf0\x17\x8a\xff\x21\xe1\ \x3f\x48\xe2\x7f\xf1\xa8\x43\x0b\x24\x76\x56\x06\x86\x87\x31\xff\ \xe1\xa1\x0c\x10\x40\x2c\x30\x39\x90\xda\xcb\xdf\x18\x18\x36\xbc\ \x65\x60\x38\xfd\x99\x01\xec\x7d\x66\x6c\xbe\x82\xf1\x99\x51\x3d\ \xc9\xc8\x88\xc4\x67\x84\xf2\x19\x51\xb5\xfd\x03\x72\x98\x59\x50\ \xdd\x04\x10\x40\x2c\x30\xcb\xe5\x80\x41\x9f\x29\x0e\xd4\x03\x54\ \x54\x2d\xcf\xc0\xd0\xa8\x80\x23\x38\x41\x51\x0d\x34\x09\x94\x76\ \x10\xec\x7f\xf0\xd0\xfa\x07\x12\xff\x07\xf1\x3a\x44\x18\xa1\xf6\ \x1f\x50\x80\x95\x85\x85\x81\x97\x95\x11\xec\x18\x10\x00\x08\x20\ \x16\x58\x3a\x63\x07\xd2\x4e\xbc\x0c\x44\x02\xe4\xa4\xca\x00\x09\ \x2e\x78\x78\x83\x2c\x63\x84\x18\x0a\x4d\xc0\xff\xfe\xfe\x67\xf8\ \xfb\xfb\x37\xd8\x31\x4c\x8c\xff\x18\xfe\x32\xb2\xc1\x75\x02\x04\ \x10\x0b\x36\xe3\x7f\xfc\xf8\xc1\xf0\xf0\xe1\x43\x60\x82\x81\x27\ \x43\x86\x3f\x7f\xfe\x30\x30\x33\x33\x83\x31\x08\xfc\xfd\xfb\x17\ \x2c\x06\x52\xc3\xca\xca\x0a\xf6\xe5\x6f\xa0\x25\x20\x71\x98\x3a\ \x98\x18\x0f\x0f\x0f\x83\xb0\xb0\x30\x30\x60\x80\x96\xff\xfd\xc3\ \xc0\xc5\x85\x70\x00\x40\x00\xb6\xc9\x15\x07\x60\x00\x84\xa1\x64\ \xf7\x3f\x25\x02\xc2\xd7\xe1\x97\x56\x4d\x0c\x09\x6d\x79\xa6\xcf\ \x1f\xc0\xdd\xc9\xee\x32\x0c\x01\x30\x56\x15\xc1\xba\x5b\xcc\x8c\ \x3a\xec\x70\x57\x55\x89\x08\x02\xc1\x87\xe7\xee\x2e\x33\x43\x6f\ \x66\xa2\x7e\x04\x82\xe6\x3b\xaf\x00\xc2\xea\x00\x90\x62\x6e\x6e\ \x6e\x06\x5e\x5e\x5e\x38\x06\xf9\x82\x8f\x8f\x0f\x6c\x21\x08\x83\ \xd8\x20\x35\x20\xf1\xef\xdf\xbf\x83\x1d\x0b\x52\xc7\xc5\xc5\x05\ \x16\x03\x59\xc6\x02\x8c\x6f\x10\x1b\x44\xc3\x42\xf1\xdf\x3f\xd4\ \xac\x01\x10\x40\x2c\xb8\x62\x19\xe4\xfa\x5f\xbf\x7e\xc1\x1d\xf4\ \xe4\xc9\x13\xb0\xef\x39\x38\x38\xc0\x06\xde\xbc\x79\x93\xe1\xdb\ \xb7\x6f\xe0\x28\x90\x96\x96\x06\xab\x01\xe9\xf9\xf2\xe5\x0b\x98\ \x16\x14\x14\x84\x9b\x03\x4e\x07\x40\x8b\x41\x0e\x07\xa9\x67\x64\ \x44\xa4\x1f\x80\x00\xc2\xe9\x00\x90\x6f\x40\x16\x81\x1c\x21\x2a\ \x2a\x0a\xb6\x5c\x4f\x4f\x8f\x81\x9f\x9f\x1f\x6c\x18\xc8\x10\x50\ \xd0\x4b\x49\x49\x31\x70\x72\x82\xcb\x14\xb0\x83\x40\xea\xe4\xe5\ \xe5\xe1\x6a\x40\x62\xa0\xf4\x04\xb2\x1c\x14\x2a\xc8\xe9\x0a\x04\ \x00\x02\x88\x05\x57\x14\xb0\xb3\xb3\x83\x15\x83\x34\x82\x2c\x00\ \xf1\x41\x41\x0e\xb3\x0c\x04\x40\xa1\xc1\xc6\xc6\x06\x4e\x84\x20\ \x00\x52\x03\xe2\xc3\x82\x1c\x26\x06\x72\x0c\x2c\xc1\xa2\x3b\x00\ \x20\x80\xb0\x3a\x00\xe4\xeb\xeb\xd7\xaf\xc3\x53\xee\xfb\xf7\xef\ \xc1\x41\x0b\x4a\x7c\x20\x4b\x61\x3e\x01\x25\x3c\x90\x03\x41\x96\ \x82\xc0\xcf\x9f\x3f\x19\x3e\x7e\xfc\x08\x96\x87\x85\x00\x28\xe1\ \x82\xcc\x03\xa9\x47\x8f\x7f\x10\x00\x08\x20\x9c\x0e\x10\x11\x11\ \x01\x27\x20\x90\xa1\x92\x92\x92\x0c\x1f\x3e\x7c\x00\x07\x37\xb2\ \x03\x40\x72\xe2\xe2\xe2\xf0\x50\x01\x25\x46\x90\xef\x41\x69\x02\ \x94\x28\x41\x0e\x00\x89\x81\x72\x15\x72\xe8\x22\x03\x80\x00\xc2\ \x19\x05\x30\x8b\x40\x18\xc4\x06\x65\x2d\x90\xe1\x20\x0c\x73\x00\ \xb2\x18\xd8\x30\x20\x0d\x2b\x03\x40\x66\x80\x30\x48\x0c\x96\xf0\ \xb0\x45\x01\x40\x00\x61\x75\x00\x28\x48\x41\x41\x2e\x24\x24\x04\ \xf6\x1d\x28\x4f\x83\xf8\x8f\x1f\x3f\x06\xcb\xc1\x1c\x00\x4a\x70\ \xa0\xb8\x85\x45\x01\x28\xe4\x40\x51\x00\x4b\xf5\xb0\x28\x80\xa5\ \x7e\x98\x18\x32\x00\x08\x20\xac\x0e\x00\x25\x2a\x09\x09\x09\xb0\ \x81\x20\xcd\xb2\xb2\xb2\xe0\x42\x47\x46\x46\x06\xec\x20\x98\x03\ \x40\x96\x83\xa2\x07\x39\x0a\x40\x89\x0e\x39\x17\x80\xc4\x6e\xdf\ \xbe\x0d\x0f\x11\x74\x07\x00\x04\x10\xdc\x01\x20\x43\x61\x06\x80\ \x34\x43\x8a\x4d\x44\x49\x08\x4b\x58\x20\x31\x58\xd4\x80\x30\x88\ \x0f\xc2\xb0\xe2\x19\x84\x61\xea\x40\x96\xc1\xe4\x70\x39\x00\x20\ \x80\x58\xd0\xeb\x00\x90\x85\xa0\x44\x03\x4a\xf9\xa0\x3c\x0f\x0a\ \x0d\x50\x51\x0a\x8a\x02\x50\x54\x20\x47\x01\xa8\xd8\x05\xb1\xd1\ \xa3\x00\x14\xef\xc8\x51\x00\xcb\x82\x20\xb5\xe8\x0e\x00\x08\x20\ \x16\xd4\xd6\x0a\xa2\x94\x02\xe5\x02\x90\x46\x90\xa1\xa0\xa0\x07\ \x45\x01\x28\x2a\x40\x09\x12\x5e\xbf\x03\x2d\x01\x45\x15\x4c\x0c\ \x64\x19\x88\x0d\x52\x87\xec\x29\x50\x14\x20\x87\x02\x32\x00\x08\ \x20\x16\x58\xf0\x83\x24\x60\xa9\x17\x56\x00\x81\x30\xc8\x11\xa0\ \xec\x06\x73\x0c\xcc\x27\x20\x1a\xc4\x87\x89\xc1\xca\x01\x10\x1f\ \xa4\x16\x16\x05\x20\x31\x98\xe7\x90\x69\x18\x00\x08\x20\x16\xf4\ \xec\x07\xc3\xa0\xa0\x04\x45\x01\x28\x38\x61\x65\x3c\x28\x14\x90\ \xa3\x00\xa4\x06\xe4\x68\xe4\x82\x08\x54\x5e\x80\xd2\x11\xcc\x53\ \xa0\x74\x85\x1e\x05\xc8\xa1\x00\x10\x40\x38\x1d\x00\x2a\x60\x40\ \x16\x80\x7c\xa2\xa2\xa2\x02\x4e\x07\xa0\x02\x06\x39\x0a\x40\x72\ \x20\x75\xe8\x51\xb0\x79\xf3\x66\x78\xd9\x0f\x8a\x26\x90\xc3\xf6\ \xed\xdb\x07\x0f\x01\x68\x95\x0c\x6e\xad\x00\x04\x10\x56\x07\xc0\ \x2a\x16\x98\xab\x3f\x7f\xfe\x0c\xf6\x09\x48\x0c\x96\x23\x40\x72\ \xc8\x62\x30\x07\x80\xf8\x20\x0b\x63\x63\x63\xc1\x75\x07\xcc\xd7\ \xb0\xc4\x0a\x4a\xe0\x35\x35\x35\x6f\x67\xce\x9c\x19\x39\x63\xc6\ \x0c\x06\x80\x00\xc2\x19\x02\xa0\xa0\x04\xd5\xf9\xb0\x02\x07\x14\ \x05\xa0\xb2\x1f\x16\x05\x20\x35\xa0\x9c\x82\x2d\x17\x80\x7c\x0f\ \xca\x3d\xb0\x4a\x0a\x96\xb8\x41\x0e\xab\xab\xab\x7b\x3b\x79\xf2\ \x64\x67\xa0\xf0\x0d\x90\x1c\x40\x00\xe1\x74\x00\x28\xe5\x83\x2c\ \x06\x05\xb3\x86\x86\x06\xd8\x72\x45\x45\x45\x94\x28\x00\xa5\x0f\ \xf4\x28\x00\xa5\x17\x50\x1a\x00\x39\x06\x56\x44\x83\xf8\x20\xcb\ \x2b\x2b\x2b\xdf\x4d\x9a\x34\xc9\x05\x28\x74\x11\x66\x06\x40\x00\ \xe1\x8c\x02\x50\xb0\xc3\xda\x7f\x9f\x3e\x7d\x22\x3a\x0a\x40\x41\ \x0c\x6b\x2f\x82\x1c\x01\x0a\x1d\x90\x59\xf5\xf5\xf5\x30\xcb\x2f\ \x20\xdb\x09\x10\x40\x18\x0e\x00\x01\x50\x2d\x08\x6a\xd1\xc0\x1c\ \x00\xb2\x00\x54\x2f\x80\xa2\x05\x25\x05\x03\x7d\x88\x2e\x06\xd2\ \x03\x6b\x9c\x82\x00\x28\xea\x5a\x5b\x5b\x41\x96\x3b\xa3\x5b\x0e\ \x02\x00\x01\x84\x51\x17\xc0\xe2\x14\x14\xdc\xd8\xe4\xd0\x1d\x8c\ \x2c\x06\x0b\x41\x50\xdc\x83\x1c\x02\xb2\xbc\xab\xab\x0b\x14\xe7\ \x2e\xd8\x2c\x07\x01\x80\x00\x62\x41\xaf\x05\xa9\x01\x40\xd1\x03\ \x8a\x9a\xfe\xfe\xfe\xb7\x53\xa6\x4c\x71\x46\x8e\x73\x74\x00\x10\ \x40\x8c\x20\x1f\xe4\xe6\xe6\x5e\x53\x57\x57\xd7\x84\x05\x1b\x25\ \x00\xd6\x0e\x7c\xfa\xf4\x29\xc8\x72\x27\xa0\xd0\x25\x5c\x6a\x41\ \x76\x03\x04\x10\xd8\x01\xc0\xec\xa6\x0a\xc4\x8e\x40\x07\x80\x7b\ \xcf\x94\x38\x00\x68\x1e\x38\x41\xbc\x78\xf1\xe2\x18\xa8\xbb\x49\ \x40\x2d\x03\x40\x80\x01\x00\x0b\x40\xe7\xb8\xdc\x89\x09\x1e\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x99\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x02\x73\x42\x49\x54\x08\x08\x55\xec\x46\x04\x00\x00\ \x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\ \xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\ \x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\ \x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x04\x18\x49\x44\x41\x54\ \x78\xda\x7d\x95\xcd\x6b\x9c\x55\x14\xc6\x7f\xf7\x7d\xa7\x33\x93\ \x49\xa6\x4d\x6b\x91\x0c\x4c\x5b\x15\xa5\x0d\xe2\x42\xa1\x46\x2b\ \xd5\xd2\x66\x55\x34\x2d\x08\x7e\x50\x5c\x89\x7f\x80\xba\x90\x4a\ \x48\x69\x08\x16\xc1\x36\x28\xb8\xb1\x4b\x13\x4d\x5b\x14\xdb\x45\ \x11\x6a\x6b\xed\x42\x8d\x11\x44\xa4\x44\xa4\xc5\x45\x8b\x13\x89\ \xd4\x36\x1f\x33\xf3\x4e\xe6\xbd\xd7\x87\xc3\x30\x43\x88\xe4\xfe\ \xb8\x24\x2f\x9c\xe7\xb9\xe7\x24\xe7\x9e\xeb\x02\x6b\xd7\x89\x9c\ \x3f\xe0\x86\xe8\xa7\x24\xa0\x22\x66\xc3\x85\xe8\xf2\xd1\x84\x35\ \x6b\x8d\xc1\x58\x29\x8c\x70\xc4\x17\x03\x9e\x40\x2b\x88\x08\xed\ \x45\x26\xdd\xe8\x70\x65\x1d\x83\xd1\x7c\x18\xe6\x4d\x5f\x68\xb2\ \x42\x42\x83\x14\x0f\x12\xc7\x64\xc9\xb1\x81\x0c\x51\x95\x71\x37\ \x36\x52\xff\x5f\x83\x63\x7d\xe1\xab\x30\x90\x52\x67\x59\xa2\x12\ \x65\x8a\x74\x83\xbe\x16\xb9\x4d\x05\xaf\xaf\x3c\x31\x6e\xda\x1d\ \x3e\x3e\xb7\xc6\x60\xf8\xb1\x70\xd1\x97\x1b\x54\x65\xb0\x9b\x9d\ \x6c\x22\x6f\x67\x42\x4a\x43\xd4\xf8\x95\x19\xf2\x14\xc8\x12\xdd\ \x76\x07\xc7\x7e\x5b\x65\xf0\x6e\x5f\x98\xf1\xe5\x3a\x0b\x6c\x61\ \x1f\xdb\xe9\x25\x87\x33\x20\x90\x8a\x26\xcb\xcc\x71\x91\x3b\x6c\ \x94\x8d\x2c\x76\xbf\x37\xd7\x36\x78\x27\x1f\xae\xfa\x01\xa5\xce\ \x13\x3a\xbd\x8f\x2e\x32\xc4\xc2\x89\x00\x78\xb1\x42\x83\x84\x05\ \xbe\x67\xc6\x4a\x89\xa6\xdd\xbe\xf7\xeb\x10\x01\xa4\xc3\x7e\x20\ \xe1\x9e\xe4\x03\x6c\xa3\x87\x3c\x39\x91\xb5\xad\xdf\x6d\x77\xd1\ \x2d\x36\xf3\x1c\x4f\x2a\x32\xc1\x0f\xa4\xc3\xad\x0c\xde\x2e\x85\ \x1b\xcd\xc2\x12\x45\x5e\x65\x7b\xab\xf2\x98\x4b\x3c\x2b\x01\xb6\ \x82\xd1\xb4\x2c\x6a\x2c\x70\x5a\xbb\x87\x4c\xd5\x3d\x7c\xb2\x12\ \x41\x3a\xd2\x2c\xd4\xa9\x33\x48\x59\xf2\x6c\xcb\xe0\x06\x13\xfc\ \x41\x64\xc4\xc6\x06\xcb\xab\x4b\xd2\x17\xa9\x8b\x66\x21\x1d\x81\ \xf8\x4e\xce\x7f\xba\x92\x5b\xe0\x19\x15\xb0\x59\xf2\x8c\x02\x63\ \x89\x7e\x64\x89\x5f\xf8\x8b\x87\xc8\x02\xae\x0d\x40\x1e\xf8\x5d\ \x71\x6e\xe7\xd7\xa7\x22\xbf\x3f\x2d\x36\xf4\xd1\xcf\x16\x62\xc3\ \x19\x75\x6a\x54\xf9\x81\x63\xfc\xdc\xe9\x47\xcb\x23\x2b\x9e\xd2\ \x4f\x35\x5a\xd1\xef\x8f\xd2\x43\x29\x09\xdb\xec\x1f\x97\xb1\x90\ \x08\x07\x24\xc8\x40\xfc\xcd\x29\x3e\x62\xa1\x6d\x91\x11\x59\x0a\ \x3c\x48\x42\x4a\x7a\x28\xf2\xfd\x32\xe0\x01\x02\xcb\xda\x26\xb6\ \xd5\xb0\x1c\x96\x8d\x6f\x79\x8b\x9f\x30\x0b\x11\x93\xd1\xde\x65\ \x06\xbe\x3f\xf2\x25\x35\x09\x1b\x51\x45\xa4\x04\x0b\x32\x03\xa1\ \x1c\x24\xaf\x89\x79\x3e\xe0\x63\x16\x31\x03\xcb\x73\xab\x54\x32\ \x28\x65\x7c\xc9\x93\xd2\x63\xe9\x77\xce\x87\x3f\x49\xa8\x5b\xf3\ \x78\x62\x6b\xe1\x6b\xdc\xe4\x08\x8f\xe3\x2c\x72\x0b\x92\x23\x83\ \x80\x68\x25\x07\x1d\x83\x5b\xdc\xe3\xae\x76\x60\x93\x91\x31\x01\ \x80\xc5\x89\x60\x64\x42\x25\x3c\xe2\x58\xc2\x6c\x6c\xd3\xae\x36\ \x52\x61\x81\xa8\x65\xbe\x87\x37\x28\xe2\xb1\x38\x99\x9b\x45\x25\ \xe3\xcd\xe0\x2e\x4d\xbc\x08\xc2\x96\xf5\x43\x1e\x08\xd6\x5c\x5b\ \x39\xca\xde\x76\x57\x7a\x31\x6f\x06\xbe\x12\x85\x59\x88\x55\xf1\ \x8a\xa5\x98\xb6\x2d\xb2\x12\x76\x53\x14\xdd\x3c\xcf\x67\x1d\x79\ \x2b\x6e\x56\x2a\x08\xb3\x51\x38\x1f\xac\x71\x13\x52\x9a\x1d\x03\ \xbb\x3c\x3d\x92\xef\xe0\x43\x4e\xd0\x0b\x1d\x03\x8b\xbb\x2e\x95\ \xbe\xce\x47\xe1\x0a\x8b\x31\x35\x66\xa8\xd2\xa0\x29\xac\x4a\x0a\ \x66\xf0\x02\xe7\x38\x00\x6d\xb9\xb7\x88\x06\xd7\x14\x1d\xc3\x62\ \xb8\x12\x4d\x24\x61\x32\x22\xc7\x37\xcc\xd1\x10\x56\x0a\x41\x06\ \x25\x8e\x73\x8c\xde\x55\xf2\xd4\x6e\xe4\x3f\x7c\x21\x45\x44\x98\ \x9c\x48\x22\x08\xa3\xa1\x1a\x03\x53\x2c\x50\x47\x26\x96\xe2\xd3\ \x9c\x64\x0f\xab\xc5\x3a\x5b\xd4\xf9\x84\x80\x0a\xa8\x86\x51\x88\ \xe0\xf3\x0a\xe3\xb1\x1c\x6f\x71\x95\x25\x6a\x24\x62\x85\xd7\x29\ \xa0\x5c\x8c\xd4\x58\x21\x11\x35\xe5\x7a\x53\xd1\x31\x8c\x4b\x49\ \x06\x80\x31\x06\xe3\x81\x2e\x2e\xe1\x18\xc4\x04\xab\x86\x5a\x6b\ \x2a\xa2\xd3\x25\xff\x92\x2e\x24\x9f\x96\xaa\x33\x54\x5f\xd1\x50\ \x0d\x36\x93\x77\xf0\x1a\x65\xb2\xc2\x9a\x1b\x00\x2f\x24\x67\x9e\ \xd3\xdc\xb0\xb9\xec\x34\x54\xa7\x3a\x43\xd5\x2c\x34\xd6\x43\xb9\ \x69\xbd\x3f\xc4\x5e\x85\xc5\xad\xab\x6d\xf5\x8b\xef\x38\x87\xb3\ \x4b\x2f\xf9\xc1\xa9\xd5\x63\x1d\xe0\xe5\x3e\xf4\xb0\x78\x4b\xb4\ \x9b\x5d\x3c\xca\xfd\xdc\x87\xe3\x5f\xe6\xb9\x2e\x96\xac\x27\x65\ \x39\xcd\xe1\x33\x6b\x1f\x16\xb3\xb0\xa7\x2d\x14\xec\x4f\xd6\xee\ \x08\x27\x91\x0d\x3a\xe1\xec\x69\x3b\x53\x5f\xe7\x71\x7d\xc9\x1e\ \xd7\x50\xec\x5c\x2e\x67\x5b\xd8\xe3\x7a\x76\x9d\xc7\xb5\x63\x92\ \x0b\x07\x18\x72\xfd\xa1\xf5\xbc\xbb\x4a\x98\xe5\x82\xbb\x7c\x36\ \x61\xcd\xfa\x0f\xcb\x16\xf4\x39\xc3\x9f\xd1\x8a\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x2d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\xcf\x49\x44\x41\x54\x78\xda\x62\ \xfc\xff\xff\x3f\x03\x25\x80\x89\x81\x42\x30\xf0\x06\xb0\xc0\x4d\ \x62\xc2\x30\x6b\x3a\x94\xce\x84\xd2\x8d\x40\xac\x0d\xc4\x57\x81\ \xb8\xfe\xdf\xbf\x7f\x78\x5d\x20\x0f\xc4\xbf\x80\x58\x02\xca\x06\ \x81\x7a\x20\x9e\x04\x15\x23\xe8\x05\x17\x20\x3e\x09\xc4\xac\x50\ \x36\x08\x44\x03\x71\x10\x10\xd7\x11\x63\x80\x3d\x10\x1f\x87\x1a\ \x62\x0f\x15\xd3\x07\x62\x4d\x20\x5e\x04\x65\xa3\x86\x01\x12\x50\ \x02\xe2\xdf\x40\xcc\x0f\xc4\x8f\x81\xd8\x09\x2a\x56\x46\x6c\x2c\ \x78\x03\xb1\x06\x10\x4f\x05\xe2\x54\x20\x66\x83\x8a\x61\x07\xa0\ \x94\x08\x4b\x8d\x8c\x8c\x8c\x20\xbc\x19\x88\x55\xa0\x6c\x10\xee\ \x82\x8a\x61\xd7\x87\x64\x00\x37\x10\xaf\x02\xe2\x87\x50\x5a\x0a\ \x88\xdd\xa1\x7c\x98\x18\x27\x10\x33\x23\x1b\xc0\x88\x64\x3b\xc8\ \x00\x3e\x10\x13\xdd\x91\x40\xfc\x17\x1a\xad\x3f\xa1\xf4\x5f\xb8\ \xbe\xa1\x9f\x99\x00\x02\x0c\x00\x58\x02\x44\x1a\x06\xfb\xff\xce\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\xa0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x05\x1d\x49\x44\ \x41\x54\x78\xda\xc5\x57\xdf\x6f\x54\x45\x14\xfe\x66\xee\xdc\xbb\ \x77\x77\xdb\x12\xb5\x5a\xbb\xfd\x91\x60\x4c\x90\xa8\x81\x44\x69\ \xd0\x6a\xc1\xa8\x81\xa4\x42\x24\xfe\x88\xc6\x36\xf1\xc5\xe8\x0b\ \x89\x3c\xa8\x89\x2f\xfe\x01\x86\x10\xe3\x03\xfa\xe2\x83\x0f\x42\ \x78\x20\xc2\x03\x31\x21\x6d\x9a\x90\x16\x03\x0d\x2a\x95\x62\x5b\ \x02\x96\x76\x5b\xb6\x2d\xd8\x2e\xed\xfe\xb8\x3b\x77\xae\xe7\xce\ \x2d\x77\x6f\xa1\xeb\x4a\x13\xe0\x4b\x4f\xce\x99\xc9\xe4\x7c\xdf\ \x39\x67\x3a\xbb\xcb\x3c\xcf\x43\x14\x07\x0e\x1c\x58\xb1\xb1\x6f\ \xdf\x3e\x86\x35\xe2\xc4\x89\x13\xf6\xc8\xc8\x48\x1e\x65\x38\x94\ \x2f\x86\x08\x04\xeb\x60\x9f\xc0\xc3\x6e\xbd\xe2\xe0\x37\x7e\xbe\ \x81\x28\xd8\x36\xf6\x0b\xd6\x88\x84\x9d\xe0\x93\x87\x27\xc3\x75\ \x49\x96\x44\x98\x4f\x41\x81\xe1\xb8\x20\xf7\xae\x78\x53\xbc\xe2\ \x71\x0f\xac\x08\x4c\x4f\x4f\x23\x8a\xad\x1f\x3d\xb3\xa3\xe1\xd1\ \x87\x51\x63\xda\x48\xc4\x12\x48\xc6\x62\xa8\xb1\x6c\xd8\x56\x0c\ \x71\x61\xc1\xe0\x06\x5c\xe5\xa2\x20\x1d\xe4\x1d\x07\x4b\x4e\x1e\ \x8b\xc5\x22\x72\xe4\x67\x66\x17\x56\xe4\x73\x94\xc3\x63\x9d\xe6\ \x0e\x65\x7a\xf0\x3c\x40\x1e\x95\xb6\x00\x41\xba\x12\x1a\xa3\x40\ \x4f\x4f\x0f\xa2\x38\x7b\x6a\x18\xcf\xbe\xdd\x80\xb8\x69\x22\x6e\ \x99\xda\x27\x02\x4f\x22\x04\x4c\xc3\x40\xc9\x25\x01\x8e\x44\xbe\ \x54\x22\xe2\x12\x79\x32\xf2\xbf\x9f\xcc\xa0\x27\x53\xce\x27\x95\ \x84\x33\x28\x61\xbc\xc0\x20\x3d\x15\x8c\x00\x0c\x4c\x47\x1e\xc0\ \xeb\x19\x0e\x1e\x3a\x08\x28\x80\xb9\xb4\x36\x39\x1a\x5e\x4d\x42\ \x91\x5c\xd7\x53\x54\xa9\x36\x22\x54\x54\xb9\x0b\x38\xf4\x47\x5e\ \x29\x0f\x8e\xeb\xd2\x7e\x78\x46\x9f\x6f\x58\x9f\xc4\xf7\x87\xbf\ \x03\x2d\xe0\xb9\x80\x67\x78\x30\xdb\x39\x5c\x78\x9a\xcf\xe7\x16\ \x01\xf9\xb2\x35\x02\x57\xde\x1b\x83\x45\x55\xc5\x84\x80\x6d\x0a\ \x24\x84\x05\x97\x08\xa4\x4b\xc4\x3c\x20\x66\x8c\x81\x52\xea\xca\ \x39\x63\x5a\xa0\x24\x52\x47\xba\x5a\x48\x9d\x59\x0f\xd3\x2b\xc2\ \x7a\xaa\x0e\xd7\x9a\x33\x58\x67\xd5\x43\x4a\x0f\x37\x9d\x25\xf0\ \x45\x46\xb1\x0a\xf8\x08\x51\x01\x7e\x22\x5d\x8d\xcb\xc9\x94\xd2\ \x49\x0d\xdf\x02\x22\x32\x09\x42\x48\x68\x70\x06\x86\x40\x8c\xab\ \x02\x41\x1b\xea\x36\xa3\xa3\x71\x27\x0c\x98\xfa\xdc\xd1\x4b\x47\ \xf0\x7a\xeb\x1b\xb0\x79\xc2\xbf\x03\xd8\xdb\xb3\x57\xef\x47\x05\ \x04\x50\xda\x88\xdc\x27\x25\x95\x8c\x11\xb1\x22\x52\x17\x14\x92\ \xb1\x90\x5c\x8f\x81\x93\xa8\x88\x00\xa5\x02\x51\x1b\xd6\x6d\xc2\ \x63\x76\x0a\x05\xb7\x40\x15\xdf\xc4\xa6\xfa\xe7\x91\x4a\x34\x23\ \x2f\xf3\x28\x39\x12\x5e\xc0\x55\x16\x10\x92\x33\xed\x83\x76\x33\ \xa5\x09\x19\x55\x84\x80\x37\x42\xce\x83\xea\x19\x07\xf1\x43\xab\ \xf3\x3b\xe7\x41\xcf\x7d\x30\x73\x06\x93\x37\xd3\x18\x9a\xfb\x03\ \xc3\xd7\x2f\x6a\x01\x7f\x2f\x5c\xc5\xb9\x99\xdf\xf0\xe7\xec\xb0\ \xee\xd2\x9d\x02\xbc\x88\x08\x17\x90\xb4\x20\xfa\x32\xb7\xe7\x73\ \x04\x6d\x16\x9c\x53\x67\x18\x0c\xf2\x5a\xe4\xad\x09\x2e\x77\xe6\ \xd7\xe9\xd3\x5a\xa0\x5c\xbe\x94\xfd\xe9\x81\x30\x96\xca\xd5\xf9\ \xa3\x02\x18\xd9\x36\xa5\x54\x9f\x9f\xe0\x3e\x42\x8b\xe7\x9c\x6f\ \x17\x78\x00\x88\x16\x2b\x96\x37\xb4\x3d\x08\x70\x54\x40\x36\x9b\ \xd5\xe6\x63\x7c\x7c\x5c\xdb\x5a\xe2\x89\x53\x86\xb6\xaa\x02\xa8\ \x03\x51\x5b\xb5\x5d\xc7\xce\xce\xe1\xc8\xe0\x52\x74\xbf\x6a\x5c\ \x2d\xbf\x40\x05\xd4\xd6\xd6\x86\x71\x6b\x6b\xab\xf6\x57\x16\xe7\ \xf1\xd3\x99\x25\x28\x91\xc4\x67\x2d\xe5\x7d\xa0\x72\xdc\xfc\x92\ \xc4\x7f\x41\x54\xba\x1c\x13\x13\x13\xda\xb7\xb4\xb4\x84\x71\xc7\ \xc6\x16\xec\xd9\x9c\xc0\xa1\xfe\x19\xe4\x8a\x0a\x1f\xb6\x71\x70\ \x16\x3d\x73\x67\x9c\xee\x37\x75\xdc\xd4\x5e\xc2\x6a\x5c\xfc\x6e\ \x2f\x61\xf7\xd6\x24\x9e\x4e\x59\x38\x36\x38\x87\xfd\x27\xb3\x70\ \x15\xd6\x88\xc8\x3b\x20\xa5\xec\x53\xaa\x62\xa6\x3b\xc4\x5d\x5f\ \x94\x78\xff\x9b\x61\xed\xdb\x37\xd4\xe1\xeb\xae\x27\x10\x13\x1c\ \x3e\x32\xb1\x18\xa2\x68\x28\x16\xb1\x1a\x0c\xc3\x80\x10\xa2\xfc\ \x0e\xcc\x2c\x14\x30\x3d\x5f\xc4\x6c\xb6\x84\xcc\x82\x83\xcb\xe9\ \xeb\x98\x5b\x74\x51\xf4\x62\xb8\x76\x23\x8f\x85\x9c\x42\x5e\x1a\ \xa1\x18\x37\x70\xe8\x1f\xc9\x62\xef\x0f\x97\xf0\xe5\xce\x04\x7c\ \x0d\x83\x00\x76\x4f\x4d\xc1\xc7\xf1\x54\x0a\x6d\x03\x96\x8e\x53\ \x2f\x3a\x55\xee\x40\xf9\xc3\x26\xfc\xf8\x25\x47\x9e\x62\xe5\x1b\ \xe0\xc8\xd5\xbb\x54\xa2\x33\x4a\x0b\x63\xd1\x57\x16\xaa\x62\x17\ \xf5\xba\x3c\x82\x52\xa9\xd4\xe7\xba\x2e\xfe\x2f\xe6\x97\x68\x04\ \xdf\xfe\xa5\xbb\xd5\xf6\x64\x2d\xf6\xd3\x08\xe2\x56\x30\x82\x6b\ \xb6\x8d\x28\x1e\x2f\x14\x2a\x8e\xc0\x34\xcd\xca\x4f\x71\x3a\x9d\ \xd6\xbe\xa9\xa9\x69\x45\x3c\x31\x99\xc6\x57\xc7\xe7\x03\xf2\xf5\ \x16\x3e\x7f\xcd\xf6\xc9\xc3\x33\xa9\x7c\x1e\x53\x34\x02\x1d\xd3\ \x08\xa6\x4f\xc7\x02\x21\x5b\x57\x17\x22\x2a\xb4\xa8\xe2\x63\x72\ \xe8\xcc\x22\xce\x4f\x3a\xd8\xb9\xe9\x21\x7c\xdc\x6e\x82\xb3\x60\ \x7f\x4d\x88\x8e\x40\x4a\x89\x6a\x18\x18\xcd\xe2\xd3\x1f\x2f\x63\ \xcf\x96\x7a\x7c\xb1\xbb\x59\x93\x57\x43\xa5\x02\x85\x10\xb0\x2c\ \x6b\x5b\x85\x0f\xa3\xf2\xd7\xf3\xc6\xc6\xc6\x30\x9e\xfa\xc7\xc2\ \x3b\xcf\x25\xf0\xc1\x16\x0e\x06\x8f\x5a\x5d\x3e\x53\x58\x9e\xb5\ \x6d\xdb\x2b\xe2\x6a\x10\xb8\x0b\xbc\xd5\xf6\x08\x89\x71\xb0\x16\ \x8c\x8d\x8d\xe9\x7b\x12\xf3\x7f\x57\xd4\xd4\xa0\x58\x2c\x66\x00\ \x9c\xd7\x23\x70\x1c\xa7\x8f\xc6\x80\x7b\x89\xde\xde\x5e\x74\x76\ \x76\xea\xee\x0c\x0d\x0d\xe5\x28\xde\x38\x3b\x3b\x7b\x55\xe0\x3e\ \x21\x1e\x8f\x23\x97\xcb\x81\x7e\x2b\x16\xbb\xbb\xbb\x5f\xf6\xc9\ \x6f\x8d\xc0\xbb\x1f\x5f\x48\x92\xc9\x24\x2e\x5c\xb8\x90\xef\xea\ \xea\xea\x18\x1d\x1d\x3d\x17\xbd\x03\xfa\x51\xb8\xd7\x50\x4a\xcd\ \xec\xda\xb5\x6b\x3b\x55\x7e\xf1\xf6\x7f\xc3\x16\xb2\xd6\x70\x7d\ \x6f\xe0\x91\x8d\x53\x97\x27\x71\x1b\xfe\x05\xe5\x2c\x38\xc3\x2d\ \x33\x09\xcd\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x60\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\ \x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0c\x0f\x07\x0c\ \x25\xcb\x40\x36\xd5\x00\x00\x01\xa2\x49\x44\x41\x54\x28\xcf\x75\ \x89\x31\x68\x13\x01\x18\x46\xdf\x7f\x77\x81\xa6\x26\x85\xf6\x42\ \x83\x06\x14\x6d\xae\xd1\xc1\x90\x41\x10\x71\x10\xeb\xc5\x24\x88\ \xa5\x9b\x42\x02\x16\x71\x74\x51\x74\xf4\xb4\x82\xe0\x20\x75\x72\ \xeb\xee\xe4\xd2\xa5\x60\x0a\x75\x72\xb0\x14\x87\xd0\xf6\x62\x15\ \x53\xd0\x62\x8b\x6d\x1a\x6b\x1b\x02\xd7\xfb\x1d\x42\x74\xf2\x2d\ \xef\xe3\x7b\x00\x80\x76\x35\x74\xf3\xdb\x0d\x97\xff\x92\x1c\x6b\ \x3e\xd2\x59\x7d\x30\x97\xbb\x08\x70\x19\xaf\xfb\x3b\x5d\x9d\x38\ \xbf\x39\xa5\x0b\xe1\x8c\xce\xeb\xac\xde\x7f\xdb\x7f\x09\xa0\x81\ \x09\x3b\x9c\xb5\x83\x5b\x93\x33\xd7\x53\xfd\x3a\x44\x40\x93\xa3\ \xf2\x7b\x64\x67\xf2\x6e\x39\xdd\x57\x79\x2f\xe0\xc4\xbf\xdf\xf1\ \xa6\x0d\x3d\x27\xfb\x6c\x72\x92\x2d\x5d\x92\x75\xf5\xb9\x26\x6b\ \xad\x37\xb6\x01\xc1\xc4\xc3\xe9\xa8\x16\xe5\x50\x1b\x64\x68\xf0\ \x59\x1a\x6c\x73\x8a\x14\xf5\x43\x42\x0b\x82\xca\x6d\x54\x3e\x68\ \x53\xf2\xd4\xd8\x63\x89\x5f\x0c\x48\x11\x1f\x31\x92\x51\xb3\x34\ \x7f\x26\x3f\xac\x83\xa4\x65\x84\x45\xb6\x99\xa3\x4d\x4c\x4b\x52\ \x23\xa2\x1b\xd1\x52\xcb\x18\xb8\x52\xd0\xaf\x2c\xc8\x0a\x6d\x5c\ \x3a\x34\x89\x51\xa0\x46\x44\x57\xe4\xb4\xc6\x17\xad\x5d\xfa\x48\ \x61\xf1\x85\x35\xb2\xb4\x89\xe1\xb2\x8c\xa9\xbe\xd8\xea\x14\xbc\ \x77\x96\xa9\xab\x52\xd7\x9c\xa6\xc5\xd2\x65\x7e\xc8\x98\xfa\x98\ \x52\xd7\x44\x98\x29\x7a\xd5\x2c\x16\x18\x1a\x93\x8f\x7c\xc2\x95\ \x0e\xc3\x6c\x88\xa1\x75\xb5\x3b\xa3\xe3\x5e\xb5\x8c\x83\xb5\xbf\ \x7b\x64\x30\x4f\xa0\x5b\x12\xc7\xa7\x85\xa9\xbe\x24\xc2\xd1\xf1\ \xc7\xd5\x7b\xbc\x04\xcc\xf5\xd7\xab\xda\xca\x25\x23\x0e\x7b\xfa\ \x53\x0e\xb4\x2e\xb6\x66\x8a\xbd\xdc\xe3\xf8\xb1\x17\x13\x07\xaf\ \xf4\x79\x78\x55\xcb\xe1\xd3\x3c\x94\xff\x35\xe9\x0d\x3b\xf1\xec\ \x82\x56\xc2\x29\x17\xb2\x3c\xf9\xdb\xff\x00\x7a\x59\xaa\xa8\xfb\ \x10\xe1\xab\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xda\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x11\x00\x00\x0b\x11\ \x01\x7f\x64\x5f\x91\x00\x00\x01\x7c\x49\x44\x41\x54\x78\x9c\xed\ \x95\x41\x8e\x84\x20\x10\x45\x7f\x99\x89\xc6\x0d\x89\x5b\x4f\xc3\ \xd1\x38\x9a\xa7\x71\xdb\x09\x3b\x4d\x4c\xcd\x42\xb1\x41\x4a\x46\ \x45\xe3\x66\x7e\x42\x3a\x11\x8a\xff\xa8\x2a\x68\xe0\x5f\x2f\x8b\ \xae\x06\x1a\x18\x7e\x0d\xc0\x37\x37\xd0\x19\x87\xe8\xf8\xe7\x6a\ \xf0\xd7\x5c\x5f\x8c\xee\x00\x00\x45\x0e\xc0\x75\xf3\x39\xd6\x40\ \x53\x26\x40\xae\xf4\xf9\x0c\xdc\xd5\x7c\x4e\x97\x33\x90\xd3\x7c\ \xb7\x00\x48\xf5\x6f\xdb\x96\x01\xf8\xc3\x97\x38\x77\x67\x0f\xf0\ \xe7\xf3\x01\xc2\xab\xcd\x00\xa0\x94\x72\x86\xe4\xcd\xf3\x69\x80\ \x44\xfd\xb9\x2c\x4b\x00\xa0\xba\xae\x23\x08\x6b\xed\xfa\x8d\x88\ \x82\x3d\x82\x77\xc0\x19\x18\x98\x64\x7d\x77\xea\x4f\xd3\x34\x61\ \x1c\x47\x29\x64\x5d\xcf\x1c\x9e\x61\xcd\x40\x6e\x77\x8f\xe3\xb8\ \x35\x27\x00\xa8\xaa\x6a\x0f\x86\x56\x80\x1b\xae\x96\x94\x11\x06\ \xe6\x13\x27\x20\x50\xb8\x27\xd1\x4f\xab\x04\x94\x01\x49\xdb\xb4\ \xfb\x2a\x7c\xf3\x23\x77\xfb\xec\xfb\x2f\x94\x26\x06\xb8\x5b\x65\ \x59\x1e\xce\x56\x31\x9f\xc6\x8d\xaf\x4e\xa4\x3c\x5a\x47\xb4\x26\ \x72\xb7\x37\x3c\x80\x50\x52\x19\x42\x18\x2d\x6d\x16\x6c\x3a\x0c\ \xc3\x2e\xdc\x56\x1b\x00\x2d\x2e\x4a\xc1\x01\xc1\x89\x93\xa6\x52\ \x69\x92\x3d\x70\xa2\x0c\xb4\x40\xb0\x52\x0a\x10\x9e\xe3\xba\xae\ \x79\x69\xc6\x80\x56\x00\xd0\x89\xdb\xa0\x23\x63\x00\xe0\x45\xee\ \x9b\x04\xd1\x34\x4d\x64\xbe\x03\x10\xea\x40\x16\xc8\x1f\xd6\x5a\ \x2c\x6f\x7f\x34\xd7\xb6\x6d\x14\xbc\x03\xa0\x05\x90\xbc\xff\xff\ \xbe\xef\xd1\xf7\xfd\x51\x00\xc9\x30\x86\xba\x43\x89\x12\x3c\x63\ \x78\x52\xdd\xd2\x03\xdd\x63\x0e\x7f\x34\xa1\xde\xfc\xbe\xa2\xee\ \x4d\xf3\xe7\xf5\x0b\x79\xa3\x89\x40\x30\xb1\x17\xca\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x0b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x03\x00\x00\x00\x44\xa4\x8a\xc6\ \x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\ \x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\ \x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\ \x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x0d\x50\x4c\x54\ \x45\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x7f\x7f\x7f\ \x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x82\x82\x82\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x12\x12\x12\x00\x00\x00\x10\x10\x10\x7e\x7e\ \x7e\x7e\x7e\x7e\x7e\x7e\x7e\x54\x59\x59\x7f\x7f\x7f\x5c\x60\x5e\ \x80\x80\x80\x58\x5d\x5d\x5a\x5e\x5f\x82\x82\x82\x5b\x60\x60\x5c\ \x61\x60\xb6\xb6\xb6\x61\x67\x66\x62\x67\x67\x72\x72\x72\xab\xab\ \xab\xac\xac\xac\xa1\xa1\xa1\xf6\xf6\xf6\x9a\x9a\x9a\x94\x94\x94\ \x7e\x7e\x7e\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xd6\xda\xdc\xf2\ \xf2\xf2\xff\xff\xff\xfe\xfe\xfe\xa4\xa4\xa5\xd2\xd5\xd6\xa6\xa7\ \xa8\x9b\x9b\x9b\x9c\x9c\x9c\xa0\xa0\xa0\xa1\xa1\xa1\xa2\xa2\xa3\ \xa5\xa5\xa5\xaa\xaa\xaa\xad\xad\xad\xae\xae\xae\xaf\xaf\xaf\xb0\ \xb0\xb0\xb1\xb1\xb1\xb3\xb3\xb3\xb4\xb4\xb4\xb7\xb7\xb7\xb8\xb8\ \xb8\xb8\xb9\xb9\xb9\xb9\xb9\xbb\xbb\xbb\xbc\xbc\xbc\xbf\xbf\xbf\ \xc0\xc0\xc0\xc1\xc1\xc2\xc2\xc2\xc2\xc2\xc2\xc3\xc3\xc4\xc5\xc5\ \xc6\xc6\xca\xca\xca\xce\xce\xce\xd0\xd0\xd0\xd1\xd2\xd2\xd8\xd8\ \xd8\xd8\xd8\xd9\xd9\xd9\xd9\xda\xda\xdb\xdb\xdb\xdb\xdc\xdc\xdc\ \xdc\xdc\xdd\xdd\xdd\xdd\xde\xde\xdf\xdf\xdf\xdf\xe0\xe0\xe0\xe1\ \xe1\xe1\xe2\xe2\xe2\xe4\xe4\xe4\xe5\xe6\xe7\xe6\xe7\xe8\xe7\xe8\ \xe8\xe7\xe8\xe9\xe8\xe9\xe9\xe8\xe9\xea\xe9\xe9\xe9\xe9\xea\xea\ \xe9\xea\xeb\xea\xea\xea\xea\xeb\xeb\xeb\xeb\xeb\xeb\xeb\xec\xeb\ \xec\xec\xeb\xec\xed\xec\xec\xec\xec\xed\xed\xed\xed\xed\xed\xee\ \xee\xee\xee\xee\xee\xef\xef\xef\xef\xef\xef\xf0\xf0\xf0\xf0\xf0\ \xf0\xf1\xf1\xf0\xf1\xf2\xf1\xf1\xf1\xf1\xf2\xf2\xf2\xf2\xf2\xf2\ \xf3\xf3\xf3\xf3\xf3\xf3\xf4\xf4\xf4\xf4\xf4\xf4\xf5\xf5\xf5\xf5\ \xf5\xf5\xf6\xf6\xf6\xf6\xf6\xf6\xf7\xf7\xf7\xf7\xf7\xf7\xf8\xf8\ \xf8\xf8\xf8\xf9\xf9\xf9\xfa\xfa\xf9\xfa\xfa\xfa\xfb\xfb\xfb\xfb\ \xfb\xfc\xfc\xfc\xfc\xfd\xfd\xfd\xfe\xfe\xfe\xff\xff\xff\x7a\x44\ \xd9\x87\x00\x00\x00\x50\x74\x52\x4e\x53\x00\x00\x01\x02\x02\x03\ \x04\x05\x07\x07\x0a\x0c\x0d\x10\x11\x15\x16\x19\x1a\x1b\x1d\x1f\ \x21\x22\x24\x25\x26\x27\x29\x2b\x2c\x2d\x31\x33\x35\x36\x39\x3c\ \x3e\x42\x44\x46\x49\x4a\x4e\x52\x59\x6a\x7b\x8a\x95\x97\x9b\x9e\ \xa4\xa4\xa5\xb4\xb4\xbf\xc3\xc3\xc5\xc7\xd0\xd1\xd1\xd9\xdf\xe5\ \xea\xf0\xf4\xf8\xf8\xf8\xfc\xfd\xfd\xfe\xaf\x7b\x7c\x5e\x00\x00\ \x02\x14\x49\x44\x41\x54\x78\xda\x6d\x93\x4d\x6b\x13\x51\x14\x86\ \xdf\x73\xee\x4d\xb0\xd2\xfa\x81\x54\x44\x04\xb5\xb8\x93\x12\x29\ \x42\x57\xc5\x5d\x97\xfe\x08\xdd\x14\xc4\x5f\xe2\x1f\xa8\x82\x2e\ \xfd\x07\x6e\xdc\x54\x2d\xb8\x50\xd0\x7c\xac\x0a\xa5\x54\x6d\x6b\ \x6a\xda\x49\xf3\x21\x4d\x32\x73\xef\xf5\xde\x33\x77\x26\x59\xf8\ \xe6\x24\x43\xe6\x79\xee\x9c\x93\xb9\x13\xba\xb1\x88\xff\xa7\x73\ \x2c\x07\xbd\xb8\x31\x60\xc5\x44\xcc\x60\x10\x18\x20\x0a\xa0\xfa\ \x22\x0a\x18\xfe\xf5\x50\x55\xa0\x48\x22\x5c\x5c\x44\x81\x3d\xf6\ \x01\x33\xe4\x45\x9e\x75\x5b\x76\xb5\x14\xb4\x70\x26\xca\x2b\xf0\ \x7e\x73\xc9\x7c\xa6\x42\x20\x55\x85\x62\x99\xa2\x68\xd2\xba\xbb\ \x82\x51\xfb\xc2\x08\x79\xb3\xaa\x52\xa1\x8d\x56\x79\x58\x29\x5a\ \x00\xd6\xb8\x56\xc9\x05\xad\x88\x83\x90\x7f\x04\xce\xf7\xbf\x8f\ \x80\x79\x55\x53\x22\x30\x05\x28\x55\x1c\x6e\x2e\xbd\x73\x78\x72\ \xe5\x62\x4d\x04\x10\x89\x12\xa9\x22\x52\x5c\xbb\xfa\x1e\x78\x3a\ \x77\xe9\x81\xa7\xcb\xcf\xc6\x2c\x5c\x86\xfc\xd6\x73\xa9\xcd\xac\ \x33\xf6\xf6\x23\xe0\x65\x76\xda\xa0\xe5\xe7\x63\xe1\x22\x40\x8a\ \xca\xbb\xb4\x69\x3b\x0c\x8e\x5c\x0a\x41\x99\x66\xc3\x5e\x67\x90\ \xfc\x7c\xe1\x80\xbc\x51\x66\x93\xff\x68\x80\x43\x22\xff\xda\xf3\ \x13\x64\xc6\x59\x7b\x67\xcd\xcf\x60\x4e\x9b\x1a\x44\x14\x39\x01\ \xab\xc8\xaf\xf0\x71\xe2\xf9\xab\xc9\x59\x03\x0c\xcf\x29\xf2\x72\ \xb3\xeb\xdd\x75\xe0\xf5\x79\xbf\x0e\x68\x99\x41\x50\xce\x43\x9d\ \xec\x3d\x26\xbc\x39\x9b\x34\x00\xc4\x16\x72\x5e\x38\x01\xf8\xf2\ \xb0\x0a\x0c\x4d\xc3\xc8\x22\xd9\x3f\x9e\xe5\xd6\x25\xc0\xb6\x6d\ \xa4\x71\xbb\xc1\x8c\x90\xc8\xad\x39\xbf\xd7\x74\xe9\x6e\x32\x82\ \x08\xd2\x59\x2e\x10\x79\xda\x3b\xe9\x5e\xdb\x49\x7f\xff\x44\x14\ \x64\x65\x19\x67\x92\xfd\xa1\x9a\x5f\xd8\xda\x1b\x4c\x05\xe9\x10\ \x45\x33\x68\xf7\xd7\xd3\xd6\x87\xfd\x24\xae\x62\xa9\xf2\x39\x76\ \xd9\xa0\xaf\xd3\xd6\xf6\xaf\x8e\xf0\xf2\x7c\xd9\xc4\x8d\x92\x74\ \xae\xf5\xe9\xf0\xc8\x21\x46\xe7\x56\x11\x9b\x8d\x8d\xde\x3a\x38\ \xb2\x98\x0a\xb3\x21\xd8\xb4\x5d\xff\xd1\x71\x28\xc3\xf6\xad\x52\ \x72\x2f\x65\x04\x72\x3b\x07\xbb\xc7\x33\x1c\x74\xf9\x16\x63\x36\ \xd9\xe1\x00\xb3\x91\x8d\xaa\x14\x0f\x34\x85\xaf\xce\x39\x63\xad\ \x2f\x6b\x52\x2b\xff\x2c\xa5\x3d\x53\xba\xc2\xc1\x83\x0b\xc4\x64\ \x64\xbc\xaa\x33\xfb\x0f\x1c\xe1\xbc\x7c\x1f\xe9\xf9\x6c\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x38\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\ \x82\xcc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0b\x1d\x04\x0b\ \x0e\x62\xcb\xa4\x0f\x00\x00\x01\x7a\x49\x44\x41\x54\x28\xcf\x8d\ \x91\x3d\x48\x95\x61\x18\x40\xcf\xf3\xbe\xaf\xdf\xcd\x2c\x95\xf2\ \xea\x25\xfc\x83\xa0\x86\x08\x1a\x84\x08\x49\x1a\xd5\x51\x91\xa8\ \xa0\x45\x84\x06\x91\x1a\x5a\x82\x86\x20\xa2\x9f\x25\x49\x28\xa1\ \x20\x87\x50\x70\xb8\x85\x90\xe2\xa6\x53\x20\x0e\x22\x17\x1a\x0a\ \x35\x08\x82\x10\x43\xb9\x9a\xdf\x7d\xbf\xe7\x69\x33\xa1\xa5\x33\ \x1d\x38\xe3\x81\xff\xe7\x81\x83\xb1\x95\x17\x8b\xb0\xca\xc4\xbf\ \xf9\x15\x70\xef\xf5\x07\x9b\xb6\xfb\x23\x30\xfe\x37\x3c\x3d\xb0\ \xa1\x8b\xe3\x36\x63\x1f\x75\x54\x6f\xb5\x03\xbc\x03\x9e\xe1\xce\ \x03\xd0\x20\x57\xf2\xad\x6f\x4f\xb0\x6f\xbb\x9c\x92\xc2\x74\x77\ \x13\xdc\x00\xee\x22\x37\x93\xba\xe1\x9a\x8e\xda\xce\x9a\xd6\x46\ \x9c\x01\x38\x8b\xee\x27\xe5\x8d\x5f\x9f\xf6\x96\x7e\xbc\x0c\xc7\ \xef\x9c\x7b\x5c\x4d\xc0\x45\xf3\x0a\x02\x0a\x34\x46\x6b\x8b\x6d\ \xbb\x57\x73\xe2\xb6\x8a\xdf\x71\x1a\x2d\x06\x45\xc5\x30\x0c\x25\ \x86\x8a\x39\x36\x75\x7d\xde\xaf\x6e\x36\x7f\x4e\x06\xea\x01\x41\ \xc4\x21\x08\x26\x62\x8e\x0d\x29\xf5\x4f\x2d\xf8\x87\x8c\x96\x4e\ \x6e\x37\x74\x1f\x13\x11\x67\x1e\xc1\x24\x5a\x59\xd6\xa4\xd4\x37\ \x55\x7c\x82\xc0\xb5\x64\x32\xbd\xfd\xfb\x6c\xce\x9b\x17\x01\x32\ \x4b\x45\xf9\xba\xf2\xfc\xc2\xa0\x7f\x93\x05\x20\x73\x64\x59\x4a\ \x82\xa7\x0a\x87\xe2\x49\xd1\x00\x66\x10\xa0\x8c\x7a\x39\xea\xf1\ \x92\xa3\x16\xcf\x9e\x28\x09\x06\x08\x10\x60\x07\x30\x00\xd6\x59\ \x5e\xab\x84\x4b\x2d\xcd\x08\x5e\xa1\xda\xc0\xc1\x11\x50\xad\x7c\ \x8b\x0b\x73\xc5\xcb\xd7\xcf\x74\x9d\x7e\xdf\x33\x3b\xf3\x85\x58\ \x05\xa9\x00\xb0\x08\xf4\xe6\xeb\x0a\x87\xd7\xd5\x17\x7a\xf2\xf0\ \x08\xf8\x03\x93\x22\x8b\xf2\xeb\x38\xda\x1a\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x73\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\ \x82\xcc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0c\x02\x0b\x21\ \x39\x04\x1b\x11\xcc\x00\x00\x01\xb5\x49\x44\x41\x54\x28\xcf\x5d\ \xd1\xbb\x6b\x53\x61\x18\x80\xf1\xe7\xfd\xce\x39\x69\x62\x35\x84\ \x4a\xd2\x72\x54\x82\xa4\x08\x55\x51\x3b\x54\x05\x07\x6f\x4b\x71\ \x11\xc4\x0b\xba\x28\x0e\x16\xa5\x43\x87\x82\x45\x14\x0d\x68\x62\ \xb5\xf5\x86\x58\x10\xa1\x2a\x82\x75\x13\x04\x5d\x6a\x5d\x04\xa1\ \x15\x9c\x44\x5c\x2c\x52\x28\xa1\x8d\x1a\x62\x4e\x34\xc9\xc9\xf7\ \xba\x14\x05\x9f\xe5\xf7\x07\x3c\xf0\x37\x5d\x72\x22\xf3\x58\x67\ \xf4\xf9\x6b\x78\x04\x18\x80\x6b\x40\x5e\x06\x51\x1e\x00\xcf\x5a\ \x43\x3c\x3e\x24\xe1\x38\xaf\xc4\x85\x51\xf1\x0c\xcd\xc0\x1d\x6d\ \x8c\x74\xd6\xd7\xed\xf7\xc3\x4c\x99\x1f\xfc\x6c\x3b\x77\xa2\xdd\ \xf4\x3e\x15\x80\xe1\xa4\xb9\xad\xbd\xcd\xd9\xe0\x89\xdc\xf0\x51\ \xe2\x36\x26\x55\x71\xa8\x92\x7a\x21\x37\xf7\x92\xa7\xc7\x62\xf5\ \xb7\x54\x28\xb1\x9a\x38\x2d\x58\xf5\xa4\x40\x91\xae\x29\xb7\x72\ \x72\x45\x4d\x51\x54\x0e\xab\xc7\x4b\x79\xab\xf3\x6c\xa0\x47\xde\ \x2c\xac\x1c\x6f\x4b\x94\xaf\x3a\xdd\x6e\x33\x88\xec\x0c\x59\xcb\ \x46\x1a\xb2\x83\x43\x92\x90\x8f\x92\x61\x76\x99\x7e\x2e\x5e\x1f\ \xf9\x22\x39\x2d\xe1\x58\x57\x0e\x4a\x5c\xe7\xa5\x4e\x12\xf4\x02\ \x1d\xb4\xd0\x25\xef\x71\xae\xb8\xfe\x54\xb0\xc7\x9a\x9a\xfa\xd4\ \x58\x43\x40\x81\xef\x6c\x22\x2a\x67\x34\x8e\x30\x7d\xc0\xa4\x86\ \x3b\x88\x69\x9a\xe5\x80\xd1\x24\x9b\x75\x1b\xfb\x48\x73\x8f\x92\ \x36\xb1\x93\x02\xe3\x85\x6f\xed\x75\x76\x69\x06\xc5\x88\xa3\x0e\ \x51\x90\x39\x5d\xc5\x59\xa9\xad\x37\x30\xe7\x73\xcb\x5d\x9c\x94\ \x87\x32\x43\x45\x23\x62\xf9\x85\xd2\x29\xef\xa4\xfc\xf5\xfe\x27\ \xb9\x4b\x3f\x00\xf9\xed\x9a\x6b\xec\x56\xfc\x70\xab\x93\x16\x0f\ \xa3\x59\x29\x1f\x1d\x9b\x10\xc8\xd3\x20\xe2\x0e\x85\x90\x4b\xc8\ \xe9\xfa\x40\x90\x8a\xd2\xad\xc5\x70\xda\x8b\xb5\xde\xa9\xca\xbf\ \x9b\x59\x1c\x73\xde\xc2\xe5\x2d\x95\xa1\x85\x23\x06\x2f\x3b\x76\ \xa9\x9f\xff\xba\xb8\xe4\x31\xfa\x7c\xe8\x93\x53\xfc\x01\x4d\x0d\ \xa5\x21\x02\xe5\x7b\x9a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x04\x5a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\ \x00\x09\x70\x48\x59\x73\x00\x00\x00\x48\x00\x00\x00\x48\x00\x46\ \xc9\x6b\x3e\x00\x00\x03\x77\x49\x44\x41\x54\x48\xc7\xa5\x95\x5b\ \x6f\x4c\x51\x18\x86\xd7\xad\x9b\x75\xe1\x57\xb8\x76\xe1\xd2\x21\ \xaa\x44\xa9\x32\x45\x83\x36\x88\xe3\xd0\xa6\x46\x51\x55\xd5\x51\ \x6d\x26\xa5\x1a\xe7\x53\x8a\x19\x24\xb8\x21\x24\x75\x08\x21\x12\ \x42\xd2\xaa\x76\xb4\xaa\x75\x6c\x75\x94\x1e\xad\x3d\x75\xa8\x9d\ \xbc\xde\x6f\xd9\x74\x24\x54\x4a\x9e\x4c\xd7\xde\x7b\xad\xf7\xc9\ \xb7\xd6\xfe\xa6\xa3\xa0\xfe\x0f\xfb\x27\xe2\x8b\x54\x47\xcc\x88\ \xb9\x1c\x49\xb3\x82\x70\xd6\xc5\x78\xcc\x75\x31\x52\x3a\xdc\x0b\ \xf1\x70\x06\x05\x27\xef\xbc\xff\x87\xb8\xd0\xe9\x9e\xbc\xa1\x8e\ \x8f\x0a\x9b\xaf\xf8\x37\x06\x71\xbc\x4f\x55\xe9\x53\x8e\xdc\xec\ \x1e\x31\x92\xaa\x32\xea\x98\x0e\x3b\x83\x74\x55\x0c\xcb\x2e\x8f\ \xc4\x67\x92\x3a\x66\xd4\xdb\xb1\x27\xac\x60\xe7\x6f\x28\x27\x3b\ \xff\x88\xa4\x8e\x18\xf5\x35\x7c\xf5\xe3\x17\x7c\x41\x68\xc4\x48\ \xea\x90\x51\xbd\xc9\x6d\x6e\x3f\x1c\xec\x47\xe9\x30\x94\x79\x24\ \x5e\x8b\xe0\x80\x51\x73\xc6\xd4\x0c\x1a\xf4\xe3\x09\xee\xe2\x0c\ \xa7\xb7\x7b\x04\xc9\xd0\x58\x42\xb6\x27\x20\xf7\x9f\xc9\x3e\xa3\ \xb6\x8e\x0e\x7e\xee\x47\x1f\x9a\xa8\x68\x46\x23\xae\xb2\x96\x62\ \xb2\x8d\xfc\x18\x13\xaf\x86\xee\x3f\x91\x3d\x46\x55\xea\xd2\x81\ \x7b\xdc\x42\xa3\x55\x3c\xc1\x53\xb4\xa0\x16\xe7\xb0\x03\x5b\xfe\ \x82\x08\x2a\x8d\xaa\xd0\xfb\x9c\x53\xe8\x64\xf4\x31\x25\x52\x85\ \x28\x5a\xf9\xb9\x8d\xc3\xc8\xff\x0d\x9b\x89\x8c\x1f\x49\x85\x51\ \xe5\x7a\x8f\xd3\x84\xa3\x78\x81\xa8\x55\x34\xe1\x25\x25\xa2\x78\ \xc6\x67\x8d\xb8\xc0\x33\xc8\xfb\x85\x0d\x44\xc6\x01\x52\x6e\x54\ \x48\x57\x3a\x03\x38\x80\xeb\x0c\x89\xa2\x01\x35\x3c\x91\x4e\xc6\ \x5b\x29\x78\x89\xd7\xe4\x3e\xaa\x10\xc0\x3a\x92\x4b\x64\x0c\x10\ \x11\x84\x8c\x2a\xd3\x15\x4e\x9c\xcb\xd3\xb9\x38\xca\x78\x14\x67\ \x91\x8c\x13\x68\x47\x37\x5e\x59\xc5\x2b\xb4\xe1\x0d\xaf\xae\xb0\ \x96\xb5\x1e\xd9\x24\x4e\xca\x8c\x2a\xd1\xe5\x8e\xc3\x43\xf4\xe1\ \x20\x17\x37\x90\xc7\xdc\xe3\x14\xe2\xc7\x43\x4a\xde\xda\x2a\xda\ \xa9\x88\xb1\xae\x28\x22\xc8\xc1\x6a\x8b\xa4\x4a\x8c\x0a\xea\x90\ \x15\x2c\xc5\x54\xee\xb8\x11\xf5\x54\xdc\xc3\x0a\x0a\x93\x91\x84\ \x99\x38\xcd\xe8\x7b\x0a\xda\xd1\x41\xd9\x3b\x5e\xc7\x70\x87\x35\ \x2c\xb7\x82\xa0\x51\x45\xba\xd4\x31\x30\x14\xf8\xb8\xbf\x37\x78\ \x64\x15\xa7\xb1\x04\x8b\x31\x1f\xd3\x31\x99\xac\xe7\x93\x2e\xce\ \x7d\x57\xb4\xe1\x10\x67\x97\x40\x52\x45\x46\x15\xea\x12\xe7\x03\ \x3e\x20\x13\x8b\x58\xf6\x4d\xbe\x44\x51\xd4\x73\x1b\x99\xc8\x22\ \x19\xac\x62\x25\xbb\xb4\xcd\x9e\x44\x0c\xb7\x30\x8f\xcf\x32\x89\ \xa4\x0a\x8d\x2a\xd0\x41\x2b\x58\x40\x66\x93\x0e\xd4\x91\x47\x5c\ \x98\x85\x85\x64\x19\x9b\xaa\x05\xcf\xed\x49\x34\xb3\xff\x26\x63\ \x8e\x5d\xbb\xc0\x0a\x0a\x8c\xca\xd7\xc5\x4e\x3f\xbf\x0b\xf3\xc8\ \x7c\xd6\x50\xc5\xa5\x0f\xad\xe2\x30\xef\x43\x7c\xa9\xd2\x5a\xad\ \x54\x54\x23\x95\xe7\x94\x6e\x57\x0a\x92\xca\x37\x6a\xa3\x2e\x72\ \xfa\xf8\xe6\x7d\x96\x54\x4c\x64\xa0\x81\xcd\x5c\xc7\x4f\x35\x4f\ \x5d\x5a\xab\x99\xba\xad\x98\xc4\xcd\xa4\x13\x9f\x87\xa4\x36\x1a\ \x95\xa7\x0b\xad\x20\xcd\x23\x09\x9b\xb8\xd3\x5a\xaf\x8a\x06\xab\ \x38\xcf\xc3\x9c\x82\x59\xde\x0a\xd9\xa8\x8c\x92\xca\x33\x2a\xa0\ \x0b\x9c\x5e\xf4\xd2\xfe\x9d\x14\x8c\xe7\x91\x35\xb3\xf4\x5a\xab\ \xb8\xcf\xc6\x9d\x80\x69\x3f\xe7\x67\xb2\xca\x54\x3b\x4a\x2a\x60\ \x54\xae\xce\xb7\x82\x94\x9f\x24\xb1\xbc\x18\x2b\x90\x2a\xce\xd8\ \x17\x39\x3d\x61\x36\x05\x33\x88\x8c\x92\xca\x35\x2a\x67\x54\xc0\ \xf4\x20\x91\x4e\xfe\xc3\x6c\x61\x9f\x77\xe1\x22\x9b\xb7\x16\x3d\ \x7f\xa4\x1b\x39\x7d\xfc\x61\xc9\xbe\x15\x75\x7f\x9d\x78\xc0\xb6\ \xee\xc0\x5e\x7e\x13\xdf\x0d\x13\xef\x41\xbd\x9b\x7d\x83\x82\x35\ \x0b\x8b\xe3\x75\x6e\x37\x86\xe8\xc2\x25\x7e\xa5\x9e\xa2\x7b\x58\ \x6a\xdc\xa2\xf8\x9a\x0c\x35\x8e\xf8\xe7\xfa\xaf\xf9\x4d\x22\xab\ \xcc\x6a\xe3\xff\x1b\x97\xfd\x69\xde\xaf\xf3\xff\xf0\x0d\x5e\x8c\ \x4e\xae\x77\x40\x20\x8d\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\ \x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x31\x2d\x31\ \x32\x2d\x31\x35\x54\x31\x36\x3a\x34\x30\x3a\x35\x36\x2b\x30\x39\ \x3a\x30\x30\x5a\x76\x29\x10\x00\x00\x00\x25\x74\x45\x58\x74\x64\ \x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x31\x2d\ \x31\x32\x2d\x31\x35\x54\x31\x36\x3a\x34\x30\x3a\x35\x36\x2b\x30\ \x39\x3a\x30\x30\x2b\x2b\x91\xac\x00\x00\x00\x19\x74\x45\x58\x74\ \x53\x6f\x66\x74\x77\x61\x72\x65\x00\x41\x64\x6f\x62\x65\x20\x49\ \x6d\x61\x67\x65\x52\x65\x61\x64\x79\x71\xc9\x65\x3c\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0d\xa8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\ \x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\ \x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\ \x0b\x1e\x08\x16\x11\x0b\x00\x93\x6c\x00\x00\x02\xe6\x49\x44\x41\ \x54\x38\xcb\x75\x93\x5b\x4c\x93\x77\x18\xc6\x7f\xdf\xd7\x71\x08\ \xf5\xa3\xc0\xfc\x9c\x11\xc1\x5a\xa9\xd4\x01\xce\xa8\xd1\x69\x3d\ \x06\x15\x09\xd9\x88\xc6\x25\x4c\x2f\xb8\x58\xd0\x70\x61\x94\x8b\ \xc1\x26\xa4\x06\x83\x31\x0b\xd9\x8c\x61\xa6\x17\x3b\x5d\xcc\x78\ \xa1\xf1\x40\x36\xd1\xcc\x8b\x0d\x08\x28\x99\x8a\x9a\x11\x40\xd0\ \x86\xa3\xd0\x52\xa9\xb6\xd2\xf6\x5f\xe0\xef\x8d\x53\x2a\xf8\x24\ \xef\xcd\x9b\xe7\xf9\x5d\xbc\x07\x45\x4a\xc9\x4c\x6d\xbd\x55\x98\ \x02\x1c\x04\xd6\x01\x6b\x00\x03\x70\xf7\x75\x39\x1b\x37\xd4\x7b\ \x66\xfa\x95\x99\x00\x7b\x4b\xc1\xa9\x79\xaa\xf1\x9b\xf5\xfa\x4a\ \x96\x18\x53\x49\x4f\x58\x84\xaa\x18\xe8\x9b\x18\x64\x70\x62\x84\ \x56\x77\x3b\xfe\xa9\x40\x6d\x8b\xfd\x5a\xf9\x2c\xc0\xa7\xff\xec\ \xac\x5e\x61\x5a\xee\x38\xb0\xac\x90\x46\x6f\x33\x8f\x7c\x2e\x3c\ \x41\x3f\x4c\x4b\xe6\x27\x68\x2c\x33\x99\xd9\xa9\x6f\xe5\xa2\xab\ \x81\xf6\xf1\x8e\xe3\xb7\xb7\xdd\x3c\xf1\x06\xb0\xf6\xaf\xed\xd5\ \xd9\x29\x99\x8e\xdd\xe6\x4d\x9c\xeb\xbd\xca\x27\xc6\x55\x6c\xd7\ \x37\x63\x4b\xb4\xa2\x02\x9d\xfe\x1e\x6e\x79\xff\xa5\xf9\x79\x23\ \x5f\x5a\xf7\xd0\xda\xdf\xce\xbd\xb1\xff\x4e\xde\xd9\xf5\x77\x95\ \xb2\xf2\xcf\x8d\xa9\x09\xb1\xc6\xc1\x43\x39\x45\xfc\xd6\x79\x81\ \xa2\x45\x5f\x50\x9a\xf9\x15\xef\xca\xe3\xf1\x70\xd9\xd7\xc0\xef\ \x03\xe7\x28\xc9\x2a\xe2\xd7\x87\x97\xf0\x89\xe7\x8b\x55\x21\x22\ \xa5\x1b\xf4\x55\xfc\x31\x74\x0d\xbb\x69\xe3\x9c\xe1\xb6\xb6\x36\ \xca\xca\xca\xd8\xbf\x70\x2f\x85\x1f\x7d\xc6\x45\x57\x3d\xab\x17\ \x64\x23\x44\xa4\x54\x15\x22\x58\x60\x88\x93\x3c\x1d\xf5\x52\x98\ \x56\x30\x67\xb8\xae\xae\x8e\xaa\xaa\x2a\x34\x4d\xe3\xf3\xc5\xf9\ \x8c\x8c\x8d\x13\x1b\xaf\x20\x44\x70\x8f\x2a\x44\xf8\x63\x37\x6e\ \xbc\x7e\x1f\x56\xcd\xf2\xde\xb0\xcd\x66\x03\x60\xa9\x66\x66\xcc\ \x37\xc6\xf0\xf4\x30\x42\x84\x33\x54\x11\x0a\x89\xe1\xc0\x30\x53\ \x41\x81\x94\xd3\x51\x80\x40\x20\x80\xaa\xaa\x68\x9a\x16\xd5\x8f\ \x84\x43\x8c\xbe\x1c\x45\x84\x42\xa8\x91\xb0\xe8\x7d\xf1\xe2\x25\ \x49\xb1\x26\x7a\xc6\x7b\xa3\x8c\xb9\xb9\xb9\x14\x17\x17\x53\x59\ \x59\x89\x10\x02\x80\x27\xcf\x1e\x93\x1c\x93\x84\x2f\xe0\x27\x12\ \x16\xfd\x06\xc3\x8e\xd8\xb4\xf8\xf8\x84\x2d\xb6\x0f\xad\x0c\x78\ \xfa\xc9\xb3\xe4\x45\x41\x2c\x16\x0b\x76\xbb\x9d\xc4\xc4\x44\x00\ \x7e\xbc\x73\x96\xa9\x38\xc9\x90\x7f\x90\x71\xaf\xef\xbc\x2a\x42\ \x41\xe7\xd3\xbe\x01\x26\xe7\x4d\x72\xa5\xa7\x9e\xef\x5a\x6a\x67\ \x0d\x52\xd7\x75\x00\x7e\xb8\x7d\x9a\x9f\x1f\xfe\x42\x4c\x72\x0c\ \x43\xae\x21\x44\x28\xe8\x44\x4a\x09\x0e\x43\x8d\xf1\xac\x49\x96\ \xdf\x3f\x26\x53\xcf\xa4\xcb\x23\xd7\x8f\xc8\x07\xa3\x0f\xe4\xff\ \xea\xf6\x74\xcb\x8a\x9b\x15\x52\xff\x7e\xa1\xac\x68\xff\x56\x6a\ \xce\x24\x89\xc3\x50\x23\xa5\x7c\x7b\xca\xca\xd7\x1f\x54\xc6\xa5\ \xc5\xd5\x1c\xdd\x52\xc6\xe3\x81\x5e\x9a\x1e\x35\xe1\x1e\x71\x03\ \x90\xb2\x20\x85\xcd\xd6\x4d\x64\x2d\xcd\xe1\x74\xf3\x19\x82\x7d\ \x81\x72\x59\x3b\x59\x3b\xeb\x99\x94\xc3\x4a\x35\xf1\x06\x87\x39\ \xdb\x4c\x7e\x66\x01\x39\x7a\x0e\x00\xdd\xde\x2e\x1a\xba\x6e\xd0\ \xd3\xd1\x05\x13\x53\x27\x64\x9d\x3c\x3e\xe7\x37\x02\x28\x25\x4a\ \x3a\x50\x0a\xec\x03\x32\x5e\xb7\x5d\xc0\x15\xc0\x29\x7f\x92\x51\ \xab\x7a\x05\x8a\xb5\x57\xec\x88\x9b\xdb\x45\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x68\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01\ \x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0b\x1a\ \x07\x1d\x25\x4d\x7e\x6e\x78\x00\x00\x01\xb8\x49\x44\x41\x54\x28\ \xcf\x25\xc8\xcf\x6b\x92\x71\x1c\xc0\xf1\xf7\xe7\xfb\xb8\x3d\x53\ \x4b\x87\xeb\xd7\xb3\xf5\x03\xc4\x45\xd8\xda\x4c\x06\x19\x64\x68\ \x87\x4a\xe8\x54\x78\xd8\x2d\xe8\x14\xc1\x20\xff\x81\xea\x1f\x08\ \x82\xba\xd7\x2d\x82\x5d\x72\x61\xa7\xb2\x08\xc6\x46\x35\x4c\xfa\ \x85\x8b\x9c\xdb\xd3\xb6\xa6\xab\xc1\xa6\x8f\x39\x9f\x6f\x87\xbd\ \x8e\x2f\xd1\xec\xca\x0c\xcb\x75\x49\xe9\x53\x20\x65\x5d\xd4\x8f\ \x0b\x95\xdd\x17\x0d\x64\x94\xe4\xcc\x7b\x49\xf3\x98\x61\x21\xac\ \x52\xeb\x16\xdb\xed\x3b\xfa\x7e\xc1\x05\xd1\x64\x94\x7a\x1b\x8e\ \x5f\xf5\x6e\xd2\xc0\xc1\xc0\x4f\x88\x00\x53\xad\xca\x47\xf7\x7c\ \xc1\x55\x20\xb9\x70\x3c\xeb\x2d\xf1\x05\x38\x4d\x94\x2e\x0b\x7c\ \x25\xeb\x8d\xc4\x25\x07\x72\x39\xd2\x57\xba\xe5\x9b\xa7\xc9\x35\ \x4e\x22\x40\x97\x05\xa6\xe9\x23\xca\x83\x66\x7b\xcc\x18\xce\x25\ \x53\x4a\x8d\x10\x25\x46\x85\x59\xaa\x68\x8e\xd3\xe6\x3b\x7e\x02\ \xaa\xba\xe5\x91\xd4\xa0\x61\x73\x01\x8b\x75\x5e\xd1\x83\xa2\xc6\ \x6f\x02\x18\xd8\x1c\x36\x24\xa5\xf4\xa8\xc5\x06\x75\x3a\xfc\x65\ \x00\x07\x07\x87\xf7\x2c\x12\xa4\xc1\x41\xf4\xa8\x07\xc0\x25\xcf\ \x14\x1e\x7a\x31\x10\x86\x48\x73\x80\x97\xfc\xc2\x05\x94\x94\x57\ \x08\xd2\xe0\x22\x67\x70\x70\x68\x53\x45\x70\x39\xca\x5e\x56\x91\ \xb2\x47\x17\xed\xc4\xa0\x5a\xc6\x26\x4b\x3f\x65\x14\x71\xf6\x31\ \xcd\x22\x16\x35\x57\x17\x8d\xc8\xd2\xda\x8d\x74\x6f\x9d\xcf\xf4\ \x33\xce\x38\x31\x06\x78\x43\x1e\xcd\x09\x9e\x37\x77\x6e\x1a\x95\ \x8d\x27\x9d\xfa\xb9\x4b\x3d\x6b\xcc\xf0\x1a\x9b\x79\x9e\xf2\x81\ \xfd\x24\xc9\xb7\xea\x77\x0b\x79\xd1\x64\x94\xbc\x0b\x8f\x5d\xf1\ \xd9\x2c\xd1\x40\x08\x71\x04\x8b\x17\xad\x9f\xa5\xd9\x74\xc3\x11\ \x8d\xf8\xcd\x3d\x67\x6f\x07\x27\x13\xe6\x90\x3a\x04\xac\xb0\xec\ \xce\xfd\xfb\xf3\x68\xe6\x61\x67\x9b\x4d\xd1\x80\x98\xf8\x46\x62\ \xa1\x09\x33\x61\x44\xa0\xfb\xc3\x99\x5b\x7f\xf6\xed\x13\x5b\x6c\ \x6b\xf7\x3f\xe4\xe9\xa7\xe5\xeb\x9c\x6e\x4e\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\xbc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x07\x39\x49\x44\ \x41\x54\x78\xda\xed\x97\x5b\x6c\x14\xd7\x19\xc7\xff\x73\xdb\xd9\ \xd9\xab\xf1\x05\xdf\x30\xbe\x1b\x13\x93\xc8\x06\x17\x92\x52\x44\ \x68\x80\xc6\x05\x25\x51\xda\x87\x5e\x45\x9f\x6a\x55\xaa\xe4\x3e\ \x54\xa2\x55\xab\xa6\x58\x85\x2a\xe9\x43\x1e\x1a\xb5\x45\xe4\x21\ \x15\x15\xad\x20\x71\x08\xa5\x01\x53\x43\xe2\x26\x0e\x09\x71\x1c\ \x1a\x8c\x4d\x1c\xdb\xeb\xdb\xda\x7b\xf7\x7a\x77\xbd\xbb\xb3\x33\ \x73\xa6\xdf\x8e\x6a\x57\x2e\xb5\x9a\x28\xad\xda\x07\xce\xee\xd1\ \x48\xa3\xd1\xf9\xff\xbe\xef\xff\x9d\xef\xcc\x70\xa6\x69\xe2\x7f\ \x39\xfe\x3f\x01\xf4\xc0\xa1\x7a\x13\xc6\xc3\x30\x0d\xd9\x34\xd9\ \x22\xc0\xe2\xa6\x69\x24\x68\xc6\x39\xc0\x27\x6f\x1a\x48\xff\xc7\ \x01\xf4\xe0\xe3\x7b\xb2\xd9\x4c\x17\xcf\xb1\x7d\xa2\xc4\x15\xc2\ \xd4\xa1\xe6\x18\xfc\x0b\xc0\x06\xaf\x01\xaf\x5b\x03\x60\x82\x31\ \x53\x67\x4c\x1f\xe0\x79\xe3\x82\xc9\x32\xaf\x38\x6b\x3f\x9a\xf8\ \xd4\x00\x91\xd1\x7d\xbf\xf4\x14\x28\xdf\x35\x59\x0e\x67\xce\x26\ \x48\x54\x87\x66\xc8\x24\xe7\x84\x4d\x2e\x81\x20\x64\x20\xdb\x96\ \xa1\xd8\x73\x90\xe5\x1c\x1c\x0a\xc3\xd6\x46\x1e\x0d\xd5\x4b\x06\ \x33\x8c\x1b\x5c\x1e\xc6\xc8\xf4\xb8\x1b\xfd\x63\x9f\x18\x60\xec\ \x8d\xd6\x6f\xd4\xd4\x97\x9e\x36\x0c\x0d\x4f\x9d\x08\x23\xa5\x6d\ \x47\x7d\xe3\x4e\xd8\x15\x3b\x78\x8e\x07\xcf\x0b\xe0\x45\x1e\x0e\ \xbb\x03\x8a\x43\x81\xdd\x6e\x03\xa0\x21\x11\x7d\x0b\xe9\xc4\x7b\ \x70\x3a\xa2\xd8\x5a\xcf\x50\xb7\x39\x66\xea\x7a\xee\x2d\x0a\xe2\ \xa7\x05\xcd\x0b\x7d\x1f\x1f\xe0\x2f\xdb\x7c\xd5\xf5\x25\x35\x17\ \x7a\x53\x38\xdf\xdb\x88\x83\x1d\x87\x31\x3b\xb3\x00\x3d\x67\x40\ \x94\x44\x48\xa2\x04\x49\x92\xe0\x72\x3b\xe1\x76\xbb\xe0\x74\x39\ \xe1\x74\xfe\x1d\x46\xb6\xc1\x30\x32\x98\x9f\xb9\x8a\xa5\xc8\xdb\ \x28\x2e\x08\x63\x57\x6b\xc0\xe4\xa0\x9e\x37\xb4\xdc\x8f\x8b\xef\ \x0f\x8d\xfc\x5b\x80\xc9\xeb\xdb\xd4\x8a\x4d\x5e\xdb\xe9\x17\x79\ \xf8\x42\xfb\xb0\x9c\xcc\x40\xe0\x49\xd0\xe5\xb1\x84\x45\x51\xb4\ \xae\x0a\x65\xc4\xe5\x71\xc1\xed\x72\x59\x00\x0e\x02\x20\x08\xeb\ \xbe\x4d\x96\x60\xb3\x49\x88\x86\x3e\xc2\xc8\xfb\xcf\xa1\xbc\x64\ \x1a\x3b\xb6\x06\x55\x83\xe9\xcf\xe7\x54\xed\x58\x59\x5b\x38\xbc\ \x2e\xc0\xcd\x4b\x35\x4b\x5b\x5a\x36\x7a\x7a\xfb\x39\x5c\xff\xe0\ \x11\x04\x16\xc2\x14\xa9\x17\x1e\x77\x01\xf9\x2d\xe7\x01\x56\x32\ \xb1\x92\x01\x82\xb3\x32\x40\x10\x74\x55\x64\xb2\xc5\x0e\x99\xac\ \xa1\x67\x09\x9e\xc3\xe4\xf8\x9b\xf0\x8d\x9e\x22\x6b\x02\xa8\xdb\ \x14\x8b\xe9\x39\xed\x07\xa5\x6d\xc1\x53\xff\x12\xe0\x4f\x27\x5d\ \x57\xf6\x1e\xa8\x3f\x90\x48\x31\x3c\xf7\x87\x03\xf0\x4d\x44\x28\ \xca\x3c\x80\x97\x22\x75\x5b\x8b\xae\x4c\x9b\xcd\x66\x41\x38\x5c\ \x0a\x79\x6f\x41\x40\xc9\x8b\x13\x84\x6c\xb3\x59\x59\x10\x44\x01\ \x30\x4d\xe8\xba\x8e\x3b\xb7\x5e\x82\x9a\xfa\x23\xf6\x3f\x34\xc3\ \x72\x59\xf5\x78\x59\x5b\xf0\x27\x77\x01\x9c\x3e\x8e\x96\xfb\x1e\ \x28\xfd\x60\x4b\x8b\x87\x7f\x63\xb0\x12\x7d\xd7\x77\x22\x1a\x89\ \x13\x84\x07\x2e\x02\xa1\x2c\xac\x85\x90\xc9\x1e\x27\x41\x38\x95\ \x7f\x00\xc8\x24\x4e\x53\x22\x00\x91\x00\x78\x9e\x47\x7e\x64\x32\ \x69\x44\x82\x63\x08\xcd\xfc\x0a\x1d\x7b\x67\x61\xe4\xd2\xbf\xad\ \xd8\x11\xfc\xd6\x5d\xdb\xf0\xcc\xd3\xe2\xb3\x8f\x74\x94\x7f\xcf\ \xe1\x60\x78\xe1\x95\x2f\x62\xf0\xa6\x49\x11\x29\x04\xe0\x26\x31\ \xcf\x1a\x00\x41\x10\x2c\x21\x87\xe5\x3f\x15\x22\x45\x4f\x90\x16\ \x84\x24\x59\xcf\x58\x00\x1c\xc7\x21\xbf\x76\x3a\xbd\x8c\x54\x32\ \x8e\xe0\xf4\x6f\xf0\xf0\xae\x09\xb8\xe4\xc4\x55\x2d\x6b\x3c\x51\ \xf3\xb9\x70\x6a\x15\xe0\x85\x6e\xce\x59\x5a\x59\x10\x79\x68\xb7\ \xcd\x1e\x8b\x9b\x38\xf5\xe2\x61\xea\x05\x9c\x25\x4e\x36\x90\x98\ \x73\x55\xdc\x30\x74\x24\x52\x09\x78\x3d\x5e\x14\x15\x16\x59\xdb\ \xd5\x4e\x00\x92\x2c\xad\x16\xad\x20\xac\x02\xe4\x27\x01\x24\x91\ \xcd\xaa\x88\xcd\x9f\xc1\x97\x0f\x8d\x42\x5b\x8e\xff\xb9\xe6\xb3\ \xc1\x83\x6b\x3a\xe1\xc9\xee\x8a\x2f\xd5\x56\xc5\xcf\xb5\x6d\x17\ \xb8\xb4\x2a\xe0\x7c\xff\x11\xdc\x1c\xce\xc2\xa1\xb8\xc8\x6f\x17\ \x45\xeb\x40\x2a\x9d\xc4\xed\x3b\xb7\xe8\x9e\xdb\x8a\x9a\x44\xac\ \x94\x37\xd5\x37\xa2\xbc\xbc\x82\x00\x56\x2d\x58\xb5\x81\xd6\x27\ \x68\x03\x8b\xf1\x18\x54\xb2\x44\x41\x0f\xbe\xfa\xd8\x04\xe2\xe1\ \xcc\xd7\x6b\xf6\x44\xce\xac\x39\x0b\x9e\x3d\xfe\xe4\x2f\x6a\x0b\ \xfa\xbe\xdf\xfe\x19\x0d\x26\xef\xc4\xd5\xc1\x23\x18\xb8\x91\x81\ \x8d\xec\xa0\x2c\x90\xa7\x19\x24\x69\x91\xc2\x0d\x45\x04\xe1\xb0\ \x16\x4e\xa6\x92\x88\x46\x43\x54\x33\x4e\xb4\x34\x6f\xb3\xec\x11\ \x04\x11\xc4\x06\x8e\x7e\x26\x08\x80\x31\x30\xdd\xc0\xf4\xac\x0f\ \x1b\x3c\x0e\xb4\xd6\xff\x1e\xdb\x1a\x42\x7e\x2d\xcb\xea\xd6\x00\ \x9c\x3b\x77\x4e\x98\x9e\x18\x78\x77\x93\xfd\x6c\x5b\xfb\x0e\x8d\ \xba\x5f\x14\xaf\x0d\x3d\x8e\x37\xdf\xab\xa4\x05\x25\x2a\x38\x05\ \x92\xdd\x89\xf2\xd2\x32\xda\x25\x1e\xe8\x64\x47\x34\x16\x85\x7f\ \xde\x8f\xd9\xb9\x29\x8a\x96\x61\xf7\x83\x7b\x56\x85\xe9\xbf\x6a\ \x03\x23\x08\x35\xa7\x22\x1c\x0a\xa0\x72\x63\x1c\xdf\xf9\x66\x3f\ \x96\x82\xc9\x5f\xdf\x75\x1a\x1e\x3b\x76\xcc\xa5\xc8\xd9\x97\x8b\ \xb8\x97\xf6\xef\xda\x2e\x92\x50\x14\x81\xb0\x17\x6f\x8f\xec\xc1\ \x9d\x49\x0f\xa5\xde\x8e\xe6\xe6\x16\xdc\xd7\xb4\x15\x59\x55\xc5\ \xdc\xfc\x1c\x26\xa7\x7d\x98\xf4\x4d\x60\x6a\x7a\x1c\xfb\xf7\x1e\ \xb4\x9e\x01\x56\xc5\xd7\x40\xf8\xfd\xd3\x28\xf0\xba\xf1\x95\x43\ \xaf\xc2\x23\x07\x02\x2b\x00\xff\x0c\x21\x2a\x0e\xee\x12\x4b\x0c\ \xec\xdf\x52\xe5\xa3\x7d\xba\x19\x22\xbb\x89\xf1\xb9\x5a\xdc\xb8\ \xd3\x8a\xf9\xa0\x8b\xd2\x7d\x3f\xea\x6a\xeb\x10\x89\xc7\xe1\x9b\ \x9a\xc4\x84\x6f\x1c\xf1\xc5\x08\x5a\x1f\x68\x07\xcf\x71\x77\x01\ \xe8\xba\x06\x8d\xe6\xbc\x7f\x16\x1e\xaf\x17\x5f\x3b\xdc\x8f\x9a\ \x52\xbf\xbe\xee\x0b\xc9\xd3\xcf\x9c\x78\x99\xc1\x7c\x02\x46\x0a\ \x5a\xac\x0f\xbb\xdb\xbd\xa8\xab\x2b\x85\xba\x78\x11\xc3\x93\xcd\ \x18\x9b\x6f\xc0\x7c\xb8\x04\x80\x08\x9b\x64\xb3\x7c\xa6\x46\x65\ \x15\xe6\x8a\x05\x26\xcb\x47\x6d\x58\xb5\xa2\x1b\x9a\x65\xc1\xc2\ \x82\x1f\xc5\x45\x6e\x74\x77\xbd\x8e\xe5\xa5\xe5\xf4\xba\x00\xc7\ \x7f\xde\x7d\xb9\xc0\xeb\xfd\xc2\xb5\xd7\x5e\x47\x75\x4d\x35\xdc\ \xf6\x1c\xc4\x74\x3f\x3a\x3a\x3e\x8f\xe2\x0d\x3a\xd2\xb1\x6b\x88\ \x45\x16\x31\x19\x68\xc2\x74\xb8\x06\x0b\xd1\x22\x12\x61\xd6\x09\ \xba\x32\x98\xc9\xc0\xe8\x9e\x41\x10\x1a\x89\x87\xc2\x01\x78\xbd\ \x4e\x1c\x79\xf2\x16\xf6\xb4\xc7\xf0\xfe\x50\x76\x68\x5d\x80\xee\ \x9f\x3d\x75\xc2\x34\xb9\x1f\xe6\xe9\x7b\xaf\xf4\xa2\xa4\xa8\x04\ \x8d\x4d\x0d\x90\xcc\x10\x38\x75\x14\x3b\xdb\x2a\xd0\x58\xdf\x00\ \x45\x8a\x42\x4d\xbd\x83\xc5\xc5\x24\xa6\x42\xf5\x48\xa4\x9d\x48\ \x64\xdc\x48\x2e\xcb\x58\x4c\x08\x50\x55\x46\xc5\xbc\x48\x3d\x65\ \x09\x4d\xd5\x61\x3c\xb8\x3d\x88\x8a\x8d\x0c\xb7\x87\x99\x7a\xe9\ \x9a\x51\xb9\x2e\xc0\xd1\x67\x8e\xba\xf9\x04\xf7\x21\xcf\x0b\xe5\ \x26\x63\xb8\x7c\xf9\x32\x45\xa1\xa1\x6a\x73\x15\xca\xca\xca\xa8\ \x41\xc9\x30\x32\xb3\x70\x08\x0b\x68\x6b\x16\x51\x55\x29\xc1\x69\ \x8b\xc1\x26\x44\x21\xf2\x49\xf0\xa2\x0a\x51\x02\x24\xc9\x84\x40\ \x57\x41\x04\xf5\x11\x60\xce\xcf\x61\x6c\x9c\x9f\x3d\x7b\xc1\x38\ \xd0\xf7\x8e\xf9\xe1\xba\x00\x16\xc4\xd1\xa3\x3b\x73\x2c\x77\x91\ \x31\x56\xe2\xa4\x3e\x30\x32\x32\x8a\x91\xe1\xdb\xf9\x6e\x68\x1d\ \xc9\xa5\x65\xa5\x28\x2c\x2c\xb4\x8e\x64\x96\x5d\x80\x91\x0b\x11\ \x40\x16\x25\x5e\xea\x15\x9e\x04\x0a\xdd\x06\xdc\x1e\x3b\xe2\xcb\ \xb2\x31\x35\x6b\x8e\x0e\x8f\x04\x9e\x67\x0c\x43\xe4\xca\xc0\x95\ \xeb\x26\xfb\x58\x6f\xc5\x5d\x5d\x5d\x8d\x9a\xa1\x5d\xcc\x69\x5a\ \x13\xc7\xf3\x56\x3b\x0e\x47\xc2\x88\x45\x63\x48\x2e\x25\x90\x49\ \x67\xf2\xab\x58\x7d\x41\x56\x14\x50\xc6\xfe\x5a\x52\x5c\xf0\x3b\ \x00\x36\x93\x33\x86\xf4\x2c\xde\xed\xe9\xe9\x89\x7e\xaa\xd7\xf2\ \xce\xce\x4e\x49\x65\xfa\xb7\xc9\x82\x1f\x69\xba\x5e\x9e\x3f\x6a\ \x99\x09\xab\xba\xb5\x5c\x8e\xaa\x5b\xb3\x7a\x3d\x15\xda\x2c\x53\ \xb3\x3b\x86\x86\x86\xc2\xff\x95\xef\x82\xc7\x3a\x3b\x1d\xe2\xd2\ \xd2\xa3\x9a\xa6\xed\xd3\x35\x6d\x2f\xc1\x6c\xd4\x72\xd6\xfe\x8e\ \x6a\x9a\x7e\xde\x54\xb3\x27\x07\x07\x07\x67\xf0\x09\xc6\xbd\x2f\ \xa3\x7b\x00\xf7\x00\xfe\x06\xaa\x0a\xb0\x26\xbd\xe1\x20\x4d\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x3b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\ \x82\xcc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0b\x1d\x02\x2e\ \x23\xcb\x6a\x54\x2f\x00\x00\x01\x7d\x49\x44\x41\x54\x28\xcf\x8d\ \x91\x4b\x48\x94\x61\x18\x85\x9f\xf7\xfb\x3e\xc7\x5b\x60\x5e\x7e\ \xbc\xc0\xa8\x8b\x59\x4b\x0b\x21\xa2\xa5\x9b\x20\xdc\x64\xd2\xae\ \x68\x2b\x21\x08\xed\x84\x16\x79\x41\x2b\x41\xda\x58\x20\x88\x44\ \x44\xb8\x70\x19\x44\x82\x0a\xd1\x80\x6d\x2c\x74\x6c\x21\x3a\x0b\ \x11\x0c\x0d\x2f\xa0\x33\xbf\xff\xfb\xba\x18\xba\x40\x1b\xcf\xd9\ \x1c\x38\x9c\x03\x87\x03\x97\xc7\x7b\x07\x4b\xab\x8b\xcb\xf0\x9d\ \xd9\xff\xed\x57\xc0\xcc\xf4\xae\x6d\xd9\x9b\x7e\x78\xfd\xd7\x78\ \xf6\x47\x0d\x5f\xcf\xda\x9e\x1d\xe8\x82\x8e\xb5\x03\xbc\x05\x9e\ \xc3\x07\x00\x5a\xe4\x6e\x34\x97\xdb\xb6\xbc\xe6\x75\xdb\xde\xad\ \xdc\x6f\xfc\x1d\x93\xc1\x54\xfd\xa3\x9a\xce\xba\x9b\x35\xad\x69\ \x9c\x01\x38\x8b\xdd\x0e\x47\xf9\x9f\xd9\x93\x95\xfc\x54\xa8\x1d\ \xb8\x31\x56\x4d\x0a\x77\xae\xde\x10\x01\x05\xd2\xe7\xda\x96\x69\ \x3b\xbe\x57\x29\x6e\x6f\x7e\x13\xaf\xb1\xc5\x41\x51\x51\x4a\x2c\ \x86\xa2\x79\x76\x75\xfd\xa3\xff\xbc\x9f\xd9\x28\xef\x8d\x00\x87\ \x88\x43\x10\x4c\xc4\x1c\x39\xc9\xf6\x4c\x2c\xf9\x61\x86\xd6\x9a\ \x8f\x5a\x6e\x5d\x15\x11\x6f\x01\xc1\x24\xb6\x43\x59\x93\x2f\x77\ \x26\xe6\xc7\x11\x78\x9c\x7a\x51\x7c\x79\xd6\x59\xee\x2d\x88\xc3\ \x48\xec\x4c\x12\xbe\xad\xf6\x5f\x7b\xea\x9f\x24\x01\x24\x71\x24\ \xc9\x29\x15\x04\x52\x78\x12\x3c\x05\x34\x80\x1a\x04\x38\x44\xbd\ \x54\x05\xca\xa4\x92\x7a\x02\x27\xa2\x94\xb6\x08\x10\xe0\x17\x60\ \x00\xe4\x58\xd8\x2a\x84\xdb\xe9\x0c\x8e\xa0\x70\xa5\xd4\x50\x0d\ \x9a\xc4\x3f\x64\xf3\xd3\xd7\x91\xe9\xec\xba\x4c\x76\x75\xf4\x75\ \x74\xc7\x65\x50\x10\x0c\x58\x06\x1e\x46\x0d\x4d\xff\x5e\x17\x35\ \x3d\x88\x60\x14\xb8\x00\x97\x37\x94\x7c\x30\x95\x66\xed\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x75\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\ \x82\xcc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0c\x02\x0b\x23\ \x2c\x5b\xf0\x97\xa5\x00\x00\x01\xb7\x49\x44\x41\x54\x28\xcf\x55\ \x91\x49\x48\x94\x71\x18\x87\x9f\xf7\xff\x2d\xc3\x4c\x61\x53\x93\ \x13\x51\x53\x8c\x6d\x90\x10\xd3\x02\x25\x85\xa1\x2d\x24\xd4\xa5\ \x63\x8b\xa6\x87\x2c\x32\x34\x48\xe8\x50\xd1\x6a\x85\x74\x8a\xf0\ \x10\x4c\xcb\xa9\x8e\x95\x74\x28\x24\xa2\x43\x10\x84\x20\xc2\x90\ \xd0\x41\xa3\x0e\x35\x33\x59\xa9\x8d\xdf\xf6\x76\x68\x81\xf9\x5d\ \x7e\x87\x07\x9e\xcb\x03\x55\xcb\xac\x3d\x1d\xb6\x7d\xcd\x2c\x00\ \xd8\xf5\xaa\x4f\x57\xb4\x99\x7f\xe8\xba\x34\xd9\xb0\xfa\x5d\xc6\ \x6c\x5e\x98\x2b\x92\xdd\xf6\x76\x4f\x63\x32\xdc\x7b\x4f\xaa\x0d\ \xcb\x77\xae\x7f\xb1\x8c\xb8\x16\x64\x0d\xb3\xa1\xb1\x9e\x5c\xb0\ \xff\x80\xfe\x1e\xed\x08\xbf\xf8\x77\xce\x3f\xa2\xc1\x7f\x93\xd6\ \xac\x94\x31\xd6\xf3\xcb\xe3\x17\xe5\xd6\x92\xa0\x97\xee\x08\xa5\ \x82\x87\xd1\xca\xa9\x67\x87\xe2\x9b\x26\x89\x63\x4f\x8f\x2e\xaa\ \x4c\x4b\xdf\x70\xa2\x4e\x6b\x22\xf5\xd8\x28\x4b\x75\x44\x06\x10\ \xca\x9a\xa2\x44\x42\x4c\x38\x92\x36\xe3\x87\x67\x0e\x28\x91\xcc\ \x95\x9c\xa6\x64\x08\x74\x4a\x6b\xf8\x24\x46\x22\xb0\x76\x8f\x99\ \xc5\xc3\x93\x83\xa5\xc8\xa3\x0e\x65\x02\xc5\x96\x24\x0d\x52\xe0\ \x08\x42\x8a\x9f\xf3\xac\x83\x1d\xdf\x92\x4a\x59\x5a\x70\x70\x64\ \x0b\xef\x89\x71\x4c\x5c\x9a\xc8\x6a\x81\x5a\x4b\x9e\xb6\x7e\xb8\ \x5f\x54\x97\x1e\xbe\x8b\x51\x17\x87\x92\x8c\xe9\x47\x60\xbb\xac\ \xd2\x13\x22\x90\xd7\x22\x81\xb6\x8b\xab\x15\x31\xd8\xb8\x6a\xc4\ \xa3\xc0\x2c\xb5\xdc\x9c\x30\xa0\x2d\xf6\x2f\x4b\xf2\x0c\x49\x49\ \x1d\x6c\x42\x7c\x12\x6c\xa5\x59\x1f\xe3\xdc\x96\xbb\xb4\x03\x37\ \x76\x68\x77\xb0\xcf\x27\xcd\x3a\xea\xd5\x91\x90\x18\x9f\x83\x6b\ \xb6\x95\x16\x80\x7e\x7a\x81\xb3\xee\x9c\xe3\x5e\x97\xbf\xd2\x50\ \x1f\x6c\xb0\xe6\xcb\x03\x46\x5f\xe7\x1b\xff\xb7\xb8\x82\x6d\x9d\ \x09\xe1\x6a\x2e\x3c\xf7\x63\xff\x0c\x31\xa6\xb0\x9b\x07\x5e\x56\ \xa5\xba\xf4\xf7\x07\xad\xae\xd6\xa3\x0f\x3b\x4f\x42\x27\xbf\x01\ \xb3\x32\xa1\x1e\x82\x06\x36\xaf\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x13\x99\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x0a\x4f\x69\x43\x43\x50\x50\x68\x6f\ \x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ \x6c\x65\x00\x00\x78\xda\x9d\x53\x67\x54\x53\xe9\x16\x3d\xf7\xde\ \xf4\x42\x4b\x88\x80\x94\x4b\x6f\x52\x15\x08\x20\x52\x42\x8b\x80\ \x14\x91\x26\x2a\x21\x09\x10\x4a\x88\x21\xa1\xd9\x15\x51\xc1\x11\ \x45\x45\x04\x1b\xc8\xa0\x88\x03\x8e\x8e\x80\x8c\x15\x51\x2c\x0c\ \x8a\x0a\xd8\x07\xe4\x21\xa2\x8e\x83\xa3\x88\x8a\xca\xfb\xe1\x7b\ \xa3\x6b\xd6\xbc\xf7\xe6\xcd\xfe\xb5\xd7\x3e\xe7\xac\xf3\x9d\xb3\ \xcf\x07\xc0\x08\x0c\x96\x48\x33\x51\x35\x80\x0c\xa9\x42\x1e\x11\ \xe0\x83\xc7\xc4\xc6\xe1\xe4\x2e\x40\x81\x0a\x24\x70\x00\x10\x08\ \xb3\x64\x21\x73\xfd\x23\x01\x00\xf8\x7e\x3c\x3c\x2b\x22\xc0\x07\ \xbe\x00\x01\x78\xd3\x0b\x08\x00\xc0\x4d\x9b\xc0\x30\x1c\x87\xff\ \x0f\xea\x42\x99\x5c\x01\x80\x84\x01\xc0\x74\x91\x38\x4b\x08\x80\ \x14\x00\x40\x7a\x8e\x42\xa6\x00\x40\x46\x01\x80\x9d\x98\x26\x53\ \x00\xa0\x04\x00\x60\xcb\x63\x62\xe3\x00\x50\x2d\x00\x60\x27\x7f\ \xe6\xd3\x00\x80\x9d\xf8\x99\x7b\x01\x00\x5b\x94\x21\x15\x01\xa0\ \x91\x00\x20\x13\x65\x88\x44\x00\x68\x3b\x00\xac\xcf\x56\x8a\x45\ \x00\x58\x30\x00\x14\x66\x4b\xc4\x39\x00\xd8\x2d\x00\x30\x49\x57\ \x66\x48\x00\xb0\xb7\x00\xc0\xce\x10\x0b\xb2\x00\x08\x0c\x00\x30\ \x51\x88\x85\x29\x00\x04\x7b\x00\x60\xc8\x23\x23\x78\x00\x84\x99\ \x00\x14\x46\xf2\x57\x3c\xf1\x2b\xae\x10\xe7\x2a\x00\x00\x78\x99\ \xb2\x3c\xb9\x24\x39\x45\x81\x5b\x08\x2d\x71\x07\x57\x57\x2e\x1e\ \x28\xce\x49\x17\x2b\x14\x36\x61\x02\x61\x9a\x40\x2e\xc2\x79\x99\ \x19\x32\x81\x34\x0f\xe0\xf3\xcc\x00\x00\xa0\x91\x15\x11\xe0\x83\ \xf3\xfd\x78\xce\x0e\xae\xce\xce\x36\x8e\xb6\x0e\x5f\x2d\xea\xbf\ \x06\xff\x22\x62\x62\xe3\xfe\xe5\xcf\xab\x70\x40\x00\x00\xe1\x74\ \x7e\xd1\xfe\x2c\x2f\xb3\x1a\x80\x3b\x06\x80\x6d\xfe\xa2\x25\xee\ \x04\x68\x5e\x0b\xa0\x75\xf7\x8b\x66\xb2\x0f\x40\xb5\x00\xa0\xe9\ \xda\x57\xf3\x70\xf8\x7e\x3c\x3c\x45\xa1\x90\xb9\xd9\xd9\xe5\xe4\ \xe4\xd8\x4a\xc4\x42\x5b\x61\xca\x57\x7d\xfe\x67\xc2\x5f\xc0\x57\ \xfd\x6c\xf9\x7e\x3c\xfc\xf7\xf5\xe0\xbe\xe2\x24\x81\x32\x5d\x81\ \x47\x04\xf8\xe0\xc2\xcc\xf4\x4c\xa5\x1c\xcf\x92\x09\x84\x62\xdc\ \xe6\x8f\x47\xfc\xb7\x0b\xff\xfc\x1d\xd3\x22\xc4\x49\x62\xb9\x58\ \x2a\x14\xe3\x51\x12\x71\x8e\x44\x9a\x8c\xf3\x32\xa5\x22\x89\x42\ \x92\x29\xc5\x25\xd2\xff\x64\xe2\xdf\x2c\xfb\x03\x3e\xdf\x35\x00\ \xb0\x6a\x3e\x01\x7b\x91\x2d\xa8\x5d\x63\x03\xf6\x4b\x27\x10\x58\ \x74\xc0\xe2\xf7\x00\x00\xf2\xbb\x6f\xc1\xd4\x28\x08\x03\x80\x68\ \x83\xe1\xcf\x77\xff\xef\x3f\xfd\x47\xa0\x25\x00\x80\x66\x49\x92\ \x71\x00\x00\x5e\x44\x24\x2e\x54\xca\xb3\x3f\xc7\x08\x00\x00\x44\ \xa0\x81\x2a\xb0\x41\x1b\xf4\xc1\x18\x2c\xc0\x06\x1c\xc1\x05\xdc\ \xc1\x0b\xfc\x60\x36\x84\x42\x24\xc4\xc2\x42\x10\x42\x0a\x64\x80\ \x1c\x72\x60\x29\xac\x82\x42\x28\x86\xcd\xb0\x1d\x2a\x60\x2f\xd4\ \x40\x1d\x34\xc0\x51\x68\x86\x93\x70\x0e\x2e\xc2\x55\xb8\x0e\x3d\ \x70\x0f\xfa\x61\x08\x9e\xc1\x28\xbc\x81\x09\x04\x41\xc8\x08\x13\ \x61\x21\xda\x88\x01\x62\x8a\x58\x23\x8e\x08\x17\x99\x85\xf8\x21\ \xc1\x48\x04\x12\x8b\x24\x20\xc9\x88\x14\x51\x22\x4b\x91\x35\x48\ \x31\x52\x8a\x54\x20\x55\x48\x1d\xf2\x3d\x72\x02\x39\x87\x5c\x46\ \xba\x91\x3b\xc8\x00\x32\x82\xfc\x86\xbc\x47\x31\x94\x81\xb2\x51\ \x3d\xd4\x0c\xb5\x43\xb9\xa8\x37\x1a\x84\x46\xa2\x0b\xd0\x64\x74\ \x31\x9a\x8f\x16\xa0\x9b\xd0\x72\xb4\x1a\x3d\x8c\x36\xa1\xe7\xd0\ \xab\x68\x0f\xda\x8f\x3e\x43\xc7\x30\xc0\xe8\x18\x07\x33\xc4\x6c\ \x30\x2e\xc6\xc3\x42\xb1\x38\x2c\x09\x93\x63\xcb\xb1\x22\xac\x0c\ \xab\xc6\x1a\xb0\x56\xac\x03\xbb\x89\xf5\x63\xcf\xb1\x77\x04\x12\ \x81\x45\xc0\x09\x36\x04\x77\x42\x20\x61\x1e\x41\x48\x58\x4c\x58\ \x4e\xd8\x48\xa8\x20\x1c\x24\x34\x11\xda\x09\x37\x09\x03\x84\x51\ \xc2\x27\x22\x93\xa8\x4b\xb4\x26\xba\x11\xf9\xc4\x18\x62\x32\x31\ \x87\x58\x48\x2c\x23\xd6\x12\x8f\x13\x2f\x10\x7b\x88\x43\xc4\x37\ \x24\x12\x89\x43\x32\x27\xb9\x90\x02\x49\xb1\xa4\x54\xd2\x12\xd2\ \x46\xd2\x6e\x52\x23\xe9\x2c\xa9\x9b\x34\x48\x1a\x23\x93\xc9\xda\ \x64\x6b\xb2\x07\x39\x94\x2c\x20\x2b\xc8\x85\xe4\x9d\xe4\xc3\xe4\ \x33\xe4\x1b\xe4\x21\xf2\x5b\x0a\x9d\x62\x40\x71\xa4\xf8\x53\xe2\ \x28\x52\xca\x6a\x4a\x19\xe5\x10\xe5\x34\xe5\x06\x65\x98\x32\x41\ \x55\xa3\x9a\x52\xdd\xa8\xa1\x54\x11\x35\x8f\x5a\x42\xad\xa1\xb6\ \x52\xaf\x51\x87\xa8\x13\x34\x75\x9a\x39\xcd\x83\x16\x49\x4b\xa5\ \xad\xa2\x95\xd3\x1a\x68\x17\x68\xf7\x69\xaf\xe8\x74\xba\x11\xdd\ \x95\x1e\x4e\x97\xd0\x57\xd2\xcb\xe9\x47\xe8\x97\xe8\x03\xf4\x77\ \x0c\x0d\x86\x15\x83\xc7\x88\x67\x28\x19\x9b\x18\x07\x18\x67\x19\ \x77\x18\xaf\x98\x4c\xa6\x19\xd3\x8b\x19\xc7\x54\x30\x37\x31\xeb\ \x98\xe7\x99\x0f\x99\x6f\x55\x58\x2a\xb6\x2a\x7c\x15\x91\xca\x0a\ \x95\x4a\x95\x26\x95\x1b\x2a\x2f\x54\xa9\xaa\xa6\xaa\xde\xaa\x0b\ \x55\xf3\x55\xcb\x54\x8f\xa9\x5e\x53\x7d\xae\x46\x55\x33\x53\xe3\ \xa9\x09\xd4\x96\xab\x55\xaa\x9d\x50\xeb\x53\x1b\x53\x67\xa9\x3b\ \xa8\x87\xaa\x67\xa8\x6f\x54\x3f\xa4\x7e\x59\xfd\x89\x06\x59\xc3\ \x4c\xc3\x4f\x43\xa4\x51\xa0\xb1\x5f\xe3\xbc\xc6\x20\x0b\x63\x19\ \xb3\x78\x2c\x21\x6b\x0d\xab\x86\x75\x81\x35\xc4\x26\xb1\xcd\xd9\ \x7c\x76\x2a\xbb\x98\xfd\x1d\xbb\x8b\x3d\xaa\xa9\xa1\x39\x43\x33\ \x4a\x33\x57\xb3\x52\xf3\x94\x66\x3f\x07\xe3\x98\x71\xf8\x9c\x74\ \x4e\x09\xe7\x28\xa7\x97\xf3\x7e\x8a\xde\x14\xef\x29\xe2\x29\x1b\ \xa6\x34\x4c\xb9\x31\x65\x5c\x6b\xaa\x96\x97\x96\x58\xab\x48\xab\ \x51\xab\x47\xeb\xbd\x36\xae\xed\xa7\x9d\xa6\xbd\x45\xbb\x59\xfb\ \x81\x0e\x41\xc7\x4a\x27\x5c\x27\x47\x67\x8f\xce\x05\x9d\xe7\x53\ \xd9\x53\xdd\xa7\x0a\xa7\x16\x4d\x3d\x3a\xf5\xae\x2e\xaa\x6b\xa5\ \x1b\xa1\xbb\x44\x77\xbf\x6e\xa7\xee\x98\x9e\xbe\x5e\x80\x9e\x4c\ \x6f\xa7\xde\x79\xbd\xe7\xfa\x1c\x7d\x2f\xfd\x54\xfd\x6d\xfa\xa7\ \xf5\x47\x0c\x58\x06\xb3\x0c\x24\x06\xdb\x0c\xce\x18\x3c\xc5\x35\ \x71\x6f\x3c\x1d\x2f\xc7\xdb\xf1\x51\x43\x5d\xc3\x40\x43\xa5\x61\ \x95\x61\x97\xe1\x84\x91\xb9\xd1\x3c\xa3\xd5\x46\x8d\x46\x0f\x8c\ \x69\xc6\x5c\xe3\x24\xe3\x6d\xc6\x6d\xc6\xa3\x26\x06\x26\x21\x26\ \x4b\x4d\xea\x4d\xee\x9a\x52\x4d\xb9\xa6\x29\xa6\x3b\x4c\x3b\x4c\ \xc7\xcd\xcc\xcd\xa2\xcd\xd6\x99\x35\x9b\x3d\x31\xd7\x32\xe7\x9b\ \xe7\x9b\xd7\x9b\xdf\xb7\x60\x5a\x78\x5a\x2c\xb6\xa8\xb6\xb8\x65\ \x49\xb2\xe4\x5a\xa6\x59\xee\xb6\xbc\x6e\x85\x5a\x39\x59\xa5\x58\ \x55\x5a\x5d\xb3\x46\xad\x9d\xad\x25\xd6\xbb\xad\xbb\xa7\x11\xa7\ \xb9\x4e\x93\x4e\xab\x9e\xd6\x67\xc3\xb0\xf1\xb6\xc9\xb6\xa9\xb7\ \x19\xb0\xe5\xd8\x06\xdb\xae\xb6\x6d\xb6\x7d\x61\x67\x62\x17\x67\ \xb7\xc5\xae\xc3\xee\x93\xbd\x93\x7d\xba\x7d\x8d\xfd\x3d\x07\x0d\ \x87\xd9\x0e\xab\x1d\x5a\x1d\x7e\x73\xb4\x72\x14\x3a\x56\x3a\xde\ \x9a\xce\x9c\xee\x3f\x7d\xc5\xf4\x96\xe9\x2f\x67\x58\xcf\x10\xcf\ \xd8\x33\xe3\xb6\x13\xcb\x29\xc4\x69\x9d\x53\x9b\xd3\x47\x67\x17\ \x67\xb9\x73\x83\xf3\x88\x8b\x89\x4b\x82\xcb\x2e\x97\x3e\x2e\x9b\ \x1b\xc6\xdd\xc8\xbd\xe4\x4a\x74\xf5\x71\x5d\xe1\x7a\xd2\xf5\x9d\ \x9b\xb3\x9b\xc2\xed\xa8\xdb\xaf\xee\x36\xee\x69\xee\x87\xdc\x9f\ \xcc\x34\x9f\x29\x9e\x59\x33\x73\xd0\xc3\xc8\x43\xe0\x51\xe5\xd1\ \x3f\x0b\x9f\x95\x30\x6b\xdf\xac\x7e\x4f\x43\x4f\x81\x67\xb5\xe7\ \x23\x2f\x63\x2f\x91\x57\xad\xd7\xb0\xb7\xa5\x77\xaa\xf7\x61\xef\ \x17\x3e\xf6\x3e\x72\x9f\xe3\x3e\xe3\x3c\x37\xde\x32\xde\x59\x5f\ \xcc\x37\xc0\xb7\xc8\xb7\xcb\x4f\xc3\x6f\x9e\x5f\x85\xdf\x43\x7f\ \x23\xff\x64\xff\x7a\xff\xd1\x00\xa7\x80\x25\x01\x67\x03\x89\x81\ \x41\x81\x5b\x02\xfb\xf8\x7a\x7c\x21\xbf\x8e\x3f\x3a\xdb\x65\xf6\ \xb2\xd9\xed\x41\x8c\xa0\xb9\x41\x15\x41\x8f\x82\xad\x82\xe5\xc1\ \xad\x21\x68\xc8\xec\x90\xad\x21\xf7\xe7\x98\xce\x91\xce\x69\x0e\ \x85\x50\x7e\xe8\xd6\xd0\x07\x61\xe6\x61\x8b\xc3\x7e\x0c\x27\x85\ \x87\x85\x57\x86\x3f\x8e\x70\x88\x58\x1a\xd1\x31\x97\x35\x77\xd1\ \xdc\x43\x73\xdf\x44\xfa\x44\x96\x44\xde\x9b\x67\x31\x4f\x39\xaf\ \x2d\x4a\x35\x2a\x3e\xaa\x2e\x6a\x3c\xda\x37\xba\x34\xba\x3f\xc6\ \x2e\x66\x59\xcc\xd5\x58\x9d\x58\x49\x6c\x4b\x1c\x39\x2e\x2a\xae\ \x36\x6e\x6c\xbe\xdf\xfc\xed\xf3\x87\xe2\x9d\xe2\x0b\xe3\x7b\x17\ \x98\x2f\xc8\x5d\x70\x79\xa1\xce\xc2\xf4\x85\xa7\x16\xa9\x2e\x12\ \x2c\x3a\x96\x40\x4c\x88\x4e\x38\x94\xf0\x41\x10\x2a\xa8\x16\x8c\ \x25\xf2\x13\x77\x25\x8e\x0a\x79\xc2\x1d\xc2\x67\x22\x2f\xd1\x36\ \xd1\x88\xd8\x43\x5c\x2a\x1e\x4e\xf2\x48\x2a\x4d\x7a\x92\xec\x91\ \xbc\x35\x79\x24\xc5\x33\xa5\x2c\xe5\xb9\x84\x27\xa9\x90\xbc\x4c\ \x0d\x4c\xdd\x9b\x3a\x9e\x16\x9a\x76\x20\x6d\x32\x3d\x3a\xbd\x31\ \x83\x92\x91\x90\x71\x42\xaa\x21\x4d\x93\xb6\x67\xea\x67\xe6\x66\ \x76\xcb\xac\x65\x85\xb2\xfe\xc5\x6e\x8b\xb7\x2f\x1e\x95\x07\xc9\ \x6b\xb3\x90\xac\x05\x59\x2d\x0a\xb6\x42\xa6\xe8\x54\x5a\x28\xd7\ \x2a\x07\xb2\x67\x65\x57\x66\xbf\xcd\x89\xca\x39\x96\xab\x9e\x2b\ \xcd\xed\xcc\xb3\xca\xdb\x90\x37\x9c\xef\x9f\xff\xed\x12\xc2\x12\ \xe1\x92\xb6\xa5\x86\x4b\x57\x2d\x1d\x58\xe6\xbd\xac\x6a\x39\xb2\ \x3c\x71\x79\xdb\x0a\xe3\x15\x05\x2b\x86\x56\x06\xac\x3c\xb8\x8a\ \xb6\x2a\x6d\xd5\x4f\xab\xed\x57\x97\xae\x7e\xbd\x26\x7a\x4d\x6b\ \x81\x5e\xc1\xca\x82\xc1\xb5\x01\x6b\xeb\x0b\x55\x0a\xe5\x85\x7d\ \xeb\xdc\xd7\xed\x5d\x4f\x58\x2f\x59\xdf\xb5\x61\xfa\x86\x9d\x1b\ \x3e\x15\x89\x8a\xae\x14\xdb\x17\x97\x15\x7f\xd8\x28\xdc\x78\xe5\ \x1b\x87\x6f\xca\xbf\x99\xdc\x94\xb4\xa9\xab\xc4\xb9\x64\xcf\x66\ \xd2\x66\xe9\xe6\xde\x2d\x9e\x5b\x0e\x96\xaa\x97\xe6\x97\x0e\x6e\ \x0d\xd9\xda\xb4\x0d\xdf\x56\xb4\xed\xf5\xf6\x45\xdb\x2f\x97\xcd\ \x28\xdb\xbb\x83\xb6\x43\xb9\xa3\xbf\x3c\xb8\xbc\x65\xa7\xc9\xce\ \xcd\x3b\x3f\x54\xa4\x54\xf4\x54\xfa\x54\x36\xee\xd2\xdd\xb5\x61\ \xd7\xf8\x6e\xd1\xee\x1b\x7b\xbc\xf6\x34\xec\xd5\xdb\x5b\xbc\xf7\ \xfd\x3e\xc9\xbe\xdb\x55\x01\x55\x4d\xd5\x66\xd5\x65\xfb\x49\xfb\ \xb3\xf7\x3f\xae\x89\xaa\xe9\xf8\x96\xfb\x6d\x5d\xad\x4e\x6d\x71\ \xed\xc7\x03\xd2\x03\xfd\x07\x23\x0e\xb6\xd7\xb9\xd4\xd5\x1d\xd2\ \x3d\x54\x52\x8f\xd6\x2b\xeb\x47\x0e\xc7\x1f\xbe\xfe\x9d\xef\x77\ \x2d\x0d\x36\x0d\x55\x8d\x9c\xc6\xe2\x23\x70\x44\x79\xe4\xe9\xf7\ \x09\xdf\xf7\x1e\x0d\x3a\xda\x76\x8c\x7b\xac\xe1\x07\xd3\x1f\x76\ \x1d\x67\x1d\x2f\x6a\x42\x9a\xf2\x9a\x46\x9b\x53\x9a\xfb\x5b\x62\ \x5b\xba\x4f\xcc\x3e\xd1\xd6\xea\xde\x7a\xfc\x47\xdb\x1f\x0f\x9c\ \x34\x3c\x59\x79\x4a\xf3\x54\xc9\x69\xda\xe9\x82\xd3\x93\x67\xf2\ \xcf\x8c\x9d\x95\x9d\x7d\x7e\x2e\xf9\xdc\x60\xdb\xa2\xb6\x7b\xe7\ \x63\xce\xdf\x6a\x0f\x6f\xef\xba\x10\x74\xe1\xd2\x45\xff\x8b\xe7\ \x3b\xbc\x3b\xce\x5c\xf2\xb8\x74\xf2\xb2\xdb\xe5\x13\x57\xb8\x57\ \x9a\xaf\x3a\x5f\x6d\xea\x74\xea\x3c\xfe\x93\xd3\x4f\xc7\xbb\x9c\ \xbb\x9a\xae\xb9\x5c\x6b\xb9\xee\x7a\xbd\xb5\x7b\x66\xf7\xe9\x1b\ \x9e\x37\xce\xdd\xf4\xbd\x79\xf1\x16\xff\xd6\xd5\x9e\x39\x3d\xdd\ \xbd\xf3\x7a\x6f\xf7\xc5\xf7\xf5\xdf\x16\xdd\x7e\x72\x27\xfd\xce\ \xcb\xbb\xd9\x77\x27\xee\xad\xbc\x4f\xbc\x5f\xf4\x40\xed\x41\xd9\ \x43\xdd\x87\xd5\x3f\x5b\xfe\xdc\xd8\xef\xdc\x7f\x6a\xc0\x77\xa0\ \xf3\xd1\xdc\x47\xf7\x06\x85\x83\xcf\xfe\x91\xf5\x8f\x0f\x43\x05\ \x8f\x99\x8f\xcb\x86\x0d\x86\xeb\x9e\x38\x3e\x39\x39\xe2\x3f\x72\ \xfd\xe9\xfc\xa7\x43\xcf\x64\xcf\x26\x9e\x17\xfe\xa2\xfe\xcb\xae\ \x17\x16\x2f\x7e\xf8\xd5\xeb\xd7\xce\xd1\x98\xd1\xa1\x97\xf2\x97\ \x93\xbf\x6d\x7c\xa5\xfd\xea\xc0\xeb\x19\xaf\xdb\xc6\xc2\xc6\x1e\ \xbe\xc9\x78\x33\x31\x5e\xf4\x56\xfb\xed\xc1\x77\xdc\x77\x1d\xef\ \xa3\xdf\x0f\x4f\xe4\x7c\x20\x7f\x28\xff\x68\xf9\xb1\xf5\x53\xd0\ \xa7\xfb\x93\x19\x93\x93\xff\x04\x03\x98\xf3\xfc\x63\x33\x2d\xdb\ \x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\ \x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\ \x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x08\xc4\ \x49\x44\x41\x54\x78\xda\xe4\x97\x6b\x8c\x55\xd5\x15\xc7\x7f\x7b\ \xef\x73\xdf\x97\xb9\x33\xc3\x30\x0c\xf3\x02\x54\x98\xc1\x00\x03\ \x15\x64\x1c\x05\x71\x4a\x94\xd0\x54\x4d\x4c\x4c\x3f\x58\x3f\xd4\ \xa2\x69\x4c\x1b\x13\x63\xda\x8a\xda\x68\x4c\xdb\xd8\xa4\xb1\xf1\ \x51\xad\x6d\x6d\x7d\xb5\xf1\x1d\x11\xa8\xa0\x20\x02\xe1\x25\x75\ \x60\x54\x5e\x83\x65\x98\xb9\xcc\x9d\xf7\xdc\x79\xdc\xd7\x39\x67\ \xaf\x7e\x98\x01\x64\x06\x93\x7e\xf3\x43\xd7\xce\x49\xce\x39\xc9\ \xde\xeb\xbf\xf6\xfa\xef\xff\xda\x4b\x89\x08\xdf\xa6\x69\xbe\x65\ \x73\xce\xbd\x3c\xaa\xde\x98\x84\x4c\xd1\xc9\x08\x77\xe0\x12\x07\ \xec\xf8\xef\xc5\xc0\x35\x40\x87\x86\x8f\x5b\xee\x2f\x64\xd2\x0b\ \x7c\xe7\xcb\xd4\x97\xe5\xfb\xfb\xf7\x96\xa4\x06\xbb\xb3\x4d\xd2\ \x94\x52\xa8\x8c\x52\x8a\x11\x3d\xcc\xfe\xe1\xfd\xac\xf6\x9b\xf1\ \x5d\x0f\xd4\x85\xf5\xdf\x7f\xef\xfd\x8b\x01\x5c\xca\x14\xd0\x0d\ \xc4\xc6\x3f\x17\x00\x8f\x01\x51\x20\x68\x21\xd1\xf0\x74\xe8\x9f\ \x4f\x7f\xbe\x7b\xce\x8b\xa3\x2f\xdd\xae\x84\x5a\x81\xf6\x63\xd1\ \xa3\x9b\xd6\x96\xaf\x3d\x1a\x8f\xc5\xdd\xae\xcf\x52\xec\xfd\xed\ \xbe\x8b\x1c\x7f\x63\x0a\xf4\x25\x86\x83\x62\x23\x8a\x00\x10\x82\ \x3a\x81\x19\x40\x0e\xc8\x29\x58\x99\x17\xb7\xe8\xd5\x9e\xd7\x56\ \xe0\xb3\x50\x7c\xaa\xb0\x6a\xe9\xb1\xe1\xe3\xdf\x19\xea\x1e\x8a\ \x86\x77\x46\xc9\x3c\x3f\xa6\x4c\x4e\x1b\x67\xcc\xd1\xfe\xb0\x8f\ \x97\xf6\xce\x3f\x53\x52\x30\xc4\xe8\xd7\x23\x8f\x68\x74\x93\xc5\ \xaf\x8f\xc0\x89\x3d\xd8\x8f\x12\x70\xf6\x4a\xf4\xb0\x07\x09\xc0\ \x08\x7c\x5e\xca\xb4\xac\x52\x5a\xa3\x30\xe3\xc1\x88\x03\x50\xa9\ \x2b\xd9\x9f\x3a\xd0\xd0\x76\xdd\x89\x79\x99\x74\x26\xd3\x6d\xba\ \x8e\xd4\x47\xeb\xbb\xc4\xe0\x4f\x26\xfd\x79\x00\x1e\xfe\x84\x73\ \x45\x01\x6f\x55\x01\xef\x7e\x83\x8e\x2a\xe8\xff\x04\x0a\xb5\xb0\ \xbb\x01\x7e\xef\x41\x23\x90\x0c\xe0\x6c\x7c\xe0\xa7\xcf\x14\xf2\ \x4e\xe1\x20\x1e\x73\x50\xcc\xc7\xe7\xc4\xcd\x33\x6f\xfa\xf4\x08\ \x87\x2b\xb7\x2c\xd9\x7a\x9b\xaf\xbc\x3a\x34\xa3\x07\xcc\x81\xe2\ \xf2\xe9\xe5\x9b\x17\xc7\x1a\x86\x74\x48\xa3\x94\x9a\x0a\xc0\x9e\ \x4f\x94\xd2\x0a\xd5\xe0\xa0\x22\xc0\x20\x10\x0c\xa3\x57\x85\x60\ \xa7\x86\x0f\x81\x3d\x80\x6b\xf1\xdd\xab\xef\x5e\xc7\x8a\xd2\x9b\ \x4f\x0e\x8c\xf5\xff\xb5\x80\x5b\xe2\x98\x60\xff\xda\xe2\xab\x86\ \x7e\x71\xe6\xb1\x66\x3f\xe7\xd5\xa0\x88\xa1\x08\xbb\x9e\x77\x45\ \xda\x0c\x17\x55\x97\xcd\x1a\xfa\xe3\x9d\x7f\x62\xb0\x63\x90\x87\ \x77\x3c\x7c\x31\x80\x04\x49\x00\x0c\x62\xc7\x88\xb7\x8d\x52\x94\ \x55\xf8\x8e\x20\x85\x00\x72\xf8\x2c\xf0\x21\xc8\x6a\x54\x26\x3f\ \x31\xa7\x91\x65\xe4\xe3\xf8\xed\xd9\xf6\xa4\x8d\x91\xac\x0a\xc6\ \x29\x0f\xc6\x4c\x01\x6f\x00\x61\x18\x45\x02\xc1\xa5\x84\xbe\x53\ \x9b\x4f\xe6\x9e\x78\xfb\xef\x45\x5f\x7d\x76\x3c\x63\x33\x39\x7b\ \xee\x60\x9d\x07\xf0\x1e\x2e\x10\xa4\x9a\x0a\xaa\x90\x2d\x19\x86\ \x98\x46\xbc\xc9\x10\xda\x6f\x18\xf9\x40\x80\x16\x84\x04\x61\x56\ \x11\xe1\x2b\x7a\x49\x76\x9d\x25\x75\xa6\x9f\xbf\x3c\xf2\x22\xf7\ \xbd\xf2\x13\x4a\x4a\x22\x04\x62\x45\x76\xba\x99\xd1\x92\x88\xf5\ \x4d\x0b\x68\x67\x85\xe7\xb8\xbd\xcb\xf4\x92\xad\xe6\x90\xf5\x3e\ \xd8\xd5\x6a\x09\x15\x7b\x18\x7b\x81\x6f\xe7\x48\xb1\x50\x3d\x66\ \x02\x44\xae\x0c\x50\x5c\x29\x44\xda\x8f\xf2\xc4\xb1\x85\x54\x51\ \x41\x3d\x73\x99\x8b\x42\xe1\xa2\xa9\xd5\x23\x2c\x50\x2e\x0f\x4e\ \x7b\x85\x63\x5e\x3b\x61\x09\xe2\x04\x1c\x35\x34\x34\x24\x6b\xee\ \x58\xc3\xbd\xcf\xdd\x4b\x49\xac\x44\x1d\xdc\x7b\xd0\x29\xa8\x82\ \x8e\xc5\x42\xf6\xc0\xbb\xed\x6c\x7a\x76\x77\x71\xa1\xf2\x67\xc3\ \x19\xe7\xba\x3c\xb8\xc8\xfe\xfa\x8b\x53\x10\xa4\xb8\xc9\x10\xd9\ \x60\xb1\x45\x0e\x92\x2c\x63\xf1\xe3\x47\xf8\xf4\xf0\x17\x24\x59\ \xc7\x7a\x34\x86\x30\x45\xbc\x14\xd9\xcc\xe7\xb1\xcd\x24\xbc\x62\ \x8a\x82\x31\xce\x71\xba\x64\x7a\x09\x3b\x5f\xd9\x49\xd9\x8c\x32\ \x96\xad\x5b\x26\x6f\x3e\xf4\xa6\x1b\xb0\x90\xea\x2d\x98\x93\xd9\ \x1f\x37\x31\xf7\xe7\xdf\xc3\xeb\x1d\x46\x06\xfe\x01\x6a\x14\xe8\ \xbd\x08\x80\x26\xd4\x2c\x58\x01\xfa\x3c\x46\xab\x66\xb2\xb6\x69\ \x16\xb7\x1c\x01\x91\xa3\xa4\x27\x4e\x88\x8f\x9f\x5f\xce\xcc\xc0\ \x09\x0a\xa6\x1b\x91\xf3\x32\x22\x6e\xc1\x65\xde\xc2\x79\x74\xee\ \xed\xe4\xf8\x07\xc7\x89\x16\x87\xe2\xad\x47\x8f\xe4\x87\xca\x7f\ \xb3\x94\x39\x37\xdd\x87\x7b\xb6\x04\xa5\x42\x58\x04\xa4\x0b\xf8\ \xdb\x45\x00\x14\xba\x53\xb0\xe1\x71\x19\xd0\x9e\x30\xdc\x6f\x19\ \xcf\x4f\x04\x85\x21\x0a\x58\x82\xde\xd5\xe4\xdc\x4f\xc9\x99\x0e\ \x0c\x81\x71\xef\x22\x84\x42\x21\xf2\xb9\x3c\x69\x9d\xc6\x6a\x1b\ \xc8\xa7\x5d\x3f\x5d\xfa\x90\x4b\xc9\xda\x99\x78\x03\x95\xa0\x7a\ \x11\xf2\xa0\xab\xc7\x75\x6d\xd2\x31\x54\xd8\x77\x15\x12\x06\x59\ \x2a\xe8\x83\x16\xb3\x55\x21\x28\x34\xbe\xce\xd0\x11\x7b\x06\x85\ \x83\xc2\x90\x37\x3d\x28\x1b\x46\xb8\x20\x2a\x22\xc2\xd0\xd0\x10\ \x03\x03\x03\x1a\xb0\xe8\x40\x56\x56\x2e\x81\xdc\xa9\x56\x52\x33\ \x8f\xa3\x6d\x2d\x60\xf1\xdd\x2d\x88\x74\x4d\x01\x70\x78\xd1\xe2\ \x7e\x50\xcf\x79\x46\xc7\x2a\xcf\x26\xb3\xb3\x7a\x52\xae\xa7\x1d\ \x04\x9f\xe4\xb4\xa7\x28\x98\xd4\x44\x75\x10\x94\x04\x50\x93\x0a\ \xa9\xb5\x96\x09\x42\xcb\xb8\xac\xb8\x28\xd3\x0b\x66\xda\x69\x7c\ \xf7\x61\x60\x01\x4a\xf7\xa0\xcc\x97\x28\xbc\x29\x00\x0a\xc1\xa0\ \x41\xe9\x3a\xc4\x56\x25\x67\xd5\xfc\x27\xb9\x34\xd0\x46\xf1\x08\ \x78\x01\x12\x1f\xa7\x51\x7e\x50\x4d\x2c\x7e\x91\x92\x4d\xc4\x8f\ \x55\xee\xb9\xa2\x23\x20\x04\xbd\x0a\x1a\xde\x1e\x43\x91\x43\x49\ \xef\x59\x90\x34\xa8\x2c\xe0\x8e\xcf\x59\x3e\xa9\x1a\x7a\x6e\x23\ \x8e\xf3\x20\xa8\x88\x28\xa7\x0f\x1b\xfa\x35\x7e\xa4\xc5\x19\x69\ \x41\xa3\x34\x5a\x03\x88\xd6\x1a\x11\xc1\x5a\x7b\x5e\x43\x8d\xc4\ \x88\xb9\x35\x58\x95\x01\x14\x82\xc7\xac\xb1\xf5\x18\xab\x11\xfc\ \x88\xa0\x6f\x03\x59\x0d\x72\x12\xf4\xcb\xc0\x18\x8c\x33\xfb\x02\ \x00\x27\xf0\xfd\x89\x3d\x1e\xc5\x78\xb5\xa4\x2f\x5b\xc6\xa9\x6d\ \x2d\xf3\xcc\x0b\x21\x67\x56\xb9\x08\xba\x60\x8c\x21\x97\xcb\xd1\ \xd7\xd7\xc7\xb9\x9d\x10\x25\x18\x2f\x42\x45\xe6\x56\x82\xb6\x06\ \x99\x08\xd0\x27\x03\xb8\x28\x54\xa3\x8f\xba\x0b\xc8\x03\x75\x0a\ \x7c\xa0\x0b\x78\x75\xd2\x8d\xc8\xb6\xa3\x88\x83\xc4\x71\x4a\xfb\ \x18\xd9\xdf\x11\xef\xd9\x60\x22\xc6\x04\x42\x2a\xea\x86\x08\xe1\ \x88\x43\x36\x9b\xc5\xf3\xbc\xf3\x69\x50\x12\x20\x17\x38\x43\x32\ \xb6\x91\x0c\x01\x46\x71\x19\xa5\x80\xa2\x14\x4d\x39\x8a\xe2\x52\ \x90\x10\x50\x00\x32\x82\xad\x14\x6c\xf5\x14\x0e\xa0\x79\x07\xd1\ \x41\x02\x33\x6b\xe8\xdc\xb9\xad\xd6\xfe\x61\xc7\xec\xba\xcb\xfd\ \x25\x77\x37\x8e\x96\x97\x95\x13\x8e\x86\xd9\xbb\x69\x2f\x87\x9e\ \x3e\x44\x59\x59\x99\xb2\xd6\xca\x78\x02\x2c\x69\x5c\xa6\x0b\x2c\ \xa1\x40\x0e\x17\x83\xc3\xbf\x78\x92\x51\xfa\x89\x33\xe7\xd0\x3c\ \x7e\x78\xd2\x25\x3b\x4f\xa1\xf3\x3e\xb9\x1d\x82\xa4\xa6\x02\x50\ \x89\x54\xd0\x9e\x78\x36\x76\xe6\x9e\xe2\x6b\x6f\x6b\x18\xb9\xe9\ \xee\x1f\xd8\xd1\xd1\x7c\xb8\xa2\xae\xc2\xaf\x49\xd4\x78\xbe\xf6\ \xa5\xee\xfa\x3a\xc6\xd2\x19\xb6\xbd\xbc\x95\x68\x34\x8a\x8f\xa5\ \x4c\x12\xbc\xe0\x3e\x42\x52\x02\xb4\x91\xa6\x04\x8b\xc2\x72\x1d\ \x8d\xf8\x14\xc8\x13\x3f\x9d\x22\xfb\xab\x10\xba\xde\x67\xa4\xa7\ \xc0\xe8\x17\xa0\xdc\x29\xb5\x40\x85\x2b\x41\xbc\x70\x63\x73\x55\ \xbc\xe2\xc9\xaa\xd0\x0e\xb3\xeb\xc6\x80\x1b\x9c\xed\xe6\xbc\x96\ \xaa\x50\xc5\xf6\x3f\xcf\xf9\xdd\xa8\x13\xd2\xf6\x58\x4f\x92\xe3\ \x67\x3a\xa8\x89\x55\xe2\x04\x83\x04\x3b\x84\x6b\xd7\x38\xb4\x52\ \x60\x23\x59\x22\x28\x14\x18\x9f\xd8\x8d\x0a\xd3\xec\x21\x47\x5c\ \xf2\xef\xf5\xe1\xa4\x4f\xd3\x87\x30\x86\x42\x71\x58\x1e\x9d\x2c\ \x44\x7d\x7a\xf6\x8a\x25\x81\xbe\xab\x07\x64\x9f\xd9\x74\x03\x83\ \xdc\x88\x22\x84\x30\x2b\x68\xf4\xa8\x35\x99\x5d\x5d\x99\x7c\x7e\ \xd0\x29\x50\x73\x59\x35\x55\x91\x4a\x24\x00\xca\xba\x0c\xd1\xc3\ \xe5\x28\xae\x23\xcc\x27\x08\x0e\x5c\xab\x71\x7f\x04\x6e\x5c\x50\ \x8b\x8b\xc8\x47\xab\xe9\x79\x7e\x11\x0a\x08\x5e\xfa\x46\x54\x3c\ \x33\x66\x37\x7c\x72\xd7\xc8\xb6\x8e\x0f\xcb\xdb\x92\xa7\xca\x09\ \x10\x41\x70\x50\xc4\x1c\x31\xd3\xc7\x5c\x37\xb8\x73\xb8\x35\xe1\ \xfa\xb9\x72\x63\xcd\x48\x8f\xdb\x9d\x5c\x98\xb8\xd2\x0b\x47\x15\ \x80\xc9\x43\x68\x05\xe4\x2c\xca\xee\x83\x45\x82\xc4\x15\xf8\x0a\ \x09\xe7\x89\x5c\x36\x40\x51\x10\xa4\xf0\x8d\xd7\xf2\xcc\x60\x96\ \x1d\xaf\xef\x52\x81\xeb\x43\x63\xd1\xb2\xc8\xa9\x4c\x21\x5b\x87\ \xa5\x04\x21\x35\x3f\xba\xa0\xed\xa5\x81\x77\x2a\x5e\xed\x7a\xeb\ \x56\x34\x8b\x11\x3a\x11\x5e\x7f\x23\xfe\x6c\x6b\xf9\x5b\xa5\x51\ \x41\xad\x03\xe6\x8f\x41\xcb\x2a\xd8\xdc\x86\xdd\x93\x42\xad\x0c\ \x42\xb5\x87\xe4\x03\xc8\x11\x83\x14\xbe\x2e\xdd\x53\x00\xe4\x47\ \xf2\xe6\xcd\xf5\x6f\x04\x56\xae\x5f\x99\x5d\x55\xb7\x6a\xdf\xf6\ \x91\xed\x99\x9a\xc4\xec\xd2\x5a\x35\xfb\xf4\x9a\x6b\x6e\x68\xdb\ \x30\xf8\x50\x33\x86\xe5\x28\x62\x40\x1c\xa1\x29\x97\x1b\xe9\x74\ \x7e\xe9\x7c\xd7\x83\x7b\x00\xad\x60\xf5\x18\xb8\x0d\xb0\xa5\x0b\ \xf5\x94\xa0\x1b\x4a\x08\xb5\x0b\xb2\xfb\x52\xce\x27\xf7\x05\xaa\ \x30\x5c\xd0\x27\x5e\x3b\x61\x6f\x58\xde\xdc\x5b\x94\x4f\x6c\xaf\ \x2b\x9d\x27\x8d\xb7\x37\xd9\x6e\xdd\x1d\x1b\xaf\x4b\xca\x43\xc4\ \x02\x1e\x16\x0b\x62\x44\xe9\x25\xe0\xe7\x26\x24\xb6\xcc\x85\xea\ \x45\x68\x14\x6a\xcf\x0e\xf4\x9e\x04\x31\xbe\xc9\xf9\xe4\xd6\xcc\ \x07\xbc\xce\xae\x4e\x8e\xa5\x8e\x59\x13\x35\x7e\xf4\xce\x98\x75\ \xd7\xe5\x09\x54\x04\xf3\xcb\x4a\xae\x6a\x45\xcb\x41\x65\x54\x12\ \xcd\xd1\x5b\xca\x6f\xd9\x53\x15\xa9\xed\x13\xb1\x1f\x03\x06\x08\ \x03\x43\x0a\x8e\x66\x81\xf9\x08\x7a\x42\x27\x2e\x35\x2e\xb5\x03\ \x02\xb8\x82\xf0\xd9\x81\x7f\xe3\x5e\xe3\xd2\xfb\x4e\x0f\xbc\x0e\ \xbe\xf8\x5e\xb5\xd4\x76\xf4\xa9\xfe\xb7\x75\x91\x9a\xb6\xba\xac\ \x39\x5d\x3f\xa3\xbe\x7b\x78\x6e\xd8\xcb\x3d\xee\x7c\x34\xf3\x81\ \x81\x82\xa0\xae\x00\x5a\x81\xbd\x4c\xc8\xde\xff\x62\xea\xff\xbe\ \x3b\xfe\xef\x00\x19\x9d\x13\xb2\x2e\x11\x15\x06\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x8f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x03\x00\x00\x00\x44\xa4\x8a\xc6\ \x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\ \x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\ \x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\ \x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x0a\x50\x4c\x54\ \x45\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x02\x45\x8d\x03\x46\x8f\x04\x48\x90\x05\x49\x92\x01\x34\x6b\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x24\x69\xba\x10\x51\x99\x06\x41\ \x81\x0a\x4d\x95\x09\x4b\x93\x08\x4a\x91\x09\x4b\x93\x06\x49\x8f\ \x1e\x5c\xa0\x1f\x5c\xa0\x1f\x5d\xa1\x20\x5e\xa3\x20\x5f\xa4\x20\ \x5f\xa6\x20\x61\xa9\x21\x5f\xa3\x21\x5f\xa4\x21\x5f\xa5\x21\x60\ \xa4\x21\x60\xa6\x21\x60\xa8\x21\x61\xab\x22\x61\xa8\x22\x61\xa9\ \x22\x62\xab\x22\x63\xad\x22\x63\xae\x23\x65\xae\x23\x65\xb0\x23\ \x65\xb2\x23\x66\xb3\x24\x64\xb0\x24\x66\xb1\x24\x67\xb4\x24\x67\ \xb5\x24\x68\xb8\x25\x68\xb7\x25\x69\xb9\x26\x69\xb9\x26\x6a\xbb\ \x26\x6b\xbb\x27\x5f\x9d\x27\x60\x9f\x27\x6b\xbd\x27\x6c\xbd\x2c\ \x64\x9f\x31\x69\xa8\x31\x6a\xa9\x33\x6c\xaa\x3d\x73\xae\x53\x80\ \xaf\x59\x94\xd3\x5a\x94\xd3\x5c\x89\xbb\x61\x92\xcd\x62\x99\xd3\ \x62\x99\xd6\x6a\x9f\xda\x72\xa3\xd8\x74\xa5\xde\x7b\xa9\xda\x7c\ \xab\xe1\x7e\xa5\xd2\x7f\xa6\xd3\x82\xad\xdb\x83\xa8\xd3\x84\xa9\ \xd5\x85\xaa\xd4\x85\xb0\xe5\x86\xab\xd6\x88\xab\xd6\x88\xac\xd6\ \x88\xb1\xdc\x8d\xaf\xd7\x8d\xb6\xe9\x91\x93\x98\x91\x94\x99\x91\ \xb7\xde\x92\x95\x9a\x93\x96\x9a\x93\x96\x9b\x94\x97\x9c\x95\xbd\ \xee\x96\xbc\xec\x9a\xbc\xe0\x9d\xc1\xf2\x9e\xc2\xf0\x9e\xc2\xf2\ \x9f\xc3\xf0\xa4\xc3\xe4\xa5\xc7\xf5\xa6\xc8\xf5\xab\xab\xab\xac\ \xac\xac\xad\xad\xad\xad\xbb\xca\xae\xae\xae\xaf\xaf\xaf\xaf\xca\ \xe6\xaf\xce\xf9\xb0\xb0\xb0\xb1\xb1\xb1\xb3\xbf\xce\xbb\xc5\xd2\ \xbc\xc4\xcd\xbd\xc5\xce\xbe\xc6\xcf\xbf\xc7\xd0\xc0\xc8\xd1\xc1\ \xc9\xd2\xc4\xca\xd3\xc5\xcb\xd4\xc6\xcc\xd5\xc7\xcd\xd6\xc8\xce\ \xd7\xc9\xcf\xd8\xca\xd0\xd7\xca\xd0\xd9\xcb\xd1\xd8\xcc\xd2\xd9\ \xcd\xd1\xd8\xce\xd2\xd9\xcf\xd3\xda\xd0\xd4\xdb\xd1\xd5\xdc\xd2\ \xd6\xdd\xd5\xd9\xdd\xd6\xda\xde\xd7\xdb\xdf\xd8\xdc\xe0\xd9\xdd\ \xe1\xda\xde\xe2\xda\xe0\xe7\xdb\xdf\xe3\xdd\xe0\xe3\xde\xe1\xe4\ \xdf\xe2\xe5\xe0\xe3\xe6\xe0\xe6\xed\xe1\xe4\xe7\xe2\xe5\xe8\xe3\ \xe4\xe7\xe3\xe6\xe9\xe4\xe5\xe8\xe5\xe6\xe9\xee\xee\xee\xef\xef\ \xef\xf0\xf0\xf0\xf1\xf1\xf1\xf2\xf2\xf2\xf3\xf3\xf3\xf4\xf4\xf4\ \xf5\xf5\xf5\xf6\xf6\xf6\xf7\xf7\xf7\xf8\xf8\xf8\xf9\xf9\xf9\xfa\ \xfa\xfa\xfb\xfb\xfb\xfc\xfc\xfc\xfd\xfd\xfd\x1c\x9b\xe4\x96\x00\ \x00\x00\x15\x74\x52\x4e\x53\x00\x02\x07\x08\x15\x18\x18\x18\x18\ \x1f\x33\x34\x39\xb6\xb7\xc0\xc4\xd7\xd8\xd8\xd9\xf8\xb3\xa5\xe9\ \x00\x00\x01\xd6\x49\x44\x41\x54\x18\x19\x05\xc1\xc1\x6a\x5c\x65\ \x00\x06\xd0\xf3\xdd\xf9\x73\xd3\x04\x8a\x14\xdd\x14\x74\x21\xb8\ \x4c\x16\x92\x82\x68\x52\xdf\xc3\x55\x57\x82\x6f\x24\xd8\x8d\xe0\ \xde\x67\xb0\xd8\x06\x41\x17\x92\xe8\xd2\x85\x15\x2a\xa2\x2b\x53\ \x9b\x99\xcc\xcc\xfd\x3c\x27\x59\x1d\x06\x00\x00\x74\xb3\x2f\x46\ \xe6\xaf\xb7\x11\x11\x80\xaa\x1a\x4f\xd6\xc5\x30\x6d\xd7\x53\x92\ \x48\x48\x69\xb5\x6d\x27\x30\x42\x7e\x7f\x1d\x41\xa0\xa8\xfb\xef\ \x45\x60\xc0\xdd\x1c\x21\x40\xa9\xf5\x37\x6f\x4e\x7e\xbd\xc1\x80\ \xe3\x5c\x85\xe9\xf4\x1a\xa7\xd7\x4e\xa8\xff\x3e\xb2\xfb\x09\x03\ \xe6\x3c\x0a\x71\x16\x7a\xa6\xd4\xfe\xd6\x02\x83\xe4\xc1\x5a\x88\ \x09\x16\xa5\x47\xcb\xd6\x02\x03\x0e\xe6\x4c\x49\x22\x54\xdb\x2e\ \x5d\x36\x0a\x03\x08\x88\x34\x85\x74\xd9\xda\xc1\x00\x79\x91\x8b\ \xe7\x2b\x1e\x5f\xda\xf3\x31\xd2\xb5\xc2\x80\x38\x8f\xc7\x49\x72\ \xae\x6d\x8b\xee\x14\x06\x40\x00\x90\xd2\x65\xbf\xc0\x40\x5e\xfe\ \x1b\x11\x81\xaa\xba\xbf\xbb\x6b\x61\xc0\x7a\x8e\x88\x98\x16\x55\ \xb5\x5e\x86\x1d\x0c\x38\x76\x6d\x92\xd3\x5f\xa4\xa7\x57\x4e\x54\ \x1b\x1b\x18\x30\x7b\x24\xe2\xcc\xb4\x38\x53\xd5\x4e\x66\x18\xf0\ \xe0\x36\x62\x12\xd3\xa2\x16\x75\xaf\x93\x0d\x0c\x38\x98\x33\x25\ \xc9\x14\xba\xb4\xed\xd2\xfd\xa1\xc2\x40\x43\x83\xa2\x50\x96\x59\ \x61\x00\x2f\x72\x71\x19\xab\xf3\x4b\xdd\xfb\xe4\xe9\x6f\x4b\xdf\ \x3f\xf2\x41\xdb\x4d\x56\x47\x4f\x37\x99\x92\x64\x8a\x50\x5d\xbe\ \x7c\xe7\xed\xc5\xce\x30\xfd\xfd\xdd\x04\x0a\xad\xaa\xd6\x67\x7f\ \xfd\x99\xae\x56\xcd\xab\x67\xeb\x01\x2f\x6f\x44\x04\xa8\x7e\xf8\ \xe3\xea\x61\xe5\xd5\x0f\x6f\x36\x03\xd6\xb3\x10\x81\xaa\xf9\xe2\ \xfb\x83\x77\xfd\xf1\xfc\xf5\x9d\x41\x7b\x9c\xab\x30\x9d\x5e\x87\ \x93\x6b\x27\x1c\x7d\x7a\x39\x79\x76\xb3\x25\xab\xa3\xaf\x36\xff\ \x44\x08\x40\xa9\x83\x6f\x7f\xbe\xbb\xc5\x80\xb7\x36\x11\x02\x94\ \xba\x37\xbe\xf8\xfc\x0e\x46\x31\x1f\x26\x49\x04\xaa\x6d\x5b\x0a\ \xc3\x72\x20\x11\x82\x14\xa5\x3a\x16\x90\xac\x0e\x03\x00\x00\xba\ \xd9\x17\x91\x04\x00\x00\xb4\x85\xff\x01\x83\x36\xf1\x3f\xdd\x87\ \xfc\x56\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x3d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x0a\x4f\x69\x43\x43\x50\x50\x68\x6f\ \x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ \x6c\x65\x00\x00\x78\xda\x9d\x53\x67\x54\x53\xe9\x16\x3d\xf7\xde\ \xf4\x42\x4b\x88\x80\x94\x4b\x6f\x52\x15\x08\x20\x52\x42\x8b\x80\ \x14\x91\x26\x2a\x21\x09\x10\x4a\x88\x21\xa1\xd9\x15\x51\xc1\x11\ \x45\x45\x04\x1b\xc8\xa0\x88\x03\x8e\x8e\x80\x8c\x15\x51\x2c\x0c\ \x8a\x0a\xd8\x07\xe4\x21\xa2\x8e\x83\xa3\x88\x8a\xca\xfb\xe1\x7b\ \xa3\x6b\xd6\xbc\xf7\xe6\xcd\xfe\xb5\xd7\x3e\xe7\xac\xf3\x9d\xb3\ \xcf\x07\xc0\x08\x0c\x96\x48\x33\x51\x35\x80\x0c\xa9\x42\x1e\x11\ \xe0\x83\xc7\xc4\xc6\xe1\xe4\x2e\x40\x81\x0a\x24\x70\x00\x10\x08\ \xb3\x64\x21\x73\xfd\x23\x01\x00\xf8\x7e\x3c\x3c\x2b\x22\xc0\x07\ \xbe\x00\x01\x78\xd3\x0b\x08\x00\xc0\x4d\x9b\xc0\x30\x1c\x87\xff\ \x0f\xea\x42\x99\x5c\x01\x80\x84\x01\xc0\x74\x91\x38\x4b\x08\x80\ \x14\x00\x40\x7a\x8e\x42\xa6\x00\x40\x46\x01\x80\x9d\x98\x26\x53\ \x00\xa0\x04\x00\x60\xcb\x63\x62\xe3\x00\x50\x2d\x00\x60\x27\x7f\ \xe6\xd3\x00\x80\x9d\xf8\x99\x7b\x01\x00\x5b\x94\x21\x15\x01\xa0\ \x91\x00\x20\x13\x65\x88\x44\x00\x68\x3b\x00\xac\xcf\x56\x8a\x45\ \x00\x58\x30\x00\x14\x66\x4b\xc4\x39\x00\xd8\x2d\x00\x30\x49\x57\ \x66\x48\x00\xb0\xb7\x00\xc0\xce\x10\x0b\xb2\x00\x08\x0c\x00\x30\ \x51\x88\x85\x29\x00\x04\x7b\x00\x60\xc8\x23\x23\x78\x00\x84\x99\ \x00\x14\x46\xf2\x57\x3c\xf1\x2b\xae\x10\xe7\x2a\x00\x00\x78\x99\ \xb2\x3c\xb9\x24\x39\x45\x81\x5b\x08\x2d\x71\x07\x57\x57\x2e\x1e\ \x28\xce\x49\x17\x2b\x14\x36\x61\x02\x61\x9a\x40\x2e\xc2\x79\x99\ \x19\x32\x81\x34\x0f\xe0\xf3\xcc\x00\x00\xa0\x91\x15\x11\xe0\x83\ \xf3\xfd\x78\xce\x0e\xae\xce\xce\x36\x8e\xb6\x0e\x5f\x2d\xea\xbf\ \x06\xff\x22\x62\x62\xe3\xfe\xe5\xcf\xab\x70\x40\x00\x00\xe1\x74\ \x7e\xd1\xfe\x2c\x2f\xb3\x1a\x80\x3b\x06\x80\x6d\xfe\xa2\x25\xee\ \x04\x68\x5e\x0b\xa0\x75\xf7\x8b\x66\xb2\x0f\x40\xb5\x00\xa0\xe9\ \xda\x57\xf3\x70\xf8\x7e\x3c\x3c\x45\xa1\x90\xb9\xd9\xd9\xe5\xe4\ \xe4\xd8\x4a\xc4\x42\x5b\x61\xca\x57\x7d\xfe\x67\xc2\x5f\xc0\x57\ \xfd\x6c\xf9\x7e\x3c\xfc\xf7\xf5\xe0\xbe\xe2\x24\x81\x32\x5d\x81\ \x47\x04\xf8\xe0\xc2\xcc\xf4\x4c\xa5\x1c\xcf\x92\x09\x84\x62\xdc\ \xe6\x8f\x47\xfc\xb7\x0b\xff\xfc\x1d\xd3\x22\xc4\x49\x62\xb9\x58\ \x2a\x14\xe3\x51\x12\x71\x8e\x44\x9a\x8c\xf3\x32\xa5\x22\x89\x42\ \x92\x29\xc5\x25\xd2\xff\x64\xe2\xdf\x2c\xfb\x03\x3e\xdf\x35\x00\ \xb0\x6a\x3e\x01\x7b\x91\x2d\xa8\x5d\x63\x03\xf6\x4b\x27\x10\x58\ \x74\xc0\xe2\xf7\x00\x00\xf2\xbb\x6f\xc1\xd4\x28\x08\x03\x80\x68\ \x83\xe1\xcf\x77\xff\xef\x3f\xfd\x47\xa0\x25\x00\x80\x66\x49\x92\ \x71\x00\x00\x5e\x44\x24\x2e\x54\xca\xb3\x3f\xc7\x08\x00\x00\x44\ \xa0\x81\x2a\xb0\x41\x1b\xf4\xc1\x18\x2c\xc0\x06\x1c\xc1\x05\xdc\ \xc1\x0b\xfc\x60\x36\x84\x42\x24\xc4\xc2\x42\x10\x42\x0a\x64\x80\ \x1c\x72\x60\x29\xac\x82\x42\x28\x86\xcd\xb0\x1d\x2a\x60\x2f\xd4\ \x40\x1d\x34\xc0\x51\x68\x86\x93\x70\x0e\x2e\xc2\x55\xb8\x0e\x3d\ \x70\x0f\xfa\x61\x08\x9e\xc1\x28\xbc\x81\x09\x04\x41\xc8\x08\x13\ \x61\x21\xda\x88\x01\x62\x8a\x58\x23\x8e\x08\x17\x99\x85\xf8\x21\ \xc1\x48\x04\x12\x8b\x24\x20\xc9\x88\x14\x51\x22\x4b\x91\x35\x48\ \x31\x52\x8a\x54\x20\x55\x48\x1d\xf2\x3d\x72\x02\x39\x87\x5c\x46\ \xba\x91\x3b\xc8\x00\x32\x82\xfc\x86\xbc\x47\x31\x94\x81\xb2\x51\ \x3d\xd4\x0c\xb5\x43\xb9\xa8\x37\x1a\x84\x46\xa2\x0b\xd0\x64\x74\ \x31\x9a\x8f\x16\xa0\x9b\xd0\x72\xb4\x1a\x3d\x8c\x36\xa1\xe7\xd0\ \xab\x68\x0f\xda\x8f\x3e\x43\xc7\x30\xc0\xe8\x18\x07\x33\xc4\x6c\ \x30\x2e\xc6\xc3\x42\xb1\x38\x2c\x09\x93\x63\xcb\xb1\x22\xac\x0c\ \xab\xc6\x1a\xb0\x56\xac\x03\xbb\x89\xf5\x63\xcf\xb1\x77\x04\x12\ \x81\x45\xc0\x09\x36\x04\x77\x42\x20\x61\x1e\x41\x48\x58\x4c\x58\ \x4e\xd8\x48\xa8\x20\x1c\x24\x34\x11\xda\x09\x37\x09\x03\x84\x51\ \xc2\x27\x22\x93\xa8\x4b\xb4\x26\xba\x11\xf9\xc4\x18\x62\x32\x31\ \x87\x58\x48\x2c\x23\xd6\x12\x8f\x13\x2f\x10\x7b\x88\x43\xc4\x37\ \x24\x12\x89\x43\x32\x27\xb9\x90\x02\x49\xb1\xa4\x54\xd2\x12\xd2\ \x46\xd2\x6e\x52\x23\xe9\x2c\xa9\x9b\x34\x48\x1a\x23\x93\xc9\xda\ \x64\x6b\xb2\x07\x39\x94\x2c\x20\x2b\xc8\x85\xe4\x9d\xe4\xc3\xe4\ \x33\xe4\x1b\xe4\x21\xf2\x5b\x0a\x9d\x62\x40\x71\xa4\xf8\x53\xe2\ \x28\x52\xca\x6a\x4a\x19\xe5\x10\xe5\x34\xe5\x06\x65\x98\x32\x41\ \x55\xa3\x9a\x52\xdd\xa8\xa1\x54\x11\x35\x8f\x5a\x42\xad\xa1\xb6\ \x52\xaf\x51\x87\xa8\x13\x34\x75\x9a\x39\xcd\x83\x16\x49\x4b\xa5\ \xad\xa2\x95\xd3\x1a\x68\x17\x68\xf7\x69\xaf\xe8\x74\xba\x11\xdd\ \x95\x1e\x4e\x97\xd0\x57\xd2\xcb\xe9\x47\xe8\x97\xe8\x03\xf4\x77\ \x0c\x0d\x86\x15\x83\xc7\x88\x67\x28\x19\x9b\x18\x07\x18\x67\x19\ \x77\x18\xaf\x98\x4c\xa6\x19\xd3\x8b\x19\xc7\x54\x30\x37\x31\xeb\ \x98\xe7\x99\x0f\x99\x6f\x55\x58\x2a\xb6\x2a\x7c\x15\x91\xca\x0a\ \x95\x4a\x95\x26\x95\x1b\x2a\x2f\x54\xa9\xaa\xa6\xaa\xde\xaa\x0b\ \x55\xf3\x55\xcb\x54\x8f\xa9\x5e\x53\x7d\xae\x46\x55\x33\x53\xe3\ \xa9\x09\xd4\x96\xab\x55\xaa\x9d\x50\xeb\x53\x1b\x53\x67\xa9\x3b\ \xa8\x87\xaa\x67\xa8\x6f\x54\x3f\xa4\x7e\x59\xfd\x89\x06\x59\xc3\ \x4c\xc3\x4f\x43\xa4\x51\xa0\xb1\x5f\xe3\xbc\xc6\x20\x0b\x63\x19\ \xb3\x78\x2c\x21\x6b\x0d\xab\x86\x75\x81\x35\xc4\x26\xb1\xcd\xd9\ \x7c\x76\x2a\xbb\x98\xfd\x1d\xbb\x8b\x3d\xaa\xa9\xa1\x39\x43\x33\ \x4a\x33\x57\xb3\x52\xf3\x94\x66\x3f\x07\xe3\x98\x71\xf8\x9c\x74\ \x4e\x09\xe7\x28\xa7\x97\xf3\x7e\x8a\xde\x14\xef\x29\xe2\x29\x1b\ \xa6\x34\x4c\xb9\x31\x65\x5c\x6b\xaa\x96\x97\x96\x58\xab\x48\xab\ \x51\xab\x47\xeb\xbd\x36\xae\xed\xa7\x9d\xa6\xbd\x45\xbb\x59\xfb\ \x81\x0e\x41\xc7\x4a\x27\x5c\x27\x47\x67\x8f\xce\x05\x9d\xe7\x53\ \xd9\x53\xdd\xa7\x0a\xa7\x16\x4d\x3d\x3a\xf5\xae\x2e\xaa\x6b\xa5\ \x1b\xa1\xbb\x44\x77\xbf\x6e\xa7\xee\x98\x9e\xbe\x5e\x80\x9e\x4c\ \x6f\xa7\xde\x79\xbd\xe7\xfa\x1c\x7d\x2f\xfd\x54\xfd\x6d\xfa\xa7\ \xf5\x47\x0c\x58\x06\xb3\x0c\x24\x06\xdb\x0c\xce\x18\x3c\xc5\x35\ \x71\x6f\x3c\x1d\x2f\xc7\xdb\xf1\x51\x43\x5d\xc3\x40\x43\xa5\x61\ \x95\x61\x97\xe1\x84\x91\xb9\xd1\x3c\xa3\xd5\x46\x8d\x46\x0f\x8c\ \x69\xc6\x5c\xe3\x24\xe3\x6d\xc6\x6d\xc6\xa3\x26\x06\x26\x21\x26\ \x4b\x4d\xea\x4d\xee\x9a\x52\x4d\xb9\xa6\x29\xa6\x3b\x4c\x3b\x4c\ \xc7\xcd\xcc\xcd\xa2\xcd\xd6\x99\x35\x9b\x3d\x31\xd7\x32\xe7\x9b\ \xe7\x9b\xd7\x9b\xdf\xb7\x60\x5a\x78\x5a\x2c\xb6\xa8\xb6\xb8\x65\ \x49\xb2\xe4\x5a\xa6\x59\xee\xb6\xbc\x6e\x85\x5a\x39\x59\xa5\x58\ \x55\x5a\x5d\xb3\x46\xad\x9d\xad\x25\xd6\xbb\xad\xbb\xa7\x11\xa7\ \xb9\x4e\x93\x4e\xab\x9e\xd6\x67\xc3\xb0\xf1\xb6\xc9\xb6\xa9\xb7\ \x19\xb0\xe5\xd8\x06\xdb\xae\xb6\x6d\xb6\x7d\x61\x67\x62\x17\x67\ \xb7\xc5\xae\xc3\xee\x93\xbd\x93\x7d\xba\x7d\x8d\xfd\x3d\x07\x0d\ \x87\xd9\x0e\xab\x1d\x5a\x1d\x7e\x73\xb4\x72\x14\x3a\x56\x3a\xde\ \x9a\xce\x9c\xee\x3f\x7d\xc5\xf4\x96\xe9\x2f\x67\x58\xcf\x10\xcf\ \xd8\x33\xe3\xb6\x13\xcb\x29\xc4\x69\x9d\x53\x9b\xd3\x47\x67\x17\ \x67\xb9\x73\x83\xf3\x88\x8b\x89\x4b\x82\xcb\x2e\x97\x3e\x2e\x9b\ \x1b\xc6\xdd\xc8\xbd\xe4\x4a\x74\xf5\x71\x5d\xe1\x7a\xd2\xf5\x9d\ \x9b\xb3\x9b\xc2\xed\xa8\xdb\xaf\xee\x36\xee\x69\xee\x87\xdc\x9f\ \xcc\x34\x9f\x29\x9e\x59\x33\x73\xd0\xc3\xc8\x43\xe0\x51\xe5\xd1\ \x3f\x0b\x9f\x95\x30\x6b\xdf\xac\x7e\x4f\x43\x4f\x81\x67\xb5\xe7\ \x23\x2f\x63\x2f\x91\x57\xad\xd7\xb0\xb7\xa5\x77\xaa\xf7\x61\xef\ \x17\x3e\xf6\x3e\x72\x9f\xe3\x3e\xe3\x3c\x37\xde\x32\xde\x59\x5f\ \xcc\x37\xc0\xb7\xc8\xb7\xcb\x4f\xc3\x6f\x9e\x5f\x85\xdf\x43\x7f\ \x23\xff\x64\xff\x7a\xff\xd1\x00\xa7\x80\x25\x01\x67\x03\x89\x81\ \x41\x81\x5b\x02\xfb\xf8\x7a\x7c\x21\xbf\x8e\x3f\x3a\xdb\x65\xf6\ \xb2\xd9\xed\x41\x8c\xa0\xb9\x41\x15\x41\x8f\x82\xad\x82\xe5\xc1\ \xad\x21\x68\xc8\xec\x90\xad\x21\xf7\xe7\x98\xce\x91\xce\x69\x0e\ \x85\x50\x7e\xe8\xd6\xd0\x07\x61\xe6\x61\x8b\xc3\x7e\x0c\x27\x85\ \x87\x85\x57\x86\x3f\x8e\x70\x88\x58\x1a\xd1\x31\x97\x35\x77\xd1\ \xdc\x43\x73\xdf\x44\xfa\x44\x96\x44\xde\x9b\x67\x31\x4f\x39\xaf\ \x2d\x4a\x35\x2a\x3e\xaa\x2e\x6a\x3c\xda\x37\xba\x34\xba\x3f\xc6\ \x2e\x66\x59\xcc\xd5\x58\x9d\x58\x49\x6c\x4b\x1c\x39\x2e\x2a\xae\ \x36\x6e\x6c\xbe\xdf\xfc\xed\xf3\x87\xe2\x9d\xe2\x0b\xe3\x7b\x17\ \x98\x2f\xc8\x5d\x70\x79\xa1\xce\xc2\xf4\x85\xa7\x16\xa9\x2e\x12\ \x2c\x3a\x96\x40\x4c\x88\x4e\x38\x94\xf0\x41\x10\x2a\xa8\x16\x8c\ \x25\xf2\x13\x77\x25\x8e\x0a\x79\xc2\x1d\xc2\x67\x22\x2f\xd1\x36\ \xd1\x88\xd8\x43\x5c\x2a\x1e\x4e\xf2\x48\x2a\x4d\x7a\x92\xec\x91\ \xbc\x35\x79\x24\xc5\x33\xa5\x2c\xe5\xb9\x84\x27\xa9\x90\xbc\x4c\ \x0d\x4c\xdd\x9b\x3a\x9e\x16\x9a\x76\x20\x6d\x32\x3d\x3a\xbd\x31\ \x83\x92\x91\x90\x71\x42\xaa\x21\x4d\x93\xb6\x67\xea\x67\xe6\x66\ \x76\xcb\xac\x65\x85\xb2\xfe\xc5\x6e\x8b\xb7\x2f\x1e\x95\x07\xc9\ \x6b\xb3\x90\xac\x05\x59\x2d\x0a\xb6\x42\xa6\xe8\x54\x5a\x28\xd7\ \x2a\x07\xb2\x67\x65\x57\x66\xbf\xcd\x89\xca\x39\x96\xab\x9e\x2b\ \xcd\xed\xcc\xb3\xca\xdb\x90\x37\x9c\xef\x9f\xff\xed\x12\xc2\x12\ \xe1\x92\xb6\xa5\x86\x4b\x57\x2d\x1d\x58\xe6\xbd\xac\x6a\x39\xb2\ \x3c\x71\x79\xdb\x0a\xe3\x15\x05\x2b\x86\x56\x06\xac\x3c\xb8\x8a\ \xb6\x2a\x6d\xd5\x4f\xab\xed\x57\x97\xae\x7e\xbd\x26\x7a\x4d\x6b\ \x81\x5e\xc1\xca\x82\xc1\xb5\x01\x6b\xeb\x0b\x55\x0a\xe5\x85\x7d\ \xeb\xdc\xd7\xed\x5d\x4f\x58\x2f\x59\xdf\xb5\x61\xfa\x86\x9d\x1b\ \x3e\x15\x89\x8a\xae\x14\xdb\x17\x97\x15\x7f\xd8\x28\xdc\x78\xe5\ \x1b\x87\x6f\xca\xbf\x99\xdc\x94\xb4\xa9\xab\xc4\xb9\x64\xcf\x66\ \xd2\x66\xe9\xe6\xde\x2d\x9e\x5b\x0e\x96\xaa\x97\xe6\x97\x0e\x6e\ \x0d\xd9\xda\xb4\x0d\xdf\x56\xb4\xed\xf5\xf6\x45\xdb\x2f\x97\xcd\ \x28\xdb\xbb\x83\xb6\x43\xb9\xa3\xbf\x3c\xb8\xbc\x65\xa7\xc9\xce\ \xcd\x3b\x3f\x54\xa4\x54\xf4\x54\xfa\x54\x36\xee\xd2\xdd\xb5\x61\ \xd7\xf8\x6e\xd1\xee\x1b\x7b\xbc\xf6\x34\xec\xd5\xdb\x5b\xbc\xf7\ \xfd\x3e\xc9\xbe\xdb\x55\x01\x55\x4d\xd5\x66\xd5\x65\xfb\x49\xfb\ \xb3\xf7\x3f\xae\x89\xaa\xe9\xf8\x96\xfb\x6d\x5d\xad\x4e\x6d\x71\ \xed\xc7\x03\xd2\x03\xfd\x07\x23\x0e\xb6\xd7\xb9\xd4\xd5\x1d\xd2\ \x3d\x54\x52\x8f\xd6\x2b\xeb\x47\x0e\xc7\x1f\xbe\xfe\x9d\xef\x77\ \x2d\x0d\x36\x0d\x55\x8d\x9c\xc6\xe2\x23\x70\x44\x79\xe4\xe9\xf7\ \x09\xdf\xf7\x1e\x0d\x3a\xda\x76\x8c\x7b\xac\xe1\x07\xd3\x1f\x76\ \x1d\x67\x1d\x2f\x6a\x42\x9a\xf2\x9a\x46\x9b\x53\x9a\xfb\x5b\x62\ \x5b\xba\x4f\xcc\x3e\xd1\xd6\xea\xde\x7a\xfc\x47\xdb\x1f\x0f\x9c\ \x34\x3c\x59\x79\x4a\xf3\x54\xc9\x69\xda\xe9\x82\xd3\x93\x67\xf2\ \xcf\x8c\x9d\x95\x9d\x7d\x7e\x2e\xf9\xdc\x60\xdb\xa2\xb6\x7b\xe7\ \x63\xce\xdf\x6a\x0f\x6f\xef\xba\x10\x74\xe1\xd2\x45\xff\x8b\xe7\ \x3b\xbc\x3b\xce\x5c\xf2\xb8\x74\xf2\xb2\xdb\xe5\x13\x57\xb8\x57\ \x9a\xaf\x3a\x5f\x6d\xea\x74\xea\x3c\xfe\x93\xd3\x4f\xc7\xbb\x9c\ \xbb\x9a\xae\xb9\x5c\x6b\xb9\xee\x7a\xbd\xb5\x7b\x66\xf7\xe9\x1b\ \x9e\x37\xce\xdd\xf4\xbd\x79\xf1\x16\xff\xd6\xd5\x9e\x39\x3d\xdd\ \xbd\xf3\x7a\x6f\xf7\xc5\xf7\xf5\xdf\x16\xdd\x7e\x72\x27\xfd\xce\ \xcb\xbb\xd9\x77\x27\xee\xad\xbc\x4f\xbc\x5f\xf4\x40\xed\x41\xd9\ \x43\xdd\x87\xd5\x3f\x5b\xfe\xdc\xd8\xef\xdc\x7f\x6a\xc0\x77\xa0\ \xf3\xd1\xdc\x47\xf7\x06\x85\x83\xcf\xfe\x91\xf5\x8f\x0f\x43\x05\ \x8f\x99\x8f\xcb\x86\x0d\x86\xeb\x9e\x38\x3e\x39\x39\xe2\x3f\x72\ \xfd\xe9\xfc\xa7\x43\xcf\x64\xcf\x26\x9e\x17\xfe\xa2\xfe\xcb\xae\ \x17\x16\x2f\x7e\xf8\xd5\xeb\xd7\xce\xd1\x98\xd1\xa1\x97\xf2\x97\ \x93\xbf\x6d\x7c\xa5\xfd\xea\xc0\xeb\x19\xaf\xdb\xc6\xc2\xc6\x1e\ \xbe\xc9\x78\x33\x31\x5e\xf4\x56\xfb\xed\xc1\x77\xdc\x77\x1d\xef\ \xa3\xdf\x0f\x4f\xe4\x7c\x20\x7f\x28\xff\x68\xf9\xb1\xf5\x53\xd0\ \xa7\xfb\x93\x19\x93\x93\xff\x04\x03\x98\xf3\xfc\x63\x33\x2d\xdb\ \x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\ \x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\ \x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x01\x68\ \x49\x44\x41\x54\x78\xda\xa4\x93\xbf\x4a\x03\x41\x10\x87\xbf\x15\ \x85\x70\x22\x28\x8a\x76\x66\x6d\x24\x60\x91\x26\x0f\x10\xdb\x54\ \x21\x55\x4a\x49\x27\x56\x16\x81\x2b\x84\x80\x95\xa4\x51\x1f\x41\ \x2c\x22\xa4\x10\x2c\x6c\x2c\x7c\x01\x45\x1f\xc1\x3f\xa5\xc8\xa5\ \x48\xf6\x76\xf6\x92\x3b\x1b\x23\xd1\x8b\x1a\x71\x60\x8b\xfd\xed\ \xee\xc7\x6f\x66\x76\x54\x92\x24\xfc\x27\xa6\xf8\x67\x4c\x8f\x6e\ \x7c\xdf\xdf\x52\x4a\x1d\x02\xf3\x83\xc1\xe0\xa8\xd9\x6c\xee\x0e\ \xcf\x6a\xb5\xda\xb9\x88\x94\x9d\x73\xbb\xed\x76\xfb\xe8\xe3\x51\ \x92\x24\x9f\x96\xef\xfb\xd7\xf5\x7a\x3d\xf9\xaa\x57\xab\xd5\xf9\ \x4a\xa5\x72\xf7\x55\x4f\xa5\x10\x45\x11\xce\xb9\x94\xd5\x56\xab\ \xd5\x31\xc6\x74\x7e\x4c\x01\xc0\x39\x47\xbf\xdf\x1f\x9b\x6f\x18\ \x86\x4c\x04\x18\xe7\x00\xc0\x18\xf3\x3b\x40\x44\xb0\xd6\x4e\x0c\ \x48\xd5\xc0\x5a\xfb\x2d\xa0\xd7\xeb\xfd\x0e\x30\xc6\xdc\x8b\x08\ \xc5\x62\xb1\x3c\xaa\x1f\x2e\xe9\x9d\xcb\x97\x78\x23\xf0\xf4\xdc\ \x50\x0b\x3c\xed\x8d\x03\x1c\x77\xbb\xdd\x8e\x31\xa6\x91\xcf\xe7\ \x35\x40\x36\x9b\x2d\x9e\x2a\xd9\x5e\x8e\x55\x06\x78\x0c\x3c\x5d\ \x7a\xbf\x7e\xa6\xc6\x7d\xe5\x42\xa1\xa0\xad\xb5\x0d\x11\xd1\x61\ \x18\x22\x22\xf7\xd6\xda\x93\xa7\xc1\xe2\x3a\x70\x0a\x84\x80\x0f\ \x1c\xa8\xbf\xce\x42\xe0\xe9\x7d\x60\x0f\x10\xa0\x91\xea\x42\x2e\ \x97\x4b\xac\xb5\x1f\xdd\x70\xce\x11\x45\x11\x71\x1c\x13\xc7\x31\ \xaf\x99\xd5\x5b\x20\x02\x32\xc0\xcd\xc4\x0e\x02\x4f\xaf\x00\x57\ \x80\x02\x4a\xc0\x1d\x30\xfb\x97\x69\xbc\x00\xe6\x80\xcd\x05\xf3\ \xf0\x0c\xac\x01\x33\x6f\x03\x00\xa2\xf3\xd4\x09\xe7\xfe\x9d\x97\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\xdc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x03\x00\x00\x00\x44\xa4\x8a\xc6\ \x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\ \x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\ \x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\ \x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x07\x50\x4c\x54\ \x45\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\ \x59\x59\x57\x5c\x5a\x58\x5d\x5d\x5a\x5e\x5f\x5b\x60\x60\x5c\x61\ \x60\x7e\x7e\x7e\x61\x67\x66\x62\x67\x67\x80\x80\x80\x81\x81\x81\ \xd6\xda\xdc\xe4\xe7\xe8\xf2\xf2\xf2\x7f\x7f\x7f\xd2\xd5\xd6\xd8\ \xdb\xdc\x7e\x7e\x7e\x94\x94\x94\x99\x99\x99\x9a\x9a\x9a\x9f\xa0\ \xa0\xa0\xa0\xa0\xa2\xa2\xa2\xa4\xa4\xa4\xa5\xa5\xa5\xa6\xa6\xa6\ \xa7\xa7\xa7\xa9\xa9\xa9\xad\xae\xae\xb1\xb1\xb1\xb1\xb2\xb2\xb4\ \xb4\xb4\xb5\xb6\xb6\xb7\xb8\xb8\xbb\xbb\xbb\xbd\xbd\xbd\xbf\xbf\ \xbf\xc1\xc1\xc2\xc2\xc2\xc3\xc3\xc4\xc5\xc4\xc4\xc4\xc5\xc5\xc5\ \xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc7\xc7\xc7\xc8\xc8\xca\xca\xca\xca\ \xcb\xcb\xcc\xcc\xcc\xcd\xcd\xce\xcd\xce\xce\xcf\xcf\xcf\xcf\xd0\ \xd0\xd0\xd1\xd1\xd1\xd2\xd2\xd3\xd3\xd3\xd4\xd4\xd4\xd5\xd5\xd5\ \xd7\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd9\xd8\xd9\xd9\xd9\xd9\xd9\xda\ \xda\xda\xda\xda\xdb\xdb\xdb\xdb\xdc\xdc\xdc\xdc\xdc\xdd\xdd\xdd\ \xdd\xde\xde\xdf\xdf\xdf\xdf\xe0\xe0\xe0\xe1\xe1\xe1\xe2\xe2\xe2\ \xe3\xe3\xe3\xe4\xe4\xe4\xe5\xe5\xe5\xe5\xe6\xe6\xe5\xe6\xe7\xe6\ \xe7\xe8\xe7\xe8\xe8\xe7\xe8\xe9\xe8\xe9\xea\xe9\xe9\xe9\xe9\xea\ \xea\xe9\xea\xeb\xea\xea\xea\xeb\xeb\xeb\xeb\xeb\xec\xeb\xec\xec\ \xeb\xec\xed\xec\xec\xec\xec\xed\xed\xed\xed\xed\xed\xee\xee\xee\ \xee\xee\xee\xef\xef\xef\xef\xef\xef\xf0\xf0\xf0\xf0\xf0\xf0\xf1\ \xf1\xf0\xf1\xf2\xf1\xf1\xf1\xf1\xf2\xf2\xf2\xf2\xf2\xf2\xf3\xf3\ \xf3\xf3\xf3\xf3\xf4\xf4\xf4\xf4\xf4\xf4\xf5\xf5\xf5\xf5\xf5\xf5\ \xf6\xf6\xf6\xf6\xf6\xf6\xf7\xf7\xf7\xf7\xf7\xf7\xf8\xf8\xf8\xf8\ \xf8\xf8\xf9\xf9\xf9\xf9\xf9\xf9\xfa\xfa\xfa\xfa\xf9\xfa\xfa\xfa\ \xfa\xfb\xfb\xfb\xfb\xfb\xfb\xfb\xfc\xfc\xfc\xfc\xfd\xfd\xfd\xfd\ \xfe\xfe\xfe\xfe\xfe\xff\xff\xff\x78\x9a\x78\x4f\x00\x00\x00\x3b\ \x74\x52\x4e\x53\x00\x00\x01\x02\x03\x05\x07\x0a\x0c\x0d\x10\x11\ \x15\x16\x19\x1a\x1b\x1d\x1f\x21\x22\x24\x25\x26\x27\x29\x2b\x2c\ \x2d\x31\x33\x35\x36\x39\x3c\x3e\x42\x44\x46\x49\x4a\x52\x95\x95\ \xa4\xa4\xb4\xb4\xb8\xc3\xc3\xef\xf1\xf8\xf8\xf8\xfa\xfd\xfd\x32\ \xa6\x1d\xe0\x00\x00\x02\x00\x49\x44\x41\x54\x78\xda\x6d\x91\xbf\ \x6b\x14\x41\x18\x86\xdf\xef\x9b\xd9\x8b\x12\xc5\xc2\x88\x20\x69\ \x0d\x16\xc6\x04\x84\xa0\x45\x4e\x14\xb5\x51\xb0\x48\x25\x98\x52\ \x0b\x3b\xff\x0b\x1b\xb1\xf6\x6f\x48\x61\x63\xe7\x71\xd1\x20\x36\ \x42\xd8\x53\x53\x08\x62\x50\xef\x30\x47\x72\x1b\xcf\x73\x2f\x77\ \xc9\xfc\x70\x77\x76\x87\x9b\x3b\x7c\x77\xd9\x5d\x78\x9e\x99\xf7\ \xdb\x5d\x49\xc8\x33\x33\x83\xff\x67\x4f\xa2\x10\x1e\xf5\x58\x30\ \x11\x33\x18\x04\x06\xc8\xad\xac\x3c\x2b\x05\xfc\x3d\x20\x26\x21\ \x21\xc8\xc5\x71\xe7\x7a\x81\x87\x5b\x72\x7e\x4a\x80\x19\xee\x20\ \x10\x9c\xe2\x85\x3f\x8d\x45\xf5\xf9\x72\x44\xc4\xee\x24\x14\x86\ \x80\x17\x36\x17\xae\xea\x7e\x7c\x25\x22\xce\xb1\x37\x82\x0a\x9c\ \x02\xae\xd7\xe2\x25\x49\x5c\xf2\x89\x8a\xc5\x37\xb3\x27\x70\x6d\ \x3d\x5e\xca\x04\x06\x17\x9c\x02\x61\x36\x59\x7b\xc0\xa2\xfa\x76\ \xfb\xbc\x9b\x01\x0c\xf0\xd8\x0c\x98\x4b\x5f\xae\x40\x2c\x7f\x42\ \xf9\x26\x10\x65\xc5\xc2\x34\xa0\x95\x5d\x23\x96\x1b\xcb\x24\x2f\ \x2a\x26\xe2\x8c\xfa\xc8\xe9\x27\x28\xa3\xad\x61\x54\x24\x0a\xcc\ \x08\x87\x74\x21\x0b\x62\xed\xb1\x4f\x28\xe4\x4e\xd9\xec\x15\x82\ \x4c\x9f\xbb\x19\x8e\x33\xcb\xb9\xaa\xe1\x23\x13\x81\x47\x18\x90\ \x0d\xe4\xb9\xf0\x50\xbd\x57\x55\xb0\xfa\x78\xa9\xc4\x34\x51\x41\ \x5b\xfb\xab\x04\x5d\x3f\x13\x39\xee\x30\x87\xc2\x8f\x2f\xab\x91\ \xb1\x75\xcc\x7b\xce\x13\x3b\x7c\xb8\x75\xd2\xa2\x7e\x70\x9b\x1d\ \x2f\xb0\x09\x05\xec\x03\xef\x92\x3b\xd1\x88\x6b\x85\xa3\xe0\x53\ \xdf\xac\x91\xfe\x7e\x2f\x02\x1c\xcf\x71\x3a\x18\x2a\xf5\x4a\x7b\ \xe1\xf4\x8d\x0d\x71\x77\x8a\xc1\x25\x1f\xfe\xee\x74\x7a\xe6\x5b\ \xda\x92\xf0\xc6\x8a\x14\xf0\x31\xaa\xb3\xdd\x3c\x76\x96\x1a\xcd\ \xbe\x84\x0f\x07\x0f\xba\xbb\xf3\xf3\xfe\x61\x5c\xfb\xd5\x25\x39\ \xc6\x5d\x03\x60\x86\xbd\xdd\xe8\x30\x5e\xdf\x4d\x08\x5e\x20\x1b\ \x6c\x62\x07\x49\xf7\x5c\x5c\x4f\xda\x76\xec\x67\x85\x23\x0c\x8c\ \x7c\xbd\xd7\x36\x08\x84\x20\x94\x75\xb4\xbf\xee\x24\x16\x23\xc1\ \xbe\x78\x2c\xb8\x9c\x00\x96\xec\x66\xda\xea\x12\x02\xa1\x89\xa7\ \x08\xa3\x5b\x7d\x02\xbc\xc0\x82\x4d\x33\xbb\xb0\x20\x22\xc0\x5a\ \xab\x4d\x45\x98\x2c\xda\x40\x82\xd8\x31\x21\xa3\xfc\xce\xb0\x39\ \xd0\x8a\x34\x60\x19\xe6\x1f\x46\xfa\xb5\x61\x30\x13\x28\x09\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x09\xdf\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\ \x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd7\x0a\x1d\x14\x16\x35\x7a\x28\x6b\x8c\x00\x00\x09\x6c\x49\x44\ \x41\x54\x78\xda\xa5\x57\x7b\x8c\x15\xd5\x19\xff\xcd\x7b\xe6\xde\ \x3b\x3b\xf7\xde\x65\x5f\x2c\x22\xe8\xca\x22\xac\x05\x01\xa1\x95\ \xa2\x95\x97\x4a\x6b\x83\x9a\xda\xb4\x9a\x58\xa9\xa4\xd1\xc4\x6a\ \xd3\x54\x63\x1f\x4a\xac\x49\x13\xfd\x43\x1a\xad\x89\xd6\x60\x63\ \x42\x9b\xc6\xd6\x57\x14\x1f\xe0\xa3\xd5\xa2\xac\xca\xb3\x2c\xb2\ \x0a\x5b\x56\xdc\x65\x5f\xf7\x39\x33\x77\xde\xd3\x6f\xce\xd5\xeb\ \x25\x2d\x95\xb6\x67\xf7\xbb\x67\xee\x99\x73\xce\xf7\xfb\x7e\xdf\ \xef\x9b\x73\x87\xc3\x69\xb6\x6b\x7e\x3b\xa0\x45\x31\x2e\x4d\xc9\ \xfc\xea\x8c\xc2\x2f\x51\x25\x7e\x96\xc4\x73\x39\x70\x31\x17\x84\ \x71\xb1\xe6\x47\x43\xa6\x1b\xed\xb6\xbd\x68\x3b\xc7\xe1\xe5\x27\ \x37\xce\xb7\x71\x1a\xed\x3f\x02\x88\xe3\x18\x57\x3d\x72\xb0\x33\ \x2d\x0b\xb7\x77\x1a\xf2\x86\xd9\xad\x8a\xd1\xa2\x70\xb0\x4c\x1b\ \xa5\xb2\x05\xdb\xf1\xd8\x1c\x4d\x11\x61\xe8\x29\xa4\xd2\x1a\x2a\ \x6e\x8c\x7f\x14\xbd\xe2\x58\x25\x78\xdc\xf6\xc2\xfb\x9e\xbe\xe9\ \xbc\x31\x8e\xe3\xfe\x7b\x00\xdf\x7f\xe2\x03\xbe\xea\x86\x3f\x9a\ \xdd\xaa\x6e\x9a\xdf\x95\xca\x4c\x4e\x95\xf1\xf6\xc1\x4f\x70\xe8\ \x58\x01\xf9\x8c\x8c\x8e\xac\x06\x3d\x25\xb3\xb9\x66\xcd\xc7\x58\ \xb9\x86\x92\xe9\x61\xce\x8c\x2c\x96\xcc\x69\x47\x36\x9b\xc6\x07\ \xe3\x9e\x39\x5c\xf2\x7f\xae\x8a\xfc\x83\x5b\x6f\xec\x8b\x4e\x1b\ \xc0\x37\x1f\xde\x9f\xcd\x6a\xd2\x1f\x97\xcd\xd6\xd7\xc6\xae\x83\ \xa7\xfe\x3a\x88\x92\xe5\x63\xd5\xc2\x6e\x7c\xe5\xdc\x0e\xa4\x15\ \x89\xad\xe4\xea\x1f\x8d\x4d\x6c\x37\xc0\xae\xc3\xe3\x78\x7d\xff\ \x08\x32\xc4\xd4\xda\xc5\x33\x10\x4b\x2a\xf6\x8e\x38\x2f\x56\x9c\ \xe8\xda\xe7\x6f\x59\x58\xfc\x42\x00\x57\x3c\xb4\x6f\x5a\x7b\x8b\ \xfc\xda\x8a\x1e\xe3\xbc\x3d\x03\xc7\xb1\xed\xdd\x61\x5c\xba\x64\ \x26\x2e\x9a\xdf\x05\x8e\xe7\xc0\xe8\x3c\xc9\x71\x32\xd6\xbc\x61\ \x3d\x75\x3b\x0f\x8d\x61\xfb\x9e\x61\xac\x98\xdb\x8a\xde\x59\x6d\ \xe8\x3f\xee\xee\x9b\xb2\xc2\xb5\xdb\x6e\x3d\x7f\xfc\x94\x00\xd6\ \xff\x66\xbf\x6a\xa4\xc4\xbf\xac\xec\xcd\x2e\xdd\xb1\xeb\x23\xbc\ \x7f\xa4\x80\xeb\x57\xf7\x62\x9a\xa1\x35\x1c\xb3\xae\xc9\x69\x7d\ \x1c\x9f\x8f\x7f\xae\x20\x14\xaa\x0e\xb6\xbe\xf1\x21\xe6\xb4\x2b\ \x58\x3a\xaf\x0b\x6f\x0f\xbb\xfd\xe5\x5a\x74\xc9\xb6\xdb\x16\x35\ \x04\xca\x37\x0b\x4e\x14\xb8\x5f\x2f\x3f\xdb\x58\xfa\xe6\xee\x21\ \x72\x5e\xc4\x75\xab\x7a\xa1\x28\x32\x48\xdd\x9f\x5a\xd8\xe8\x4f\ \x79\xed\x85\xb0\x12\xa3\x6b\x45\x12\xf0\x9d\x8b\xcf\xc1\x47\x93\ \x3e\xf6\x0e\x8e\x61\x51\x97\xb4\x54\x16\xb0\x79\x64\x64\xe4\x5f\ \x19\xb8\x6c\xf3\x9e\x95\x5f\x3e\xcb\xd8\xc1\xb9\x16\xf7\xc4\xab\ \x1f\xe2\xaa\xaf\xf6\xc0\x48\xab\x49\x68\xf4\x7f\x72\xc4\xf5\xcb\ \x98\xf5\xf5\xfb\x7c\x53\x1a\x22\x20\xf4\x11\x07\x2e\xa6\xe9\x2a\ \x0a\x0e\x08\x4c\x8c\x67\xdf\x19\xc2\xa5\x7d\x39\x04\x52\x0a\x7b\ \x47\xbd\x35\xdb\x7f\xbc\x64\x47\x83\x81\x3b\xff\xfc\x11\xd7\x96\ \x91\xee\x9b\x99\x15\xb9\x67\x76\x0e\x61\xd1\x39\x9d\xe0\x05\x89\ \xa2\x89\x28\x9a\xcf\xa2\x67\xd7\x2c\x32\xb3\xe6\xa2\x5a\xa9\xa0\ \x52\x2e\xc2\xb4\x6b\x34\x16\xd4\xc7\x6d\x07\xd5\x72\x09\x72\x68\ \xe2\xca\x0b\x66\x60\x1d\x89\xb0\xe6\xfa\xe0\x25\x09\x8b\xe6\x74\ \xe1\xad\xc3\x25\x4c\xcf\x00\x79\x8d\xbf\xff\xe6\xc7\x77\x73\x0d\ \x00\xfd\x43\xe5\x35\x73\xbb\x52\x8b\xf7\x1c\x3e\x01\x1f\x02\xda\ \xf3\x19\x58\x3e\x73\xc8\x8c\xea\xf9\x53\xe7\x11\x73\x52\x2e\x4c\ \x60\xf9\xd9\x69\xdc\x7b\xed\x12\xe6\xd0\x72\x7c\x98\x96\x0d\xdf\ \x2a\x62\xd5\xbc\x56\xdc\xb0\xa6\x0f\xfb\x87\xc6\xf1\xc0\x73\x07\ \x60\x85\x02\x9c\x80\x43\x7b\x2e\x03\x5e\xd1\x70\x64\xb4\x8a\xb3\ \x5b\xa5\x85\x87\x26\xc2\x35\x0c\x40\x92\x7b\x43\x15\x36\x74\x66\ \x44\xec\x1a\x1c\xc7\xcc\x8e\x2c\x39\x07\x39\x8d\x59\x54\x56\xcd\ \x63\x0e\xec\x24\x4a\x8a\xb6\x52\x18\xc7\xca\x79\x79\x5c\xbe\x6c\ \x0e\x92\x56\xad\x56\xd8\x7d\x4d\x8c\x70\xfb\xd5\x8b\x10\x46\x31\ \x36\xfd\x7e\x17\x5e\x1b\x34\x51\x13\x0c\xb8\x91\x84\x5a\x00\x38\ \x11\x8f\x99\x9d\x59\x7c\x70\xa2\x86\xf6\x34\x0f\x5d\xe6\xbe\xc7\ \x74\xf7\xf5\xcd\xbb\xa5\xee\x9c\x72\xd9\x54\xd1\x44\xd9\x89\x31\ \x53\x53\xd9\x02\x0e\x21\x62\xbf\x86\xa8\x56\x66\x79\xe5\x25\x15\ \xb1\x67\xe3\xea\xa5\xdd\x58\xbf\xa2\x0f\x51\x14\x31\xe1\x4e\x95\ \x6d\x64\xb4\x10\x5e\x10\xe3\x9e\x3f\xed\xc7\x94\x19\x40\x54\x73\ \x10\x24\x05\x01\x04\x70\x21\x69\x24\xaa\x8b\x2d\x95\xec\x1d\x89\ \xc4\xa2\x8b\x5c\x8a\x5f\xb7\xfe\xa1\xbd\xa2\x58\xb2\x83\xbe\x25\ \x67\xea\xc6\xd1\xd1\x49\xa6\xf8\x5a\x08\x08\x88\x81\x28\x80\x5f\ \x9e\xc0\xb6\xbb\xbf\x81\xa4\x2d\xdf\xf0\x2b\x6c\xbc\xf2\x22\x5c\ \xb3\x72\x01\xc2\x30\x6c\xd8\xc0\xf0\x14\x32\x98\x0e\x59\x56\xa0\ \x4a\x22\xd2\xaa\x86\x74\x24\x43\x0d\x85\xba\x63\xae\x61\x04\x98\ \x87\x46\x20\x4e\x14\x89\x05\x5d\x37\x06\xc7\xad\x3e\x51\xe0\x31\ \x3f\x9b\x12\xb1\x77\xa2\x0c\x87\x16\x95\x6a\x11\x64\x89\xa2\x0b\ \x7c\x54\x27\xa7\xf0\x59\xfb\xdb\x96\x3b\x93\x8e\x39\x0d\x82\x20\ \x31\xc6\x82\x40\x1b\x48\xa2\x08\x9e\xcc\xa3\xef\x9e\xe5\xa1\x64\ \x7b\x10\x79\x0e\xaa\x2c\x90\x49\xb4\x9f\x44\xa2\x16\x40\x4b\x68\ \x0e\x8f\x89\x92\x89\x2f\xb5\x67\x41\x53\xe6\x51\xe9\xa3\x53\x12\ \x80\x8a\xe5\x02\xbc\xce\x0e\x13\xde\x0f\x09\x40\x08\xdb\x74\xd0\ \xdc\xc8\x61\xc3\x39\x19\x03\x43\x00\xc8\x38\xa2\xda\x83\x6f\x4e\ \x21\x74\x4c\x70\x71\x08\x97\x42\xae\x91\x53\x29\xd5\x02\xb5\xa5\ \x0d\x92\x96\xae\x97\xb1\x20\x30\xcd\x28\x12\xad\xe3\xb8\xe9\x22\ \xa5\x51\x05\x7d\x90\x76\x20\x26\x0b\x44\x01\x3c\xcf\x83\x60\x20\ \xa1\xa7\xa9\x35\x68\x6f\x06\x40\x73\x98\xc5\xbe\x83\x2d\x1b\xe6\ \xa1\x33\x9b\x82\x90\xec\x23\x49\xcc\x8a\x76\x80\xeb\x1e\x3b\x48\ \x73\x74\x96\x07\x91\xf6\xa7\x0b\xd4\x77\x8e\x55\x31\x0c\x23\x27\ \x0c\x63\xc8\x22\x21\x8a\xd9\x66\x8c\xae\x18\x02\x8b\xae\x39\xfa\ \xe6\xdc\x37\x33\x20\x51\xee\x39\x29\x8d\x9b\xb7\x7e\x48\x0c\x54\ \x81\x38\x62\xa2\xe3\x05\x11\x52\x9a\x18\x30\xda\xc9\xb1\xc8\xc6\ \x7c\x3e\x49\x19\x4f\x01\x73\x20\xbf\xae\xe8\x06\xd1\x48\x52\xe7\ \x46\x46\xc5\xa4\x85\x04\x21\x8b\x80\xb2\x0b\x51\x92\x9a\x01\x30\ \x6b\x76\x4e\x7d\x43\x03\x82\xac\x42\xd1\x52\xcc\x79\x5d\x74\x14\ \x65\x62\x02\xdd\x4b\x34\xc2\x0b\x6c\x3d\xf9\x47\x4b\x5a\x81\x13\ \x44\x20\xdf\x27\x78\xcf\x0f\x07\x26\xaa\x1e\xba\x5a\x75\x10\x30\ \x08\x3c\xa3\x89\xd1\xa7\x66\xb2\x8d\x73\xe2\xbc\xef\xde\x83\x47\ \x9e\x7e\xf3\xdf\x30\x40\x40\x69\x21\x89\x89\xb1\x27\x2b\x0a\x54\ \x2d\x03\x35\x95\x81\x92\x98\xaa\x41\x92\xe5\x7a\x60\x3c\xa3\x9e\ \x3d\xe8\x0a\x56\x00\x3f\x88\x0e\x8a\xd3\x74\xf9\xef\x9f\x14\x9c\ \xf2\xc2\xee\xb4\xa1\x8c\x96\x08\x75\xcc\x36\xe2\x04\x05\xfc\xb4\ \x6e\xac\xb8\xeb\x45\x16\x55\xd7\x82\x55\x78\x6a\xa0\x04\x08\xfb\ \x70\xcd\x8a\x5e\xe6\x9c\xb4\xc2\xe6\x0a\xb4\x86\xf3\xaa\xd0\x39\ \x1b\x05\x13\x50\xf5\x3c\x44\x35\x4d\x91\x0b\xec\x9c\xa8\x9f\x1f\ \xa4\xb3\x20\x86\xc4\x47\xa4\x13\x0d\xfd\xc7\xac\x72\x46\x11\x0e\ \xf0\x3b\xee\x58\x16\x9c\xa8\x78\xdb\x92\x72\x69\x4d\x71\x40\x14\ \x32\x55\x4b\xf4\x5d\xd3\x73\x30\xa6\xf7\x20\x3b\xa3\x17\x7a\xfb\ \x19\xc8\x51\xff\xfc\x61\x0f\x7f\x78\x63\x00\xd4\x68\x1e\x4b\x13\ \x4b\xc3\x34\x35\xc4\x4f\xd7\x4e\xc7\xb7\xce\x15\x80\xc2\x10\xbc\ \xca\x38\x10\xb8\x8c\x55\xca\x39\x8b\x3e\x0e\x03\xe4\x94\x7a\x9a\ \x4f\x94\xbd\x97\xde\xfa\xc5\x85\x3e\x4f\xe8\x08\xb5\xff\xbb\xe1\ \x82\x83\x73\xda\x35\x56\x4e\x1c\x3b\x9a\x05\xc8\xb2\xcc\x28\x24\ \x23\x6a\x55\xa8\x69\x1d\xd9\xee\x1e\xec\x38\xc6\xe1\xd9\xf7\x3e\ \x66\x00\x52\x2d\x79\xba\xaf\xa2\x8a\x34\xee\x7e\xee\x28\xab\xa6\ \xbb\xae\x38\x0b\xcb\x5a\x4d\x78\x85\xe3\x88\x03\x27\x71\xce\x58\ \x8c\x3c\x07\x67\xe6\x24\x1c\x9b\x72\x31\x65\xfa\x5b\x1a\x27\xeb\ \xf5\x0f\xbf\xcb\x7d\x5c\x74\x77\xaf\xeb\xcb\x2e\xdc\x79\xa4\x02\ \x8b\xd7\x91\xd2\x5b\x28\x3a\xb1\x2e\x26\x9e\x59\x12\x29\xf5\x31\ \xdb\xd4\x33\x8b\x14\x91\x0f\xcd\xc8\x43\x4e\x1b\x04\x1a\xf0\x1d\ \x1b\x76\x71\x02\x7a\x50\xc4\xfa\x05\x6d\xe8\xc8\xeb\x78\xb0\xdf\ \x83\x98\xc9\xa1\x66\xd9\x50\xfd\x0a\xce\xef\xd6\xf0\xec\x9e\xc9\ \xf7\x67\xb5\x69\x17\x3c\xb6\xf1\xfc\xb8\x71\x8a\x9f\xfb\x93\x57\ \x57\x2f\xef\x69\xd9\xde\x6d\x88\x78\xf7\xb8\x0f\x89\xe8\x57\x53\ \x29\x56\x3e\x02\x51\x28\xc9\x3c\x31\x92\xf4\x09\x10\x80\x43\x04\ \xb0\x52\x13\x98\xc2\xe3\x38\xa1\x38\x82\xe7\xfa\xb0\xcb\x15\x02\ \x52\x40\x5b\x5a\x44\x31\x4a\x23\x82\x08\xdf\xaa\x60\xf1\x74\x11\ \x47\xc6\x9d\xf8\xcd\xc1\xe2\xea\x81\xfb\x56\xbe\xd6\xfc\x83\x84\ \x29\x7d\xf1\xcf\xde\x78\x94\x58\xd8\x98\x94\xe5\x60\x89\x87\xda\ \x92\x83\x46\x20\x14\x4d\xa4\x5e\xa4\x3e\xa9\xf9\xa4\xb4\x38\x34\ \xe8\xa3\x9e\xb5\x18\x88\x88\xff\x90\x84\xe6\xd6\x42\x38\x96\x47\ \xbd\xc7\x00\xb9\x56\x15\xbd\x79\x40\x21\x06\x9f\xd9\x3d\xfe\xe8\ \x7b\xf7\x5e\xfc\x03\x5a\x7f\xf2\x4f\x32\x1a\x48\x8e\xdf\xdb\x5e\ \x3d\x54\xea\x37\x54\x1e\x3d\x46\x84\xd0\x2a\x33\x5a\xb9\x38\x62\ \xc2\x14\x13\x31\x31\x41\xf1\x2c\x25\x1c\x59\xf3\x61\x53\xff\xce\ \x8c\x3d\x68\x3c\x37\x80\x47\xce\x7b\xb2\x80\xa1\x8a\x78\xf9\xc0\ \x64\x7f\xcd\x0f\x6f\xa5\xfb\xa7\xfe\x55\x3c\xfb\xd6\x57\xda\x3b\ \x5b\xa4\x57\x56\xcd\xd5\x17\x04\x11\x70\xcc\x14\x00\x4d\x47\xc6\ \xc8\x90\x2e\x14\x12\x23\x4b\x09\x03\xd0\x08\xbe\x11\x7d\xc4\x9c\ \xda\x55\x17\x66\xd9\x04\xef\xda\x98\xd3\x2a\x40\xa1\xf9\x2f\xec\ \x9b\x38\x30\x52\x72\x57\x1e\x79\x60\xcd\xe4\x17\xbe\x17\x9c\xf9\ \xc3\x97\x73\x39\x4d\xd8\x7a\xe1\x59\xe9\xcb\xbb\x0c\x09\x23\x16\ \x87\x62\x20\x81\x4f\x2a\x42\x53\x21\x29\x52\x52\xe3\x0c\x04\xf0\ \x99\xf3\x10\x7e\x42\x77\xcd\x41\xec\x3a\x68\x53\x63\xcc\xca\xcb\ \x18\x2d\xb9\x78\xfd\x50\xe1\x15\x7a\xf0\x7c\xfb\xe8\xe6\x35\xa5\ \xd3\x7e\x33\x5a\x78\xfb\x8e\xe4\xcd\xe8\x96\x9e\x36\xe5\xde\x45\ \x33\x53\x99\x34\x51\x38\x69\xc7\x28\xd4\x62\x98\x5e\x8c\x84\x9d\ \xb8\xf1\x66\x90\x3c\x60\x00\x5d\x15\xd0\x96\x11\xd1\xa1\x8b\x70\ \xbc\x08\xbb\x8e\x56\xcc\xc3\xa3\xd6\xa6\x7c\x46\x7a\xe0\x9d\x5f\ \x7e\xed\xf4\xdf\x8c\x9a\x5b\xf7\x4d\x2f\x74\xa4\x15\xe1\x8e\x33\ \xf2\xca\x0d\x73\x3b\x53\xd9\x8e\x16\x89\x3d\x5c\x3c\xdf\x87\x4f\ \x28\x38\xfa\x93\x65\x11\x2a\xb1\x12\xc6\x3c\xc6\xaa\x3e\x0e\x8d\ \x58\xe5\xe1\xc9\xda\x96\xaa\x13\xdc\x7f\x63\x7b\xff\xe8\xa6\x4d\ \x9b\xfe\x97\x97\xd3\xc6\x7d\x89\x4c\x4e\xf5\xac\xc8\xa5\x17\x5c\ \xb5\xce\xc8\x77\x5c\x92\x35\xf4\xbe\x4c\x5a\xeb\x56\x24\x29\x03\ \x20\x26\x30\x55\xd3\x76\x46\x4b\xe5\xca\x81\xf2\xd4\xd8\xeb\xe6\ \x9e\x27\x5f\xb2\x8f\xee\x2c\x02\xf0\xc8\x7c\xb2\xe8\xff\x01\x20\ \x90\x89\x64\x52\xb3\xd1\x39\x20\x92\xf1\x4c\x03\xf5\x16\x30\x67\ \x27\x5b\x32\x16\xb2\x22\x3d\x45\xfb\x27\x42\xd8\xac\x75\xfe\x76\ \xfc\x14\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x82\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x04\xff\x49\x44\ \x41\x54\x78\xda\xbd\x95\x5b\x68\x54\x57\x14\x86\xbf\x3d\x73\xe6\ \x96\x49\x1a\x63\x1c\x93\x0c\x54\x42\xd3\x48\xcc\x93\xd8\x56\xa5\ \x90\xa0\x14\x29\x81\x42\x85\x3c\x14\xdf\xa4\x17\x44\x29\xd8\x22\ \xda\x82\xa4\x08\x8d\xad\xc6\x4b\x0c\x44\x51\xdb\x5a\xa4\x88\xd0\ \x17\xa1\x4f\x2d\x41\xbc\x54\x6d\x21\x16\xa5\x37\x94\x18\x9d\x7a\ \xc9\xe4\x62\x2e\x93\xb9\x9e\x39\x67\x66\x77\xdc\x38\x19\x3d\x99\ \x4c\x0e\xa1\xf4\x83\xc5\xde\xfb\x70\x98\xff\x5f\x6b\xed\x75\x46\ \x93\x52\xf2\x5f\x22\x7a\xc5\x32\x2a\xd8\x8d\x41\x0b\x26\x95\x38\ \x29\x43\x63\x9c\x24\x17\xa8\xa2\x4b\x6e\x92\x03\x50\x40\x83\x02\ \x42\x88\x7a\xa0\x9e\x85\xe0\x47\x63\x37\xbb\x28\x67\x5d\x6b\x6d\ \xab\x6b\xc3\x8b\x1b\x68\xa8\x68\x00\x01\x83\xd3\x83\x8b\xfa\x1e\ \xf4\x35\x5c\x1e\xbc\xfc\x9e\x38\x2c\x7e\xe0\x57\xda\xe5\xf7\x32\ \x63\x31\xa0\xa8\xd7\x75\xfd\x42\x2a\xa5\x83\x00\x81\xb0\xac\xca\ \x25\x6a\xa5\xb0\xcf\x64\x33\xb4\xfd\xd4\x46\x7f\xbc\x9f\xed\xaf\ \x6e\xa7\xe9\x85\x26\xf5\xec\x71\xf2\x31\x08\xa8\xad\xa8\x65\xf3\ \x8a\xcd\xac\xad\x5b\x2b\x7a\xfe\xec\x79\x5b\x5f\xa7\x5f\x10\x27\ \xc4\x1b\x72\x8b\x34\x34\x2c\x3c\x11\x8f\xc6\x62\x38\x1c\x02\x21\ \x8a\x04\xc0\xd3\x7d\x9e\x0f\xae\xbe\xcf\xd5\xc4\x55\x36\x35\x6d\ \xc2\xeb\xf5\xf2\xc0\x08\x31\x3d\x36\xce\xc1\xd7\x7a\x01\xf8\xf4\ \xb7\x0f\xa9\x0a\x54\x53\xe6\xf7\xd2\xbe\xbc\x9d\xb3\x7f\x9f\x6d\ \x91\x11\x79\x46\x08\xf1\xce\x2c\x03\x42\x40\x41\xdc\xf1\x64\x55\ \x67\x20\x6f\xa2\xb0\x07\x6e\x45\x6e\x73\xee\xfe\x39\x82\xcb\x82\ \x68\xe5\x1a\xe1\x74\x88\x0a\x0d\x26\xa3\xa3\xe4\x99\x8a\x0e\xe2\ \xa9\x8e\x12\x03\x7c\x65\x1a\xc1\xba\x20\x8f\x22\x8f\x36\xd2\x41\ \x83\x86\x95\xa7\xc2\xb3\x2a\x00\x60\xd9\x03\x1c\xf9\xbd\x1b\xe9\ \x95\xf8\x17\xfb\x79\xa8\x87\x58\xe2\x06\xb7\x13\xe2\x89\x71\xf2\ \x24\x93\x0f\xc8\x92\x40\x97\x10\x05\xca\x5d\x7e\x58\x84\x0b\xc9\ \xde\xd9\x15\x40\x14\x2f\x3f\x80\xe5\x6c\x98\x26\x17\xc3\x17\x21\ \x08\x03\x63\x03\x3c\x0e\xff\x43\xd0\x5b\x46\xb5\x4b\x90\x0c\x1b\ \xf0\x16\x8a\xd0\xad\xfb\x44\xa2\x61\x26\x0d\x49\x58\x4f\x30\x52\ \x9b\x06\x09\x64\x78\xbd\x58\x0b\xe6\xea\xbd\x5a\x29\x9c\xc9\x64\ \x32\x44\x1d\x51\x48\x83\xbc\x23\x19\xdf\x95\xa2\x18\x97\x3e\x9e\ \xe6\x59\x5e\x38\x24\xe0\x25\x60\x02\xff\x1c\x2d\x10\xf3\x9b\x00\ \x90\x12\x4d\x6a\x90\x05\x04\xb6\x71\x0a\xc0\x05\xf8\xf1\x16\x69\ \x01\xf6\x0c\xa8\xcb\xe9\xc0\xe3\xf3\x80\x0f\x68\x84\xea\xe3\x82\ \x80\x1b\x02\x1e\x30\x87\xe1\x97\x1d\x12\x80\x37\x7b\x04\x15\x41\ \x18\x49\xc3\x98\x0e\xce\x26\x20\x09\x38\x49\x2c\xa4\x02\x2a\x78\ \x6a\x60\x85\x67\x05\x63\xc6\x98\xca\x48\xbc\x0c\x7e\x3f\x2c\xf5\ \x81\xe1\x67\x86\x9a\x06\x58\xbc\x1c\x64\x02\x12\x49\xb8\x37\x85\ \x7a\x9f\x51\x6e\x2e\xa8\x02\xf9\xd0\x34\x8d\xad\x8b\xb6\x72\x2d\ \x75\x0d\x33\x6b\x12\x89\xc1\x84\x04\x5f\x06\xb4\x2c\x33\x4c\x00\ \xf1\x08\x8c\xe8\xf0\x28\x06\x69\x03\x00\xc9\x25\x4e\xda\xad\x40\ \x51\x63\x1e\x8f\x87\x96\xe6\x16\x56\x5e\x59\xc9\xf5\xaa\xeb\x98\ \x09\x18\x9e\x02\xd2\x50\x96\x61\x86\x51\x13\x32\x53\x30\xa4\xc3\ \x68\x0a\xf0\x02\x77\xe8\xe7\x47\x7e\x2e\x52\x01\x6b\x94\xae\x4a\ \x65\x65\x25\x9d\xd5\x9d\x6c\x8b\x6e\xe3\x6e\xc5\x5d\x52\x29\xb8\ \x3f\x09\x7e\x01\x75\x67\x04\x0e\xc0\x74\xc2\x54\x12\xd2\x1e\xa0\ \x12\x78\xc8\x20\x3b\xf9\x04\x98\xd0\x98\x85\x12\xb3\x15\x00\x6e\ \xb7\x9b\xd5\xaf\xac\xa6\xfb\x4a\x37\x7b\x26\xf7\x70\x63\xc9\x0d\ \xb2\x1e\x88\x4e\xe4\xc2\x09\x38\xf2\xb3\x07\x1a\x1a\xe6\x4d\x73\ \x80\x0e\x76\x60\x72\x1d\x48\x17\x6d\x81\x0a\x1b\xe2\x80\xba\x88\ \xe5\xe5\xe5\xb4\xb6\xb4\x72\xe8\xc6\x21\xfa\xfe\xe8\xe3\x7c\xe0\ \x3c\xb7\x6b\x6e\xa3\x67\x75\x5c\x4e\x17\x6e\xd3\x4d\xfd\x68\x3d\ \x1b\x63\x1b\xe9\xd8\xd9\x71\x0c\xb8\x04\xc4\x65\x8e\x92\x97\x90\ \x12\xe2\xc5\x4c\xac\x59\xb3\x86\xc6\xc6\x46\xda\xee\xb5\x11\x0a\ \x85\x88\xc7\xe3\xaa\x42\x3e\x9f\x8f\xba\x60\x1d\xcd\xcd\xcd\x74\ \x6c\xe9\xf8\x0b\x88\xca\x1c\x00\xc5\x5b\x50\x88\x59\x26\x2c\x3c\ \x6b\x48\xfd\x13\xd6\xd6\xd6\x12\x08\x04\x58\xb5\x6a\xd5\x73\xef\ \x38\x9d\x4e\x5c\x2e\x17\x80\x91\x17\x2f\x6e\xc0\x9a\x39\x94\x12\ \xb5\x3e\x53\xd5\xc8\x89\xa9\xcc\xed\x30\xe7\x14\x28\x8a\x97\xbe\ \xa4\x09\x2b\x2a\xd9\xc2\x0b\xf3\x18\xb0\x0a\xc3\x7c\xa2\x16\xf1\ \x82\x68\x36\x9b\x7d\x6e\x05\x10\x0e\xa7\x3d\x03\xc2\x32\x8e\xb3\ \x28\x61\x2c\x93\xc9\x28\xd1\x74\x3a\x8d\x61\x18\x4f\xce\x2a\x00\ \xe2\x69\x33\x06\x24\xed\x56\xc0\xb6\x68\x9e\x9c\x90\x12\xd5\x75\ \x5d\x4d\x40\x24\x12\xc9\xad\x09\xf5\x7b\x15\x95\x55\xc6\x97\xfb\ \x3b\x7b\x80\xfe\x92\x06\x94\xf8\x1c\x82\x25\x50\x59\x9b\xa6\x49\ \x2a\x95\x22\x1c\x1e\x66\x64\x64\x18\x8f\xc7\xcb\xd2\x9a\xa5\x38\ \x1d\x4e\xd9\xb9\x6f\xdf\xf1\xd3\x5f\x9f\xfa\x4c\x4a\x99\x2d\x65\ \xa0\xa8\x78\xe9\x16\x14\x0c\xe4\x32\x57\x59\x0f\x0d\x0d\xb1\x7e\ \xfd\x3a\x32\x19\x53\x99\xd9\x7b\xa0\xeb\xf4\x37\x27\x8e\x7f\xa4\ \xc4\x6d\x5d\x42\x98\x77\xe6\xad\xd9\xe7\xcb\x3f\x3e\x3e\x81\xdb\ \xed\x99\x11\x3f\xd0\x73\xe4\xdc\xc9\xde\xa3\xef\xe6\x67\xdf\xf6\ \x14\xd8\x47\xdd\x7a\x55\xfe\x58\x2c\xc6\xf4\xf4\x34\xc1\x60\x70\ \x46\xbc\xf7\x70\x77\xbb\x45\xdc\x5e\x05\xb0\xd7\x0a\x4b\x0b\xd2\ \x64\x01\x97\xdb\x25\x3b\xbb\xf6\x9f\xfe\xea\xe8\xb1\x62\x99\xdb\ \x1f\x43\x9b\xe6\x54\x05\x72\xa1\xca\x1e\xa8\xa9\x33\x3f\xdf\xb7\ \xff\xd8\xb7\xaa\xe7\x79\x71\xfb\x06\xd4\x67\x54\x4d\x82\xa5\xe7\ \xa5\x3e\x3a\xc2\xe1\x00\x87\x86\xe1\x70\xc7\x0e\x76\x7d\x71\xe4\ \xbb\x53\xea\xb6\xcb\x85\x7c\x8a\x43\x39\x03\xeb\x59\x38\x09\xa0\ \xdf\x22\x6e\xd7\x80\xca\x26\x04\x84\xf8\x1f\xf9\x17\x67\x93\x24\ \x6a\x48\x9d\xf5\x2b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x04\x79\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x02\x73\x42\x49\x54\x08\x08\x55\xec\x46\x04\x00\x00\ \x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\ \xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\ \x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\ \x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x03\xf8\x49\x44\x41\x54\ \x78\xda\x7d\x95\x4f\x68\x5c\x55\x14\xc6\x7f\xf7\xcd\x64\x26\x33\ \xc9\xa4\x9a\xaa\x64\x60\x52\xff\x20\xd8\x20\x6e\x84\x3a\x82\x88\ \xb5\xcd\xaa\x8b\xb4\x20\xf8\x17\xf7\xba\x10\x2c\x2e\xc4\x12\x23\ \x86\xa0\xb8\x90\xb8\x53\xec\xc2\x95\x9a\x56\x10\xdb\x45\x37\x9a\ \x50\x5d\x08\x21\x0b\x11\x29\x01\x89\xb8\x30\x38\xa1\xa1\x7f\xd2\ \x99\x4c\x66\x26\xf3\xee\xf5\xf3\x70\x99\x10\x47\x72\x3e\x0e\x6f\ \x0e\xef\x9c\xef\x7c\xef\xce\x7b\xe7\xb8\x40\xbf\x7d\x98\xf7\x27\ \xdd\x14\x13\x94\x05\xa8\x09\xab\xe1\x72\xb2\xf8\x4e\x9b\x3e\xeb\ \x23\x98\x2b\x87\x19\x5e\xf1\xa5\x80\x27\x10\x93\x48\x90\xd7\xf9\ \xd2\xcd\x4e\xd7\x0e\x20\x98\x1d\x0c\xd3\x9c\xf5\xc5\x2e\xbb\xb4\ \xe9\x90\xe2\x81\x84\x0c\x39\xf2\x0c\x90\x25\x69\x32\xef\xe6\x66\ \x5a\xff\x4b\xf0\xde\x58\xf8\x2e\x54\x53\x5a\x6c\x93\x50\xa6\x42\ \x89\x21\x50\x54\x67\x9d\x1a\x5e\xd1\xa0\xc8\xdc\xb2\x3b\xf3\xfe\ \x46\x1f\xc1\xf4\x63\xe1\x8a\xaf\x74\x68\x8a\xe0\x18\x8f\x70\x88\ \x41\xeb\x09\x29\x1d\x61\x87\x5f\x59\x61\x90\x22\x39\x92\x75\x77\ \x6a\xee\xb7\x7d\x04\xe7\xc6\xc2\x8a\xaf\xb4\xb8\xc3\x28\xc7\x39\ \xc2\x5d\xe4\x71\x06\x08\xa4\x42\x57\x4a\x36\xb8\xc2\x4d\x46\x44\ \x23\x8a\x63\x1f\x6c\xf4\x08\xde\x1e\x0c\x57\x7d\x55\xd2\x79\x5c\ \xdd\xc7\x28\x90\x25\x23\x38\x21\x00\x5e\xd8\xa5\x43\x5b\x0d\x7e\ \x66\xc5\x1e\x25\x59\x76\xc7\x3f\x6a\x41\x02\x90\x4e\xfb\x6a\x9b\ \x2d\x95\x57\x19\x67\x58\xb7\xf3\x42\xce\x5c\xbf\xcd\x0b\x0c\x09\ \x77\xf3\x0c\x4f\x28\xb3\x8d\xaf\xa6\xd3\x51\xc1\x5b\xe5\xb0\xd6\ \x2d\x36\x28\xf1\x12\x47\xe2\x93\x67\x48\xac\x3f\x66\xc1\xd0\x35\ \x15\x3b\x52\x71\x5e\x3e\x4c\xb6\xe9\x1e\xfe\xb8\x96\x40\x3a\xd3\ \x2d\xb6\x68\x31\x49\x45\xe5\xb9\x48\x20\x8a\x1e\x32\x86\x01\xd3\ \x55\x50\xe9\x73\xb4\x84\x6e\x31\x9d\x01\xf7\x46\x3e\x6c\xee\x96\ \xb6\x78\x8a\x67\x19\x53\x79\x56\x89\x5f\xa8\x4f\x4b\xd7\xb3\x60\ \x76\x8e\x86\xe2\x3c\x9f\xd0\xa5\xad\x7b\xdb\x2c\xb1\xc8\x21\x06\ \xea\xee\xde\xc4\x9f\x48\x4b\x1d\x25\x4f\x30\x1a\x3b\x39\x82\x0a\ \x6e\x71\x03\xa2\x79\xb6\xb8\xce\x06\x89\xe9\xc8\x09\x4f\xea\xda\ \x21\x2d\xf9\x13\x49\x7a\x3a\x15\xeb\xb8\xfd\x71\x59\x94\x22\xdf\ \xa5\xc5\x8e\x10\x4d\xf1\x36\x0d\xb9\x23\x21\x2b\xe4\x28\xf2\xa0\ \xaa\x52\xd2\xd3\x89\x9f\x10\x01\x0f\x10\x94\x10\xec\xe8\x30\xa1\ \x4d\x79\xb4\x78\x74\x4d\xc0\x09\x19\x3b\xa3\xa3\x46\xe0\x27\xb2\ \xbe\x9c\xaa\x60\x44\x92\x1c\x29\x01\xd0\xd5\x08\x02\xd1\x4c\x51\ \x03\x47\x24\x30\x9d\xf7\xa8\x2a\xc5\x95\x45\xe0\x49\x19\x46\xf2\ \x63\x7f\xf8\x85\x75\x6e\x32\x4e\x34\x91\xdd\xe6\x3a\x09\x44\x8a\ \x44\x18\x45\xfd\xf1\xe5\x6c\x40\x88\x37\x30\x87\x06\x7f\xf3\x3b\ \x2d\x88\x56\xa7\xc1\x0d\x0e\x63\xd6\x53\x12\x0c\x49\xa8\x05\x1c\ \x0d\x0b\x30\xc7\x64\x96\xe4\x40\x7f\x1c\xf3\x6e\x63\x14\xb5\xc4\ \xff\x4b\xa0\xb0\x8b\x17\x8c\xc6\xce\x79\x44\x6e\xb6\x3f\xb6\x0c\ \x2f\x6c\x1a\x81\xaf\x25\x61\x15\x71\xff\xc9\xae\x3d\x53\x6a\x09\ \x39\x0a\x94\xe4\xd1\x7a\xb1\x95\xc7\xbc\x55\x53\x14\x56\x93\x70\ \x29\xe8\xe7\x9a\xfd\x29\xdd\x48\x90\xa7\xc8\x88\x3c\x5a\x2f\x36\ \x82\x98\x77\x4d\x55\x8a\x2e\x25\x61\x89\x7a\x86\x1d\x56\x68\xd2\ \xa1\x2b\x78\x15\x0c\x53\x92\x47\xeb\xc5\x92\x6c\x19\x1d\x7e\xa2\ \x29\x02\xea\x61\xc9\x05\x5e\xfe\x34\xbc\xa6\x09\xc8\x9b\x3c\xc4\ \x10\x85\xf8\x46\x3a\xfe\x6b\x2a\x8f\xdf\x42\x8d\x77\xed\xd3\x72\ \x9f\x7d\xf5\x7a\x02\x61\x36\x34\xc5\xc6\x02\x77\x68\xd1\x11\x24\ \x11\x4f\xd8\x5f\x6c\xd2\x75\x57\x39\x9f\x13\xd0\x03\x34\xc3\x2c\ \x24\xf0\x75\x8d\xf9\x8c\xf8\xfe\xe2\x2a\x0d\xf1\xb7\x05\x1d\xa9\ \xc1\x1b\x52\x83\x26\xb5\xf5\xff\x81\x3f\xc8\x8b\x80\x79\x55\x92\ \x05\x60\x8e\xc9\x4c\xb5\xc0\xf7\x38\x26\xb1\x82\x7d\x43\x2d\x4e\ \x45\xd4\x5d\xe5\xdf\x52\x40\xe5\xcb\xaa\xda\x1b\xaa\x2f\x6a\xa8\ \x06\x9b\xc9\xf7\xf3\x2a\x15\x72\x82\xbd\xdc\x00\x48\x85\x95\x6f\ \x72\x9e\x35\x9b\xcb\x4e\x43\x75\x61\x6f\xa8\x1a\x85\xc6\x7a\xa8\ \xe8\x90\xf0\x4c\xf1\x34\xc5\x38\x95\xa4\x20\x6a\xfa\x91\x6f\x70\ \x76\xc4\x2a\x3f\xb5\xb0\x6f\xac\x9b\xbd\x30\x86\x16\x8b\x37\xa1\ \x43\x1c\xe5\x51\xee\xe3\x30\x8e\x5b\xea\x7c\x4d\x68\xd8\xc0\x13\ \xe5\x32\x67\x2e\xf4\x2f\x16\xa3\xb0\xd5\x16\x8a\x76\x64\xf6\x46\ \x04\x88\x63\x64\x00\x3b\x13\x5b\x6d\x17\x5a\x07\x2c\xd7\xe7\x6d\ \xb9\x86\xd2\xde\xc7\xe5\xcc\x05\x5b\xae\x17\x0f\x5a\xae\x3d\x92\ \x7c\x38\xc9\x94\x9b\x08\x71\xbd\xbb\x5a\x58\xe5\xb2\x5b\xbc\xd8\ \xa6\xcf\xfe\x01\x04\xa8\xe5\xf1\xf0\xc2\xe8\x8a\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x66\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0a\x15\x17\x36\x33\xb6\ \xff\xbc\xd6\x00\x00\x00\xea\x49\x44\x41\x54\x28\xcf\x7d\xd1\x3f\ \x4e\x02\x61\x10\x05\xf0\xdf\xf7\x85\x05\x8c\x16\xc4\xd0\x18\x2d\ \xe8\x68\xe1\x06\x5e\x81\x13\x80\x27\x53\x4e\xc0\x15\xb8\x01\xb4\ \xdb\xd1\x92\x18\xc1\x44\xf9\xb3\xbb\x2c\x16\x10\x03\x42\x9c\x97\ \xcc\xcc\xcb\x9b\x99\x4c\xf2\x82\x63\xa4\x03\x7d\xcf\x47\x32\x36\ \x6c\xbf\x1d\xda\x00\x69\xcb\x48\xa7\xee\xce\x0d\xd6\xbe\x6c\x98\ \xea\xb5\x67\x04\xd2\x96\x49\x6c\x3c\xa8\xda\x28\xec\x54\x24\x72\ \xef\xca\xa5\x6e\x7b\x16\x31\x8a\x8d\x27\x85\x85\x8d\x9d\x60\x67\ \x6b\xaf\x29\x36\x8c\x08\xe9\xc0\xeb\xa3\x5c\x2e\x20\x9c\xe4\xdc\ \x82\x97\xa8\x5f\x17\x2f\xe4\x20\xaa\x49\xe8\x87\x74\xdf\x44\xf9\ \x2b\x9c\xd6\x95\x4f\x91\x9a\x52\x10\x8f\xc2\x29\x12\x54\xd8\x5d\ \x6c\x9e\xb2\xc8\xfa\xca\xee\xe1\x5e\x81\x68\x7c\x6d\xe0\x80\x6f\ \xc6\xd1\x30\x93\x5f\xbc\x18\x04\x99\x8c\x61\x20\x9d\x84\xce\xbd\ \xe4\xcf\x48\x6e\xae\x9c\xb6\xbb\x11\xbd\xfd\xf2\x43\x76\x26\x6f\ \xcd\x95\x4b\xbd\x33\xb3\x12\xb7\xaa\x28\xac\xce\xcd\xfa\xdf\xee\ \x1f\x3a\x79\x50\xa1\x12\xe5\x09\xa4\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x0c\x18\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\ \x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0b\x1d\x07\x0f\ \x34\xc2\xed\x06\xe0\x00\x00\x01\x5a\x49\x44\x41\x54\x28\xcf\x45\ \x91\x31\x4b\x63\x41\x14\x85\xbf\x3b\x33\x9a\xb8\x26\x6e\x61\x9b\ \x05\x6d\x62\xe9\x0f\x49\x2f\xa4\x5d\x08\x96\x2f\x8b\x20\x16\x16\ \x36\x16\x16\x62\x5e\x99\xc6\xc6\x62\x61\xfb\xfc\x81\xf5\x17\xd8\ \x06\x61\x97\x4d\x5a\x97\xc5\x65\xf5\xbd\x79\x33\xf7\x5a\x44\x57\ \x4e\x73\x38\x87\x03\x97\xfb\x09\x40\x41\x09\xc0\xe7\x81\xef\x43\ \x9e\x5f\xcf\xde\x53\x79\x33\xe3\x49\xaf\xd8\x26\x00\x89\x07\x96\ \xe5\x64\xbc\x6a\xa4\xa0\x64\xaf\x3d\xfc\xb7\xeb\x2a\xc4\xbc\x80\ \x9a\x49\x9b\x1f\x7a\xb3\x79\x5f\x15\x08\xc0\x59\xea\xf9\xda\x82\ \x28\x11\x68\xe1\xc8\xd6\x92\x5f\xf9\x2c\x80\x83\xf1\x55\xcf\x3f\ \x99\x88\xb0\xe0\x90\x43\x16\x08\xc8\x93\x7d\xf2\x5f\xae\x40\xe0\ \xc2\xd6\xf1\x78\x3c\x8a\x01\x0e\x87\x92\xc9\xd4\x1c\x8b\x1b\x0d\ \x3e\xa0\x66\x18\x8a\xb1\x64\x89\xbe\x2a\xdb\x26\xa3\x41\x08\xfb\ \x8a\x8a\x02\xc2\x4f\x2e\x80\x13\x76\x50\x14\x13\x23\xec\x07\x21\ \x93\x70\x40\x42\xf8\x0b\x40\x22\x63\x64\x32\x10\xf2\x5d\xa2\x31\ \x91\xd5\x0d\x02\x18\x19\x25\x13\xcd\x89\xde\xb9\xe9\xac\x22\x49\ \xa4\x21\xa1\x00\x28\x89\x48\x24\xc9\x33\xd3\x99\x83\x3f\x93\x0d\ \xa2\xd5\xd4\x24\xba\x74\x69\xa8\x89\xd4\xb6\xc1\xef\x92\xd5\xa3\ \x4e\xd3\x9a\xaf\x2c\x08\x3c\x20\x6c\x63\x64\x6b\x49\xcc\xe7\x01\ \x5c\x01\x7c\xef\x44\xed\x4a\x43\x63\x1f\xd9\x22\x5a\x43\x47\xa2\ \xde\x76\xa0\x78\x87\x75\x34\xd9\x2a\xd6\x51\xc0\x11\x79\x2c\x2f\ \xdf\x60\xfd\x07\xdb\x26\x1d\x0c\x5b\x7d\xa8\xe7\xdf\xbe\x12\xa8\ \x56\xc3\x17\x45\x0d\xa6\x27\x57\xe6\x39\xc2\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x08\xb0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ \x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ \x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ \x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ \x46\x00\x00\x08\x26\x49\x44\x41\x54\x78\xda\x62\xfc\xff\xff\x3f\ \x43\x7e\x7e\xfe\x45\x45\x45\x45\xd5\xdf\xbf\xff\xfe\xfd\xcf\xf0\ \x9f\x01\x0e\x80\xcc\x7f\x40\x8a\x09\xca\x41\x92\x01\xcb\x21\x8b\ \xfc\x87\x13\x50\xfe\x7f\x14\xd5\x70\x31\x46\x46\x46\x06\x90\xa9\ \x4f\x9f\x3c\xb9\x3a\x75\xea\x54\x0b\x80\x00\x62\x01\x49\x30\x31\ \x32\xb2\xa7\x65\x15\x70\xfe\xfa\xcd\xc0\xc0\xcc\x0c\x94\xfe\x07\ \x31\xfc\xf7\x1f\x06\x06\x16\x20\xff\xc7\xaf\xff\x0c\x5f\x7e\xfc\ \x03\xdb\xf0\x0f\xe4\x28\xa0\x41\x20\xc3\x40\xec\xff\x50\x87\x80\ \xf5\x80\xc4\x40\xbc\x7f\x30\x35\x08\x31\xb0\xbe\x7f\x10\x87\x68\ \x48\xb1\x32\x34\x54\x16\x72\x81\xd8\x00\x01\x78\x20\x83\x13\x00\ \xa1\x18\x86\x46\xf0\x20\xa8\xe0\x2a\x1e\x1c\xc3\xe1\x5c\xc1\x41\ \x74\x08\x6f\xe2\x02\xde\xf4\x22\xb4\xf4\x57\x53\x50\x0f\xe5\x95\ \x04\x42\x48\xfe\x95\xb3\x04\xcc\x8b\xa2\xa9\x6e\xd4\x45\x86\x4b\ \x1c\xfb\x69\xe8\xbb\x12\xe3\x74\x60\xdb\x95\x61\x0e\x49\x0e\x35\ \x07\xd7\x62\x41\x92\x9b\xc5\x85\xa6\x0c\xd1\xd7\xd7\xf0\xf9\x5b\ \x78\xa4\x50\x13\x4d\x20\xb0\x0e\xed\xbf\xd7\x23\x80\x58\x90\x83\ \xe8\x3b\xd0\xa7\x4c\xdf\xfe\x33\xfc\x05\x3a\x97\x0d\xe8\x73\x1e\ \x0e\x26\x86\x03\x57\xbe\x33\x08\xf3\xb3\x30\x3c\x7c\xf3\x1b\xe8\ \x0b\x46\xa0\x6f\x18\x81\x0e\x01\x06\xe3\x3f\x20\x06\xd1\xa0\x10\ \x05\x31\x61\x0c\x46\x98\x00\x23\x38\xb8\x99\xc0\x5c\x46\x48\x44\ \x02\x43\x83\xe5\x1f\x94\x0b\x05\x00\x01\xc4\x02\x73\x0a\x2f\x27\ \x03\x83\x8b\x01\x1b\x30\xf8\x20\x31\xcb\xcc\xf4\x9f\x01\x14\x2a\ \x3f\x7f\xff\x67\x60\x65\x61\x63\xb0\xd7\xe2\x02\x3a\xe0\x1f\x58\ \xee\xdf\xdf\xff\x10\x36\x90\x03\x72\x2c\x28\x64\x40\xfa\x40\xc1\ \xfe\xef\x1f\x44\x0e\x44\xff\x05\x45\x03\x4c\x1c\x88\x99\x98\x98\ \xc1\x51\xc2\xcf\xc9\xcc\x00\x4b\x22\x00\x01\x04\x0f\x01\x90\xa3\ \xc4\xf8\xa0\xae\x27\x08\xfe\x23\xf0\x7f\x04\xfe\x0f\x4d\x68\x20\ \x07\x31\x40\xd3\x0a\x34\xb5\x32\xfc\xfd\xfb\x97\xe1\xc5\xcb\x17\ \x0c\x82\x02\x02\xc0\x74\x85\xb0\x03\x20\x80\x98\x70\xa5\x58\x5c\ \x00\xec\xb3\xbf\xff\xc1\x71\xfb\xfb\x0f\x28\xee\x81\xf8\x37\x28\ \x8e\xff\x03\x43\xeb\x1f\x14\xff\x67\xf8\x01\xa4\xc1\xf8\x17\x44\ \xee\xe3\x97\xef\x0c\xdb\x77\xee\x65\x78\xf4\xf4\x25\x34\x27\x40\ \x00\x40\x00\x31\x31\x90\x00\xfe\xff\xc7\xef\x73\x64\x75\xe0\x2c\ \x87\xc4\x67\x62\x62\x62\x50\x53\x53\x63\x10\x16\x16\x46\x51\x0b\ \x10\x40\x2c\xa4\x58\x8e\x0b\x43\xe4\xc1\xe1\x03\x76\x1b\x23\x54\ \xe0\x1f\x92\xa3\x99\x81\xf9\x5b\x5b\x5b\x9b\x81\x9f\x9f\x1f\xc5\ \x01\x00\x01\x44\x74\x08\x20\x07\x1b\xb2\x83\x90\x43\x06\xa4\x86\ \x13\x98\x73\xb8\x80\x89\x8c\x8d\x95\x09\xae\x86\x95\x99\x89\x81\ \x87\x93\x85\x81\x9d\x9d\x9d\xe1\xdb\xb7\x6f\x28\xe6\x00\x04\x10\ \x0b\x03\x52\xb2\x6b\x5b\xf9\x00\x9c\xff\x85\xb9\x59\x18\xee\xbf\ \xf9\xce\xc0\xcd\xce\xc4\x20\x2b\xc4\xc1\x70\xff\xf5\x4f\x06\x45\ \x49\x0e\x86\x2c\x2f\x69\x68\x0e\xc0\x4c\x33\xa0\x02\xeb\xd0\x95\ \x4f\x0c\xab\x8e\xbe\x06\xa7\x7c\x75\x19\x4e\x86\x08\x3b\x51\x60\ \x76\xfe\xcf\x30\x7f\xdf\x4b\x86\xeb\x8f\xbf\x31\x78\x1b\x71\x32\ \x58\xaa\xf1\xa1\x78\x06\x20\x80\x98\x60\x59\x00\x54\x52\x9d\xbc\ \xf6\x8e\xc1\x56\x9d\x89\x41\x4a\xf0\x2f\xc3\xe4\x55\x0f\x18\x76\ \x9f\x78\xc9\xe0\xa2\xcb\xca\xa0\x27\xf3\x9f\xe1\xc0\xf9\x67\x0c\ \x5f\xbf\x7d\x67\x60\x62\x86\xe4\x6d\x18\x66\x04\xfb\x1c\x52\x12\ \xea\x2b\x72\x32\x3c\x7a\xfe\x85\x61\xf6\x8a\xc7\x0c\xab\x8f\xbc\ \x62\x60\xfc\xf3\x95\x41\x84\x9b\x89\xe1\xde\xab\x9f\x0c\x3f\xbe\ \xbd\x65\xb8\x77\x66\x1b\x30\x27\xbc\x04\xa7\x07\x18\x00\x08\x20\ \x16\x44\xfc\x31\x30\x94\x86\xcb\x32\x98\x48\xff\x65\x38\xf5\x18\ \xe8\x1d\x5e\x56\x86\x7f\x6c\x7f\x81\x79\xf6\x3f\x43\xac\x9b\x22\ \x83\xa4\x30\x2b\xc3\x93\x97\x1f\x19\x14\x65\xd9\xc1\x1a\xbe\xfd\ \xf8\x0b\x2e\x01\x41\x3e\x67\x67\x61\x04\x8b\x09\x02\x43\x6e\x52\ \x86\x32\x83\x0b\xb0\xd4\x3c\x79\xfd\x0b\xc3\x9c\xfd\x1f\x18\xac\ \x34\xfe\x33\x08\x70\x33\x32\x24\x99\x70\x33\x5c\xbf\x21\x0c\x4c\ \x03\x02\x28\x69\x00\x20\x80\xe0\x89\x10\xe4\x1b\x0b\x35\x41\x06\ \x16\xa6\x7f\x0c\xac\x6c\x3f\x20\xa9\x1b\xa4\x8e\x11\x68\x03\x23\ \x0b\x83\x83\x81\x34\xc3\xbe\x8b\xaf\x19\x2a\x56\x5e\x65\x78\xfe\ \xe1\x27\x83\x9d\x96\x00\x83\x84\x00\x30\xaa\x9e\x7f\x67\xb8\xfc\ \xe4\x1b\xc3\x84\x04\x45\x06\x2d\x69\x4e\x06\x55\x69\x1e\x86\x96\ \x48\x19\x86\xb8\xc9\xf7\x18\xea\x57\x3c\x67\x08\xb0\xf8\xc1\xd0\ \x1d\xc6\x0f\x0c\x29\x66\x06\x33\x0b\x4b\x06\x51\x51\x51\x14\x07\ \x00\x04\x10\x4a\x22\x64\x61\x01\xba\x87\x09\x52\x1a\xa2\xd7\x6a\ \xcc\xc0\x60\x73\x35\x14\x61\xf8\xfa\xe5\x27\xc3\xc9\x53\xef\x18\ \x14\x05\x7e\x33\xc4\x59\x70\x30\x64\x3a\x71\x33\xc8\xf1\xfe\x61\ \xb8\xfd\xf8\x2d\x38\x3a\xbe\x7c\xff\xcb\x10\x6b\x27\xc6\x10\x6d\ \x23\xc8\xc0\xf0\xed\x0f\xc3\xd9\xbb\x9f\x19\x5e\x7e\xfe\xc3\x20\ \x26\x22\x02\xb6\x1c\x1d\x00\x04\x10\x91\xb9\x00\x96\xf0\x98\x18\ \x38\x38\x59\x19\x18\xd8\x18\x19\xb8\x59\x7f\x33\xdc\x79\xcb\xc0\ \x70\xec\xde\x3f\x86\xa6\x68\x65\x06\x09\x1e\x48\x25\xc4\x02\x2c\ \xc2\xef\xbc\xf8\xc6\x20\x2a\xc0\xc6\xa0\xa0\xc8\xc1\xf0\xf8\xf1\ \x4f\x86\x9e\xed\x5f\x18\x18\xc1\xf1\x0e\x2c\xac\x7e\xfe\x44\x31\ \x19\x20\x80\xb0\x96\x03\x4c\x8c\x08\x8b\x99\x18\xff\x33\x30\x20\ \x27\x14\x68\xa2\xbd\xf1\xfc\x0f\xc3\xc6\x4b\x2f\x18\x34\x24\xd9\ \x19\x14\x9c\xc5\x18\x78\x41\x49\xe3\xef\x1f\x86\xaf\xc0\x6a\x7b\ \xd6\xee\x37\x0c\x61\x66\xbc\x0c\x9e\xda\xcc\x0c\x71\xb3\x5f\x33\ \x6c\x38\xf6\x81\x61\xb6\xfa\x73\x06\x7d\x9e\x3b\x0c\xf2\x2a\xda\ \x0c\x3c\x3c\x3c\x70\xa3\x00\x02\x88\x09\x39\xa8\xbf\x7c\xf9\x02\ \x34\xe4\x37\xc3\x4b\x60\x1c\x33\x00\xdb\x06\x1f\xbe\x32\x30\xbc\ \xfe\x0c\xa9\x58\xc0\x55\x18\x23\xa4\x86\x03\x7a\x93\xe1\xde\xcb\ \xdf\x0c\x17\xef\x7f\x65\xf8\xf1\xfd\x0b\xc3\x77\x60\xee\xe0\xe4\ \x60\x63\x78\x03\x0c\xea\xec\x79\x8f\x19\xb8\xd8\x19\x19\x14\x84\ \xfe\x31\x38\x1b\x4a\x30\xe4\x79\x88\x33\x30\x00\x6b\xd9\xfa\x55\ \x2f\x18\x76\x5c\x78\xc7\xc0\x82\x56\xd5\x00\x04\x10\x4a\x08\xfc\ \x03\x5a\x7e\xff\xf9\x0f\x86\x67\xef\xbe\x32\x64\xfb\x0a\x30\xfc\ \xfc\xf6\x95\xe1\xd8\x8d\xf7\x0c\x22\x82\xbc\x0c\x02\x5c\x4c\xd0\ \x74\xc2\x08\x4a\xf6\x0c\xbe\x86\xec\x0c\xbe\x26\x7c\x0c\x17\xee\ \x7d\x04\x57\x3e\x4f\xde\xfd\x61\x38\x7d\x17\x18\xf4\xfc\xcc\x0c\ \xac\xff\xbf\x30\x7c\xfe\xc3\xcf\xc0\xff\x97\x85\x41\x59\x92\x8b\ \x21\x27\x50\x80\xe1\xfd\xc7\xaf\x0c\xff\x79\xe4\x19\xf8\x84\x44\ \x51\x42\x13\x20\x80\x50\x1d\x00\xac\xc3\x85\x81\xd9\x2f\xda\x92\ \x97\xe1\xbb\x2e\xb0\x2a\xfe\xc5\x03\xac\x52\x99\x18\xfe\xfd\xfa\ \xc2\xf0\x93\x85\x0b\x58\x2d\x33\x30\x70\x00\x4b\x38\x4e\x36\x56\ \x60\x45\xc4\xc8\x10\x6a\x2d\xc9\x60\xa0\xc0\xc5\xf0\xf8\xed\x6f\ \x86\xad\x97\xbf\x32\x24\xdb\xf3\x33\x78\x6a\x31\x81\x2b\x1e\x60\ \xa1\x07\x4e\x13\x3e\x86\x7c\x0c\x8e\x2a\xff\x19\xbe\x7f\xe7\x01\ \x9a\xcf\x04\x4c\xcc\x28\x2d\x37\x06\x80\x00\x62\x41\x6e\xab\x81\ \xca\x6b\x70\xf1\xc9\xc0\xca\xc0\xc9\x27\xcc\xc0\xc5\xc8\x08\x2f\ \x4e\x99\x80\x09\xe3\x05\xb0\x85\xf4\xe1\x3b\xb0\xc5\x04\x4c\x88\ \x57\x9e\x33\x30\xa8\x3e\xfc\xc9\xf0\xee\x0b\x2b\xc3\xac\x7d\xef\ \x18\x0c\x65\x99\x19\x98\xff\x71\x32\x30\x73\x0b\x30\x88\x72\x0b\ \x02\xa3\xed\x1f\xd4\x53\x0c\x0c\x9c\xbc\x42\x0c\x5c\x7c\x90\xe8\ \x43\x2f\xd2\x01\x02\x88\x05\x5b\x79\x8f\xac\x08\xd2\xaa\x61\x04\ \x57\x2c\xcf\x3f\x00\xb3\x18\x30\x74\xbc\xd5\x7f\x02\x0d\xfe\xcb\ \xf0\xe8\xd5\x37\xa0\x38\x33\x83\x8f\x1e\x30\x21\xf2\x7d\x63\xf8\ \x09\x6c\x25\xb1\x03\x53\x28\xc8\x72\x98\x03\x30\x8a\x6c\x16\x94\ \x26\x08\x03\x40\x00\xb1\xe0\xab\x70\xd0\xf3\xab\xa1\x02\x07\x83\ \x8e\x04\xa8\x6d\x27\x0e\x0e\x47\x26\x60\x88\x81\x42\xe6\xff\x3f\ \x16\x60\x9d\xcf\xc5\xc0\xc2\xc6\x09\x2e\x66\xe7\xce\x9d\x8b\x56\ \x51\x21\x95\x27\x40\x3d\xbf\x7e\xfd\x02\x39\x10\xec\x42\x80\x00\ \x22\xda\x01\xb0\x34\xc2\xc2\xc1\xcb\xc0\xca\xc9\x88\xd1\xd4\xe6\ \x04\x37\x56\xa0\xc1\x0e\xa4\x93\x93\x93\x19\x38\x39\x39\x51\x4a\ \x3d\x36\x36\x36\x86\x77\xef\xde\x31\xd4\xd6\xd6\xbe\x9a\x35\x6b\ \x56\xf0\xcc\x99\x33\x19\x00\x02\x88\x24\x07\xe0\x6a\xf3\xc3\xf8\ \xe0\xe8\x02\x86\x00\x2c\xae\x91\x31\xc8\xe7\x1f\x3f\x7e\x64\xa8\ \xab\xab\x7b\x35\x6d\xda\x34\x3b\xa0\xf2\xbb\x20\x3d\x00\x01\x44\ \x96\x03\x08\xb5\x1b\x40\x0e\x02\x05\x33\xac\xd6\x03\x85\x04\xc8\ \xe7\x20\xcb\x81\x9d\x11\x90\xe5\x37\x61\xea\x01\x02\x88\xea\x0e\ \x80\x59\xfa\xe7\xcf\x1f\xb0\x23\x38\x38\x38\x18\x5e\xbf\x7e\xcd\ \xd0\xdc\xdc\x8c\x61\x39\x08\x00\x04\x10\x4d\x42\x00\x04\x7e\xff\ \xfe\x0d\xf6\xf9\xdb\xb7\x6f\x19\xda\xdb\xdb\x61\xc1\x7e\x13\x5d\ \x3d\x40\x00\xb1\x30\xd0\x08\xb0\xb2\xb2\x02\x2b\xa2\xc7\x0c\x40\ \x8b\x71\x5a\x0e\x02\x00\x01\xc4\x82\x9c\x27\x41\xa9\x94\x1a\x00\ \x94\xd7\x6f\xdc\xb8\xf1\x67\xc9\x92\x25\xcf\xe6\xcc\x99\xe3\x86\ \xcb\x72\x10\x00\x08\x20\x46\x50\x82\xc9\xc9\xc9\xb9\x2c\x2b\x2b\ \xab\xf5\x17\xd4\x7b\xa0\x42\x14\x7c\xff\xfe\x9d\xe1\xc5\x8b\x17\ \x4f\x66\xcf\x9e\x6d\x0e\x14\x7a\x8d\x2f\x37\x01\x04\x10\x23\x34\ \x1f\x0b\x81\x3a\xad\xa0\x72\x02\xb5\x93\x4d\x9e\x1b\x80\x18\xe4\ \x91\x1b\x40\xfc\x8e\x50\x76\x06\x08\x30\x00\x98\x98\xce\x48\x79\ \x15\x57\x3b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0b\xe5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\ \x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0c\x02\x0b\x15\ \x1a\x1d\x56\x93\x49\x00\x00\x01\x27\x49\x44\x41\x54\x28\xcf\x6d\ \x90\xb1\x4a\x03\x41\x14\x45\xcf\x9b\x99\xcd\xaa\xd1\x40\x0c\x01\ \x1b\x2b\xc1\x4e\x6d\xe2\x0f\xd8\x09\x69\xec\x05\xed\xfd\x02\x41\ \xd0\x4e\xf4\x17\x6c\x6c\x6c\x6d\x04\xed\xc5\xc2\xce\xca\x46\x50\ \x03\x82\xa0\xa0\x46\x45\x92\xec\xce\xcc\xb3\x31\x6e\x8a\x7d\xe5\ \xe1\x70\xb9\xef\x0a\xff\x77\xd0\x5e\x3a\xd2\x9e\x8a\x8c\x3d\x6c\ \x6f\x1d\x0f\xa9\x2b\x84\xf9\x95\xe5\x99\x9c\x00\xc4\x36\x65\x82\ \x0f\x3d\x72\x14\xc5\xfb\x82\x8e\x08\xb9\x66\x43\x81\x52\xa1\xdf\ \x1b\xe0\x89\x00\x59\x41\xe5\xf0\xb4\xb5\x96\x87\x20\x41\xd3\xd8\ \x4c\x02\x11\xc7\xf5\xe0\x39\x58\x04\x67\xbf\xcf\xdd\x5c\x6b\x96\ \xcc\x7a\x3c\xc1\xf6\x15\x31\xdc\x6a\x37\xad\xe3\x48\xa8\x20\x2d\ \x37\xf0\x03\x32\x02\x9e\x88\x97\x7b\x1e\x11\x49\xf1\x28\x20\x84\ \xe0\xbe\xc4\x20\xbc\xf3\xc2\x2b\x1d\x2a\x54\x48\xfe\xaa\x0a\x42\ \xc4\xdd\xa4\x77\x78\x14\x83\x21\x51\x15\x0f\x8a\x08\x86\x80\x25\ \xa6\x2e\xdb\xd1\x55\x72\x20\xca\x62\x75\x41\xf1\x58\xe9\x76\xb2\ \x2b\x63\x2d\x26\xf9\xb9\x90\xe2\xa1\x8d\xdd\xc6\x1e\xd4\x98\xe4\ \xed\x64\x7f\xbd\x64\x87\x98\x08\xd3\x34\xa8\xe1\x6d\xe9\x50\x4a\ \x95\x3a\x0d\x9a\x7c\x8e\xe4\x9a\x11\xc1\x4d\x30\x45\x9d\x19\x26\ \x93\xd2\x04\x7f\xf9\xb1\x69\xfb\xb9\xe9\x8f\x3f\x9d\x15\xf4\x17\ \xfc\xbc\x76\xcb\x21\xed\xb3\x6d\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x06\x3a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x05\xcc\x49\x44\x41\x54\x78\xda\x62\ \xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x62\x18\x60\x00\x10\x40\ \x2c\x30\x06\x23\x23\x23\x41\xc5\xd6\xd6\x51\x0a\x40\xca\x01\x88\ \xed\x81\x58\x01\x16\x7a\x50\xfa\x01\x90\x3e\x08\xa4\x0f\x9c\x38\ \xb1\xf2\x01\x21\xb3\x60\x7a\x01\x02\x88\x11\xce\xc0\xe3\x00\x1b\ \x9b\x18\x90\xa5\xf5\xff\xff\xff\x73\x80\xa8\x65\x62\x60\x65\x85\ \xb8\xfd\xdf\x3f\x88\xfe\xdf\xbf\x7f\x01\xd9\xff\xc0\x06\x03\xd5\ \x1d\x00\x0a\x35\x9e\x3a\xb5\xe6\x00\x21\x07\x00\x04\x10\x5e\x07\ \x00\x2d\x16\x00\x52\xf3\x81\x38\x00\xc4\xe7\xe2\xe2\x64\x90\x93\ \x93\x63\xb0\xb2\x32\x02\xb2\x39\x18\x34\x35\x15\xc0\xea\xde\xbc\ \xf9\xc8\xf0\xfa\xf5\x7b\x86\x63\xc7\xce\x33\x5c\xbd\x7a\x8d\xe1\ \xeb\xd7\xaf\x0c\x7f\xff\xfe\x01\x49\x6d\x00\xe2\xc4\xd3\xa7\xd7\ \x7e\xc0\xe5\x00\x80\x00\xc2\xe9\x00\xa0\xe5\x06\x40\x6a\x3d\x28\ \xa8\x41\x16\x1b\x1b\x1b\x32\x04\x06\x3a\x31\xa8\xab\xcb\xe2\x0d\ \x5a\x90\x63\xd6\xaf\x3f\xc8\xb0\x6d\xdb\x2e\x86\xcf\x9f\x3f\x81\ \x2c\x02\x45\x47\xe0\x99\x33\xeb\x2e\x60\x73\x00\x40\x00\x61\x75\ \x00\xd4\xf2\xfd\x40\x31\x01\x09\x09\x09\x86\xe4\xe4\x50\x06\x3d\ \x3d\x65\x92\x12\xd7\xd3\xa7\xaf\x19\x66\xcd\x5a\xc3\x70\xf1\xe2\ \x05\x60\x68\xfc\x05\x85\x80\xe3\xd9\xb3\xeb\x2f\xa0\x3b\x00\x20\ \x80\x30\x1c\x00\x0d\xf6\xf3\x40\xbe\x82\x94\x94\x14\x43\x56\x56\ \x14\x83\x94\x94\x08\x59\x29\xfc\xfb\xf7\x9f\x0c\xcb\x96\x6d\x67\ \xd8\xbb\x77\x1f\x28\x7d\x80\x12\xa9\xe1\xb9\x73\x1b\x3e\x20\x3b\ \x00\x20\x80\xb0\x65\x43\x50\x9c\x2b\x88\x89\x89\x31\x24\x26\x06\ \x33\xf0\xf1\x71\x33\x7c\xf9\xf2\x1d\x18\xb7\xf7\x19\xfe\xfc\xf9\ \x03\x66\xe3\xc3\xa0\x28\x60\x65\x65\x06\xb3\xff\xfe\xfd\xc7\x10\ \x10\xe0\xc8\xa0\xad\xad\x03\xb2\x50\x01\x6a\x36\x0a\x00\x08\x20\ \x26\x2c\xa9\x3d\x00\x14\xe7\xbe\xbe\x2e\x0c\x3c\x3c\x9c\xc0\x04\ \xf5\x9d\xe1\xc2\x85\xdb\x0c\x3a\x3a\x8a\xc0\xf8\x97\x83\x8b\x61\ \xc3\x2f\x5e\xbc\x05\xaa\x53\x00\x26\x54\x71\xb8\xba\x3f\x7f\xfe\ \x32\x84\x85\x79\x31\x88\x89\x49\x80\x1c\x11\x60\x68\xe8\xef\x80\ \x6c\x27\x40\x00\xa1\x87\x40\x3d\x88\x50\x51\x51\x61\x90\x90\x10\ \x06\xfb\xe2\xf6\xed\x27\x0c\xb6\xb6\x7a\x0c\x4a\x4a\x52\x60\x05\ \xca\xca\x52\x0c\x02\x02\x3c\x18\x3e\x7f\xfd\xfa\x03\xd0\x03\xba\ \x0c\xdc\xdc\x9c\x18\xea\x98\x98\x18\x81\x72\xe6\x40\x9a\x09\x14\ \x15\xf5\xc8\x16\x02\x04\x10\x13\x72\x21\x03\xca\xe7\x20\xdf\xeb\ \xe8\xa8\x01\x35\x7e\x03\x63\x79\x79\x09\xb8\xe5\x30\xa0\xa5\xa5\ \xc0\x20\x22\x22\x00\x57\xf3\xe1\xc3\x67\x06\x17\x17\x63\xb8\xe5\ \x30\x20\x28\xc8\x0b\x96\x7f\xfa\xf4\x15\x38\x3a\x78\x78\xf8\x40\ \xc2\x0e\xfa\xfa\xbe\x0a\x30\x35\x00\x01\xc4\x82\xa4\xde\x01\xa2\ \x49\x08\x9c\xc7\x41\x2e\x07\x01\x10\x7d\xf4\xe8\x15\xa0\x03\x75\ \x50\x0c\x37\x32\x52\x65\xf8\xf9\xf3\x17\x30\x84\x1e\x33\x04\x07\ \xdb\x63\x58\xfe\xec\xd9\x5b\x86\x99\x33\xd7\x32\x3c\x78\xf0\x04\ \x5c\x2e\x80\x00\x2f\x2f\x2f\xd0\xb1\xef\x40\x51\x01\xb2\x6b\x01\ \x48\x0c\x20\x80\x90\x1d\x60\x0f\x2a\xe1\x44\x44\x84\xc1\xae\x46\ \x06\x17\x2f\xde\x02\x5b\xe6\xe4\x64\x84\x22\x6e\x69\xa9\x0d\xcc\ \x9e\x4a\x18\x96\x3f\x7a\xf4\x92\xa1\xb6\x76\x2a\xdc\x62\x18\x60\ \x63\x63\x03\x47\x03\x30\x5b\xda\xc3\x1c\x00\x10\x40\x2c\x48\xf9\ \x52\x81\x8d\x8d\x05\x1c\x5f\x9f\x3f\x7f\xc5\xc8\x1a\xa7\x4f\x5f\ \x65\xf8\xf1\xe3\x17\x83\x97\x97\x05\x8a\x38\xb1\x96\x23\x1c\xc1\ \xce\xf0\xed\xdb\x57\x78\x14\x00\x04\x10\x0b\xba\x02\x90\x4f\xb1\ \x39\x00\x04\x8e\x1d\xbb\x00\x74\xc4\x4f\x86\xa0\x20\x7b\xac\xf2\ \x84\x2c\xc7\x06\x00\x02\x08\xc5\x01\xa0\x8a\x05\xe2\x80\x2f\x38\ \x35\x5c\xbd\x7a\x97\xc1\xdd\xdd\x0c\xc3\xe7\x20\x70\xe0\xc0\x79\ \xa2\x2c\x07\x26\x76\x38\x1b\x20\x80\x58\xd0\x8b\xc6\x5f\xbf\x7e\ \x31\x7c\xfa\x84\xdd\x01\x92\x92\x62\x0c\x45\x45\x91\x58\x2d\x07\ \x81\xb8\x38\x0f\x70\xde\xdf\xbb\xf7\x08\x5e\xcb\x91\x1b\x41\x00\ \x01\x84\x1c\x02\x0f\x40\x55\xea\xef\xdf\xbf\x41\x89\x04\x43\xa3\ \x8c\x8c\x14\x43\x75\x75\x22\x4e\xcb\x61\x20\x33\x33\x10\x4c\xe3\ \x72\xc4\xf7\xef\xe0\xdc\x05\x6f\x2f\x00\x04\x10\x13\x52\x08\x1c\ \x04\xd5\xe7\xa0\x10\x00\xd1\xc8\x58\x4a\x4a\x82\xa1\xb1\x31\x0d\ \x6b\x82\x5b\xb4\x68\x07\x56\x47\x38\x3b\xdb\x80\xeb\x17\x64\xfc\ \xf3\xe7\x4f\xa0\x79\x7f\x19\xa0\x0d\x17\x30\x00\x08\x20\xe4\x10\ \x38\x00\x92\xfc\xfa\xf5\x0b\x30\xa5\x0a\xa1\xf8\xbc\xb9\x39\x03\ \xab\xe5\xf5\xf5\xd3\xc1\x71\xfe\xed\xdb\x0f\x86\x8c\x8c\x00\x0c\ \x47\x80\x2c\xdd\xb7\xef\x28\x5c\xec\xd3\xa7\x4f\xb0\xe0\x87\x37\ \x54\x00\x02\x08\x1e\x02\xd0\x66\xd4\x01\x90\x81\xac\xac\xac\x0c\ \xec\xec\xec\x60\xac\xa8\x28\x8b\x61\xf9\xe3\xc7\xaf\x18\xda\xda\ \xe6\x82\x2b\x27\x90\x9a\xa3\x47\xcf\x30\xcc\x9b\xb7\x05\x23\x24\ \x54\x54\x64\xe0\xe6\xb0\xb0\xb0\x80\x0b\x21\x90\x1d\xd7\xae\xed\ \x84\x47\x01\x40\x00\xa1\xd7\x05\x8d\xa0\x96\xcc\x87\x0f\x1f\x18\ \x38\x39\x39\xc0\xf8\xf2\xe5\x1b\x28\xc1\xfc\xf4\xe9\x1b\x86\xde\ \xde\xc5\xe0\xa8\x81\xa9\x01\xe1\x13\x27\x2e\xa0\xa8\x3b\x79\xf2\ \x3a\xc3\xaa\x55\x3b\xe0\xf2\x6f\xde\xbc\x86\xb5\x92\x1a\x91\x2d\ \x04\x08\x20\x8c\xf6\x80\xa9\x69\xf0\x7a\x50\xad\xa5\xae\xae\x09\ \x2c\x96\x05\x90\x4a\x3d\x03\x60\xa9\xa7\xc2\xb0\x78\xf1\x16\x70\ \x90\xe3\x02\x20\x75\x32\x32\x62\x0c\xab\x57\xef\x42\x6a\x25\xbd\ \x65\xb8\x74\xe9\x3c\x28\xf8\x37\x5c\xbf\xbe\x2b\x10\x39\xd7\x01\ \x04\x10\x86\x03\x4c\x4c\x82\xc0\x0d\x12\x66\x66\x16\x05\x43\x43\ \x43\x60\xf9\xcd\x4d\x51\xb3\x1b\x94\xa5\x8f\x1f\x3f\x06\x6a\xb4\ \x82\x82\xdd\x10\xe8\x00\x94\x06\x09\x40\x00\x61\x6d\x92\x19\x1b\ \x07\x82\x9b\x64\x2c\x2c\xac\x02\x7a\x7a\x7a\xe0\xfc\x4f\x0e\x78\ \xfa\xf4\x05\xc3\x99\x33\xa7\x81\x39\xeb\x27\xb8\x49\x06\xb4\x1c\ \xa3\x49\x06\x10\x40\x38\x1b\xa5\x20\x47\x00\xe5\xc0\x8d\x52\x15\ \x15\x35\x60\xab\x46\x1d\xde\x14\x27\x04\x7e\xfd\xfa\x0d\x4c\x3b\ \xd7\x19\xae\x5f\xbf\x02\x6f\x94\x22\x5b\x8e\xec\x00\x80\x00\xc2\ \xdb\x2c\x37\x32\x0a\x10\x00\xca\x83\x9b\xe5\xa0\x9c\xa1\xac\xac\ \x0a\x4c\xd9\x0a\xc0\xb4\xc1\x8f\xd5\xe2\x77\xef\x3e\x02\xab\xe7\ \x7b\x0c\xb7\x6e\xdd\x00\xe6\xf9\x1f\xe0\x38\x07\x35\xcb\x61\xc1\ \x8e\xcd\x01\x00\x01\x44\x54\xc7\x04\xd4\x8c\x82\xb6\x64\x1c\x40\ \xea\x41\xd9\x4a\x44\x44\x8c\x01\xd1\x33\xfa\xc7\xf0\xe4\xc9\x23\ \x64\x83\xc1\x1d\x13\x60\x76\x23\xd8\x31\x01\x08\x20\xa2\x1c\x00\ \x03\xa0\x96\x0c\xb4\x31\x61\x0f\x6d\x64\x22\x97\xed\xf0\xae\x19\ \x72\x3e\x27\xe4\x00\x80\x00\x62\x1c\xe8\xde\x31\x40\x00\x0d\x78\ \xef\x18\x20\xc0\x00\xed\x4c\x16\xa8\x71\x99\x0f\x36\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xe3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x06\x60\x49\x44\ \x41\x54\x78\xda\xad\x96\x5b\x6c\x14\x55\x18\xc7\xff\x67\xce\xec\ \xb5\x74\x4b\xd9\x72\x69\x2a\x4a\x41\x45\x2a\x97\x02\x51\x54\x42\ \x30\x8a\x51\x7c\x40\x82\x18\xa3\x26\x18\x89\xc4\x47\x15\x1f\x84\ \xf8\xa2\x26\x1a\xa3\x09\x89\x31\x26\x3c\x28\x1a\x63\x48\x44\x88\ \x1a\x83\x1a\x95\x07\x08\xc1\x48\x02\x91\x08\x88\x29\x57\xa1\xb4\ \xa5\xd7\xdd\x99\xdd\xee\xcc\x9c\x8b\xdf\x9e\xdd\x61\xb2\xae\x5b\ \x2f\xe9\x37\xfd\xf6\xec\x9c\x33\x3d\xbf\xff\xf9\x7f\x67\x66\xd6\ \xd6\x5a\xe3\xff\xc4\x96\x1f\x96\xb7\x43\x63\xb3\x06\xee\xe6\x8c\ \xaf\x00\x90\x92\x4a\x0c\x68\xa0\x97\x72\xe7\xae\x07\x8f\xef\xc6\ \xbf\x08\xfb\xff\xc0\x37\x7f\xbb\xb4\x1b\x96\xf5\xfd\x93\x0b\x5e\ \x9b\xbe\xb0\x6d\x39\x92\x3c\x0d\xa1\x05\xf2\x7e\x6e\xee\x50\xf1\ \xda\xdc\xef\x2e\x7d\xbc\x6a\xd3\xb7\xcb\x9e\x02\xf0\xe4\x27\x6b\ \x8f\xe7\x26\x55\x00\x63\x0c\x9b\xf6\x77\xbf\xbb\xb6\xf3\xf9\xe9\ \x2b\xda\xef\x45\x21\x70\x91\xf3\x73\xf0\xa5\x0f\x4f\x79\xe0\x3c\ \x8e\xb5\x9d\xcf\xe2\xa3\xe2\xf0\xc3\xa3\xce\xd9\x17\x01\xbc\x3a\ \xd9\x0e\x30\xa9\x31\xef\x40\xef\x01\xdc\xdd\xbe\x1a\x52\x4b\x78\ \x04\xf7\xa5\x47\x2d\xa5\xf2\x71\xc9\xb9\x88\x9e\xdc\x05\xb4\x48\ \x3d\xb3\x2c\x98\xca\x3c\xb9\x25\x28\x39\xea\xf3\x61\x79\xf2\x85\ \x43\x57\x0f\xa2\x7b\xfa\x52\x03\xf7\x95\x6f\x04\x04\x2a\xc0\xa1\ \xab\x07\x90\xe1\x4a\xe5\xaf\xf8\x9f\x00\x60\x94\xfa\xbf\x0a\x30\ \x56\x3f\xfe\x65\xf7\xd3\x60\x98\xad\x00\x1f\x0a\xbe\x06\xc4\xc6\ \x2f\xba\xdb\xb4\xc6\xd2\x8e\xd4\x0c\x64\x53\xad\x18\x97\x05\x63\ \xbf\xaf\x22\x17\x6e\x6c\x9e\x85\x31\xe7\x34\xd2\x1d\xea\xc3\x75\ \xfb\x96\x9c\x7a\x64\x5f\x77\x8f\x06\x04\x22\x25\x5a\x29\x1c\xde\ \xff\xd8\x2f\x3f\xd8\x8d\xe0\x1b\xf6\x2e\x79\xae\xc4\xad\x9d\x5b\ \x16\x6d\x87\x05\x46\x00\xcf\xfc\x77\xc2\x4e\x63\xc4\x1b\xc2\xf2\ \x19\x2b\xe1\x04\x8e\xd9\x03\x01\xc1\xbd\x8a\x00\x73\xdd\xed\x6d\ \xdd\xb8\x6b\xd6\x6a\xeb\xf8\xd0\xcf\x0b\x3c\x51\x5c\x10\x08\xcf\ \x5c\xd3\x9e\x9e\x0d\x01\x1f\x17\xf3\xe7\x70\x76\xe0\xd7\x3c\x71\ \x5a\x1b\x39\x60\x05\xbe\xea\x9a\xd6\x7a\x03\xee\x99\x75\x1f\x0a\ \x82\x20\xba\x0c\xa8\xd8\x9c\x4d\xcf\xc4\x50\xe9\x5a\x65\xd5\xca\ \x4c\x1e\x96\xc1\xa4\x13\x8c\xe9\x3e\xd5\x8b\xb8\x1d\x67\xb0\x00\ \x66\x73\x40\xd9\xe8\x0b\xfa\xcd\xf5\xb1\x44\x02\x02\xc8\x94\x39\ \x0d\x4b\x20\x24\x9a\xb2\xc9\x36\x14\xa5\x4b\x59\x20\x88\x17\x59\ \xad\x0c\xac\x06\x1c\x54\xfa\x6a\x45\xe9\xf2\xe1\x45\x7d\xda\xf4\ \x81\x33\x8b\x49\xa5\x8d\xd9\x8d\x04\x30\x1a\x4f\xb5\x26\xb3\x28\ \x0a\x17\x25\x59\x0c\x81\x11\x9c\xc0\x51\x5f\xed\x77\x82\xb0\x40\ \x1b\x11\x95\x7e\x1d\xc2\x2b\xdf\xc1\x92\x90\x1a\x13\x0b\x90\x0a\ \xc9\x4c\x7c\xaa\x71\xc0\x93\xa5\x68\xb2\x5a\x98\x69\xcd\xe4\xb5\ \x90\xda\xb6\xfa\x5d\x50\x6b\x73\x0e\xcb\x92\x90\x0a\x26\x1a\x3b\ \xc0\x59\xfb\x94\x78\x13\xc6\x49\x40\xf0\x8f\xc0\xa8\x4f\x44\x22\ \xc2\x7e\x3a\x3c\x82\x5a\x48\xf3\x14\x72\x62\x14\xf9\xd2\x08\x13\ \x2a\x74\x20\xda\xf9\xd6\xbd\x1f\x2d\x7a\x00\x9c\xcd\x58\xb2\x7d\ \xee\x11\xc4\xd8\xb2\x4c\xb2\x19\x9e\x2a\xd6\x41\x83\x5a\x80\x19\ \xaf\x1b\x03\xb5\xf0\x34\x23\x70\xc2\xb2\x99\x13\x8c\xc2\x15\x39\ \x0d\x06\x72\x01\x51\x09\x42\xf8\xaa\x5d\x0b\xdf\x58\xdc\xb9\x74\ \xdb\x4d\x53\xe7\xe0\xeb\xf8\x57\x45\x3b\xc1\x13\x73\x9b\xe7\x63\ \xc8\xef\x37\x93\x8a\x68\x95\x04\xac\xb5\x35\x80\x19\xa7\xf4\xae\ \xc3\x61\x31\x10\x07\x79\x31\x04\xc7\x77\xc1\x2c\x0d\x6e\x13\x0a\ \x28\xa3\xa3\x12\x30\x8a\x15\xef\x77\x6d\x6c\x9e\x96\xd9\xf6\xd2\ \x1d\xaf\x60\x38\x18\x40\x53\xca\x4e\xdf\xd2\xbc\x84\x26\x2b\x51\ \x16\x2b\x36\x2a\x9f\x85\x80\x0a\x3c\xa8\xc2\x22\x37\x34\x53\xe0\ \x5c\x99\xa7\xa1\x2b\xc6\xca\x1b\xd8\xec\xf6\xf3\x97\xc8\x0b\x4f\ \xc9\x4c\xc6\xe2\xe9\xb4\xc5\xa4\x00\xfc\x92\xbc\x60\x04\x94\x53\ \x73\xf6\xe8\xfa\x05\xeb\x30\x14\x5c\x85\x4b\x35\xba\xb9\xf5\x56\ \x28\x14\x31\xe8\x5f\x33\x70\x4a\x16\x42\x04\x08\x8c\x8a\x10\x81\ \x0a\x54\xb2\x12\xf5\xb8\x28\x88\x3c\xc6\x95\x8b\x6a\xe8\x18\x2d\ \xef\xf2\x65\x81\x91\xf3\xe3\x7b\xfa\xf6\xf5\xbf\xd7\xb6\x26\xfb\ \x10\x6f\x89\x75\x29\xa1\x47\x0a\xa7\x9c\x0f\x00\x08\x1b\x80\xa5\ \x6c\xeb\xb6\x99\x4d\x33\xe0\x88\x41\x52\x7f\xdd\x6e\x6d\x20\x51\ \x4d\x21\x21\x8c\xcd\x25\xed\xa2\xa4\x0a\x26\x1d\x39\x06\x5f\x8d\ \x83\x99\x5a\x02\x31\x8e\x30\x98\x06\x90\x2f\x28\xb8\x17\xc7\x77\ \xe5\x8f\xe5\x8e\x95\x13\x30\x95\x51\x94\x41\x28\x80\x6b\x9b\xcd\ \xe3\xb6\x40\x9e\x04\xd0\xa6\xd3\x9e\x2a\xd1\x8a\xc7\x19\xd5\xdb\ \x4c\x5e\x34\x2b\x23\xa0\x2c\xc0\xa3\x56\xd1\xc1\x34\x43\x85\x4a\ \x50\xcb\x82\x09\x8d\xeb\xad\xa6\x43\x11\x26\x57\x50\x7a\xf4\xd0\ \xc8\x09\x80\x74\x53\xfc\xf5\xed\x68\x53\x9a\x3a\xfd\x34\xf8\x0d\ \x5c\x39\x18\xde\x11\x13\xbc\xbf\x18\x1d\x76\xa3\xf1\x50\x80\xd1\ \x66\x51\x72\xce\x58\x66\xd5\xb4\xd6\xe2\x19\xb7\x1f\x40\x08\xaf\ \x11\x00\xbf\xa0\xce\x5d\x1b\x73\x16\x37\xa5\x62\x9a\xa2\xac\x40\ \xff\x05\xc0\xcc\x39\x8b\x4e\x6b\x57\x1c\x76\xd5\xc7\x94\x78\x0c\ \xa3\xb3\x12\xab\x00\x9c\xeb\x78\x7d\xfe\x7c\x2b\xc9\xa7\x5d\x79\ \xf9\xb7\xc3\x00\x24\xb1\x8c\x00\xe5\xbb\xf2\xcc\x40\xae\xb0\x78\ \x0e\x4f\x93\xb3\xa1\x02\x33\x67\xc5\x4b\x56\xfd\x8c\x8c\x89\xc0\ \x7f\x73\xae\x59\x78\xae\x31\x27\xdb\x84\x91\x0e\xbc\xdd\xb1\xa3\ \xeb\xb1\x64\xb3\x7d\x7f\x36\xd5\xcc\xe4\x8e\xae\xbd\x7d\x5b\x4f\ \x3f\x11\xee\x01\xe1\xf6\x14\xf6\xf4\xb4\xc5\xd7\xa7\xe9\xf5\xd5\ \x92\xb2\xd9\x40\xde\xc3\x1f\xc3\x25\xdc\xd9\xd9\x52\xc7\x6a\x1c\ \x86\x57\x17\x99\x14\xc3\x9a\xdb\xe6\xb7\x70\xd8\x6b\x8a\xb8\x84\ \xe9\xa9\x0e\xec\x76\xdc\x0d\x2d\xcf\xcc\xee\xa4\x52\xf7\x18\x01\ \xfd\xbb\x2e\xff\x28\x7d\xbd\xf5\xe8\x4a\xfd\x96\x65\x5b\x53\x02\ \x47\xf4\xb2\x24\x6b\x63\x68\x4a\x78\xd2\x69\xe4\x6f\x9d\x38\xe3\ \x5d\xfd\x10\x0b\xd0\x0b\x7a\xb4\x40\x0a\xa0\xbf\x78\x05\xd9\x66\ \xdb\x72\x3b\x52\x65\x07\xde\xb4\xab\x3b\xd3\x19\xfc\xf4\xca\xa7\ \x23\xfb\x07\x0e\xd9\x6d\xf1\x56\xaf\xa7\x90\xef\x78\xa7\x6b\x2f\ \x64\xd3\x3c\x4f\xe4\x19\xa8\x2c\xa1\xff\x06\x56\xcf\x30\xad\xae\ \xb7\x8b\x85\xc6\x78\xc2\x45\x58\xd1\x54\x8c\x33\x69\x5b\x8b\x00\ \xd8\x76\x75\x67\x2a\x12\x91\x97\xa3\xc1\xef\x94\x16\x80\x94\x28\ \xc9\xcb\x5e\xc0\xe7\x79\x52\x85\x7b\xbf\x51\x19\x22\xb8\x8e\x36\ \x8d\x21\xd7\xee\x08\x54\x59\xe0\x1c\x50\x1c\x37\x01\xe0\x76\x34\ \x60\x84\xfa\xe1\xbb\x41\x94\x54\x5f\x20\x38\xaa\x02\xea\xca\xa0\ \xeb\x35\x40\x37\x18\xd5\x91\x53\x15\x01\x8c\x81\x1c\x68\x9f\xe8\ \x17\x91\x96\x12\x81\xd4\x1c\xa5\x40\x55\xf9\xd5\x3b\x51\xd7\xdd\ \x81\xf5\xa1\x1b\xdd\xa5\xda\x08\x08\x84\x86\x04\x52\x13\x09\x80\ \xd4\x46\x04\x8a\x42\x69\x18\xb0\xd9\x08\xd1\xe4\x13\x42\x6b\xc9\ \xda\xb4\xd1\x13\x92\xa6\x64\x12\x6c\x62\x01\x4a\x69\x75\x72\xb8\ \x07\xf1\x98\x62\xd5\xb2\xd4\xdc\x6a\xd5\x49\x23\x4e\x4d\x7f\xc8\ \xae\xbf\x4b\xe8\xc3\x9c\x4b\xc6\x12\x13\xfd\x24\x93\xde\xd1\xb1\ \xcf\xce\xb7\xc6\xd7\xe9\x84\x95\xad\x01\x53\xd6\x9d\x6b\xfa\x6b\ \x30\xd6\x30\xc6\xfc\x13\x00\x54\x23\x01\x81\x38\x38\x74\x84\xf2\ \x3e\x00\x2d\x94\x16\x26\x2f\x34\xa5\xa0\x1c\xa4\x2c\xfe\xad\x80\ \xea\xb3\xc1\x05\xf0\x3b\x25\x47\x18\x93\x2f\x22\xf8\x13\x62\xae\ \xce\x87\x97\xf9\xa4\x77\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x07\x04\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\xbb\x7f\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\ \x7d\xd5\x82\xcc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x0c\x07\ \x08\x34\x20\xa9\x01\xc2\xd6\x00\x00\x06\x84\x49\x44\x41\x54\x58\ \xc3\xc5\x97\x4b\x6c\x94\xd7\x15\xc7\x7f\xe7\xde\xf9\x66\xc6\x63\ \xe3\x19\x30\x60\x9b\xf2\x90\x43\xc0\xbc\x94\x44\x41\xa4\x69\x44\ \x49\x90\x22\x12\x89\x4d\xbb\xaa\x42\x17\xdd\x77\x5b\x45\xaa\xba\ \xec\xb2\x4a\x55\x55\x42\x2c\x5a\xa9\xab\x76\x11\xa4\xd2\xb2\xa8\ \x9a\xb4\x8d\xaa\x50\x1a\x44\x4c\x9b\x56\x14\x05\xc2\xcb\xf6\xf8\ \x09\x63\xec\xc1\x0f\x66\xbe\xef\xde\x73\xba\x18\x03\x2e\x60\x63\ \xd4\x05\x47\x3a\x8b\x2b\x5d\xdd\xff\xff\xfe\xcf\xb9\xf7\x9c\x23\ \x66\xc6\xf3\x34\xc7\x73\xb6\xe7\x4e\x20\xb7\x74\x21\x22\x79\xa0\ \xfd\xff\x24\x66\x8b\xae\x40\x0a\xa4\x66\x16\x97\xdb\x2c\xf7\x73\ \x40\x44\x3c\xb0\xf5\x47\x27\x3f\xbb\x9a\xf3\x4e\x92\x9c\x27\x97\ \x73\x24\x22\xe2\x73\x9e\xc4\x0b\xce\x39\xbc\x13\xbc\xc8\x83\x03\ \xd4\x40\x4d\x89\x6a\xdc\x4b\x33\xad\xd5\xe7\x74\xbe\xd1\x0c\x73\ \x0b\x8d\x74\xe1\x5e\x63\x3c\x4b\x9b\x17\x66\x6b\x93\xbf\xf8\xf3\ \x07\x3f\xf8\xbb\x99\xe9\x4a\x0a\x78\xa0\x12\xcd\x9c\xa8\xe1\xd4\ \x70\x51\x09\xce\x23\x51\x09\x78\xf1\x66\x58\x34\xa2\x08\x4e\x5a\ \xe0\x73\x77\x67\xa8\x4f\x4d\xb1\x61\x6b\x1f\x62\xde\xaf\x29\xb4\ \xb9\xcb\x03\x67\x73\xbe\xbd\x5c\x6c\xef\xed\xeb\xd4\x7c\x7e\x57\ \x5b\xd4\xaf\x03\x07\x80\xfa\x8a\x21\x00\xbc\x46\x40\x20\x06\xc3\ \x19\xe0\x0d\x07\x98\x29\x26\x82\x13\x07\x18\x21\x6b\x90\x35\x33\ \xd2\x34\x30\x3e\x74\x93\x3b\xb5\x9a\xf5\xbe\xb0\x1b\x5f\x28\xb0\ \xa5\x6f\x37\x23\xc3\x37\xc8\xfb\x1c\x51\xcd\x52\x91\x36\x20\x59\ \x55\x12\x9a\x19\x59\x34\xd4\x14\x55\x88\x6a\x64\x99\x11\x32\xb5\ \x2c\x98\x65\x21\xda\x4c\xad\xc6\xed\xb1\x71\x62\x34\x66\xa6\x6a\ \x54\xba\xb7\xa2\xe6\x18\xb9\x76\x99\x10\x94\xca\x86\x4d\x94\x8a\ \x1d\xe4\x5d\x8e\xc4\x79\xbc\x4f\xf2\xad\x6b\x3d\x25\x09\xa1\x05\ \x88\x2a\x8a\x27\x33\xc3\x9b\x62\x4e\x50\x75\x78\xaf\x60\xc8\xcc\ \xf4\x1d\xd6\x6f\xda\x0a\xe4\x48\x8a\x6b\x98\x9f\x9d\xa6\x77\xfb\ \x5e\x0c\x21\xcb\x8c\x2c\x28\x5d\x5f\xdb\x0e\x2e\x47\xce\x29\x89\ \xf8\x64\x31\xc4\xab\x24\x00\x48\x54\x9c\x81\x99\xa0\xe6\xf0\xb4\ \x14\xa9\x8d\x0e\xda\xec\xf4\x6d\xb9\x53\xbb\x05\xda\x52\xcc\x27\ \x05\x3a\x83\x62\x08\x51\x8d\xe9\x5b\x63\x24\xa5\x32\x4e\xc1\x9b\ \xc7\xe7\x0b\x39\xa0\x28\x22\xee\xd1\x44\x7c\x8c\x40\x08\x0a\xce\ \x01\x8b\x04\xa2\x20\x62\x4c\x4f\x4d\x70\x67\x62\x98\xee\x6d\x3b\ \xd8\xbc\x7b\x9b\x01\x58\x34\xd4\x20\x6d\x2c\x70\xed\x5f\x9f\x53\ \xe9\xdd\x4c\xfb\xda\x6e\xda\xca\x1b\x08\xaa\xa4\x41\x89\x51\x2d\ \x27\xf9\x02\x50\x5a\x0c\xb9\xae\x98\x03\x21\xaa\x05\x55\x1a\x8d\ \x06\x63\x37\xbf\x22\x0d\xca\xed\xb1\x21\xee\xd6\x67\xd8\xbc\xe7\ \x35\xf2\x1d\xeb\x48\x83\x92\xa6\x4a\xaa\x2d\xb7\xa4\xc0\xa6\xfe\ \x57\x19\xbd\x71\x85\x34\x2a\x99\x1a\x41\x21\x44\x6d\xb9\xb9\x1c\ \x50\x04\xbc\x88\xe4\x44\x1e\xbe\xe3\x65\x42\xa0\x76\xb7\x36\x49\ \xa5\x77\x9b\x04\x94\xdb\xa3\x43\xbc\xf0\xf2\x1b\x34\x9b\x4d\xc6\ \xaf\x5f\xa2\xd4\x59\x41\x9c\x47\x44\x70\x49\x11\x9f\x14\x48\xda\ \xda\x71\xb9\x3c\x59\x88\xa8\x2a\x59\x34\x62\x8c\x16\xd5\xee\x87\ \xd5\x1d\x3f\x7e\xfc\xf0\xc5\x8b\x17\x7f\xe5\x9c\xfb\x8e\x88\x9c\ \x35\x33\x7b\x92\x02\xa4\x41\xf1\x49\x81\x10\x82\x65\x21\x1a\x2e\ \x47\xa6\x46\xf5\xea\x25\x72\xa5\x4e\x5c\xbe\x44\x61\x4d\x17\xc5\ \xb5\x3d\xe4\x3b\x2a\x90\x14\x69\x36\x9b\x34\x1a\x0d\xb2\x10\xc9\ \x42\xb4\x2c\x44\xcb\xa2\xdd\x5f\x73\xe4\xc8\x91\xbd\xfb\xf6\xed\ \xfb\xcd\xd1\xa3\x47\x7b\xaf\x5e\xbd\x7a\x0a\x28\x3c\x51\x81\x34\ \x28\x62\x11\x49\x8a\x54\x2f\x7d\x21\x92\xf3\x68\x48\xb9\x77\xef\ \x9e\xb5\x55\x36\x50\xaa\xac\x47\x44\x44\x81\x18\x22\x6a\x50\xbf\ \x35\xca\xf4\xf8\x10\x3d\xfd\xaf\x5a\x33\x8b\x44\x35\x54\x5b\xbf\ \x63\x88\x81\x9e\xdc\x02\xdf\x7f\xff\xfd\x9f\x4f\x4e\x4e\x96\x07\ \x07\x07\xe7\xab\xd5\xea\x4f\x96\xcd\x81\x2c\x46\xe6\xe7\x66\xb9\ \x7a\xfe\x13\x29\x6f\xeb\x37\x13\x6f\x1b\x77\xbc\x62\xc3\x5f\x5e\ \x90\xf9\x85\x59\x82\x29\x69\x0c\x96\x66\xc1\xe6\xe7\x66\xad\x7a\ \xf9\x0b\x23\x97\xb7\xee\x5d\x07\x2c\x9a\x3c\xb8\x71\x88\x4a\x33\ \xcb\xd8\x2a\x35\x39\xbc\x45\xdc\xc8\xc8\x48\x79\x70\x70\x70\xee\ \xc4\x89\x13\x3f\xbc\x72\xe5\xca\x2f\x81\xe6\x93\x5f\x81\x29\xbe\ \xd8\xce\xa6\x97\x0e\xda\xe4\x8d\x2f\xc5\x27\x89\x05\x73\x6c\xd8\ \xb9\xdf\x16\xa6\x6f\x31\xf4\x9f\x01\x11\x11\x92\x42\xbb\xe5\x3b\ \x2a\xac\xdd\xd2\x8f\x89\x6f\xc5\xde\x81\x46\x25\x62\x84\x34\xb0\ \x3d\x3f\x2d\xef\x1d\xec\x97\x91\x91\x11\x46\x47\x47\xf5\xfc\xf9\ \xf3\x27\x87\x86\x86\x7e\x0d\xd4\x6d\xb1\x08\x3d\x46\x20\x0b\xd1\ \xbc\x13\x91\x7c\x81\x8e\x4d\x2f\x9a\x85\x26\x59\x6c\x15\xb3\xa4\ \xb3\x8b\x75\x9d\x5d\xb6\xb4\x10\xa5\x66\x60\x8b\xb2\x47\x5a\xd2\ \xc7\xc8\x8e\x64\x5a\xde\x3b\xb8\x4b\x46\x46\x46\x98\x98\x98\xe0\ \xf4\xe9\xd3\x97\x06\x06\x06\x7e\x0a\xcc\xda\x92\x2e\xe8\x71\x02\ \x6a\x04\x55\x1c\xe0\xf2\x79\x5c\xa1\xc0\x9d\xf1\x61\x3a\x36\x6c\ \x46\xb0\xc5\x7a\x2b\x98\x19\x1a\x03\xe2\x3c\x21\x04\x62\xc8\x70\ \x49\x91\x18\x23\xbb\x0a\x33\x72\xec\x9b\x0f\xc1\x3f\xfc\xe8\x53\ \x1b\x18\x18\xf8\x31\x30\xfc\x68\x69\x7e\x8c\x80\xa2\x58\x34\x44\ \x84\xda\xa5\x73\xb2\x71\xcf\x6b\x36\x3b\x73\x5b\xea\xb7\xaa\x88\ \x78\x1a\x77\x6b\x94\xd6\x6f\x42\x7c\x62\xde\x25\x48\xbe\x8d\x5c\ \xa9\x44\x52\x5a\x43\xb4\x8c\xfe\x62\x5d\x8e\x1d\xdc\xfd\x00\xfc\ \xe4\xc7\x67\xcc\x76\xbe\xa9\xfc\xf1\xd4\xe8\x62\x7f\xb0\xf2\x57\ \x6c\x66\xe0\x30\xc3\xe8\xda\x73\x80\xa8\x46\xa5\x6f\xdf\x53\x1b\ \x47\xd3\x48\x7f\xbe\x2e\xdf\x7d\x04\x5c\xfb\x0f\x69\xdb\xba\x6e\ \x80\x6c\x75\x2d\x99\x07\x4c\xc1\x94\x6c\xbe\x6e\x38\xcc\xc4\x6c\ \x76\xf2\x26\x6a\xc1\xea\x23\x57\x50\x4d\xcd\xc4\xb8\xef\x6a\xc1\ \xfa\x0b\x75\x96\x82\x7f\xf8\xd1\xa7\xa6\xfd\x87\xb4\xb8\x76\x23\ \xad\x5a\xb4\x8a\x96\xec\x7f\x48\x00\x0b\xb5\x31\x29\x97\xd6\x58\ \x7d\xf8\x8a\xa4\xf3\x77\x59\x98\x9a\x90\xf2\x96\x1d\x36\x7d\xe3\ \x92\x98\x46\x7c\xa1\x8d\x7c\x47\xc5\x5e\xaa\xa8\x1c\x7b\x63\xbf\ \x7b\x14\xbc\xb4\xbe\x1b\xf1\x7e\x99\x42\xbc\x12\x81\x45\x2b\xf7\ \xf5\xb7\x9e\x4a\x7b\x87\x75\x6e\x7d\xb1\x75\x18\x50\xa8\xac\x35\ \x80\xd8\xcc\x38\xd8\x15\xe4\xdb\xdf\xd8\xeb\xaa\xd5\x6a\x4b\xf6\ \x3f\x9d\x31\xdb\xf3\xa6\x96\xd6\x75\x3f\xd8\xbf\xea\xa6\xf4\x51\ \x9b\xfa\xea\xdf\xd2\xb5\xf3\x65\xbb\x77\x67\x52\x1a\xd3\xb7\x00\ \x68\xcc\xd4\x68\xeb\xea\x45\xbc\xe7\xad\xbe\x75\xf2\xad\xd7\x5f\ \x97\x2c\xcb\xb8\x76\xed\x1a\xbf\xfb\xeb\x39\xd3\x5d\xad\x98\xaf\ \x06\xfc\xa9\x04\x2a\x7d\x7b\x0c\xa0\xbc\x65\x87\x25\xed\x6b\x96\ \x24\x9c\xb1\x2b\xb9\x2b\xc7\x0e\xbf\x22\x73\x73\x73\x5c\xb8\x70\ \x81\xdf\x7f\x72\xd6\x74\xcf\xe1\x67\x02\x7f\x2a\x01\x9f\xb4\x92\ \x67\x29\x38\x00\xf5\x09\xde\x79\xab\xdf\x5d\xbf\x7e\x9d\x6a\xb5\ \xca\xa9\xbf\x9c\x35\xdb\xfb\xec\xe0\x4f\x22\xd0\xfa\x24\x64\xf9\ \xb1\xc0\x42\xc6\xdc\xe5\xcf\xdd\x07\xe7\x7e\xcb\xdb\xef\xbc\xcb\ \xc7\x9f\xfd\xe3\x21\x78\x2e\x59\x09\x2b\xae\x6a\x2e\x00\x0e\x01\ \x1d\xcb\xcd\x11\x3d\x3d\x3d\xfb\xb3\x2c\xfb\x9e\x88\xd4\x42\x08\ \xe7\x67\x66\x66\xfe\x09\x4c\x2d\x07\xb0\x68\x73\xc0\x99\x27\xfd\ \x84\xb2\x74\x38\x5d\xc5\x64\xd4\x55\x2e\x97\xff\xd0\xde\xde\x7e\ \x71\x6c\x6c\xec\x67\x40\x15\x58\x78\x0a\x38\x8b\x6d\xd8\xbc\x99\ \xa5\xcb\x2a\xb0\x1a\x13\x91\xb7\x81\x1e\xe0\x6f\xc0\xf8\x93\x0e\ \x7c\x56\x7b\x56\x02\x85\x45\x75\x56\x9c\xf7\x9e\xc5\xfe\x0b\x40\ \xe8\xee\xab\x3d\x34\x5c\x5b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x09\xa3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x09\x35\x49\x44\x41\x54\x78\xda\x62\ \xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\xa4\x44\x73\xe7\xb4\xa3\ \x86\xcc\xcc\x2c\xe7\x4e\x1d\xdd\x2c\xbd\x6a\x51\xcb\x6b\xa0\xd0\ \x6f\x52\xcd\x00\x08\x20\x26\x4a\x1c\xc0\xc4\xc4\xdc\xaf\xa2\x20\ \xc8\xa0\xa0\xac\x9b\x0d\xe4\xf2\x03\x31\x33\xa9\x66\x00\x04\x10\ \x93\xe5\x94\x27\x0f\x8c\x9a\x4e\x98\x03\xd9\x6c\xa4\x84\x48\xf7\ \x8c\xe3\x85\x3a\xea\xa2\xf6\x1e\x0e\x4a\x0c\x82\xc2\x92\x49\x40\ \x21\x41\x20\x66\x25\xd5\x01\x00\x01\x04\x0c\x81\xff\x8c\x6c\x82\ \x92\x6b\xc4\x6d\xe3\x14\xcb\x1a\x57\xaa\xb6\x4f\x3e\x68\x04\x0d\ \x19\x9c\x8e\xe9\x98\x72\x58\x91\x83\x9d\xb5\xde\xd1\x4a\x9e\x81\ \x9d\x8d\x99\xc1\x40\x5b\x5a\x22\x22\xa1\xce\x11\x28\xc5\x45\x6a\ \xb4\x02\x04\x10\xd3\x9f\xef\x9f\xa7\x0b\xf3\xb2\xcb\xc4\xa5\xd6\ \xdc\x10\x15\x97\x3b\xcd\xc2\xca\xbe\xaf\xb8\x76\xa9\x0f\x50\x8e\ \x1d\x97\x61\xcc\x2c\xac\xfd\x40\x9f\xf3\x83\x2c\xff\xf7\xef\x3f\ \x03\x28\x1a\x94\xd4\x8c\x02\x80\x52\xdc\x40\xcc\x02\x52\x23\x97\ \x7a\x24\x50\x36\xf9\xf0\x46\xe9\xf8\x3d\x53\x80\x5c\x0e\x5c\xd1\ \x0d\x10\x40\xcc\x7c\x4a\x26\xb7\x19\x84\x94\x4a\x7c\x8d\x04\x19\ \xbe\x3e\x7f\xc7\xce\xc8\xc8\xc8\xc1\xc9\xc5\x63\xff\xf1\xc3\xeb\ \x2d\xcf\x1e\xdf\xfa\x04\x54\xf3\x17\x59\x43\xd7\xf4\xe3\x81\xf2\ \x32\x02\xf5\xb6\x66\xb2\x0c\xa0\x0c\x04\x72\x80\x90\x00\x27\xc3\ \xfd\xa7\x3f\x55\xd9\xd9\x79\x8e\xc5\xa5\xb5\xc4\x78\x04\xe7\xac\ \x79\xfb\x8b\x39\x5e\x5a\x5a\x40\xfd\xc5\x9b\x9f\x66\x0c\x4c\x6c\ \x3b\x7f\x3d\x3f\xfb\x06\xa8\xfd\x0f\xba\x03\x00\x02\x88\xf9\xcd\ \xd9\x8d\x3f\xa4\x9c\xd3\xd4\x45\x45\xf8\x74\x04\xff\x7c\x63\xe0\ \x60\x65\x62\xe0\xe4\x64\xe7\x95\x94\xd1\xd2\x3e\xb0\x6b\xc9\x66\ \xa0\x9a\x9f\x40\xfc\x0f\xa4\xb8\x67\xe6\x49\x01\x0e\x76\x96\x03\ \xc1\x9e\xea\x1c\xec\xec\x2c\x0c\xa0\x2c\x0c\x72\xc0\xdf\xbf\xff\ \x80\xf8\x3f\x83\xbc\xb2\x76\x98\xbb\x83\x9a\x8d\xb4\x18\x0f\x07\ \xeb\xd7\xcf\x0c\xd6\x56\x8a\x0c\x57\xef\x7f\x62\xf8\xfc\x83\xe5\ \xff\xb7\xdb\x9b\x8e\x02\x8d\xf8\x01\x33\x0b\x06\x00\x02\x08\x14\ \x2c\x7f\xff\xfe\xfc\xb6\xf1\xe4\xfd\x6f\x0c\x52\x2a\x12\x0c\x3f\ \x7f\xfe\x61\xe0\xe7\x65\x67\xb0\xb3\xd2\x74\x28\xaa\x5d\x52\x0c\ \x94\xe7\x81\x05\xdf\xff\xff\xff\x1a\xac\x8c\xa5\xf9\xf9\x80\xf2\ \x30\xcb\x61\x0e\xd0\x50\x11\x66\xf8\xf2\xe5\x37\x83\x10\x3f\x07\ \x83\x92\x2c\x3f\x03\xd0\x1f\x0c\x2f\xaf\xde\x63\x70\x34\x97\x66\ \x60\xe4\x96\xf4\x06\x6a\xe7\xc3\x96\x48\x01\x02\x08\x9c\x6d\x9e\ \xef\x9d\x79\x4b\xc8\x21\x3b\x51\x59\x86\x8f\x8f\xf3\xfb\x17\x06\ \x36\x16\x26\x06\x61\x01\x0e\x06\x11\x51\x31\xeb\x7f\x4c\xfc\xc7\ \xaf\x5e\x3c\xf4\xb8\x6b\xfa\x31\x1b\x79\x19\xc1\xe9\x2e\xb6\x0a\ \x60\x8d\x30\xcb\x61\x18\x94\x1e\x9e\xbe\xfc\xc2\xc0\xc7\xcd\xc6\ \xc0\xc1\xce\xcc\xf0\xf3\xf7\x3f\x86\xe7\xcf\x3f\x31\xc8\xaa\x49\ \x32\x1c\xbd\xf0\x96\xe7\x3f\xb7\xe2\xa3\x9f\x8f\x0f\x5c\x81\x86\ \x28\xbc\xf4\x03\x08\x20\x58\xbe\xfd\x2f\x6e\x97\x22\xfe\x8f\x99\ \xdd\x5a\x89\xf7\x3f\xc3\xd7\x8f\xdf\x18\x7e\xfe\xfa\xcb\xe0\xe3\ \xac\xc2\xf0\xe1\x07\x9f\x03\x0b\x2b\xcf\x41\x79\x25\x9d\x25\xfe\ \xee\x6a\xfc\xdc\x5c\xac\x50\xdf\x33\x40\x7d\x0f\x71\xc0\x6f\xa0\ \x85\x3c\x40\xcb\xaf\xde\x7a\xc3\x20\x27\xc5\xc7\x20\x08\x0c\x89\ \xcb\x37\xdf\x30\x30\x03\x43\xe2\xe3\x7f\x36\x86\xc7\x2f\xff\x70\ \xfd\xb8\xb3\x76\x2b\xd0\xae\x6f\xc8\xe9\x0a\x20\x80\x60\x29\xf3\ \xdf\x8f\x37\x0f\xe6\x5f\x7c\xf0\x95\x81\x49\x48\x00\x1e\x3c\x8f\ \x9f\x7d\x62\x08\xf2\xd4\x96\xb4\x76\x0c\xdb\x69\x6d\x22\x2b\x27\ \x26\xcc\x85\xe4\xfb\x7f\x60\x1a\xe4\x18\x88\x83\xfe\x31\xc8\x48\ \xf0\x30\x3c\x7f\xfd\x15\xe8\xf8\x3f\x0c\x1c\xc0\x10\x11\x11\xe2\ \x64\xf8\xf6\xfa\x3d\x83\x83\x99\x14\x03\x30\xaf\xdb\xb0\x88\x1a\ \x49\x43\x73\x17\x1c\x00\x04\x10\x3c\x6b\x5c\xeb\xf3\xbd\xf3\xf7\ \xfb\x97\x1d\xd7\xdf\x81\xc2\x05\x12\x30\x77\x1e\xbc\x67\x00\x59\ \x6a\x63\x2a\xcb\xfb\xe3\xd7\x5f\xac\x41\x8f\x8c\xbf\x7f\xff\xcd\ \xa0\xaa\x28\xc4\xf0\xf0\xe9\x27\xb0\x83\x74\xd4\x44\x18\xfe\xfd\ \xf9\xcb\x20\xcc\xfa\x17\x1c\x22\xec\xaa\x51\x61\xd0\xb2\x02\x5e\ \x62\x02\x04\x10\x72\xde\xfc\xfb\xfb\xeb\x87\xc5\xc7\x6f\x7e\x62\ \x10\x94\x15\x61\x78\xf5\xe6\x2b\xc3\xa7\x2f\xbf\xc0\x51\xa1\x0d\ \x34\xe8\xea\xcd\xd7\xe0\x6c\x07\xf3\x31\x72\x22\x84\xe1\x1f\x3f\ \x7e\x33\xe8\x6b\x8a\x32\xdc\x7e\xf0\x01\x1c\x45\x52\xa2\xdc\xe0\ \xb4\xf1\xe9\xf1\x0b\x06\x67\x5b\x79\x60\x62\x54\x08\x47\x4f\x8c\ \x00\x01\x84\xec\x80\xff\x57\x3b\x6d\xd7\xbc\x7e\xff\xed\xc9\xd3\ \xbf\x40\xd7\x02\xb3\x19\x28\x47\x80\x2c\x06\xa5\x7a\x59\x60\xbc\ \xde\x79\xf0\x0e\xc5\x42\x64\xc7\xc0\x30\x13\x30\x7d\xb1\xb2\x32\ \x33\x7c\xf9\xfa\x0b\x58\x57\x30\x30\x28\x02\x73\xc4\xef\x2f\xdf\ \x18\x4c\x75\x45\x41\x32\x12\x6c\x5a\x79\x28\x25\x26\x40\x00\xa1\ \x97\x4e\x7f\xfe\x7c\xff\xb2\xec\xd4\xed\xcf\x0c\x4c\xdc\x90\xf8\ \xbe\xf3\xf0\x03\x98\x06\x87\x02\x30\x81\xe1\x8b\x02\x10\xfe\x0a\ \xb4\x18\xa4\xf6\xda\x9d\x77\xe0\x10\x53\x57\x14\x84\x04\xef\xdb\ \x77\x0c\x96\x66\x32\x0c\x4c\xfc\x5a\x28\x25\x26\x40\x00\xa1\x3b\ \xe0\xdf\xcf\xb7\x0f\xe7\x5f\xb8\xf3\x91\x81\x41\x80\x9f\x01\x16\ \xef\xaf\xde\x7e\x03\x17\xb7\x4f\x9e\x7f\x66\xf8\xf4\xf9\x27\x5e\ \x07\xfc\xfe\xfd\x97\x41\x51\x86\x0f\x9c\x25\x41\x7c\x2e\x0e\x16\ \x70\x08\x7e\x7f\xf1\x9a\xc1\xca\x5c\x8e\xe1\x3f\xab\x88\x27\x93\ \xa0\x21\x3c\x31\x02\x04\x10\x46\xf9\x7c\x6f\x4e\xd8\x9d\x3f\x3f\ \xbf\xed\xb8\xfe\x16\x18\xa7\xd0\xcc\x72\xee\xf2\x0b\x30\x0d\xac\ \xfd\x18\x6e\xdc\x7d\x8b\x35\xe8\x61\x51\x02\x09\xc6\x7f\x0c\x9c\ \x40\x8b\x5f\xbe\xf9\x06\x4e\x8c\xa0\x50\x00\x25\x46\x59\x60\xec\ \x0b\x09\x72\x32\x30\xca\x04\x45\x40\x43\x81\x19\x20\x80\xb0\x55\ \x10\x7f\xff\x02\x13\xe3\xb1\x2b\x6f\x19\x84\x64\x44\x18\x3e\x02\ \x7d\x0c\x4a\x88\x20\x6c\xa4\x23\x0e\xce\x19\xd8\x7c\x0e\x71\x08\ \x30\x5c\x81\x85\xd8\x8b\x37\xdf\xc0\x06\x89\x02\xb3\x21\x48\x0c\ \x14\x22\x20\xf0\xe3\xcd\x7b\x06\x17\x27\x15\x60\xd5\x24\x07\x4f\ \x8c\x00\x01\x84\xcd\x01\xff\xef\xce\x70\x5f\xf3\xea\xed\xd7\x27\ \xaf\xff\xb3\x83\x13\x22\x28\xd8\x41\x16\x83\x82\x92\x9f\x8f\x1d\ \x5c\x3e\x60\x73\x04\x08\xf0\xf2\x71\x32\x1c\x3f\xf7\x94\xc1\x5c\ \x5f\x1c\x51\x57\x00\x7d\xaf\xae\x24\xc4\xf0\xf3\xed\x7b\x06\x0b\ \x63\x29\x60\x65\xc0\x2a\xc1\x20\x9f\x0e\x4e\x8c\x00\x01\x84\xab\ \x45\xf4\xe7\xdf\x8f\x2f\xcb\xce\x00\x13\x23\x8f\x30\x1f\x38\x47\ \x80\x12\x20\x08\x68\xa9\x8a\x30\x3c\x7b\xf5\x05\x23\xf8\x41\x80\ \x87\x87\x9d\xe1\xdc\xd5\x57\x0c\x12\x22\x5c\xc0\xb8\x67\x85\xcb\ \x83\x00\x48\x0c\xdc\x06\xfc\xfc\x11\x58\x49\x01\x8b\x73\x5e\x0d\ \x70\x62\x04\x08\x20\x5c\x0e\xf8\xf7\xf3\xfd\x93\xf9\x47\x2f\x02\ \xf3\x3e\x1f\x2f\xb8\x4c\x00\x67\x49\xa0\x23\x14\xe5\x04\x19\x9e\ \xbd\xfc\xcc\xf0\xeb\xf7\x3f\x94\xe0\x67\x62\x62\x64\xf8\xf6\xf3\ \x1f\xc3\xc3\xc7\x1f\x18\x74\x54\x85\xe1\x51\x02\x03\x12\x22\x9c\ \xe0\x10\xfc\xf9\xea\x0d\x83\xb5\xad\x12\xb0\xfd\x25\xea\xc9\xc0\ \xa7\x2f\x0d\x10\x40\x38\xdb\x84\xcf\x56\xc5\xdd\xf9\xf7\xeb\xc7\ \xb1\xb3\x4f\x7e\x33\xb0\x09\xf2\x01\x0b\xa5\x9f\x0c\x27\xcf\x3f\ \x05\x17\xb3\x8a\xb2\x02\x0c\x4f\x5e\x7c\x42\x09\x7a\x11\x11\x1e\ \x86\xe3\x67\x1f\x33\x98\xe9\x89\xa3\x84\x0e\x2c\x64\x5e\x7f\xf8\ \x09\xf6\x04\x37\xb0\x08\x52\x14\x63\x03\xaa\x07\xa6\x41\xc9\x80\ \x08\x80\x00\xc2\xd7\x88\xfc\xcf\xa9\xe0\x70\xe3\xf6\x33\xc6\x50\ \x23\x53\x39\x76\xae\x3f\xdf\x19\xfe\x02\x2d\x7f\x0d\xcc\x92\xa6\ \xfa\xd2\x0c\xe7\xae\x3c\x63\x90\x11\xe7\x03\x5b\xc2\xc5\xc5\xc6\ \x70\xf7\xd1\x07\x86\xff\x40\xc7\xc8\x4a\xf2\x81\x7d\x0e\x6c\xd8\ \x30\x70\x70\xb2\x32\xdc\x7f\xf2\x99\xe1\xc8\xd9\x67\xc0\xdc\xf3\ \x8e\x81\x05\x58\x33\x7d\x03\x16\xd7\xa0\x12\x8a\x55\x58\x90\xe1\ \xca\xd5\x0f\x22\x00\x01\x84\xb7\x15\xfb\xe5\xfa\x86\x17\xec\x72\ \xb6\xcf\x2f\x3f\xf8\xef\x6f\x65\x21\xcf\xc0\xf4\xe5\x33\xd4\x67\ \xff\x18\x7e\xff\xf9\xc3\xc0\x09\x4c\x1b\xa0\xec\xc6\xc2\xc6\xc2\ \x70\xfa\xc2\x53\x06\x43\x2d\x71\x70\x2e\x60\x02\xd6\x25\x17\x81\ \x35\xe1\xd1\x33\x4f\x81\x59\xf1\x2b\xc4\x52\x70\xf6\x02\x56\xdb\ \x62\x22\x0c\x7f\xf9\x85\x18\x2e\x5e\x7e\xc9\x70\xef\xfe\x47\x21\ \x80\x00\x62\x24\xa2\xdf\xc0\x21\x1a\xbc\x6e\x8a\x9c\xbc\x4c\x52\ \xa1\x1f\xb0\x71\xf1\xee\x2d\xb8\xae\x12\x03\x06\x21\x28\x6f\x9b\ \x1a\xc8\x02\x53\xfd\x63\x06\x25\x60\xda\x60\x02\xfa\xec\xfa\x9d\ \xb7\x0c\xb7\xee\xbf\x67\x60\x03\x16\xc7\x3f\xa1\x05\x19\x23\x0b\ \x33\x03\xa7\x94\x04\xc3\x8b\xef\xcc\x0c\x7b\x0f\xde\x67\x38\x7a\ \xf8\x1e\x03\xc3\xaf\x37\x27\x18\x3e\x9c\x5e\x0b\x10\x40\x8c\x44\ \xf6\x1d\xb8\x45\x82\x36\xed\xb1\x36\x53\x32\x0b\x37\xe4\x60\xf8\ \xfb\xe5\x0b\xd0\x37\x7f\x19\x58\x59\x18\x19\x74\x35\x24\x81\x59\ \xf4\x2d\xd8\xf2\x97\xaf\xbf\x01\x7d\xcf\xc4\xf0\xf5\xdb\x1f\x86\ \xbf\xc0\xe8\x60\x62\x67\x67\xe0\x92\x93\x66\x38\x75\xf5\x3d\xc3\ \xee\xbd\xb7\x19\x1e\x3d\x00\x06\xc7\x8f\x27\x7b\x18\x5e\x6e\x5d\ \xcd\xf0\xee\xd8\x03\xa0\xb9\x9f\x00\x02\x88\xd8\x26\x34\x13\xa7\ \x66\x94\x3c\xa7\x7a\xcc\xc5\xc4\x50\x6d\x5e\x63\x9e\x4f\x0c\x4c\ \xc0\x68\x00\x45\x05\x30\xaa\xc1\x09\x91\x91\x09\x14\xbf\x7f\x19\ \xfe\x00\x83\xf9\x3f\x17\x0f\xc3\x07\x26\x6e\x86\xfd\xa7\x5e\x32\ \x1c\x3e\x74\x8f\xe1\xdb\xe7\x0f\xf7\x18\x3e\x5f\xdb\xc0\x70\x6f\ \xc2\x16\xa0\x59\x5f\x41\x16\x03\xf1\x47\x10\x1b\x20\x80\x48\x69\ \xc3\xb3\x70\x5b\x36\xdb\xf3\xc9\x98\xef\x29\x4e\xd0\x62\x90\xf8\ \xf1\x0a\x1c\xff\xff\xfe\xfd\x05\x57\xbd\x20\x8b\xff\xf1\x09\x31\ \xdc\x78\xcb\xcc\xb0\x73\xdf\x3d\x86\x33\xa7\x1f\x03\x1b\x5f\x2f\ \xf6\x30\xbc\x39\xb0\x96\xe1\xe5\x96\xab\xa0\x24\x05\xb5\xf4\x13\ \xb4\x55\xf4\x0b\x94\x2c\x00\x02\x88\xd4\xbe\x21\x3b\x8f\xc3\xdc\ \x4a\x11\x29\xf9\xfa\x86\x02\x53\x06\x2e\x36\x26\x70\xe3\xee\xdb\ \xa7\xaf\x0c\x07\xcf\xbf\x63\xd8\xbe\xeb\x2e\xc3\xeb\x17\x6f\x5e\ \xfd\xff\xfa\x68\xf7\xff\x47\x0b\x56\x33\x7c\xbb\xff\x0a\xc9\xb7\ \x20\x07\x7c\x87\xf6\x1f\xe1\x2d\x63\x80\x00\x22\xd5\x01\x20\xf5\ \x5c\x5c\xf6\x8b\x16\xfd\x67\xe6\x0d\xfa\x0f\x6a\x96\x01\x5b\xc4\ \xa0\xec\xf7\xff\xc7\xfb\xcb\x7f\xdf\x9d\x5b\xff\xff\xfe\xcc\x7d\ \xe8\xc1\x0c\x6d\x88\xfe\x41\x6e\x8c\xc2\x00\x40\x00\x91\xd3\x3b\ \x06\x25\x4a\x5e\x20\x16\x07\x62\x01\x58\xbd\x0e\x6d\x68\x7e\x87\ \x5a\xfc\x09\xca\xfe\x85\xde\xb1\x41\x07\x00\x01\x06\x00\x4d\x55\ \x78\x5f\x2c\x92\xe0\x60\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x0a\x1a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ \x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ \x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ \x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ \x46\x00\x00\x09\x90\x49\x44\x41\x54\x78\xda\x62\x64\xa0\x32\x90\ \x0a\xdb\xad\xf8\xef\x1f\x53\xc3\xdf\xdf\xbf\x85\x5e\x6f\xf4\x88\ \x04\x0a\xfd\x00\xe2\x3f\xb8\xd4\x03\x04\x10\x0b\xb5\x2c\x96\x4b\ \x38\x2a\xf0\xff\xf7\xef\x22\x69\x11\xae\x5a\x37\x3b\x0d\x86\x63\ \xe7\x9e\x31\x9c\x7e\xd9\x9a\xc2\x2e\xaa\x25\xfd\x9f\x91\xc3\xfc\ \xe7\xab\x4b\x99\x9f\x4e\x94\xdf\x06\x2a\xfd\x0d\xc4\xff\x61\xfa\ \x00\x02\x88\x2a\x0e\x50\x4c\x3e\x96\xc8\xc7\xc9\xdc\x6f\x67\xac\ \xc8\x2f\xa5\x22\xc9\x70\xf3\x39\x03\xc3\xc7\xbf\xec\x0c\x52\x5a\ \xf6\xfd\x51\xce\xb2\xbf\x1f\x3c\xff\xf9\x6d\xe5\x92\x83\xe6\x40\ \xa5\xaf\x81\xf8\x2d\x10\xff\x85\xe9\x05\x08\x20\x8a\x1c\xa0\x92\ \x75\xca\xf1\xff\x3f\x86\xf9\x41\x36\xd2\xf2\x4a\x5a\x52\x0c\xb7\ \xde\x31\x80\x2d\xbf\x78\xfa\x26\x83\x99\x1c\x13\x83\xa6\x95\xde\ \x8f\xbe\xb5\x8f\x4e\x7c\x7e\xfb\x4b\x92\x91\x5d\xcc\x11\xa8\xe5\ \x10\x10\x7f\x44\x76\x00\x40\x00\x91\xe5\x00\xcd\xfc\xd3\x8a\xff\ \xff\x33\x2f\xd0\x57\xe4\xb3\x0b\xf3\x50\x66\xb8\xf6\x89\x81\xe1\ \xde\x07\x06\x86\x6b\x97\x5f\x30\xfc\x7c\xf3\x9a\xa1\x24\x40\x9d\ \x61\xcf\x4d\x36\x86\xa6\x55\xef\x38\xbe\x7f\xfe\xcb\xcc\xfd\x8f\ \x99\xe5\x37\x03\x2b\x37\x50\x2b\x07\xd4\xce\x9f\x30\xb3\x00\x02\ \x08\xab\x03\xec\xa6\x3d\x73\xfc\xf7\xe7\x7f\xc1\xdf\x5f\xbf\x99\ \xbe\x3c\xbb\xde\x71\xb9\xcf\xf3\x34\x28\xee\xf4\xaa\xae\xf3\x03\ \x13\x57\xa3\xb4\x20\x7b\x5e\x8c\xbb\x12\xc3\x2f\x2e\x16\x86\xfb\ \xdf\x19\x18\xee\x3f\xfc\xc6\x70\xeb\xda\x63\x86\x58\x5b\x71\x86\ \x77\x7f\x74\x19\x3a\x77\x01\x53\x1d\x30\xd9\xb1\x71\x70\x30\xfc\ \xf8\xc2\x23\xc0\xf6\xfb\x3f\xc3\x0f\x66\x7e\x65\xa0\x19\x6c\xe8\ \x76\x02\x04\x10\x0a\xc7\x71\xd6\x0b\xc5\xff\x0c\x4c\x0b\x0c\xa5\ \x38\xec\xa2\x4d\x79\x19\xde\x02\xdd\x39\x69\x2b\x9b\x0f\x63\xc9\ \xa1\xc9\xff\x99\x39\xbf\xf3\x73\x32\xa5\x87\xba\x2a\xf0\x2b\xaa\ \xf0\x32\xbc\xf9\xc6\xc0\xf0\xf0\xe9\x3f\x86\x93\x17\x9f\x31\x58\ \xc8\xb1\x32\x78\x00\x7d\xbd\xe2\x14\x03\xc3\xf3\x77\x08\xf3\xb8\ \x78\xb9\x18\xbe\xbf\x66\x91\xfd\xfb\xe7\xe7\x3b\x06\x26\x7e\x79\ \xa4\x10\x80\x03\x80\x00\x62\x84\x31\x9c\xe6\xbd\x6d\x94\xe2\x63\ \xad\x2b\x73\xe4\x65\x90\x17\x62\x60\xf8\x0c\x4c\xa7\x3f\xff\x31\ \x30\xbc\xff\xca\xc0\xb0\xf7\xe2\x37\x86\x7f\x7f\xff\x33\x58\x6a\ \x70\x33\x7c\x04\xfa\xec\x03\x50\x6c\xf7\x99\x77\x0c\xdc\xff\x7e\ \x32\x38\xeb\x8a\x33\x5c\x79\xc5\xc4\x70\xf9\x09\x50\xcf\x57\x08\ \xfe\x06\x0c\x95\xbf\x7f\x21\xf8\xc3\x8d\x17\x0c\x7f\xdf\x7c\x7a\ \xf8\xe3\xff\x3d\xb1\x1f\xb7\xda\x53\xfe\xbc\x3e\xb4\x0f\x68\xdd\ \x4b\x58\x4e\x00\x08\x20\x16\x98\xe5\xde\x9a\x3c\x75\x45\x16\x6c\ \xe0\x14\xf2\x13\xc9\x85\x5c\xec\x0c\x0c\x2e\x86\x5c\x0c\xdf\x80\ \x99\xe7\xfb\x2f\x06\x86\xcb\x0f\xfe\x30\x1c\xbf\xfc\x8a\x21\xd6\ \x42\x98\xe1\x2f\xb3\x10\xc3\xc1\x7b\x0c\x0c\x9f\x80\x16\xfe\xff\ \x8f\xc0\x70\x00\xf4\x00\x3b\x23\x2b\xc3\x97\xbf\x0c\xbc\x0c\x7f\ \x39\x7e\x32\x09\xe8\xa9\x33\xbc\x3e\x74\x14\x28\xc3\x0c\x2b\x1b\ \x00\x02\x88\x09\xac\xf0\xff\x3f\x47\x90\xe5\xdf\x09\x24\xbe\x87\ \xc0\x4c\x74\xe7\xe1\x7b\x86\xe6\x60\x29\x86\x27\x3f\xd8\x19\x2e\ \x01\x53\xfc\x3f\x24\x8b\xff\xa1\x3b\x00\x18\x8c\xcc\x40\x07\xfc\ \xfb\xcf\xcc\xf7\xef\x27\xfb\x2f\x26\x4e\x29\x55\xf4\x68\x00\x08\ \x20\xb0\x03\xfe\xff\xf9\xf3\x18\x98\x8e\x08\x82\x07\x2f\x7f\x30\ \x24\x5a\x09\x33\x1c\x7a\x04\x0c\x8d\xdf\x48\x96\xff\x43\xb0\xff\ \xc1\x1c\x00\x0c\xad\xff\x9f\xbf\x33\xfc\xfb\xc7\xc8\xc0\xc4\xcc\ \xce\xf2\xff\x2f\x27\x13\x23\x87\xb8\x1e\x50\x86\x13\x88\x59\x61\ \x66\x02\x04\x10\x13\x8c\xf1\xfd\x27\x61\x07\xdc\x7f\xf1\x8d\x41\ \x4e\x94\x09\x25\xb8\x91\x7d\x0e\xf6\xfd\x7f\x68\x2e\xff\xf0\x0b\ \x98\x6e\x18\xc0\x69\x87\x89\x99\x8d\x81\x91\x81\x93\x8b\x91\x45\ \x4c\x1d\x28\xc3\x03\xcd\x0d\x60\x00\x10\x40\x4c\x4e\x73\xdf\x2c\ \xf4\xd6\x13\x8a\xd2\x10\xc4\x6f\xf9\xb9\xbb\x7f\x18\x84\xd8\xff\ \x33\xbc\xfe\x06\xb1\xf0\x1f\x16\xcb\xc1\x6c\x60\xcc\x32\x7e\xfa\ \xc3\xf0\xef\xcf\x3f\xb0\xe5\xff\x81\x8e\x60\x62\x62\x65\x60\x66\ \x65\xe3\x62\xf8\xcd\xf1\x87\x55\x21\xce\x0a\x68\x1c\x3b\xcc\xf3\ \x00\x01\xc4\xf4\xf7\xe7\xd7\xa3\x52\xbc\xcc\x88\xa2\x09\x0d\x80\ \x12\xde\xdc\xfd\x9f\x19\xee\x3e\xfe\xcc\x50\xe8\x2e\xcc\x70\xed\ \x0d\x24\xc8\x31\x42\xe1\x1f\xa4\xda\x61\x04\xa6\xb8\xff\x40\xcb\ \xc1\xd1\x02\xc6\x40\x49\x60\x5e\x8b\xf2\xfc\xcb\x50\x15\xc7\xc5\ \xc1\x2c\xa0\x6b\x0b\x0d\x05\x70\x3a\x00\x08\x20\x96\x77\x57\xf6\ \x6d\xda\x22\x12\x34\x33\x52\x9b\x0f\xc3\xf2\x63\x77\x19\x18\x36\ \x9f\xfd\xc0\x90\x64\xca\xc7\x20\x2a\xc2\xc4\x70\xf2\x05\xd0\x8e\ \xdf\x08\xdf\xc2\xf0\x5f\xa0\xaf\xff\x81\x42\xe6\xe7\x7f\xa8\xa5\ \x90\xa0\xff\x0f\x94\x54\x10\xff\xcd\x90\xe1\xfd\x8e\x41\x46\xe4\ \x07\x30\x5b\x72\x31\xf0\x09\xc9\x9a\x03\xdd\x29\x00\x4d\x8c\xbf\ \x00\x02\x08\x54\x0e\x30\xdb\xf4\xdf\x59\x3e\x3d\x56\x39\x54\x59\ \x18\x9c\x76\x18\xde\x03\x0d\xec\xd9\xf3\x9d\x41\x14\xa8\x24\xd1\ \x8a\x93\xe1\xd1\x57\x48\x79\xf0\xf1\x0b\xb0\xa0\xb9\x7d\x87\xe1\ \xed\x8d\xc3\x0c\xbf\xbe\x7f\x67\xf8\x2b\xed\xc2\xf0\x81\x4d\x8d\ \xe1\xf3\x67\x06\x86\x2f\x40\xb9\x4f\x6f\x3f\x33\xa8\x30\x1c\x60\ \x50\x97\x66\x01\x5b\x0e\x72\x84\xb6\xdc\x2f\xa0\x83\xff\x43\x31\ \xb0\xc8\x7e\xf1\x93\xe1\xf3\xcb\xcb\xc7\x3b\x3a\x3a\x22\x80\x56\ \x3d\x03\x08\x20\x50\x30\xfc\xfd\xf9\xe1\xe5\xa2\x55\x67\xc5\x42\ \x6b\xdc\x78\xc1\x3e\x9f\x79\xf8\x07\x43\xac\x01\x27\x83\xb4\x04\ \x03\x03\x30\xdd\x31\xfc\x06\xc6\xcf\x8b\x7b\x0f\x19\x04\xde\x5c\ \x60\x08\x37\x31\x64\xf8\xa7\xeb\x08\xf4\xe5\x3f\xb0\xa1\xff\xfe\ \xdd\x86\xd2\x10\x3e\x2b\xab\x26\xc3\xab\x57\xaf\x18\x44\x45\x45\ \x19\x1e\x3e\x7c\xc8\xa0\xae\xae\xc7\xc0\xc3\xc3\xc3\x70\xf6\xc6\ \x1b\x06\x73\x03\x25\x86\xcf\xdf\xfe\x30\x5c\x3a\x2d\x64\xb9\x7f\ \xff\x7e\xfb\x93\x27\x4f\x6e\x01\x08\x20\x70\x42\x38\xdd\x68\xbd\ \x7b\xcf\xe5\xb7\xd7\xdf\x41\x73\xc2\xd7\x5f\xff\x19\x0c\x80\x96\ \x7f\x86\xc6\xf5\x0f\x60\x01\xf1\xf9\xf5\x53\x06\x0b\x53\x23\x06\ \x39\x39\x39\x06\x05\x05\x05\x06\x19\x19\x19\x06\x71\x71\x71\x06\ \x21\x21\x21\x06\x5e\x5e\x5e\x06\x4e\x4e\x4e\x86\x0b\x17\x2e\x00\ \x43\xe3\x33\x83\x95\x95\x15\x83\xaa\xaa\x2a\x83\x8b\x8b\x0b\xc3\ \xb7\x6f\xdf\x18\x76\xee\xdc\x09\x0c\xa1\x2f\x0c\xc5\x8b\x1e\x31\ \x84\x76\x5f\x67\x60\x61\x61\x01\x26\x4c\x26\x19\xa0\x55\x7c\x00\ \x01\x04\x2b\x10\x7e\xff\xfa\xf8\x62\xc6\xae\x4b\xe2\x13\x03\x4c\ \x39\x19\x44\x79\x98\x19\xae\x00\x6b\x6d\x4e\x01\xa4\xec\xc5\xc8\ \xc4\xc0\xc8\xc8\x88\x33\x97\x9c\x3a\x75\x8a\x21\x32\x32\x92\xe1\ \xd1\xa3\x47\x0c\xf3\xe6\xcd\x63\xe0\xe2\xe2\x62\x78\xff\xfe\x3d\ \x83\xbc\xbc\x3c\x83\xa3\xa3\x23\xc3\xe9\xd3\xa7\x19\xea\x7d\xc4\ \x80\xe9\x40\x88\xe1\xc6\x8d\x57\x20\xb3\x40\x76\xb3\x01\x04\x10\ \xcc\x01\xff\x3e\xde\x3d\xb5\x7a\xf1\x31\xc9\x96\x68\x53\x79\x5e\ \x79\x21\x16\x86\xc7\x6f\xfe\x32\xa8\xf2\x33\xc3\x13\x1a\x23\x10\ \xde\xba\x75\x8b\xe1\xf6\xed\xdb\xc0\x9a\xee\x0f\xc3\xef\xdf\xbf\ \xc1\xf8\x2f\xb0\xc0\x07\xf9\x52\x4f\x4f\x8f\xe1\xf1\xe3\xc7\x0c\ \xd7\xaf\x5f\x67\x60\x67\x67\x67\xb8\x72\xe5\x0a\x83\x98\x98\x18\ \xc3\xdb\xb7\x6f\x19\x8e\x1f\x3f\xce\x20\x29\x29\xc9\xf0\xe2\xc5\ \x0b\x70\x88\x81\xa2\x0b\x18\x02\x20\xdf\x30\x02\x04\x10\xbc\x20\ \xba\xb3\x2c\xff\xd5\x9b\x57\x2f\xe7\xec\xbe\xf1\x8b\xc1\x44\x9e\ \x89\xe1\xfc\xe3\x1f\x0c\x1c\x8c\x48\x59\x0d\xe8\x00\x58\x5c\x83\ \x2c\x05\xd1\xbf\x7e\xfd\x02\xd3\x1f\x3f\x7e\x04\x3b\xe0\xd2\xa5\ \x4b\x0c\xdf\x81\x89\xb3\x73\xc2\x22\x06\x3e\x39\x17\x86\x39\xab\ \x2f\x80\x1d\xf2\xe6\xcd\x1b\xb0\x63\x5e\xbf\x7e\x0d\xd7\xcb\xcc\ \xcc\x0c\xb6\x17\x20\x80\x98\x90\x42\xf1\xef\xbb\x4b\xdb\xfa\xa6\ \xed\x7e\xc1\xa0\xc0\xc5\xc0\x70\xe5\xf9\x0f\x06\x60\x4c\xc0\x0b\ \x9a\xbf\xc0\x72\x03\xd9\x72\x10\x86\x85\x80\xa2\xa2\x22\xd8\x00\ \x50\xba\xd8\xba\x75\x2b\x03\xa7\x66\x2e\xc3\x13\x06\x13\x06\x69\ \x9b\x3a\xb0\xa3\x38\x80\xed\x02\x50\x1a\x00\x39\x14\x14\x42\x4f\ \x9f\x3e\x85\x3b\x00\x20\x80\x90\x1d\xc0\xf0\x68\x4b\xe3\x8b\x07\ \x8f\x5f\xae\xd9\x77\xe5\x07\x30\x14\x38\x19\x2e\xde\x87\x64\x1d\ \x60\xb9\x02\x2a\x4b\xe0\x21\x00\xc3\xb0\x10\x00\x05\x2d\x08\xfc\ \xf8\xf1\x83\xc1\xcd\xcd\x8d\x41\x80\xf5\x21\x83\xb4\x32\x27\x83\ \xc0\xff\xc3\x0c\x6a\x6a\x6a\x60\x87\x82\xf4\xbe\x7b\xf7\x8e\xe1\ \xe6\xcd\x9b\x0c\xcf\x9e\x3d\x03\x45\x01\x58\x0f\x40\x00\x31\xa3\ \xa5\xa5\x7f\xdc\x32\x86\x37\xef\x7f\x13\x89\x8d\xb0\x16\x63\x3b\ \x75\xfb\x0b\x83\x92\x34\x3b\xb8\xfe\xff\xf4\xfa\x05\x83\x28\xcb\ \x17\x78\x28\x80\xd2\x01\xc8\x57\xac\xac\xac\x60\x36\x28\x6e\x41\ \xe2\x9a\x9a\x9a\x0c\x52\x3c\x9f\x19\x7e\x3f\x3c\xc8\xa0\x26\xc6\ \x08\x8e\x1a\x50\x9a\x00\xf9\xf8\xc1\x83\x07\x60\x87\x80\x1c\x04\ \x0c\x85\x03\x77\xef\xde\xbd\x02\x10\x40\x4c\x18\x15\xce\xaa\xac\ \xeb\x77\xef\x3f\x9e\x7b\xe3\xee\x47\x86\x53\xf7\xbe\x30\x88\x00\ \x4b\x6d\x16\xa0\xf7\xd5\x85\x21\x69\x00\x64\x09\x2c\x1a\x60\x6c\ \x50\xee\x00\xe6\x69\x70\x16\x05\xe5\x7d\x50\xca\x07\x85\x84\xb4\ \xb4\x34\xc3\xcf\x9f\x3f\xc1\xd9\xf5\xfe\xfd\xfb\xf0\xb2\x02\x1c\ \xf4\xd0\x10\x00\x08\x20\x66\x2c\x39\xea\x3f\x0b\x8f\xf8\xd5\xfb\ \xbf\x15\x53\x8c\x55\xf8\xd9\xf9\x81\xae\xf7\x50\x61\x62\xf8\xf5\ \xf1\x15\x38\x0e\x61\x96\x82\xf0\xd7\xaf\x5f\xc1\x21\x00\x63\x83\ \x12\x19\xc8\x72\x10\xf8\xf0\xe1\x03\xb8\x6c\x00\x95\x11\xa0\xac\ \x09\x0a\x76\x58\x89\x08\x0a\x31\x60\xb4\x1d\x00\xe6\xaa\x2b\x00\ \x01\x84\xad\x51\xfa\xff\xe5\x81\xee\xe7\x9c\xb2\x56\xf5\x77\x84\ \x39\xfa\xb8\xd9\x18\x19\x3c\xd4\x45\xc0\xbe\x14\x14\x14\x04\x5b\ \x08\xf3\x3d\xa8\xb4\x03\xf9\x04\x39\x61\x82\x2c\x62\x63\x63\x03\ \x8b\x83\x0a\x25\x10\x9b\x9f\x9f\x1f\xec\x10\x98\xef\x9f\x3f\x7f\ \xce\x70\xfe\xfc\x79\x30\x1b\x20\x80\x70\x35\xcb\xff\x3c\x58\x1c\ \x38\x8b\x91\x65\x5f\xd4\xad\x37\xbf\x4d\x4a\x3d\x45\xc0\xbe\x01\ \x05\x27\xc8\x11\xc8\xa1\x00\x4b\x0f\x30\x47\x80\xd8\xa0\xc4\x09\ \xe3\x83\x42\x06\x39\xba\x40\xf1\x0f\xf4\xcc\xb7\x33\x67\xce\xdc\ \x03\xe5\x3c\x80\x00\xc2\xd7\x2f\xf8\xfe\xe5\xc1\xa1\x74\x16\x2e\ \xdf\xb3\x1b\xcf\x7c\x62\x30\x90\x14\x65\xe8\xd8\xfa\x9c\xe1\xc3\ \x93\xd3\xe7\x39\x5f\x6c\xdb\x0b\xf4\xe1\x6f\xa0\x41\xff\x49\xed\ \x53\x00\xf5\xfd\x05\x46\xc9\x33\x60\x22\x7c\x08\x2a\xf5\x01\x02\ \x88\x91\x80\x7a\x36\xe9\xb0\xf5\xdd\x52\xca\x2a\x79\x7f\xbf\x7f\ \xff\xf6\xf0\xf8\x92\x79\x6f\x4f\x4e\xda\x0f\xed\x62\x7d\x80\xf6\ \xf3\xc8\x01\xa0\xe6\xc7\x17\x50\xc5\x0b\x10\x40\x84\x1c\x00\x92\ \xe7\x15\x77\x69\x09\xfd\x70\x71\xf1\xc7\x9f\xaf\x6f\x82\x2c\x7d\ \x01\x6d\x56\x7f\x45\xee\x62\x91\x08\x60\x0d\xb7\x7f\x00\x01\xc4\ \x48\x84\x62\x50\x4e\xe1\x85\xe2\x3f\xd0\xbe\xdd\x0f\x48\xa3\x9b\ \x72\x00\x10\x60\x00\xf3\x46\xbf\x32\x2e\x58\x77\xc9\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x5f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x06\x26\x49\x44\x41\x54\x78\xda\xed\x56\x59\x4c\x54\x67\ \x14\x46\xa5\xad\x84\x56\x50\x11\x19\x59\x04\x67\x80\x11\x66\x98\ \x7d\xb9\xb3\x6f\xcc\x30\x8b\xb2\xc3\xb0\x88\xe0\x08\x82\x5a\x57\ \xa8\x82\x28\x8b\x1b\xa0\xa0\x18\x2d\x6a\xdd\x5b\x97\x22\x75\xa9\ \x1b\xda\x54\x6d\x6a\x6d\xd2\xa4\x4f\xed\x4b\x13\x9f\xea\x43\x97\ \xf8\x82\xd6\x6a\x5d\xe6\xeb\xb9\x37\xd6\xd4\xb4\x45\x5b\x9b\xb4\ \x0f\x9c\xe4\xcb\xdc\xb9\xf7\xdc\x73\xbe\xff\x3b\xe7\xfc\xff\x0d\ \x01\xf0\x9f\x62\x84\xc0\x08\x81\x11\x02\xcf\x75\x20\x0b\x25\x78\ \x08\xbb\x08\xae\x17\xf0\x57\x11\x2a\x09\x7e\xc2\xa8\x97\x26\xc0\ \xe3\xf1\x4e\xec\xde\xb9\x2b\xd8\xbd\x69\x33\x12\xe2\xe2\x1e\xb2\ \x81\x87\x49\x5e\x26\xe0\xf3\x1f\xf5\x90\xef\xa6\xae\xae\x60\x78\ \x78\xf8\xfe\x97\x22\x40\xe6\x5b\xb4\x60\x61\xd0\xe7\xf5\x42\x9c\ \x2e\x42\xb2\x40\x00\x61\xaa\xf0\xe2\x5f\xf9\x6b\x35\x9a\xcf\xa7\ \x25\x25\x41\x94\x9e\x0e\x7f\x51\x11\xaa\xab\xab\x83\x6c\x8c\xbf\ \x45\x80\x6c\x2c\x61\x06\x61\xad\x50\x28\xfc\xa1\xb7\x67\x0b\x6c\ \x56\x2b\x24\x19\x19\x50\x2a\x14\x50\xc8\x15\x3f\xfe\xce\x77\x22\ \x21\xf2\xc9\x75\x98\x8e\x61\xee\xaa\x95\x2a\x48\x25\x12\xb0\xa4\ \xd7\xb7\xaf\x45\x42\x42\xc2\x2d\x7a\xb6\x98\x60\x22\xbc\x32\x2c\ \x01\xb2\xd7\x08\x47\xb3\x32\x9d\xf7\x8a\x8b\x8a\xb9\x00\x9d\x1b\ \x3b\x60\x36\x99\xe0\x74\x38\x90\x69\x77\x40\x26\x95\x21\xe2\x8d\ \xc8\xeb\x7c\xbe\xe0\xdb\xb4\x34\x11\x14\x0a\x15\x24\x12\xe9\xcd\ \xc8\x88\x88\x2f\xd9\xe4\x16\x93\x99\xf3\x73\x10\x3a\x37\x6c\x44\ \x7b\x5b\x1b\x02\x73\x02\xc8\x74\x38\x7e\xa2\xd8\x07\x08\xaf\x0e\ \x47\x60\xdb\x82\xf9\x0b\x1e\xef\xea\xdb\x89\xb2\xd2\x52\x34\xd4\ \xd7\xc3\x9d\xe5\x86\xc5\x6c\x46\x61\x5e\x01\xbc\x6e\x0f\x18\x8d\ \x16\x19\x22\x31\x0c\x06\x13\x6c\x36\x07\x3c\x1e\x1f\x2a\x2a\xaa\ \xa0\x22\x22\x7a\x46\x07\x9f\xc7\x8b\xbc\x9c\x5c\x18\x74\x7a\x64\ \x39\x9d\x68\x6a\x6c\xc4\x96\xee\x1e\x9c\x3e\x79\x0a\xb3\xca\xcb\ \xd9\x92\xb4\xfd\x29\x01\x32\x7e\x55\x65\xd5\x83\x4b\x83\x17\x31\ \xd0\x7f\x1c\x6f\xd5\x37\x70\xab\x31\xea\x0d\x6c\x30\x0e\x76\xab\ \x8d\xfb\xd5\xa8\x35\xc8\xcb\x2d\xc0\x9a\xe6\x66\x34\xae\x58\x09\ \x37\x11\x93\x49\xe5\x30\x19\x8c\xb0\x9a\x2d\xd0\x93\x0f\xbd\xc7\ \xfe\xe7\x94\xd8\xb7\x67\x2f\x2e\x9c\x3b\x8f\x2b\x1f\x5f\x46\x7e\ \x7e\xfe\xcf\x94\x4b\xfa\x07\x02\x51\x13\xa2\xfa\x3f\x38\x3e\x80\ \xe6\x55\xcd\x2c\x53\xb8\x32\x9d\x14\x44\x4f\x81\xa5\xd0\x52\x42\ \x0a\xc8\xad\x90\x51\x6b\x61\xb5\xd8\x51\x57\xb7\x00\x27\x06\x06\ \x70\xee\xcc\x59\xd4\x54\xcf\x83\x8e\xd1\x73\xea\xe8\xb4\x0c\xeb\ \xfb\x94\xf8\x0c\xaf\x0f\x55\x95\x95\xdc\x82\xba\x3a\x3a\x31\x78\ \xfe\x02\x42\x43\x43\x2f\x3d\x43\x80\x2c\x76\x6e\x20\x70\x9f\xad\ \x77\x57\x67\x17\x56\x91\x6c\xfe\x62\x3f\x34\x2a\x35\xa6\xf0\xa6\ \x20\x69\x6a\x22\xe4\x32\x39\x17\x94\x12\x70\x72\x7b\x49\xfa\xe5\ \xcb\x96\x07\x9b\x9a\x56\xc1\x6e\xb3\x43\xad\x54\x3f\x93\x5c\x22\ \xce\x20\xa2\x16\xb0\x23\x79\x70\xff\x01\x9c\x39\xfd\x21\xae\x92\ \x02\x87\x0e\x1c\x44\x61\x61\xe1\x03\xca\x29\x7c\x4a\x60\xdc\xb8\ \x71\xfd\x9d\x1d\x1d\x1c\xbb\xbe\x1d\x6f\xa3\xb5\xa5\x95\x0d\x0e\ \x3f\x35\x62\x7c\x5c\x3c\x22\x23\x23\xb9\x11\x94\x4b\x65\xec\xaa\ \x38\x25\xd4\x2a\x15\x62\x26\xc7\x0c\x51\x97\x0f\xb1\x44\x19\x2d\ \xc3\xdd\xe7\x48\x32\x0c\x94\x72\x05\x57\xc2\xf6\xd6\x36\x6c\xa6\ \x45\xf5\x6e\xdd\x8a\xc3\xef\xbe\x87\xab\x57\xae\xa2\x87\x7a\x82\ \xf6\x88\xb3\x1c\x01\xb2\xe8\xba\xda\xba\x5f\xb2\xb3\xb3\xa9\x7e\ \x26\x14\x64\xfb\x30\xa7\xcc\x8f\xd2\x82\x5c\xb6\x73\x91\x10\x9f\ \xc0\xa9\x90\x21\x16\x23\x91\x94\x70\xd8\xed\x30\x53\x60\xb6\xe3\ \x05\xd3\xf8\x43\xe9\xc2\xb4\x3b\x1a\xb5\x1a\x16\xaa\xbd\xc3\x66\ \xe3\x54\xa8\x9c\x55\xc1\x91\x49\x4d\x49\x85\xc9\x68\x80\xcb\x66\ \x81\x3f\x77\x06\xf2\x7c\x5e\x7a\xae\x45\x2e\x35\x69\x6d\xcd\x3c\ \x56\x85\x94\x90\x88\x88\x88\x6d\x0c\xdd\xf4\x3a\x1d\xc8\x52\x8b\ \xb0\xb0\xc8\x83\x75\x8b\x03\xe8\x6d\x69\x40\x6f\x7b\x13\xaa\xcb\ \x8b\x11\x3b\x25\x16\x3a\x0a\x48\xbb\x1c\x9a\x56\x36\xa2\x61\x79\ \x3d\x54\x44\x20\x29\x31\xf1\x26\x6d\x4c\xdf\xb1\x2b\xdd\xbb\xfb\ \x1d\x34\x53\x39\x3c\x59\x6e\xce\x27\x35\x39\x05\x66\x03\x03\x37\ \x23\xc5\xa2\xd2\x6c\xac\x5f\x56\x43\x31\xeb\xd1\xb3\xba\x01\xe5\ \x85\xb9\x30\xd3\x64\xbd\x1e\x1e\x7e\x28\x84\xea\x74\x5b\xa3\x54\ \xc2\x26\x4a\x44\x6e\x46\x2c\x4a\x25\x3c\xbc\xe9\x10\xa3\xa9\xd0\ \x8a\x75\xb5\x7e\xd4\x97\xf8\x20\x17\x0a\x20\x16\x89\xb9\x32\x2c\ \x5d\xb2\x14\xfb\xf7\xee\x83\x96\x9a\x71\xec\xd8\xb1\xfe\xa8\xa8\ \xa8\xa5\xac\xe4\xdd\x9b\xbb\x71\xfc\xfd\x7e\x6e\xcf\x30\x1b\x8d\ \xd0\x2a\xe4\x70\x4a\xf9\xf0\x08\xa3\x51\xae\x15\x60\x99\x4f\x83\ \x75\xb3\x7d\xd8\xbe\xa2\x06\x8d\xb3\x73\x90\x96\x22\x60\x55\xbb\ \x47\xdb\xa7\xf6\xb1\x5e\x25\x87\x2b\x95\x1c\x33\xa2\xd1\x6c\x49\ \x44\xab\x3d\x09\x1d\xbe\x74\xac\xf3\x8a\x50\x29\x9b\x0c\x97\x34\ \x19\xbc\x98\x18\xb6\xbe\x41\xb9\x4c\xf6\x88\xca\x71\x27\x3a\x3a\ \x7a\xf5\x6f\x9d\x4c\xd7\xed\x52\xb1\xe4\xae\x52\xa1\x7c\xe8\x71\ \x7b\x82\x6c\xd3\x2a\xa7\xf3\xe1\x4e\x9e\x88\x45\xc6\x69\x68\xb4\ \xf1\xd1\xea\x12\x62\x83\x37\x0d\x4b\x0c\x53\x51\xa5\x8e\x87\x31\ \x23\x85\xeb\x9b\x10\xaa\x65\x50\x27\x11\xa1\x38\x7d\x12\xea\x19\ \x1e\xd6\xda\x13\xd1\x97\x2f\x46\x6f\x4e\x3a\x9a\x8c\xb1\x44\x28\ \x1e\x25\x66\x19\x57\xff\x09\xe3\xc7\x57\x3d\xef\x70\x89\x89\x89\ \x71\xf1\x62\x78\x30\x8a\x93\xe1\x17\x45\x61\xa1\x2e\x0e\xeb\xdd\ \x42\xf4\xce\x9c\x8e\xcd\x6e\x01\x36\x39\xa7\x62\xfb\x6c\x06\x39\ \x66\x0d\x37\xe2\x21\x76\x9b\xed\x7b\xb6\x51\x2a\x94\x09\xe8\x71\ \x27\xe3\x44\x85\x02\x97\xeb\xf4\xb8\x58\xc3\xe0\x48\x89\x18\xab\ \x89\xc0\xfc\xb2\x02\x6e\x02\x68\x5a\x26\xbc\xc0\x71\x3c\x46\x98\ \x9a\x8a\x1c\x97\x95\x14\x9d\x84\xce\x2c\x01\x8e\x94\xca\x30\x58\ \xad\xc1\x60\x40\x8e\xa3\x45\xa4\x84\x67\x3a\x66\x7a\xb2\xd8\x72\ \x0d\x85\x90\xb3\x59\xa5\x50\xa2\xb6\xaa\x1c\xdd\x25\x7a\x9c\xf4\ \x0b\x71\xad\x56\x8d\x8f\x2a\x44\x38\x52\x9c\x86\xbe\x96\x65\xc8\ \xcb\xcb\x63\x0f\xa2\xaf\x86\x4d\xfe\xec\xa9\x78\x9d\x95\xb7\xb9\ \xae\x12\xdd\xde\x54\x1c\x2b\x9a\x8e\x2b\x73\xd5\xf8\x24\x20\xc6\ \xa9\x45\x59\xe8\x5c\xd3\x08\xf2\xa1\x26\x4e\x9a\xc9\xbd\xc0\x30\ \x8c\x93\xf6\xfb\xe0\xbc\x40\x15\x8e\x6d\xdb\x80\xcf\x8e\xec\xc0\ \xb5\x81\x7d\x38\xdc\xb7\x05\x73\x2a\xca\x61\xb1\x58\x6e\xb0\x07\ \xd5\x8b\x12\x20\x1b\x4d\x5d\xfe\x35\xc5\x44\xef\xfa\x16\x0c\xee\ \xdb\x82\x2f\x06\xf6\xe0\xd3\xfe\x3d\xe8\x6c\x69\x82\xdb\xe9\x0c\ \x2a\x95\xca\xc0\x33\x5b\x71\x6c\x6c\xec\x44\x83\x5e\xbf\xb3\x28\ \x37\xe7\x56\xe1\x4c\xdf\xc3\x59\xf9\x39\x0f\xec\x46\xdd\x0d\x3a\ \x92\x4b\xff\xe1\xe7\xd6\x28\x97\xd3\xe9\xa0\x11\xff\xc6\x64\x32\ \xdd\xa7\xe6\x7c\x54\x54\x50\x70\x3b\xd3\x6a\x3d\x15\x16\x16\x16\ \x37\xdc\x07\xc9\xe8\x27\x08\xf9\x97\x30\x86\x30\x8e\x30\x81\x10\ \x36\xf2\x55\x3c\x42\xe0\x7f\x47\xe0\x57\x54\x74\xc3\x49\x75\x05\ \x9d\x57\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\xf0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x01\x0a\x69\x43\x43\x50\x50\x68\x6f\ \x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ \x6c\x65\x00\x00\x78\xda\xad\xd0\x3d\x4a\x03\x41\x00\xc5\xf1\xff\ \x44\xd4\x46\xd4\x22\x58\x4f\xa9\x85\x0b\xc6\x6a\xcb\xcd\x87\x8b\ \x60\x9a\xcd\x16\xd9\x74\x9b\xd9\x21\x59\x92\xdd\x1d\x66\xc6\x98\ \xdc\xc1\x43\x78\x04\x8f\xe0\x0d\x52\x08\x5e\x44\xb0\xb6\x08\x12\ \x2c\x05\x7f\xd5\xe3\x35\x0f\x1e\x88\xd7\xa8\xdf\x1d\xb4\xce\xa1\ \xaa\xbd\x8d\x93\x28\x1b\x67\x13\x79\xbc\xe5\x88\x03\x00\xc8\x95\ \x33\xc3\xd1\x5d\x0a\x50\x37\xb5\xe6\x37\x01\x5f\x1f\x08\x80\xf7\ \xeb\xa8\xdf\x1d\xf0\x37\x87\xca\x58\x0f\xbc\x01\x0f\x85\x76\x0a\ \xc4\x09\x50\x3e\x79\xe3\x41\xac\x81\xf6\x74\x61\x3c\x88\x67\xa0\ \xbd\x48\x93\x1e\x88\x17\xe0\xd4\xeb\xb5\x07\xe8\x35\x66\x63\xcb\ \xd9\xdc\xcb\x4b\x75\x25\x6f\xc2\x30\x94\x51\xd1\x4c\xb5\x1c\x6d\ \x9c\xd7\x95\x93\xf7\xb5\x6a\xac\x69\x6c\xee\x75\x11\xc8\x68\xb9\ \x94\x49\x39\x9b\x7b\x27\x13\xed\xb4\x5d\xe9\x22\x60\xb7\x0d\xc0\ \x59\x6c\xf3\x8d\x8c\xf3\xaa\xca\x65\x27\xe8\xf0\xef\xc6\xd9\x44\ \xee\xd2\x67\x8a\x00\xc4\xc5\x76\xdf\xed\xa9\x47\xbb\xfa\xf9\xb9\ \x75\x0b\xdf\xbf\x06\x40\x2a\xe2\x79\x76\x40\x00\x00\x00\x20\x63\ \x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\ \x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\ \x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x02\x60\x49\x44\x41\x54\x78\ \xda\xa4\xd5\xcd\x6b\x54\x57\x18\xc7\xf1\xcf\xb9\xb9\x8e\x86\x90\ \x04\x89\x4a\xb2\xb0\xd4\x18\x8c\xf8\x02\xa1\xe2\xcb\x52\xc5\x8a\ \x0a\xb5\x48\x0b\x01\xc1\x8d\x9b\x22\xfe\x07\xfe\x09\x2e\x84\x2e\ \x2b\xd2\x55\x57\x2e\x84\x2a\xd8\x45\xb3\xb0\x54\x41\x29\x94\x52\ \xc5\x17\xa8\x2f\x0d\x29\x2d\x2d\x71\x7c\x99\xc4\x24\x9d\x99\xe3\ \x22\x63\xcc\xdc\x3b\x77\x32\xe0\xb9\x9b\x7b\xcf\xb9\xcf\xf7\x9e\ \xdf\xef\x79\xce\x73\x43\xf4\x61\x23\x6d\x7e\x0c\xef\xe7\xbb\x24\ \x88\xaa\xaa\xcd\xef\xc4\x76\x80\x06\xa5\xd7\x1e\x3b\x6c\x10\xfc\ \xeb\xbe\x3b\x5e\xa9\x77\xb8\x03\x04\x1f\x19\x77\xd0\x27\xfa\x25\ \x5e\xfa\xdd\x84\xcb\x9e\x14\x21\xf2\x80\x5e\x5f\x38\x63\x9d\xdb\ \xfe\x54\xf3\xb1\x7d\x46\xd5\x5c\x54\x2e\xd8\x42\x6c\xba\xa4\x0e\ \xfb\xc9\xac\xaf\x1d\x36\x64\xd0\x01\xe7\x55\xfc\xe2\xb3\xf7\x9f\ \x6a\x8e\xc8\xee\xa0\xcb\x88\xed\x7e\x75\xcd\x4d\xf3\x28\xab\xda\ \x65\x8f\x2d\x7e\xcc\x9a\xb9\x38\x92\x9c\x03\x43\xfa\x3d\xf1\xd0\ \xbc\x28\x5a\xf0\xc0\x1f\x7a\x0c\xea\x6a\xad\x20\x0f\xe8\x91\x9a\ \xf6\xbc\x91\xad\x68\xd6\x73\xac\x55\xea\x0c\xd0\xca\xa4\xb6\x23\ \x29\x74\xb6\xf9\x3e\x76\x0a\x08\xc2\xf2\x82\x6c\xcc\xc4\xa5\x95\ \x8e\x25\x84\x26\x09\xb1\x81\x58\x95\x7f\x3f\x69\x73\x4a\xd6\x48\ \x97\x50\x51\x62\xb3\xe3\x46\xb3\x11\x45\x80\x2e\xbb\x9d\x75\x40\ \xba\x54\x39\xab\x9d\x74\xca\xf1\x6c\x36\x8a\x00\x25\x87\x8c\x3b\ \xa4\x1b\x41\x14\x05\xfd\x3e\xb7\x21\xeb\x44\xb1\x84\x6e\x63\xfa\ \xac\x5a\x92\x20\x67\x6f\xe1\x71\x5e\x9e\xc0\x35\xa2\xa4\x5d\x2d\ \x14\x01\xea\xca\x5e\xda\xe9\x53\xaf\x6c\xf7\xbf\xb2\xf9\x65\x69\ \xee\x00\x50\x75\xd3\x98\x2f\x4d\x9a\x75\xd0\x84\x9f\x1b\x80\x15\ \x77\xf0\xae\xee\x6a\x7e\x33\x61\xab\x63\xe6\xfc\x65\xc2\x2d\xb5\ \x65\x15\xb1\xa2\x89\x01\x73\xae\xfb\x5e\x45\xea\x8a\xab\x2a\xad\ \x0c\x6c\x27\x21\x11\xfd\xe7\x3b\xd3\x7a\x5c\x37\x25\x16\xe5\x2b\ \x2f\xa1\xa2\x66\xa3\xf5\x66\xd4\x3d\x73\x49\xb0\xa0\x2e\x58\x6f\ \xa3\x9a\xca\x4a\x12\xea\x26\xcd\x18\x31\x2c\x45\xdd\xbc\x39\x75\ \xa4\x86\x8d\x98\x31\x99\x6d\xae\x79\xc0\x53\x53\xb6\x39\x62\x93\ \x52\x63\x35\x51\xb2\xc9\x11\xdb\x4c\x79\x9a\xeb\xce\x99\xa6\x1a\ \x0c\x38\xa7\xac\xec\x82\x13\x86\xf5\xe9\x33\xec\x84\x0b\xca\x5e\ \x38\x67\x40\x68\x8e\x08\x31\x6b\x7f\x62\xb3\xaf\x9c\xd6\xeb\x91\ \x87\xfe\xc6\x90\xad\x46\xbd\xf6\xad\x6f\x3c\x56\xcf\x44\xc4\x7c\ \x1b\x48\x8d\x3a\x6a\xbf\xbd\x7a\x95\xb0\xe0\xb5\x3b\x6e\xf8\xc1\ \x23\xd5\x6c\x73\x6a\x05\x20\xd1\x6d\x87\x9d\x06\x0d\x60\xda\x3f\ \xee\xba\xe7\xcd\xa2\xfe\x4e\x00\x8b\x1d\x21\x15\xa4\xa8\x8a\xaa\ \x6a\xad\xbb\x6c\xf8\xd0\xdf\xfb\xdb\x01\x00\x91\x08\xd4\x14\x36\ \x9d\x00\x2b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xe6\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8e\x7c\xfb\x51\x93\ \x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\ \x00\x00\xf9\xff\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\ \x00\x00\x3a\x97\x00\x00\x17\x6f\x97\xa9\x99\xd4\x00\x00\x01\x71\ \x49\x44\x41\x54\x78\x9c\x62\xfc\xff\xff\x3f\x03\x25\x00\x20\x80\ \x98\x28\xd2\x0d\x04\x00\x01\xc4\x02\x22\xaa\xab\xab\xf5\xde\xbf\ \x7f\x1f\xf1\xe6\xcd\x1b\xab\xd7\xaf\x5f\x2b\xbf\x7c\xf9\x52\x18\ \xc8\x66\xff\xf8\xf1\x23\xd8\x02\x7e\x7e\xfe\x7f\x22\x22\x22\x3f\ \xc5\xc5\xc5\xdf\x8a\x8a\x8a\xde\x05\xb2\x8f\x09\x0a\x0a\xae\x68\ \x6d\x6d\xbd\x04\x10\x40\x8c\x29\x29\x29\x53\xce\x9e\x3d\x1b\x2b\ \x27\x27\xc7\x67\x68\x68\xc8\xa0\xa5\xa5\xc5\xa0\xa2\xa2\xc2\x20\ \x25\x25\xc5\x00\x54\x04\xb6\x05\x68\x38\xc3\xb3\x67\xcf\x18\xee\ \xdc\xb9\xc3\x70\xed\xda\x35\x86\xf3\xe7\xcf\x33\x3c\x7a\xf4\xe8\ \x93\xb1\xb1\xf1\x62\x80\x00\x62\x50\x55\x55\xfd\x79\xe8\xd0\xa1\ \xff\xa4\x02\x90\x1e\x90\x5e\x80\x00\x62\x8c\x88\x88\x58\x79\xf3\ \xe6\x4d\x1f\xa0\x0b\xb8\x48\x74\xc1\x37\x75\x75\xf5\x2d\x00\x01\ \xc4\xf2\xf3\xe7\xcf\x1f\xac\xac\xac\x8c\x40\xcc\x00\x34\x88\xe1\ \xc4\x89\x13\x60\xc5\x2f\x5e\xbc\x60\xf8\xf0\xe1\x03\xd8\x00\x01\ \x01\x01\x06\x09\x09\x09\xb8\xa1\x20\xb5\x20\x3d\x20\xbd\x00\x01\ \xc4\x08\x72\xc6\xb4\x69\xd3\xd8\x34\x35\x35\x19\xbe\x7e\xfd\xca\ \x00\x14\x64\xf8\xf3\xe7\x0f\xc3\xbf\x7f\xff\x50\xa3\x8b\x89\x89\ \x81\x85\x85\x85\x81\x9d\x9d\x9d\x81\x9b\x9b\x9b\xe1\xfa\xf5\xeb\ \x0c\x59\x59\x59\xbf\x00\x02\x88\x62\x2f\x00\x04\x10\xcc\x0b\x0c\ \x64\x78\x01\xe4\xda\x1f\x00\x01\x04\xf2\xc2\x0f\xa0\x17\xd8\xc9\ \xf4\xc2\x4f\x80\x00\x82\xa5\x83\x18\xa0\x17\xf8\x49\xf4\xc2\x47\ \x60\x3a\x58\x02\x10\x40\x8c\xa0\xbc\x40\x49\x4a\x04\x08\x20\x46\ \x4a\x33\x13\x40\x00\x51\x9c\x99\x00\x02\x88\x62\x03\x00\x02\x0c\ \x00\xc0\x2e\x32\x2f\xb3\xcc\x4b\xf0\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x04\xff\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ \x67\x9b\xee\x3c\x1a\x00\x00\x04\x91\x49\x44\x41\x54\x58\x85\xb5\ \x97\xcd\x8b\x1c\x45\x18\x87\x9f\xb7\xba\xba\x7b\xa6\x67\xe7\x63\ \x37\x2c\x09\x78\x30\x18\xd4\x9b\x91\x48\x6e\xf1\xe3\x5f\xc8\x31\ \x7f\x80\x82\x07\xcf\x09\xe2\x41\x41\xd4\x15\xa2\x08\x9e\x14\x04\ \x3d\x8b\x39\xe8\x41\xcc\xd5\xb8\x89\x18\xc8\x42\x44\x8c\x21\x64\ \x51\x31\xee\x46\xd7\x9d\xc9\xec\xc7\x74\x55\xbd\x1e\xba\xe7\x2b\ \x6e\xb2\x3d\x92\xd4\x30\x5d\x45\xd1\xbc\xbf\xe7\xfd\xbd\x55\xd5\ \xdd\xa2\xaa\x54\x6d\xe9\x67\xf1\x29\x44\x5e\x14\x15\x11\x05\x13\ \x0c\x06\x23\x31\x56\x2c\x31\x91\x46\x72\xa7\xdf\xfb\xaa\xf7\xca\ \xd6\xbb\x55\x63\xda\xaa\x37\xc6\x9f\xda\xc6\xc9\x23\x27\x3f\x38\ \x7d\xf4\xf4\x62\x62\x12\x02\x4a\xc0\xe3\xf0\x38\x1c\x4e\x1c\x1e\ \xcf\x85\x9b\xdf\x3e\xd3\x7e\xb3\xf1\xe5\xe6\x6b\xfd\x9f\xaa\xc4\ \x35\x55\x01\x10\x16\x8f\x1d\x38\x56\xaf\x49\x8d\xa0\x01\xa7\x39\ \xb9\xe6\xe4\x3a\x20\x0f\x03\x5c\xc8\xc9\xc3\x80\xc3\x0b\x87\x6b\ \xc0\xa3\x55\xc3\x56\x76\x40\x81\xa0\x81\x41\x18\xe0\x70\x78\x02\ \x8e\x7c\xd4\x3b\xf5\x85\x17\xc1\x55\xce\x69\x26\x00\x01\x7c\xf0\ \xb8\xe0\x18\xfe\x4a\x49\x72\x1c\x01\x5f\xf4\x21\x3c\x1c\x00\xb4\ \x00\x18\x3b\xe0\x71\xea\xf0\xe2\xa7\x80\xbc\xfa\x87\x05\x20\xf8\ \xe0\x35\x0f\x39\x4e\xa7\x1d\x08\x12\xc8\xc9\x0b\x80\xe0\x91\xea\ \x1b\x6b\x86\x12\x04\x08\xc1\x93\xfb\x7c\x4a\x7c\xd4\x97\x4e\x78\ \xef\x28\x0a\xf6\xc0\x01\x04\xe7\x3d\x43\x07\x82\x78\xf2\xa1\x13\ \x32\x86\xf0\xea\x8b\x15\xfb\xe0\x01\x20\x78\xaf\xb9\x1f\x4c\x64\ \x5f\xee\x80\xe1\x8c\x94\xbb\x60\x16\x80\xfa\x87\xe9\x93\xad\xb4\ \xf9\xd1\x89\x47\x9e\x5d\x54\x54\x95\x40\xa0\x18\x29\x4a\xd0\xa0\ \x01\xe5\xf9\x43\x2f\x44\x0b\xe9\x42\x92\x7b\x57\x1e\x3f\xbe\x94\ \x76\xe3\xab\x78\xba\xbe\x07\x73\xfa\x4e\xe7\xfd\xb9\xd7\x45\x81\ \x00\x20\x48\x00\x04\xb4\x5c\x20\xe2\x64\xcb\xfc\x23\x2f\x5b\xa3\ \x66\xe9\xec\x89\xf7\x9e\x7b\x7c\xfe\x09\x7c\xf0\x78\x2d\xb2\xf0\ \x1a\xf0\xc1\xe1\xb5\x0c\x5e\xf6\xd3\x0e\x4c\xec\x00\xf1\x38\x71\ \x2c\x6f\x5d\x30\xfe\xb8\x1e\xd5\x28\x40\x04\x1a\x01\x91\xa2\x11\ \xa8\xd5\x72\x4e\x51\x07\x8d\x73\xe9\x92\x8d\xd5\x76\x1e\x6b\x1f\ \xc1\x85\xbc\x14\xf6\xb8\x12\xc4\x87\x72\xab\x69\x51\xdb\x29\xc1\ \xd1\xb8\x3c\x05\xc4\x71\xb9\xf7\x03\x97\x36\x2e\x21\xa6\xc8\x5a\ \x51\x04\xc6\x57\x19\xce\x09\x58\x05\x43\xdb\xa2\xfc\x27\xeb\x91\ \xe8\xc8\x91\x21\xc0\x54\xc5\x47\x7d\x3f\xdc\xe1\xfc\xfa\x37\xac\ \xf4\x57\xd0\x48\x21\x12\x04\x9d\x82\x00\x41\xa5\x10\x1f\x41\x00\ \x56\x9d\xea\xc0\x0f\x0a\xf1\xbb\xb3\x2e\x4f\xbe\x62\x3c\x2c\xc3\ \x58\x7c\x6d\xf7\x4f\x2e\xfe\xbd\xcc\x4a\x77\x05\x67\x72\x88\x28\ \x03\x0f\x25\xee\x82\x98\x70\x40\x51\x50\xb0\xa8\x92\x87\x7c\x64\ \xb3\x0b\x8e\x30\x2a\x83\x1f\x3b\x12\x7c\x71\xde\xab\xe3\x97\xee\ \x35\x2e\xae\x2f\x73\xbd\x7f\x7d\x54\xd3\x61\xd6\x2a\xf7\x81\x90\ \xc9\xd2\x48\x09\xe0\x61\xc7\xef\x00\xec\x99\x75\xe1\x46\xe0\xf6\ \xf6\x3a\xd7\x36\x7e\xe6\xfb\x5b\x17\xb9\xbd\x7b\xbb\xc8\x36\xa2\ \x0c\x3f\x21\x28\x5a\xce\x15\x6d\x0a\x42\x26\xca\x51\xee\x55\x2b\ \x0a\xcb\x7f\x7c\xc7\xf1\x83\xc7\x71\xa5\xfd\x5b\xf9\x16\x37\xbb\ \x37\x58\xed\xde\x64\xb5\xb7\xca\x6f\xbd\x5f\xe9\xbb\xfe\xf4\x06\ \xf6\x93\xc2\x13\x63\x11\xf6\x58\x7e\x7b\xae\x09\x14\xac\x78\xe1\ \x93\x1f\x3f\xe6\xdc\xf5\xcf\x49\xa3\x1a\x41\x3d\x6b\xdb\x6b\xfb\ \x9f\x20\x7a\x0f\x08\xd9\xbb\xfe\xa3\x39\x99\x84\x00\x8b\x16\xc3\ \x8d\xdd\x8d\xfd\x45\xab\x40\xc8\xbd\x17\xe1\xb0\x44\xa3\xb9\x00\ \x56\x1c\xe7\xc3\x66\x78\x4a\x12\x69\xde\xef\x04\x15\x80\x18\x2b\ \x56\xa6\x9f\x34\x77\x43\x04\x90\xbe\xe4\x18\x05\x23\x88\x51\xd4\ \x08\x6a\x28\xce\x87\x48\x50\xa3\x98\x9e\xe9\x91\xcb\x79\x51\x55\ \x0e\xbc\xda\x7a\x5a\x45\x0f\x8d\x95\xf6\xc8\x14\x0e\xca\x9c\x2c\ \x99\x05\x39\xb8\x17\x60\x6a\x53\xe2\x38\xc1\x6c\x4b\xde\xbd\xd6\ \x7d\x03\xb8\xbc\x8f\x7f\xb7\xd6\xcf\x6e\x5e\xb1\x00\x7f\xbd\xd5\ \xbd\xb2\xcf\xcd\x1c\x38\xd3\x3a\xbc\xd7\x73\x3e\xb3\x19\x99\xcd\ \xa8\xdb\x8c\xc4\xc6\x68\x10\xe9\xd2\xbd\xbc\x7e\x76\xf3\xeb\xfd\ \x62\xc2\x8c\x8f\xe3\x49\x00\x41\x68\x25\x6d\x5a\x49\x8b\x46\xdc\ \x20\x8b\x33\xd2\x28\xc5\x05\xc7\x8d\xaa\x41\x67\x02\xf0\x94\x4f\ \xb6\xa2\x75\xd2\x0e\x9d\x74\x9e\x56\xda\xa6\x19\x37\xc9\xe2\x8c\ \x7a\x54\x67\xc7\x6f\xcf\x20\x3f\xcb\x2b\xd9\x44\x6b\x26\x2d\xda\ \x25\x40\x27\xed\xd0\x4e\xdb\x34\x6c\x83\x7a\x9c\xd1\x73\xdd\xea\ \xaf\x43\xff\x07\x20\x31\x09\xcd\xb8\x49\x2b\x69\xd1\x4e\xdb\x63\ \x27\x92\x16\x59\x9c\x11\x0d\xa2\x99\xe2\xcd\x0c\x50\xb7\x19\x59\ \x9c\xd1\x88\x1b\x05\xc8\x04\x44\x33\x69\xe2\x77\x1e\xd6\x5b\x71\ \xd9\x6a\x36\xa5\x1e\xd5\x47\x20\x73\xf1\x1c\xad\xa4\x55\x42\x74\ \xe8\x27\x77\x66\x2a\x41\xf5\x4f\x33\xc0\x88\xc1\x9a\x98\x38\x8a\ \x49\x4c\x42\x1a\xd5\xa8\x47\xf5\xc2\x8d\xa4\x49\x27\x9d\x27\x8b\ \xb3\x99\x12\x9a\x05\x60\x9d\x9c\x5d\x83\x21\x92\x08\x6b\xec\xe8\ \x1f\x47\x05\x4c\x23\xce\x58\xeb\xae\xed\x00\xab\x55\x83\xca\x2c\ \x9f\xe7\x8b\x67\xda\xa7\x4c\x64\x5e\x4a\x6d\x6a\xe2\x28\x96\x24\ \x4a\x24\xb5\x35\x93\xda\x54\x6a\x71\xcd\x44\x26\x92\xab\xbf\x5f\ \xfd\x62\xed\xed\x8d\xa5\xaa\x31\xff\x05\x9e\x1b\x29\x6a\xf7\x59\ \xb1\xc0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\x64\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ \x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ \x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ \x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ \x46\x00\x00\x06\xda\x49\x44\x41\x54\x78\xda\x62\xfc\xff\xff\x3f\ \x43\x7e\x7e\xfe\x05\x05\x05\x45\xb5\xdf\x7f\xfe\xfc\x01\x72\x11\ \x00\xc4\x61\x84\x50\x30\x2e\x08\x30\x32\x82\x79\x50\x41\x38\x0b\ \xaf\xd8\x7f\x28\xc1\x08\x04\xff\xff\xff\xfd\xff\xfc\xd9\xb3\x2b\ \x53\xa6\x4c\xb1\x02\x08\x20\x16\x90\x38\x13\x23\x23\x7b\x61\x61\ \x01\x27\x03\x9d\xc0\xcb\xf7\xdf\x19\x1a\xaa\x0a\xb9\x40\x6c\x80\ \x00\x62\x41\x72\x37\xc3\xda\xe3\xbf\x19\x4c\x55\x98\x18\x78\x38\ \x19\x19\x6e\xbf\xf8\xcd\x20\xc4\xcd\xc4\xf0\xe4\xcd\x6f\x86\x3f\ \xff\xfe\x33\xfc\xfe\xfb\x9f\x41\x52\x80\x85\xe1\xfe\xab\x9f\x0c\ \x9b\xcf\x7c\x62\xf8\xf9\xe7\x2f\x58\xec\xd7\x6f\x20\x0d\x64\xff\ \xfa\xf3\x9f\xe1\xe7\xdf\x7f\x60\x36\x30\x1c\x21\x72\x40\xfe\xaf\ \x3f\xff\x20\x34\x50\xdd\xcf\x5f\x7f\x18\xfe\x31\x32\x33\x5c\xef\ \xd3\x63\x60\x84\xda\x09\x10\x40\x2c\xc8\x2e\x03\x69\x7a\xfc\xe6\ \x2f\x03\x13\x13\xd0\x30\xa0\x21\xd7\xdf\xff\x62\xf8\x07\x0c\x77\ \x66\xa0\xea\x9f\x40\x83\x1e\xbf\xfd\x05\x16\x67\x63\x61\x04\x8a\ \x33\x42\xa3\x05\x44\x33\xc2\xe3\x06\x04\x99\x60\xd1\x04\xe5\x33\ \x82\x68\x90\xba\xff\x4c\x0c\xff\x19\x99\xa0\x51\x08\x01\x00\x01\ \xc4\x82\x1c\x4f\x0e\x3a\xac\x0c\xff\x80\xbe\xfd\x0b\xc4\x20\x45\ \xbf\xff\x32\x33\xc0\x8c\xff\x0b\x74\x08\x28\x0d\x30\x03\x4d\x37\ \x55\xe6\x04\x3b\x0c\x94\x7e\x40\xea\xc1\xf8\xff\x3f\x84\x18\x88\ \x06\x8b\x31\x40\xe5\x40\x6a\xfe\x81\xcd\x65\x66\x66\x61\xe0\xe7\ \x64\x06\xcb\x81\x00\x40\x00\xb1\x20\x27\x2e\x09\x01\x24\xdf\x80\ \x01\x33\x9e\x98\xfc\x8f\x14\x79\xff\x90\x84\xa0\xe2\xff\x40\x24\ \x14\x22\xa5\x62\x26\x26\x26\x60\x94\x20\xec\x00\x08\x20\x16\x52\ \x13\xd0\x7f\xa8\x2f\x41\x98\x91\x11\x11\x0d\x30\x4b\xfe\x41\xbd\ \x86\x8d\x0f\x0a\x05\x60\x0e\x60\x60\x65\x65\x85\x9b\x07\x10\x40\ \x38\x1d\xf0\xeb\xd7\x2f\xb0\x06\x36\x36\x36\xb0\xab\x61\x00\x1c\ \x9f\x50\x8b\x7f\xfe\xfc\xc9\xf0\xe5\xcb\x17\xb8\x65\x30\x87\x21\ \x3b\x16\x14\x0e\x10\x47\xfc\x67\xe0\xe4\xe4\x04\x9a\xc5\x0c\xd7\ \x0f\x02\x00\x01\x84\xe2\x80\x1f\x3f\x7e\x30\xbc\x79\xf3\x86\xe1\ \xfc\xf9\xf3\x0c\x17\x2e\x5c\x00\xa6\xe6\x3f\x0c\xf2\xf2\xf2\x0c\ \x0e\x0e\x0e\x60\x87\xa0\x1b\xfe\xee\xdd\x3b\x06\x76\x76\x76\xa8\ \x4f\xff\xa1\xf8\x14\x94\x88\xfe\x83\x68\x70\xb0\x03\x13\xed\xbf\ \xbf\x0c\x6f\xdf\x7d\x64\xd0\xd3\xd3\x85\xeb\x01\x01\x80\x00\x42\ \x71\xc0\x8d\x1b\x37\x18\x84\x85\x85\x19\x34\x34\x34\x18\xd4\xd5\ \xd5\xc1\x86\x81\x1c\xf1\xfb\xf7\x6f\x30\x0d\x09\x42\x88\x2f\x41\ \x62\x20\x47\x71\x71\x71\x81\x43\x08\xe4\x2b\x50\x88\x80\x82\x17\ \x24\xfe\xe7\xcf\x6f\x60\x22\x66\x60\x78\xff\x9d\x8d\xe1\xe3\x2f\ \x66\x86\x2f\x5f\x3f\x33\x30\x7c\x7f\xca\xf0\xf5\xeb\x57\x06\x5e\ \x5e\x5e\xb8\x9d\x00\x01\x84\xe2\x00\x1e\x1e\x1e\x06\x59\x59\x59\ \xb0\x05\xa0\x28\x00\x59\x02\xc2\x20\x83\x61\x8e\xf8\xfb\xf7\x2f\ \xc3\xf7\xef\xdf\xc1\x41\x2f\x22\x22\xc2\x20\x2a\x2a\xca\xc0\xc1\ \xc1\x01\x76\x1c\x48\xcd\xeb\xd7\xaf\x19\x9e\x3c\x79\xc2\xf0\xef\ \xef\x1f\x06\x0e\x1e\x21\x86\x55\xa7\xbe\x30\x9c\x7b\xf8\x8b\x41\ \x4f\xec\x37\x83\xbb\x12\x23\x38\x34\x90\x01\x40\x00\xa1\x38\x80\ \x85\x85\x05\x1e\x9c\xc8\xbe\x85\xc5\x3b\x38\x05\x03\x1d\xf6\xf9\ \xf3\x67\x06\x4d\x4d\x4d\x06\x21\x21\x21\x70\x34\x3c\x7e\xfc\x18\ \x6c\x39\x33\x33\x33\x83\x98\x98\x18\x83\x8a\x8a\x0a\xc3\xc3\x07\ \x0f\x18\xfe\xfe\xfa\xc6\x10\x60\xc4\xc3\xe0\x63\xc0\xca\xc0\xc5\ \x02\x2c\x47\xee\x3d\x41\xcb\x65\x0c\x0c\x00\x01\x84\x5a\x10\x01\ \x0d\x79\xfb\xf6\x2d\x38\x2d\xc0\x7c\x0f\xf3\x35\xc8\x62\x10\xfd\ \xed\xdb\x37\x06\x2d\x2d\x2d\x06\x01\x01\x01\x86\xab\x57\xaf\x82\ \x7d\x0c\x72\x24\x28\x94\x40\xf2\xb7\x6e\xdd\x02\xa7\x1b\x31\x71\ \x71\xb0\x23\x04\xf9\x59\xc0\xd1\xf2\x07\x58\x42\xfe\x05\x96\x88\ \xb0\xe8\x82\x01\x80\x00\x42\x71\xc0\xc7\x8f\x1f\x19\xee\xdc\xb9\ \x03\x37\x0c\x86\x41\x3e\x03\x05\x3b\xcc\x72\x50\xb0\xdf\xbb\x77\ \x0f\xac\xee\x2b\x30\x6e\x17\xcc\x9f\xc7\xf0\xe2\xc5\x4b\x06\x3b\ \x3b\x1b\x06\x13\x53\x4b\x86\x6b\xd7\xae\x81\x43\x90\x8f\x8f\x8f\ \xe1\xed\xfb\x0f\xe0\x74\xf5\xe7\xef\x3f\x78\x2e\x42\x06\x00\x01\ \xc4\x84\x2b\x8f\x23\x63\x58\x94\x80\x1c\xa2\xa4\xa4\x04\x0e\x15\ \x70\x88\x00\xe9\xbc\xbc\x62\x86\xbb\xaf\x05\x19\xa4\xb4\x43\x19\ \xfa\xa7\xad\x66\x38\x78\x60\x1f\x38\x95\x3f\x7f\xfe\x1c\xac\x17\ \xe4\x01\x50\x48\xa2\x97\x1d\x30\x00\x10\x40\x28\x21\x80\x1e\xf7\ \x30\x3e\xcc\x71\xa0\xe0\x03\xc5\xfb\xa7\x4f\x9f\xc0\xbe\xda\xb1\ \x75\x1d\xc3\xbd\x4f\xb2\x0c\x09\x81\xd3\x18\x24\xc4\x38\x18\x64\ \x9f\xf0\x32\xec\xdb\x3f\x89\xc1\xd1\xc9\x19\x1c\x5a\xb0\x68\x83\ \x95\x15\xa0\xa8\x45\x2e\x53\x40\x00\x20\x80\xb0\x3a\x00\x1d\xc3\ \x7c\x02\x4b\x27\x20\x31\x50\x82\xe5\xe4\xe2\x61\xe0\xe1\x00\xe6\ \x12\xe6\x6f\x0c\xdf\xd8\x38\x18\x38\x38\xbf\x33\x70\x73\x71\xc1\ \x83\x1a\xa4\x0e\x54\xae\x80\xd2\x05\x88\x0d\x0a\x39\x77\x77\x77\ \x14\x07\x00\x04\x10\x8a\x03\x60\x79\x1d\x1d\xc3\x42\x00\x96\xcd\ \x40\x29\xfd\xfd\xfb\xf7\x0c\x9e\xde\x01\x0c\x57\xaf\xdd\x62\xf8\ \xfa\x70\x06\x03\xc7\x5f\x05\x06\x4d\xce\xf3\x0c\xb6\x31\xd1\xc0\ \xb4\xf1\x8b\x81\x9b\x9b\x1b\x6c\x1e\x28\xb4\x40\xe9\x07\x56\x88\ \xa1\x47\x01\x40\x00\xe1\x8c\x02\x74\x1a\xe6\x80\xbb\x77\xef\x32\ \x48\x48\x48\x80\x0d\x07\x15\xad\xa5\x65\xe5\x0c\xd7\xae\x5c\x64\ \xf8\x0c\xb4\xc8\x39\x26\x0c\x5c\xe7\xff\xfe\x0d\x71\x00\xa8\xd0\ \x01\x85\x00\x28\xed\x80\xd4\xc3\xb2\x32\x32\x00\x08\x20\x16\xf4\ \x44\x88\xee\x08\x58\x08\x80\x68\x90\x66\x50\x70\x4a\x49\x49\x81\ \x73\x02\xa8\x0c\x00\x45\x85\xb2\xaa\x06\x38\xce\x41\xa1\x02\x8c\ \x69\xa0\xe5\x5c\x60\x4b\x41\x39\x05\xe4\x08\x98\xa5\xd8\x12\x21\ \x40\x00\xa1\x38\x07\x39\xeb\x61\xc3\x20\x47\x80\xb2\xde\xc1\x83\ \x07\xc1\xa5\x1d\xa8\x04\x04\x25\x2c\x90\xc5\xa0\x84\x06\xb2\x08\ \x54\x34\x83\x2c\x01\x59\xfe\x00\x58\x0e\xc0\x3c\x02\xd2\x8f\xcd\ \x01\x00\x01\xc4\x82\x2d\x1b\xc2\xe2\x0a\x64\x20\xc8\x27\x20\x31\ \x18\x0d\x2b\xf3\x8f\x1e\x3d\x0a\xce\x92\xe2\xc0\x02\x07\x39\xf4\ \x40\xa5\xe4\x8b\x17\x2f\xc0\x69\x05\xe4\x40\x98\xef\x41\x21\x05\ \x72\x04\x7a\x41\x04\x10\x40\x2c\xc8\x75\x37\xa8\x04\xd3\xd3\xd3\ \x03\xc7\x35\xcc\xc7\xc8\xbe\x87\xf9\x02\x96\xa2\x61\xf1\x0a\xab\ \xba\x41\x96\x80\x4a\xc8\x8b\x17\x2f\xc2\x2d\x82\x45\x27\xcc\xd2\ \xd9\xb3\x67\xc3\x72\x14\xd8\x52\x80\x00\xc2\x48\x84\xa0\x44\x03\ \xcb\x76\x20\x0b\x60\x6c\x64\xcb\x91\x1d\x84\x9c\x73\x60\x85\x0e\ \x48\x0c\xd8\xd4\x07\x27\x44\xe4\x50\x05\x15\x50\xa0\xd2\xb6\xa6\ \xa6\xe6\xed\xcc\x99\x33\x23\x66\xcc\x98\xc1\x00\x10\x40\x28\x0e\ \x00\x85\x00\x28\xd1\xfc\x47\xe9\x1c\x30\xa0\x34\x46\x90\x43\x0c\ \x17\x78\xf8\xf0\x21\x38\x04\x60\xc1\x0f\x0b\x0d\x50\x7a\xa9\xab\ \xab\x7b\x0b\xec\x0f\x38\x01\x85\x6f\x82\xe4\x00\x02\x08\xa3\x36\ \xe4\xe7\xe7\xa7\xa8\xcd\x0f\xb2\x08\x94\x5e\x40\xd1\x02\xab\x5d\ \x41\x3e\x07\xa5\x9b\xca\xca\xca\xb7\x93\x26\x4d\x72\x06\x0a\x5d\ \x82\xa9\x07\x08\x20\x16\x6c\x6d\x3e\x4a\x01\xac\x21\x03\x72\x04\ \xa8\x71\x02\x4a\x98\xf5\xf5\xf5\x20\xcb\x5d\x80\xd2\x17\x91\xd5\ \x02\x04\x10\x0b\xad\x7a\x3f\xb0\xa2\x1b\x94\x3d\x5b\x5a\x5a\xde\ \x4e\x9e\x3c\xd9\x19\xdd\x72\x10\x00\x08\x20\x16\x6c\x71\x4c\x69\ \x14\x80\x1b\xf4\xc0\x68\x00\xf9\xbc\xbb\xbb\x1b\xa7\xe5\x20\x00\ \x10\x40\x28\x0e\x00\x69\xa2\x06\x00\x25\x3a\x90\xcf\x27\x4e\x9c\ \x08\x4b\x70\x97\x70\xa9\x05\x08\x20\x46\x50\x7c\xe5\xe6\xe6\x5e\ \x53\x53\x53\xd3\x44\x6f\x56\x93\x1b\x02\xa0\x62\x19\x58\x52\xbe\ \x9d\x3a\x75\xaa\x23\x50\xe8\x32\xbe\xb4\x02\x10\x40\x60\x07\x00\ \x53\xbe\x0a\xb0\xa5\xea\x08\x8c\x37\x26\x50\xef\x99\xc2\x04\x08\ \x8e\x03\x60\x69\x78\x14\x48\x5d\x21\x94\x58\x01\x02\x0c\x00\x7c\ \x21\xc6\xbf\x7b\x9d\xb1\xc7\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x04\x47\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\x82\xcc\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x01\x06\x13\x39\x13\x75\ \xb4\x40\x66\x00\x00\x03\xcb\x49\x44\x41\x54\x48\xc7\xcd\x95\x5d\ \x68\xd6\x55\x18\xc0\x7f\xe7\xfc\x3f\xde\xf7\xff\xdf\xbb\xad\xed\ \xdd\xe6\x6c\x2f\xc5\x60\x33\xcd\xcd\x0b\xd1\x0a\x2b\xda\x32\x22\ \x49\x92\x55\x90\x45\xd4\x85\x77\x81\x44\x04\x21\x65\xa3\xb2\x20\ \xa9\xec\xc3\x0b\x21\xf0\x4a\x91\x0d\x69\xd5\x4d\x50\x41\x11\x94\ \x0d\x9a\x99\x91\x46\x5f\x0e\x13\xe7\xc7\x9c\xdb\x72\xef\xe7\xff\ \x9c\xf3\x74\xb1\xf5\x36\x3f\x32\xbd\xaa\xe7\x5c\x1c\x38\xf0\xfc\ \xce\xf3\xfd\xc0\x7f\x2d\xea\x52\x8f\x5b\x43\x17\x88\x46\x83\x72\ \x58\x55\xd9\x64\xae\x02\xf0\x42\x73\xd8\x26\x7d\xb2\x46\xda\x55\ \x93\x88\x3a\xc6\x4f\x0c\xf1\xb9\x1a\x7b\xee\xdc\x15\x00\xfa\x5b\ \xfc\x9b\xe5\x29\xd7\x9b\x60\x70\x08\xa0\xf1\xf0\xf0\xf1\x76\xa8\ \x3d\x66\xe4\xc5\xd2\x65\x01\xfd\xdd\x3c\xe9\x36\x94\x30\xf8\xd4\ \x12\x11\x20\x24\xe4\x99\xc1\x92\x26\x35\xae\xde\x94\x77\x5f\x9a\ \xf8\x47\xc0\xf3\xb7\xca\xcb\xa5\x9e\x19\x02\x16\x71\x1d\xcd\xd4\ \x91\x42\x28\x32\xc5\x19\x7e\xe1\x18\x50\x87\xb7\x53\xb6\xbc\x72\ \xf4\x7c\x80\x37\x7b\x3d\xdb\xe5\x5e\x2b\xf4\xe6\x59\xc0\x2a\x56\ \xd0\x41\x33\xb5\xc4\xc4\x64\xc8\xd2\xca\x42\x22\x26\x98\x24\x58\ \xae\xb2\xb7\x7f\xf5\x65\xfe\x22\xc0\xa6\x66\xbb\xb9\x78\x7f\x81\ \x4e\xee\x64\x09\x0d\xa4\xc9\xe0\x11\x12\x10\xe0\xe3\x51\x43\x0b\ \xcd\x9c\x62\x9c\xe0\x06\x2a\x2b\x87\x87\xe7\x65\x45\x03\x98\x5b\ \x92\x0d\xe7\x68\x61\x15\xed\x64\x48\x53\xe2\x77\x22\x42\x02\x42\ \x52\xc4\x44\xd4\xd3\xc1\xdd\x58\xf2\x69\xf3\x98\xbf\xf2\x02\x0b\ \x9e\x6e\x32\xdb\xf2\xed\x1e\x3d\x74\x11\x93\x22\x64\x92\x21\x62\ \x16\xa2\xe7\x8e\x87\x42\x13\x91\xe2\x5b\xe2\x7a\x8a\xb7\x0d\xef\ \x2b\xce\xb3\x20\xc9\x55\x7a\x0d\x37\xb2\x84\x78\xce\x64\x98\xe2\ \x3d\xf6\x30\x09\x28\x34\x3e\x29\x42\x62\x96\xd1\xcd\x19\x6d\x7a\ \xca\xb9\x79\x2e\x6c\x0c\x4c\x5f\x42\x48\x3b\x59\x3c\x3c\x34\x0a\ \x47\x9e\x02\x9f\xf0\x2a\xdf\x50\x9a\x83\x84\x84\x34\xb0\x0c\x47\ \x79\xa1\xeb\x7a\xc6\xaf\x02\x5c\x68\xd6\x18\xea\x68\x82\x39\x00\ \x08\x05\xf2\x18\x0e\xb3\x95\xdd\x1c\xc7\xa2\xf1\xf0\x09\x68\xa2\ \x99\x62\xa3\xed\x2e\xa5\xff\x76\x41\xbb\x76\x43\x4c\x44\x19\x87\ \x42\x01\x96\x02\x79\x66\x30\x4c\x33\xc8\x5b\xec\x63\x1a\xf0\xf1\ \xa8\xe7\x1a\xca\xb8\xac\xa9\x5a\xe0\x1b\x6d\x9b\x2c\x01\xd1\x6c\ \x42\x00\x28\xf2\x2b\x21\x33\x24\xf8\xc4\x1c\x60\x8c\x7b\x59\x47\ \x0a\x4d\x44\x9a\x04\x57\x2b\x5e\x15\x60\x45\x44\x94\xc0\xdc\xef\ \x00\x65\x46\xf1\x99\x44\xd3\x40\x03\x42\x23\xad\x7f\x55\x1c\x0e\ \x41\xac\x95\x2a\x40\x3b\x77\x5c\x72\x65\x4a\x08\x52\xad\xef\xd9\ \xc8\xcf\xc6\x63\x2d\x0f\xd2\x81\x50\x41\x28\x92\x47\xe1\xa6\xc5\ \x55\x01\xce\xca\x8f\xe4\xa6\x99\x62\x01\x16\x87\x46\xa1\x88\x88\ \x50\x24\x74\xb2\x91\xd5\x64\x00\x87\x43\x98\x64\x1c\xcf\xd8\x93\ \x41\xa5\x1a\xc4\x9a\x8a\x0c\xc1\x04\xa7\xb0\x18\x2c\x02\x78\xd4\ \x12\x93\x65\x3d\xef\x70\x1f\x19\x40\x10\x2c\x86\x13\x8c\x11\x4e\ \xc8\xfe\xf6\x6a\x21\xf9\x6f\xdb\x47\x3f\x53\x14\x39\xc4\x22\xda\ \x48\xf0\xd0\x68\x62\x3a\x59\xc7\x3d\x44\x00\x08\x0e\x43\xc2\x69\ \xbe\xc0\x47\x8d\xba\x23\x9b\x65\x5e\x25\xea\x31\xb5\x43\x71\x48\ \xbe\x63\x86\x0a\x15\x2c\x29\xee\xa2\x9f\xbe\xf3\xd4\x2b\x94\xf9\ \x98\x9f\xa9\x49\xe4\x83\xf0\xc8\x79\xbd\x70\xb0\xd2\x3d\xa5\xd7\ \x16\x32\x53\xe4\xa8\x43\x03\x19\x56\xd0\x86\xcc\x29\xcf\xaa\x27\ \x8c\x30\x40\x06\x7f\x3f\xdb\x76\x8f\x5d\xd0\xce\x8b\xc7\x7d\xed\ \xaf\x3e\xc3\x38\xad\xc4\x80\x47\x84\xa9\xfa\x9d\x50\xa6\xc4\x08\ \xbb\xb0\xa4\x27\xf4\x96\x81\x4f\x2f\x9a\x07\x87\xcd\xd2\xc3\xba\ \x31\x58\x3e\xc6\x08\x19\xea\x08\x30\x58\x2c\x09\x09\x86\x0a\x27\ \x79\x9f\x01\x2c\x51\x49\xbd\x3e\xb0\xfd\x92\x13\xe9\x50\xb1\xfb\ \x20\x4d\xa9\xc5\xc6\xff\x9a\x29\x2c\x45\x12\x12\x0a\x9c\xe5\x28\ \x3f\x30\xc8\x30\xb5\xa4\x27\xd4\x1b\x83\x5b\x2e\x33\x54\xd7\xb7\ \xb8\x27\x78\xdc\x5e\x3f\xad\x3c\xae\x25\x4b\x0d\x8e\x3c\xa7\x39\ \x81\x4f\xad\xd1\x07\xd4\xf6\xc1\x5d\xff\x32\xd6\x1f\x4e\x27\x37\ \xa9\x87\xb8\x23\x69\x2d\x37\x1a\x65\x51\x68\x82\x24\x7d\xd6\x1b\ \x55\x1f\xca\x47\x7b\xbf\xbf\xa2\xc5\xf2\x40\xa3\xce\xa9\xa5\x74\ \x93\xa5\x4e\xac\xfa\x83\x13\xb2\x5f\xfd\x26\xa3\x7b\x2b\x57\xb1\ \xda\x1e\xf1\x5d\x24\x1e\x9e\x80\xd5\x49\x4d\x61\xa7\xf0\x3f\x96\ \x3f\x01\x4f\xcb\x84\xe9\xb7\x0f\x58\xc8\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xf0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x03\x00\x00\x00\x44\xa4\x8a\xc6\ \x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\ \x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\ \x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\ \x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\xa8\x50\x4c\x54\ \x45\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x89\x89\x89\x87\x87\x87\x87\x87\x87\x62\x64\x60\x74\x76\x73\x7a\ \x7b\x78\x88\x88\x88\x8e\x90\x8d\x94\x96\x93\x98\x98\x98\xc6\xc6\ \xc6\xc7\xc7\xc7\xd6\xd6\xd5\xdd\xdd\xdd\xe4\xe5\xe4\xe6\xe6\xe6\ \xf9\xf9\xf9\xfa\xfa\xfa\xff\xff\xff\x2b\x53\x2d\x8e\x00\x00\x00\ \x28\x74\x52\x4e\x53\x00\x01\x02\x03\x05\x07\x0a\x0c\x0d\x10\x11\ \x15\x16\x19\x1a\x1b\x1d\x1f\x21\x24\x25\x26\x27\x29\x2b\x2c\x2d\ \x31\x33\x36\x39\x3c\x3e\x42\x44\x46\x49\x5f\x64\xd1\x46\xaf\x83\ \x51\x00\x00\x00\x86\x49\x44\x41\x54\x78\xda\xed\x92\x31\x0e\xc2\ \x40\x0c\x04\x6f\xed\x8b\x50\xc2\x3b\x80\x82\xff\x3f\x85\x02\x78\ \x48\x94\x70\xbe\xc5\x97\x82\x22\x4a\xe4\x1a\xc1\xca\x8d\xb5\x23\ \x5b\x5a\x1b\x29\xd0\x1f\xf8\x00\x67\xe4\x1d\xb3\xf0\xe1\xc0\xa9\ \x87\xee\x00\xc6\xf1\x89\x74\xe9\x33\x64\xd3\xaf\x2c\xe3\x1d\xe9\ \x7a\xc8\x98\x27\x52\xe4\xb8\x26\x58\xa6\x5b\x03\xba\xb6\x6e\x1e\ \x36\x66\xbc\x7e\x06\x08\x83\x0a\xa3\x0e\x8f\x15\x9d\xfb\x7b\xbe\ \x5a\x54\x5c\x2a\x50\xc0\x7b\x92\xc6\x6a\xd5\x65\xd5\x01\xb8\xe7\ \xa5\xda\x49\x53\xe2\xe2\x14\x33\x5b\xa0\x37\xa5\x5f\x6c\x21\xec\ \x21\x57\x8e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x55\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x03\xd2\x49\x44\ \x41\x54\x78\xda\xed\x57\x4b\x6b\x14\x41\x10\xae\xee\xe9\x99\xd9\ \xcd\xb2\x8f\x90\x35\x11\xc1\x4b\x40\xc8\x45\xc4\x8b\x87\xdc\xbd\ \x0a\xde\xe3\x0f\xf0\xc7\xe5\x28\xde\xfd\x07\x9e\x4c\xc8\x25\x44\ \x50\x22\x6c\x64\xcd\x6e\x76\xe7\x6d\x7f\x4d\x77\x33\x36\x5d\x21\ \xe0\xc1\x8b\x5f\xa8\x9d\xdd\xae\xaa\xee\xaf\x1e\x53\x33\x11\x5d\ \xd7\xd1\xbf\x84\xa4\x7f\x0c\x85\x8f\xb3\xb3\xb3\xcb\xc9\x64\xb2\ \x2b\x84\xf0\x0a\x7c\x0f\xae\xe1\x1a\xa7\x0f\x6d\xda\xa6\x69\x8a\ \xc0\x36\x91\x52\xa6\x97\x97\x97\x2f\x0c\x81\xf9\x7c\xfe\x74\x3c\ \x99\xca\xe5\xa6\x26\x87\x2c\x11\xa4\x12\x49\xb9\x12\xb4\x5c\x2e\ \x69\x30\x18\x50\x59\x96\x94\xa6\x29\xd5\x75\x4d\x00\xca\x87\x4d\ \xab\xaa\x22\x40\x29\x45\x49\x92\x90\x3e\x90\xf4\x01\xc6\x5e\x07\ \x46\x16\x7d\xa2\xf0\x85\xed\x4b\xe5\x36\x5a\xac\x4a\xfa\xf0\xf9\ \x07\x01\xa3\x3c\xa1\xdd\x51\x4a\xa9\x14\xf4\xe2\x71\x42\xe7\xe7\ \xe7\x94\xe7\x39\x4d\xa7\x53\xba\xb9\xb9\x31\x07\x6d\xb7\x5b\xda\ \xdf\xdf\x37\xba\xc3\xc3\x43\x02\xae\xaf\xaf\x0d\xb9\x9d\x9d\x1d\ \x1a\x8f\xc7\xb4\x58\x2c\xe8\xf8\xf8\x38\x3c\xdc\x93\x07\xd0\x84\ \x70\x6c\xc6\xd3\x99\x5c\xac\x2a\x02\xf2\x14\x51\xb4\x94\xa5\x92\ \x26\x03\x45\xeb\xf5\x1a\x91\x7b\xc7\xb6\x6d\x21\x2e\x0a\x23\x00\ \x0e\x57\xca\xd8\x43\x8f\x2c\x20\x03\xfe\x70\xfc\x76\x80\xfe\xe2\ \xe2\xe2\xad\xcf\xc0\x4f\x1d\x59\x55\x6c\x09\x00\x0d\x60\xa3\x65\ \x49\x0f\x07\x52\xbf\xd9\x6c\xcc\xe6\x0e\xdf\xbe\x7f\xa7\x3c\xcb\ \x28\xd7\x25\xec\xe3\xe0\xe0\xc0\xd8\x29\xcb\xa6\x9b\xef\xed\xd1\ \xdf\x02\x1b\xc6\x80\xc8\x03\xb8\x4c\x0a\x45\x16\x60\x8e\x08\x42\ \xa0\xf6\xa7\x9f\xbe\xd0\xd7\x75\x6e\x9a\x72\x53\x36\x26\x9d\x9a\ \x33\x3d\x19\x6e\xe8\xdd\xeb\xe7\x48\x39\x7c\xc3\x43\xd1\x07\x66\ \xdf\x18\x86\xc3\x21\xb5\x1a\x8e\x80\xab\x69\x94\x69\x59\xe9\xd4\ \xd6\x92\x06\x32\xa1\x4d\xd3\xd1\x30\x95\xd4\x8a\x8e\x8a\xba\xc5\ \xc1\xa8\x7d\xcc\xcf\x75\x3b\x97\x2d\xf8\x0a\x15\x3a\xc5\x80\xd5\ \x6d\xd5\x52\x92\x08\xd3\x9c\x9d\x92\xe8\x2a\xfa\xb5\x2e\xe0\x13\ \xf5\x33\x8d\xc9\xef\xe9\xc9\x29\xfb\x43\x70\x1b\x99\x35\x1d\xf9\ \x7c\x92\xd3\x9d\x4e\xff\xfe\x6c\x00\x0f\x5a\x6f\x2b\x5a\x15\x35\ \x7c\xf9\x9a\xdf\x4f\x00\x19\x68\x1d\x01\xd6\x18\xba\xe1\xce\x88\ \xf6\x64\x4a\x7b\x62\x40\x30\x35\xb7\x58\x2a\x28\x17\xbb\x31\x3f\ \xf8\xc0\xa6\x5f\x02\xb6\x0c\xca\x32\xee\x34\xd8\x2e\x7e\xf3\xea\ \x29\x15\x85\x9d\x7e\xfa\x0f\x65\x00\x06\xd9\xa3\x90\x00\xf6\x72\ \xf5\x0f\xef\x8c\x28\x49\xd5\xbf\x87\x21\xe1\x4c\x07\x04\xca\xd3\ \x94\xde\xce\xa3\x93\x24\xa5\x0a\xa3\xc4\xef\x87\x67\xc0\x3a\x08\ \x74\x32\xc6\x6b\x50\x47\x8c\x55\x37\x60\xfa\xdd\xed\x66\x3f\x26\ \x24\x36\xea\x47\xe5\xfd\x3d\x61\xbe\x07\x7c\x09\xd8\xdb\x09\x1b\ \x3a\x72\x21\xb2\x2c\x33\xfa\xa2\x28\xfc\xa6\x7d\x72\x20\x0b\x1d\ \x03\x3c\xac\x6a\x10\x70\x4f\x30\x3c\xd5\xb8\x89\x15\xd3\xc1\x07\ \x7a\x6c\x14\xbb\x0d\x41\x86\x1d\x44\xfe\xd9\x61\x99\xe0\x00\x08\ \x37\x30\xee\x23\x10\xea\xc2\x47\x35\x37\x9e\x7d\x09\x90\x5e\x4f\ \x22\x00\xd6\x9c\xc4\x22\x80\x70\x04\x18\x3f\xbf\x2f\x82\xf3\x04\ \x3a\xc6\x18\xc4\x50\xc7\x98\x0e\xeb\x10\x2e\x73\x5c\x50\xde\xd7\ \x97\xe0\xee\xee\x0e\xc6\x90\x98\x21\xa7\xc3\x1a\xa7\x43\x13\x3a\ \x1d\x47\x00\x24\x85\x23\xd0\xa1\x1e\xa1\xb1\x2f\x0f\x4f\xce\xe9\ \xb9\x77\x03\x8e\x00\xfc\x7c\x06\xf0\x38\x45\xc3\xdc\x47\x80\xd3\ \x61\x0e\x70\x19\x60\x09\xb8\xac\xfb\x26\xbc\xbd\xbd\xc5\x3d\x8d\ \x88\x62\x86\xa8\x23\x74\x31\x02\x38\x28\xa6\xc3\xe6\x08\x8c\x9d\ \x03\xab\xd5\xca\x67\x00\x07\x74\x88\x24\x1c\xc1\xe1\x88\x0e\xe0\ \xe6\x03\x74\x5c\x9d\xef\xd5\x69\x08\x43\xe0\xe8\xe8\x48\xcc\x66\ \x33\xee\x8d\x88\x1d\x44\x20\x6d\x53\x1d\x1d\xb5\xa3\xd1\xc8\xbc\ \xfb\xc5\x80\x11\x7f\x75\x75\xd5\x18\x02\xa7\xa7\xa7\xef\xf5\x2b\ \xd2\x33\xed\x24\xfb\x6f\xb0\x90\x46\x43\x4f\x35\xa1\x0f\x93\x1a\ \x5e\xa7\xd7\x70\xaf\x63\xf0\x77\x9a\x64\xd2\xf3\x71\x23\xb9\xd5\ \xdf\x5b\x6d\xa7\xec\x54\xec\xfb\x22\xa8\xdb\x93\x93\x93\x8f\xff\ \xff\x37\x54\x91\xda\xa5\x76\xdd\x5e\xbd\x24\x3d\x91\x56\x44\xf0\ \xea\xd8\x5a\x69\x7a\x52\xf7\xa4\x82\xe8\xac\xd7\x7f\x10\x10\x1a\ \xf8\xde\x3b\x38\xeb\x5d\x73\x77\x0d\xc4\x91\x82\x6f\x67\x0f\x2b\ \xb5\x6c\xed\xb5\xb0\x52\x06\x82\x7e\xa9\x40\x48\x13\x69\x7e\x03\ \x0f\xf6\x25\x8e\xb8\x93\xb7\xf4\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x08\xf7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x08\xae\x49\x44\x41\x54\x78\x9c\xad\x97\x69\x6c\x9c\xc5\ \x1d\xc6\x7f\xef\xb5\xa7\x37\x6b\xef\xae\xd7\x77\x1c\x5f\x8a\xe3\ \x03\x0c\x38\x2d\x81\x84\xa4\x10\x68\x04\x14\x54\x2a\x04\xa5\x21\ \x44\x69\xda\xd2\x4a\x55\x3f\x81\xaa\x96\xaa\x54\x42\xad\x44\x05\ \x95\x28\x97\x28\x55\x11\x0a\x55\x13\x41\x21\x69\x53\x09\x68\x1a\ \x72\x11\xc9\x4e\xec\x04\x12\x1f\x49\x1c\xaf\xcf\xd8\x5e\x7b\xed\ \x5d\xdb\xbb\xef\x1e\xef\x4c\x3f\xec\xda\x8e\xc3\x29\xc2\x48\xf3\ \xe1\x7d\x67\xde\xff\xf3\x9b\x67\x9e\x19\xed\x2a\x5c\x45\xfb\xe9\ \x86\xd2\x0a\xc5\xd2\x6f\x91\x82\x9b\x75\x43\xdb\x6c\x18\x5a\x10\ \x09\x22\x93\x9e\x09\xc7\x12\xff\x8d\x9a\x56\xfb\xc7\x43\x89\xbd\ \x03\xf1\xf8\xd8\x67\xd5\x50\xbe\x82\xae\xf2\xe3\x75\x2b\xef\x74\ \xea\xfa\x23\x7e\xbf\x67\x73\x79\x6d\x61\x41\x59\x75\x10\x7f\x91\ \x0f\xb7\xd7\x83\xa2\xab\x98\xf1\x79\x42\x7d\x31\x86\xbb\xfb\xe8\ \xef\x0d\x0d\xb5\xf5\x45\x5f\x39\x12\x9a\x79\x0e\x88\x5d\x15\xc0\ \xfd\x2d\xe5\x1b\xfd\x6e\xe3\x37\x4d\x0d\xc5\xb7\xb5\xdc\x54\x86\ \xad\xd6\x43\x6b\x75\x3d\x4a\x9e\x1b\x54\x1b\x18\x1a\xc9\x84\x9b\ \x0f\x7b\x1a\x88\x25\x8b\x89\xc7\x66\xd0\x22\xef\x31\x7b\xfa\x1d\ \x0e\x1d\xea\x6a\x7b\xb7\x37\xbc\x73\x62\x3e\xfd\xf1\xe5\x35\xb5\ \x2f\x23\x7c\xfb\x35\x45\xee\xd6\xe2\xfc\xdf\xaf\x5d\x13\x78\xe1\ \xa1\x87\xaf\xad\xbd\xfb\xfe\x46\x4e\x04\x15\x76\xcf\xc4\x58\xab\ \x39\xf1\x38\x5c\x20\x2c\x62\x51\x83\xd7\x0f\xdc\x8a\x3b\xbf\x96\ \xda\x95\x6e\x0a\xfc\x7e\x42\xf3\x6b\x59\xb3\xae\x8c\xba\x92\x78\ \x99\x18\x19\xbf\xab\x7f\x22\xf1\xbe\x29\x44\xf8\x4b\x03\xb4\xae\ \xf4\x56\xdf\x58\xee\xdf\x73\xcf\x96\xaa\x87\xb6\x6f\x6f\xd6\x9c\ \x2b\x6d\xbc\x39\x31\x4c\xda\x7f\x2f\xad\xee\x3a\x02\xc9\x7e\x6c\ \x0e\x07\xba\xa1\x32\x3c\x5e\xc0\xc9\xd1\x9b\x71\x79\x60\x38\x0c\ \x93\x31\x48\xa6\x15\x9c\xda\x04\x5b\xbe\xb7\x86\x4c\x6c\xd6\x1b\ \x1f\x1a\xba\xae\x2b\x1c\xdf\x0d\xa4\xbe\x10\xa0\xc0\x30\x9a\xef\ \xbc\xb6\x64\xdf\xb6\xef\xd7\xdc\xd0\x72\x5b\x21\x2f\x4c\x0f\xb0\ \x6b\x3a\xcd\xec\x8a\x26\xca\x3d\x65\xf4\xcc\x74\x33\x68\xa5\x78\ \xa5\xff\x04\x0d\x8a\x87\x9a\x0a\x3b\xb1\xe8\x1c\xff\xe9\xac\x64\ \x28\xac\x30\x30\x0e\xa1\x4b\x19\xd6\xd5\xf5\xb0\xb2\x4c\xa7\xb2\ \xb9\x96\x4b\xa7\xbb\x2b\x06\x87\x27\x47\x27\x13\x99\xf6\xcf\x05\ \xf0\xd9\x6c\x0d\x3b\x36\x55\xee\xfb\xf9\x8e\x9a\xda\x86\x6f\x16\ \xf3\x52\xa8\x8b\x97\x12\x50\x57\xd8\x08\x64\x18\x9e\x1f\x24\xad\ \xa9\x84\x32\x19\xaa\xe3\x29\xbe\x55\xbc\x12\xa7\x57\x47\xb1\x60\ \xd7\x91\x46\xc2\x31\x95\xc8\x2c\x8c\xc7\x54\x2e\x8e\x7a\xb9\xbe\ \x66\x84\xc2\xc2\x7c\xc8\x98\xf4\xb5\x9f\x2d\xec\x0e\xc7\xdf\x00\ \xd2\x9f\x0a\x50\xe9\x72\x15\xef\xb8\xb5\xe2\x5f\x8f\x6e\x2d\x5f\ \x5d\xdd\xe0\x81\x14\x04\x14\x27\xed\x33\xa3\x7c\x64\x8e\x10\x36\ \xc7\x09\x9b\x61\x06\xe6\x86\x68\x8c\x4d\xf3\x58\xed\x0d\x78\xfc\ \x2e\x26\x26\x57\xf0\xf8\x3f\xee\x23\x62\x3a\xd0\x54\x10\x02\x5c\ \xaa\x89\x26\x4c\x9a\x2b\x47\xa9\x28\xd5\x70\x7a\x1c\x9c\x3b\xda\ \x5e\xd8\x11\x9a\xda\x9b\x16\x5c\xd2\x3f\x45\x5f\xdb\x7c\x7d\xe0\ \xe5\x6d\x0f\x14\x35\x56\xad\x76\x80\x99\x01\x4d\xa5\xce\x5b\xc0\ \x53\xa2\x86\x9b\x06\xde\x07\x43\x43\x53\x0c\x54\x01\x3b\x83\x9b\ \x70\x79\xdd\x60\x59\x68\x24\x31\x32\x73\x24\x93\x1e\x32\x36\xb8\ \xa6\x78\x90\xc7\xee\x3d\x4c\x20\x60\x23\xdf\xe7\x01\x24\x05\xc5\ \x01\x8a\x4b\xfd\x36\xbf\xc3\x68\x8a\xa7\xd3\x1d\xea\x95\xea\x5b\ \x9a\x0a\x7f\xb6\x7d\xb3\xef\xde\xd5\xfd\x13\xa4\x66\x92\xd9\x4d\ \xd2\x15\x40\x10\x12\x73\x98\x22\x85\x69\x26\x98\x9f\x8f\x31\x9b\ \x8c\xf1\x87\xf1\x63\x8c\x4c\x85\x41\xa8\xf8\x0b\xe2\x3c\xbd\xf5\ \x6d\xee\x5a\xdd\x81\x91\x32\xb1\x29\x71\x6a\x2a\x24\xbe\xa0\x0b\ \x55\xd3\x00\x81\xa6\xeb\xe4\x07\x56\xa0\xaa\xd2\x07\xb0\xcc\x81\ \x95\x5e\x7b\xf5\x83\xb7\x04\x9e\xbc\xb1\x46\xc1\xea\xfe\x0e\x73\ \x43\x9d\xe4\x07\x23\x88\x98\x8e\x56\x5d\x4a\xef\x7c\x94\xd2\x94\ \x8b\x9f\xf8\x1a\x28\x77\x79\xd9\x13\xed\xe3\xf4\x5c\x98\xbe\xe9\ \x30\x65\xfe\x00\xa4\x35\x4a\x8a\xd2\xfc\x6e\xeb\x51\x1e\x1c\x3c\ \xc3\x7c\xca\x40\x48\x1d\x2d\x2d\x40\x15\x8b\x89\x33\x0c\x75\x31\ \x7c\xcb\x00\x36\x5f\x1b\xf8\xd5\x1d\x1b\x6d\x3e\x5d\x57\x91\x37\ \x6e\x60\xc5\x47\x76\x64\xcf\x38\xea\xc0\x2c\xd1\x60\x17\x8f\x6e\ \xaf\x67\xab\xa7\x8e\x72\x9f\x1f\x1c\x2e\xb6\x67\xae\x61\x2c\x9e\ \xc6\xef\xf5\x82\x48\x83\xaa\x42\x5a\x01\xdd\x60\xcd\xea\x14\xa8\ \x80\x74\x80\xb0\x40\xb1\x00\x81\x94\x12\x91\x32\x51\x35\x75\x39\ \x40\xa5\xdf\x56\xff\xdd\x26\xe7\x43\x25\x97\x4c\xac\x21\x0d\x35\ \xfe\x2e\xba\xbf\x08\xdc\x55\xe0\x8f\x60\x85\x3a\xf0\x1a\x1a\xf9\ \x01\x07\x60\x41\xc6\x44\x35\x1c\x94\xfa\x3d\xa0\xe4\x12\xa7\x08\ \x90\x16\x48\x0d\x52\x32\xbb\x62\x4d\x80\x94\xd9\x8e\x24\x63\x26\ \x89\x47\xa3\x98\x96\x8c\x2d\x03\x58\xdf\xe0\xdb\xde\x5a\x2a\x9c\ \xe2\xd9\x08\x5a\xca\x0d\xb6\xfd\xd9\x01\x09\x44\x12\x58\x0f\x04\ \xb2\x17\x77\x26\x93\x5d\xa9\x2a\x40\x64\x20\xa3\x66\x33\x22\xb5\ \x9c\xb8\xbe\x24\x28\x72\xd6\xcb\x5c\x47\x25\x3a\x3e\xce\xdc\xec\ \x5c\x3a\x3c\x97\x1e\x80\xac\x49\x00\xce\x2d\x4d\x79\xf7\x05\xaf\ \xd3\x49\x6c\x73\x91\x8a\x8f\xc0\xe0\x20\x0c\x0e\x32\xe7\x8c\x10\ \xbe\xc7\x85\xba\xb1\x08\x3d\x6d\x65\xed\xc4\xca\x15\xcd\xae\x6a\ \x51\x50\x4a\x40\x2c\x89\x23\x97\xe6\x49\x01\x28\xcc\x0c\x86\x18\ \x1e\x9f\x1e\x49\x5a\x2c\x01\x34\x97\xe4\xb5\x36\x57\x29\xb5\xaa\ \xb4\x70\x6e\xce\x47\x3c\x50\xb4\x98\x0b\x35\x21\xd0\x7f\x58\x87\ \xbf\x61\x05\xa4\xad\x5c\xf1\x85\x2e\xae\x10\xc8\xbd\x13\x56\x0e\ \x64\x01\xd4\xca\x8d\x25\x99\x3a\x7f\x8e\x8b\x13\xe6\x59\x60\x64\ \x11\xa0\xba\xd8\xd6\x52\x11\x54\x15\x84\x40\x4d\x5b\xd8\x3c\xd9\ \x8c\x4e\x7e\x3b\x88\x65\x53\xe0\x64\x04\x45\x59\x10\x11\x4b\xab\ \xe6\x32\xf1\x65\xab\xbe\xd2\x15\x09\xaa\x42\x2a\x36\xc3\x58\xdf\ \x45\x42\x91\xf4\x29\x20\xb1\x98\x81\xfa\x0a\x57\x63\x9e\x47\x07\ \x91\x04\x55\xa2\x86\x12\x98\x9a\x82\x78\xa4\x1c\x65\x5a\x60\x69\ \x1a\xa4\x73\xe2\x42\x66\xf7\x75\x41\x1c\x71\x59\xbf\x1c\x2c\xf7\ \x4c\xce\x2d\x5d\x63\xa2\xb7\x87\x81\xa1\xf1\xf8\xb9\x4b\x89\xc3\ \x0b\x0e\xeb\x00\xbe\x7c\x47\xa5\xcd\xa1\x41\x12\x48\x5a\x98\x0d\ \x4e\x22\xbe\x12\x02\x7e\x0d\x5b\xb9\x1b\x37\xb6\xac\xfd\x9a\xb6\ \x3c\x54\x57\xae\x5e\xb5\x96\x4e\xc1\x82\xf5\x42\x80\x26\x91\xa6\ \xc9\x58\xe7\x09\xda\xfb\x66\xdb\xe2\x16\xed\xcb\x00\x5c\x4e\xc3\ \x86\xae\x41\x52\x82\x69\x61\xbb\x29\x8f\xa0\x6e\x47\x17\x12\x52\ \x16\x8a\x96\xc9\x8a\x2f\xee\xeb\xc2\x76\x2c\xa4\xde\x02\xb4\x4f\ \xda\xbe\x30\xcf\xd0\x99\xea\xee\xa1\xbf\xab\x57\x7e\xd0\x33\xfb\ \x26\x30\xbd\x0c\x40\xb3\x19\x12\xdd\x91\xfd\x40\x91\xa8\x69\x81\ \x2a\x2d\x50\x73\xa2\x46\x1e\x78\xcb\xc1\x66\x83\xd8\x78\xf6\xf8\ \xa9\xfa\x92\x80\x90\xa0\xca\x25\x67\x16\xd2\x2f\x04\xe8\x20\x12\ \x71\x46\xdb\x8e\xf0\x41\xd7\x74\xe7\xf0\x4c\x66\xdf\xe5\x97\x9f\ \x0a\x20\x85\xa2\x60\x5f\x91\xfb\x98\x5c\x92\xb3\x17\x4b\x7c\x4e\ \xd0\xd6\x3e\xc5\x8b\xcf\x1f\x0a\x1f\xff\xa0\x2f\x85\xcd\xbb\xe4\ \xc4\xc2\xbc\xc5\xb4\x8b\xe5\x63\x0a\xa0\x6b\x8c\x9d\x38\xce\xf9\ \xb3\x17\xac\x7f\x76\x44\x5f\x05\x86\x2e\x07\xd0\x01\x12\x09\x73\ \x12\x7b\x20\x6b\xb3\x24\x5b\x44\x91\x58\x29\xc9\xe1\xf6\x68\xea\ \xd7\xbb\x86\x5e\xeb\x18\x88\xbf\x5e\x1f\xec\x6b\xdc\xff\xa7\x0d\ \xcf\x55\xd7\xfb\xed\x88\x5c\xd8\xec\x76\xb0\xe7\x2d\x66\x70\x31\ \x13\x9a\x0a\xaa\xc2\x64\x67\x1b\xc3\x6d\x1f\xf2\xda\xe1\xa9\xbd\ \x63\xd3\x99\x3d\x5c\xd1\x54\x80\xee\xfe\xa9\x33\x49\xbc\xe0\xf6\ \xe7\xce\xb0\x04\x45\x30\x31\x69\xf1\xcc\xde\xb1\x37\x3b\x06\xe2\ \xbf\x04\x8e\xf5\x4c\xa4\xff\x36\x34\x38\x39\x9c\xbd\xdb\x25\x52\ \x31\x98\x9f\x32\x89\x84\xc6\xb1\xe2\x69\x70\x7a\xc0\x91\x07\x9a\ \x4e\x66\x36\xc6\xc4\xf1\x83\x74\xff\xef\x20\x4f\xef\x1d\x79\xf7\ \xdf\xa7\x62\x4f\x02\x53\x57\x02\xe8\x00\x47\xcf\xcc\x1c\x18\x1e\ \x08\x3f\x59\x53\xdf\xaa\x12\xdd\x0f\x52\x05\x24\x5d\xa1\x44\xec\ \xe0\x99\xe8\x5f\x16\x42\x53\xe8\xc2\xef\xf3\xe8\x7e\x90\x88\x74\ \x86\x73\x9d\x3d\xbc\xb6\xef\xdc\x99\x53\xfd\xf3\x27\xbd\x1e\xbb\ \xe3\x1b\xcd\x45\x0d\xeb\x5a\xca\x6b\x3d\x46\xc6\x19\x1e\x9d\xb0\ \x3a\x7a\x23\x43\xbb\x8e\x4d\xef\x3d\x3d\x60\xfe\x19\xe8\xbb\x52\ \x7c\x11\xa0\x37\x9c\x39\x71\xe0\xc0\xc9\x63\x35\xad\x3b\x37\x50\ \xd2\x0c\xa3\xa7\xc0\x61\x30\x1e\x4b\x8d\x59\x70\x76\x61\xf2\x0f\ \x36\x06\x7e\x54\x55\xe6\xce\x47\x4a\x46\xcf\x0d\xf3\xc4\x2b\x5d\ \xfb\xdf\x6a\x8f\x3d\x01\x74\xc1\x3c\x7b\x8e\x47\x4a\x5c\x5a\xf7\ \x9a\x42\x8f\x5a\x1d\x31\xc5\xdc\xac\x49\x37\x70\x86\xdc\xa5\xf3\ \xb9\xad\xb5\x42\xbb\xe7\xe2\xdf\xb7\x08\x39\xf9\xa2\x94\x87\x36\ \x4b\xf9\x76\x89\x3c\xff\x42\x55\xb4\xb9\xc2\xb1\x61\x4b\x2d\xf6\ \xdd\xbf\xa8\xda\xd1\xf9\x6c\x63\x5c\x1c\xba\x5d\xca\x83\x77\xc8\ \x3f\x6e\x2b\xef\x01\x5a\xbe\xb0\xf0\x17\xb4\xc5\xdf\x84\xa3\x31\ \x79\x2e\x15\x0d\x17\xad\xaf\xb2\xad\x75\xdc\x70\x1f\x18\x2e\x7c\ \xca\x98\xfd\xae\x66\xc7\xdd\x9b\x5a\x02\x5b\xd7\xac\x72\xef\x5c\ \xb5\x2a\xcf\xd0\x5c\x76\x26\x46\x66\x79\xfc\xd5\x8b\xcf\x8f\x45\ \x33\xbb\xbf\x36\x00\x80\x13\x17\x93\x47\x32\xd3\xc3\xab\xae\x2f\ \x98\x6e\x76\xd4\xad\x47\xa9\xbe\x05\x6f\x45\xa9\x3b\x18\x74\x05\ \xf3\x0a\x1c\xa8\xbe\x32\xd0\xf3\x39\x72\xb4\x77\xfa\x99\x7d\x13\ \xbf\x05\x46\xbf\x56\x00\x20\xf9\xe1\x79\xf3\xbd\xf3\x17\x46\x65\ \x59\xbc\xbb\xa9\x40\x89\x39\xb5\xbc\x12\xa4\xaf\x0e\xcb\x53\x85\ \x35\x9f\x22\x76\xa1\x8b\xa7\x76\x5d\x7c\xe7\xec\x70\xf2\xaf\x40\ \xfa\x6a\x01\x3e\xf3\xbf\x61\x9e\x83\xf5\x77\xb6\xb8\x1f\xde\xd4\ \xe0\x5e\xdf\x54\xed\xad\xcc\x77\x1b\xae\x0b\x23\xb1\xa9\x37\x0e\ \x47\x0f\xbd\xd5\x36\xfb\x14\x70\xea\x6a\xc5\x3f\x17\xe0\xb2\xf1\ \x55\x76\x8d\x6a\xdd\xa0\x70\xde\x24\x9c\x13\xfe\xc4\x79\xfe\xaa\ \xed\xff\xa9\xb4\x5c\xc2\x3d\xad\xc6\xd0\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x1a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\x00\x00\xfa\ \x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\ \x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x02\x62\x4b\x47\ \x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\x48\x59\x73\x00\ \x00\x14\x22\x00\x00\x14\x22\x01\x8f\x0d\x47\xc8\x00\x00\x03\x13\ \x49\x44\x41\x54\x48\xc7\xdd\x55\x4b\x48\x14\x71\x1c\xde\x48\x28\ \x22\x88\x48\x9d\xd5\x5d\x77\x77\x66\x77\xf6\xe5\xea\x26\x48\x1d\ \x34\x23\x32\x32\xed\x5d\x6a\x86\x59\x51\xa8\xa5\x6d\xd9\x4b\xcc\ \x28\x45\x89\x9e\x62\xe6\xa3\x65\x1f\x63\x68\x51\x97\xba\x74\xeb\ \xd0\xb5\x7b\xe7\x3a\x74\xa9\x08\x16\x0f\x05\x11\xc4\xd7\x37\xff\ \x99\x9d\x35\xac\x2e\x5e\x2a\x3e\x66\x18\x9d\xff\xf7\xfd\x5e\xdf\ \xfc\xd6\x06\xdb\xe2\xb0\x48\xfa\xff\x2f\xe0\xb5\x2b\x51\xa2\x9c\ \x28\x53\xca\xe4\x88\x42\x78\x4b\x89\x30\x11\x52\x43\xbe\xa0\x1a\ \xfc\x0d\x55\x5d\xa9\xb4\x79\x5e\xc8\xdf\x65\xe8\x50\x08\xaf\x09\ \x9f\x09\x55\xc0\xbf\x90\xea\x5f\xea\xad\x93\x1f\x7a\xbe\xe8\xb4\ \x6a\xec\xc1\x5e\x81\x7d\xd8\x4f\x34\x0a\x34\xa1\xd9\xc4\x26\x04\ \x7e\x26\x2b\x15\xf2\x88\xfc\x5e\x8f\x59\x89\x16\x0c\x62\x14\x77\ \x31\x8e\xfb\x88\x13\xfa\x3d\x89\x14\xd2\x84\x86\x69\xcc\x60\x16\ \xed\x39\x01\x5f\x9e\xdc\xe6\x79\xad\x53\xcb\x18\xb5\x17\x23\xa4\ \x8e\x91\x3c\x45\x62\x42\x50\x92\xf3\x90\xc6\x03\x3c\xc6\x13\x74\ \x22\x68\x46\x5e\x2f\xbf\x91\xa9\xb6\x0d\x31\xdc\x61\xdc\x31\xdc\ \xc3\x04\x26\x4d\xf2\x34\xa1\x31\xb6\x41\x4e\x89\x2c\x34\x3c\xc5\ \x33\x74\x21\x64\xd2\xe7\x54\xd6\x39\x64\xc5\x9d\x60\xe4\xf8\xbc\ \xc3\x9a\x10\xc8\x21\x2d\xa4\x66\x19\xae\x94\xc9\x2f\x93\xdf\xf9\ \x71\x8a\xe4\x51\xfe\x23\x26\x6a\x4e\x88\x34\xd3\x3c\x9a\x20\x52\ \xe2\xc9\xb8\x27\xad\x37\xfa\xf3\x79\x44\x18\x3f\xa6\xe0\x00\x23\ \xb7\x23\x2a\x86\x53\x81\x6e\xb3\x4d\xd3\x3c\x12\x37\xdb\x96\x25\ \xea\x59\x69\xe2\x49\x47\x17\xc7\x6a\x53\x5e\x06\x71\x9b\xd1\x23\ \x50\xe7\x7c\xc3\xbe\x21\x7f\x66\x2d\x0f\xcd\x10\x06\x21\x61\xa6\ \x9c\x32\xa3\x26\xad\xfb\x7d\x1c\x86\x83\x6e\xfb\x58\xc5\x9a\x3b\ \x19\xdb\xdb\x27\x7c\x70\x21\x80\x33\x78\x24\x48\x69\x2b\xfd\xa4\ \x90\x4a\x5a\x3d\xd0\xc4\x5c\x62\x70\xb2\x07\x99\x1a\xb6\xac\x43\ \xf7\x95\x25\x70\x9a\x13\x18\xe7\x35\x29\x26\x11\x17\x9d\xc8\x75\ \x25\x69\x49\xb6\xa2\x84\xa6\x7d\x15\xe1\xb1\x29\xce\x3f\x30\xa7\ \x0e\xab\x43\x4a\xc6\xc7\x17\xc6\x08\x8d\x7a\x35\x33\x93\x2c\x34\ \x21\x13\xc7\x4d\xf6\xce\x45\x81\x41\x95\x05\xa4\x70\x82\x3e\x28\ \x46\x21\xaf\x2a\x9a\xb4\xd7\xf2\x9c\x91\xb4\x31\x8d\x5c\xfd\x7a\ \x01\x37\xd0\x03\x37\x6c\x81\x55\x6a\x26\xcc\x76\x34\x62\x07\x36\ \xa0\x86\xae\x6f\xa6\x8d\x0f\xb2\xad\xd9\xfa\x53\x96\xff\xb2\x1d\ \x30\x8c\xa5\x0b\x78\xf4\xaa\xed\x0d\x6b\xbe\x4a\x58\x87\x5d\xe2\ \x93\x31\xe8\xad\xe8\xb7\x0c\x93\x1b\x9f\x21\xa0\x99\x2d\xbc\x8c\ \x43\x86\x00\x6c\xf9\xb5\xf9\x1f\x0a\x38\x92\x4a\x34\x98\xf4\x36\ \x1c\xc7\x00\xa7\x13\x5f\x30\x3e\x43\x32\x8e\x2b\x2c\xbc\x29\x2b\ \x00\x9b\xb4\x3c\xbf\xbb\xf0\xad\x04\x89\xd6\xa8\xe6\x8b\x23\x38\ \x8a\x63\x34\xd7\x39\x7e\x1b\x93\x62\x0e\x71\x16\x35\x40\xda\x35\ \xba\xe6\x16\x2e\xd1\x85\xbd\x6c\xa2\x3c\xff\x63\x96\x96\x14\x54\ \x15\x4e\x48\x9f\x24\xd8\x11\xc6\x16\x8a\x74\xe0\x24\x67\xdd\x43\ \xf4\xe1\x22\x7d\xd7\xce\xab\x9f\x7f\xc5\x70\x16\x57\x71\x9d\xb9\ \x2a\x0b\x17\x4a\x51\x9e\x54\x2f\xcd\x16\x7d\x2e\x66\x49\x15\xd8\ \x8c\x5a\x4a\x6d\x45\x1d\xea\x59\x5e\x03\xb6\x63\x27\x7b\xb5\xdb\ \x5c\x32\x1b\x7f\x25\x60\xa0\x78\x85\xbd\xc5\xf1\xdc\xf1\xcd\x49\ \xaf\x95\x10\x2e\xc2\xcd\x8a\x0d\x64\x17\x9d\xbe\xe2\xfe\xb8\x54\ \x1d\xab\x9d\x41\x67\xb0\x24\xe4\x0a\xb9\xc2\xee\xb0\xbb\xd4\x43\ \xc8\x11\x2e\x57\xae\x58\x6f\x39\x11\x55\xa3\x7f\xf9\xef\xc2\xbf\ \x21\xf0\x03\xcc\xac\xbb\x00\x2d\xec\xf1\x47\x00\x00\x00\x25\x74\ \x45\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\ \x30\x31\x31\x2d\x31\x32\x2d\x31\x35\x54\x31\x36\x3a\x34\x30\x3a\ \x35\x36\x2b\x30\x39\x3a\x30\x30\x5a\x76\x29\x10\x00\x00\x00\x25\ \x74\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\ \x32\x30\x31\x31\x2d\x31\x32\x2d\x31\x35\x54\x31\x36\x3a\x34\x30\ \x3a\x35\x36\x2b\x30\x39\x3a\x30\x30\x2b\x2b\x91\xac\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x9b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x02\x73\x42\x49\x54\x08\x08\x55\xec\x46\x04\x00\x00\ \x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\ \xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\ \x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\ \x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x04\x1a\x49\x44\x41\x54\ \x18\x19\x05\xc1\x4d\x6f\x1c\x77\x1d\x00\xe0\xe7\x3f\x33\xeb\xcd\ \xc6\xb1\x9d\xc4\x4d\x62\x27\x4e\x13\xd2\x42\x02\x0a\x14\xb5\xf4\ \x02\x07\x28\x12\x42\x8a\xa0\x52\x25\x84\x10\x07\x8e\x70\xe2\x03\ \xf0\x09\xf8\x00\x9c\xe0\x04\xe2\x00\x28\x52\x29\x42\x42\x9c\xe0\ \x44\x11\x90\x03\x28\x04\xa5\x6d\xda\xe6\xa5\x8e\xd7\x6f\xb1\xd7\ \xde\xec\xcb\xcc\xfc\xe7\xc7\xf3\xa4\x00\x00\x00\x40\x4a\x40\x04\ \x00\x00\x00\x29\x00\x00\x29\xfd\xa2\x7a\xeb\x2b\xe5\xcb\xcf\x5f\ \xaa\xaf\x16\x97\xfb\xeb\xcc\xb7\xe2\x49\xef\xe1\xe2\x87\xf9\xc1\ \xef\xff\xf6\xc3\x36\x02\x00\x10\x42\x08\x21\xdc\x5e\xd8\xbe\xf5\ \xe0\xed\x83\x71\x1d\x4d\xb4\x91\xa3\x8b\x67\xb1\x1b\x93\xc8\xd1\ \x46\x1d\xf3\x38\x38\x7e\xf0\xf6\xf6\xad\xdb\x0b\x21\x84\x10\x42\ \x0a\x40\x4a\x77\x7f\x7c\xe1\xa7\x83\x93\x49\xa9\x36\x42\x29\x54\ \x0a\x0d\x42\xe7\x84\x25\x59\x98\x4d\x86\x3f\xf9\xfc\xcf\x22\x80\ \x14\xe0\x2f\x2b\xab\xbf\xdb\xf8\x26\x85\x4a\xe1\x58\x27\x49\x48\ \x20\x04\xb2\x15\x49\x2b\x63\xf3\xcf\x7b\xdf\xfb\xfa\x08\x52\xe0\ \xaf\xab\x17\xee\x9d\xb9\x40\x52\x3a\x46\xd2\x53\x48\x2a\x3d\x85\ \x5a\x2b\x74\x3a\xad\xe4\x24\x32\x0e\x87\xc3\x9b\x6f\xec\x53\x90\ \x8a\xfa\x57\x8b\x17\x6a\xb5\xd6\x44\x16\xc8\x5a\xad\x4a\xa5\xd0\ \xd7\xca\x3a\x1d\xb2\x5a\xab\x56\x3b\xb9\xd6\xfc\x32\x15\x54\x48\ \xa7\xbe\x3a\x07\x85\xca\x09\x33\x59\xa1\x90\x1c\x08\x85\x56\x0f\ \xa1\x43\x5f\x98\xca\xe0\xd4\xd7\x24\x2a\xa4\x51\x7f\x05\x50\x28\ \xb4\x92\x42\x52\x48\xe8\xd0\x08\xa1\x93\x84\x46\x06\x1c\xf6\xa1\ \x82\xa3\xbc\xd7\x5b\x06\x74\x1a\x95\x05\x94\x20\x21\x90\x35\x3a\ \xa5\x04\x38\x32\x6a\x25\x2a\xd0\x9f\xdb\x77\x0a\x40\x36\x51\xc8\ \x1a\x09\x49\x0f\x81\x24\x03\x9e\xeb\x4c\xfb\x50\x41\x9b\x86\xce\ \xd9\xb3\x24\x01\x80\x10\xa0\x03\x00\xe1\xd8\x82\xa7\xe6\x05\x54\ \x30\x53\x78\xec\x45\xd4\xfa\x7a\x00\x00\x00\x68\xcc\xf5\x95\x3e\ \x12\x02\x54\x90\x66\xdd\x89\x5d\x9d\xd2\x35\x8b\x4e\xdb\x96\x24\ \xa5\x02\xd0\xc9\x02\x6b\x8e\x8c\x7d\x6c\xd3\x92\x3d\x1b\x33\xa8\ \xe0\x54\xd9\xa8\xf4\x1c\xb8\x6f\xdd\x25\xab\xfa\x1e\x9a\x7b\x5d\ \x92\xf0\x77\xdc\x94\x4d\x1c\x19\x3a\x90\xd4\xae\x52\x42\x05\xb9\ \xb7\xe0\x86\x87\x4a\xb5\x56\x8d\x65\x2b\xb6\xfc\x43\x89\x46\x28\ \xec\xb9\x62\xae\x93\xcd\x71\x45\xe3\x59\x4f\x50\x21\xe6\xa6\x2a\ \x37\x6d\xda\x33\xb4\x2c\x4b\x46\x3a\xad\x0e\x14\x2a\x23\xc9\xd4\ \x23\x87\x5e\xb0\xe1\x89\xb9\x0e\x54\x50\x37\xfd\xde\x8e\xb9\xf3\ \x3e\x63\xc5\x5d\xff\xb2\xe2\x48\xa3\x50\xa0\x95\x85\x81\x1d\xe1\ \x4b\xc6\xf6\xfd\x57\xcf\xc4\x52\x03\x15\x9c\xce\x7b\xbd\xb1\x65\ \xef\xdb\xf4\x29\x37\xec\xb8\xe8\x05\xd9\x91\x63\x2c\x5b\x56\xd9\ \x33\x74\xd1\x33\x4f\x0d\xd5\x7a\x0a\x4b\x2d\x54\xe0\xc4\x15\x03\ \x33\xa5\xda\xd8\x91\x17\x9d\xb3\x6f\x47\xe5\x04\x0e\xed\xca\xd6\ \x7c\xc1\x9e\x56\xa7\xd1\x19\xb8\x62\x38\x80\x0a\x66\x9e\x3b\x8d\ \xc7\x8e\x8c\x35\x28\x6d\x1b\xc9\x3a\x50\x28\xed\x5a\xc3\xc4\x50\ \x76\x5d\xb2\xa5\x01\x15\x4c\xf2\xa0\xfc\xc4\x19\xaf\x98\x3b\xf0\ \xc0\x81\xb1\x43\x2d\xb2\x90\xb4\xb2\x99\xda\xa6\x05\x6f\x18\x79\ \xcf\x4c\x56\x64\xa8\x60\x65\xf6\x6c\x71\xd3\x82\x7f\x5a\x77\xcd\ \x19\x8b\x8e\x9c\xb1\x67\x6e\x8a\x81\xbe\x8b\x96\x2d\xbb\x64\xe2\ \x91\x47\xc6\x56\x6c\xb9\x31\x83\x0a\x51\x0c\x36\x34\x4a\xa5\x43\ \x5b\x3a\xa5\xd3\x16\xad\xea\xeb\x2b\xcc\x4d\xcd\x0d\xf4\x4c\x8c\ \x4d\x65\xc9\xdc\xeb\xb6\x07\x82\x0a\x66\x31\xf5\x92\xa1\x56\xad\ \xd6\x49\x96\xbc\x67\x5f\x16\x42\x92\x94\x56\x5d\x77\xac\xf3\xdc\ \xc8\x9a\x35\xdb\xe6\x01\x15\xe2\x93\x07\x97\xae\x3f\x72\xde\xcb\ \x66\x3e\x34\x73\xd2\x39\x13\x9d\xac\x13\x92\x42\x32\x71\xec\x7f\ \x76\x5d\x76\xcd\x13\x8f\x75\xf6\x3f\x10\xa4\xc0\xb7\x5f\xf9\xc6\ \x9d\xed\x6a\xc3\xc4\x86\xab\xfa\x46\x46\x8e\xcd\x34\xb2\x50\xaa\ \x2c\x38\x6b\xc5\x69\x61\xe8\xa1\x43\xcb\x1e\x35\xf7\x5f\x7b\xe7\ \x2e\x29\xc0\xb7\xbe\xf8\xea\x9f\x5e\x5c\x3f\xd0\xb7\x6e\xdd\x59\ \x8b\x42\xab\xef\xdf\xc2\x6b\x66\x1a\x3d\x3d\x53\xdb\xb6\x6d\x99\ \x99\x3e\xbd\x73\xeb\x8f\xff\x81\x14\x80\x2f\x0f\x5e\xfd\xcd\xe5\ \x37\xa5\xcb\x2e\x5a\x77\xde\x07\x76\x75\x3a\x21\x29\x14\xce\xf9\ \xb4\x1d\x5b\x36\x7d\x1c\x3b\x7f\xb8\xf3\xfd\x77\xa7\x40\x05\xf0\ \xee\x34\xbd\xf5\xe6\x67\xcf\xff\x68\xf2\x9d\xbc\x7e\x26\x85\xb1\ \x4e\x96\x85\xa4\xc4\x58\xe3\xa3\xb8\xb7\xf5\xfe\xed\xdd\x9f\xbf\ \x73\x3f\x02\x20\x05\x00\x48\x89\xef\xde\x38\xfb\x83\xd5\xcf\x9d\ \xbc\x54\x9c\xeb\xaf\x54\x8b\xcc\x9f\x37\xa3\xd9\x6e\xbd\x79\x78\ \xef\xf0\xd7\xbf\xbd\x4f\x04\x00\xa4\x00\x00\x00\x29\x81\x04\x02\ \x88\x00\x00\x80\xff\x03\xbc\x05\x01\xb7\x67\xc1\x4b\xf6\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x9f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x03\x1c\x49\x44\ \x41\x54\x78\xda\xed\xd7\xdf\x6b\x1c\x55\x14\x07\xf0\xef\xf7\xde\ \x3b\x77\x66\x76\x66\x13\xb3\x69\x36\x0d\x1a\x36\x21\x55\x6c\x63\ \x23\x51\xfb\xa0\x06\x65\x41\x4a\x23\xb6\x56\x63\x53\x11\xfa\xdc\ \xb4\x4f\x0a\x01\x6d\x29\x11\x11\x04\x9f\x05\x41\xa8\x14\xc4\xb7\ \x42\x15\x2c\xf6\x49\x50\xff\x0a\xa1\xc5\x07\xed\x83\x48\x91\x5a\ \xb3\xba\xdd\xd9\x7b\xaf\xf3\x23\xec\x0f\x4b\x28\xd5\x34\x41\xd8\ \x73\xf8\xb2\xf3\x76\x3e\x9c\x39\xb0\x0c\x9d\x73\xd8\xc9\x12\x69\ \x06\x80\x01\xe0\xff\x0b\x60\x9d\xa2\x7e\xb2\xae\x76\x04\xc0\x37\ \x38\x3d\xf6\x58\xf5\xda\xe4\x81\xda\xf5\xea\x6a\xf5\xe1\x6d\x05\ \x70\x37\x35\x04\xbf\xdc\x25\x47\xa7\x7f\xbe\xfe\xd3\xf8\x8d\xf5\ \xdf\xbe\xe0\x2c\xf5\xb6\x01\xf0\x3c\x3f\xaf\x44\x95\xb9\x18\x31\ \xbe\xff\xe6\x3b\x68\xe8\x59\x3c\xc7\x8b\xdb\x02\xe0\x32\xcf\x84\ \x51\xf8\xda\xbe\xb1\xbd\xb0\x9e\x85\x0b\x1d\xcc\x2f\x09\xbc\x92\ \x7f\x98\xa7\xe5\x7b\xf7\x15\xc0\x57\xb8\x28\x7d\xb5\xf6\xe4\xd4\ \x13\xa4\x26\x9c\x76\x60\x4c\xb4\x65\x1b\xf2\x26\xa9\x86\xbc\x77\ \xb8\xa2\x8e\xde\x17\x00\x8f\x71\x0a\x1e\x2e\x1c\x98\x79\x2a\x88\ \xe2\x08\x46\x19\x18\xcf\x40\xc6\x12\x28\x01\x4d\xf3\x17\xda\xa6\ \xa5\x31\x82\x4f\xb9\xc2\x99\x2d\x05\xe4\x07\x96\xe0\xd2\xfe\xe9\ \xfd\xe3\x13\x13\x13\xb0\xd2\xe6\xeb\xb7\xca\x16\x80\x08\x45\x9a\ \x0e\x30\xae\x82\x8a\xba\xcc\x17\xe9\x6f\x19\x00\x33\xf8\xac\xf6\ \x60\x6d\x7e\x6e\x76\x0e\x56\xe4\x83\x8b\x68\x0b\x96\x08\x94\xd0\ \x41\x28\x4f\xa0\x1c\xc5\x8f\xe2\x71\x79\x69\x4b\x00\x7c\x89\x67\ \x2a\x43\x95\xe5\xfa\x33\xf5\x7c\xb8\x91\x26\x4b\x0e\x70\x9e\x83\ \xf5\x6d\x06\xe8\x20\xda\x61\x1b\x89\x6c\x22\x2c\x97\x16\xf9\xb6\ \xfc\xe0\x3f\x01\x78\x98\x8b\x5a\xeb\xb5\x23\x07\x8f\x50\xfa\x32\ \x03\x14\x91\x36\xbf\x01\x06\x84\x0d\x6c\xdf\x06\x10\x03\xcd\xa0\ \x09\x15\x93\x7a\x38\x58\xe5\xaa\x5a\xfa\x57\x00\xbe\xca\x29\x10\ \x17\x96\x0e\x2e\x05\xe5\x91\x32\x6c\xd6\xcc\x01\x9d\x0d\x50\x13\ \x89\x4e\x80\x10\x3d\x88\x22\x7f\xf8\xb7\x30\xb4\x2b\xf6\x58\x11\ \xe7\xf9\x26\xf7\xdc\x03\xa0\x7b\x74\x87\x9e\x3e\x34\x5e\x9b\xa9\ \xe5\x83\x0d\x0d\xd2\x2e\x10\xd2\x76\x0e\x11\x01\x32\x40\x3f\x22\ \x2e\x72\x43\xff\x0a\x17\xd8\x07\x50\xf5\xae\x6c\x76\x94\x62\xb3\ \xa3\x9b\x7f\x64\x7e\x7e\xe1\xd9\x05\x18\x67\x60\x9d\x85\xc5\x06\ \x42\x98\xce\x6b\x70\xca\x01\x3e\x80\xa0\x17\xd0\x1f\xaf\x2a\x50\ \x19\x1e\xd9\x83\x05\xf5\xd5\x5d\x00\xdd\xa3\x9b\x1c\x9b\x5c\x3e\ \xfe\xf2\x71\x24\x2e\xc9\x86\x77\x92\x37\xbb\x10\x27\x1c\xa0\xd1\ \x8b\xe8\x6e\x20\x2a\x40\x49\x90\xe0\xf6\x50\x03\x71\x54\x7e\x81\ \xef\x7b\x1f\x6e\x02\xe8\x1e\x5d\x29\x2c\xad\x9d\x7a\xfd\x14\xa9\ \x09\x6b\x2d\x8c\x35\xc5\x16\x8a\xee\xdb\x06\x24\x00\x95\xc6\x4b\ \xa3\xfb\x10\x45\xc2\x02\xd7\x50\x0d\x78\x65\x32\x88\xc2\xb7\xf8\ \xae\x3a\x86\x9e\x52\xbd\xff\xed\x88\xf1\xc9\xd9\x13\x67\x83\xd1\ \xdd\xa3\x58\xff\x73\x1d\x5a\x6a\xf8\xc2\x47\x4b\xb6\x10\xa4\xed\ \xe8\x40\x45\x88\xb4\x65\xd6\x7e\x9a\x96\x04\x3d\xe6\x08\xfa\x04\ \x4b\x2c\x7e\x0d\x01\x02\xc2\x08\xa0\x0d\x98\x24\xc1\xd4\xe8\x43\ \xde\x0f\xb8\xf6\x11\x80\x8b\x77\x00\xf0\x2d\xdc\xca\xc7\x2b\xbc\ \xfa\xe3\x55\x9c\x3b\x7f\x6e\x43\x95\xc6\xff\x47\xb2\x61\x6a\x63\ \x98\x12\xa0\x14\x80\x20\xa0\xd2\x48\x16\xcf\x42\x00\x2c\x00\xa0\ \x04\x1c\x60\x40\x34\xfc\xdf\xb3\xe7\x5b\xe8\xa9\xbe\xef\x02\x2e\ \x53\xa0\x81\x61\x68\x6c\x7d\xb5\x50\xd4\xd7\xb8\xe9\x7a\x86\x0e\ \x3e\x4c\x06\x80\x01\x60\xc7\x01\x7f\x03\xdc\xff\x15\x57\x44\x01\ \x6e\x64\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xf0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x06\x6d\x49\x44\ \x41\x54\x58\x85\xc5\x97\x6d\x6c\x53\xd7\x19\xc7\xff\xe7\xfa\xda\ \x71\x7c\xb9\xce\x8d\x9d\x37\x67\x36\x79\x23\x8b\x54\x09\xad\x15\ \x8d\xd2\x84\x41\xc9\x3e\xb4\x7b\xe9\xba\x4d\xed\x2a\xaa\x05\xd6\ \x42\x9c\x90\x57\xc2\xca\x5b\x9b\xb5\x8c\xd2\x75\x64\xa0\x04\x31\ \x28\xe0\x56\xed\x84\xb4\x95\x00\x63\xd2\xa0\x6a\x91\x46\xca\x68\ \x81\xd1\x94\x42\x29\x15\x34\x90\x96\x34\x89\x9b\xc4\x76\xe2\xe0\ \x24\x8e\x63\xfb\x3c\xfb\x90\x38\x90\xf8\xda\x29\x93\xa6\x3d\xd2\ \xf3\xe9\x79\xf9\xff\xce\x39\xf7\x3c\xf7\x5e\x46\x44\xf8\x7f\x9a\ \x10\x2b\x70\xde\x6a\xfe\xfd\xe0\x1b\x8d\x63\x1f\xe5\xa6\x54\xfc\ \xb7\xcd\xcf\x2b\x89\xcf\xb8\x1d\x1b\x7d\xed\x0b\x6d\x3b\x63\x26\ \x11\x51\x94\x9f\xcf\x30\x36\xbb\x76\xbf\x44\x74\xec\x18\x0d\xfe\ \x79\x07\x7d\x64\x33\xd5\xa8\xe5\xc5\xf3\xb3\x46\x43\x85\xf3\x8f\ \xf5\x3c\x7c\xf0\x20\x0d\x1d\x39\x40\xed\x79\xa9\xbb\xd5\xf2\xd8\ \xec\x23\xb8\x90\xa9\x34\xe7\xac\x7d\x76\x5d\x9a\x3e\x1b\xf0\xfb\ \x41\x16\x0b\x86\xf8\x00\x3a\xb7\x6e\xaf\x2b\xbc\xe5\xd9\xf3\x6d\ \x56\x7e\x2e\x49\xaa\xc8\x7d\xb1\x62\xbf\x89\x67\x30\x1d\x27\xc0\ \x68\x84\x57\x0e\xa3\x73\xdb\xb6\x3d\x8b\x3a\x06\xea\xee\xce\x9d\ \x01\xf0\x6f\x9b\xa9\x65\xfe\xea\x27\x1b\xd2\x0d\x0b\x80\x89\x89\ \x3b\x59\x19\x19\x18\x16\x3c\xb8\xf1\xea\x8e\xba\xa2\x9b\xee\xb8\ \x10\x1f\x9a\xe5\xca\xbc\x46\xfb\xfe\xe4\x89\x34\x68\x43\xa1\x3b\ \x01\x83\x01\xbe\x64\xe0\xc6\xf6\xa6\x3d\x85\x5f\xf4\x4f\x43\x4c\ \x03\x5c\xc8\x32\xef\xca\x5c\xfe\xe8\xda\xe4\xc4\x7c\x20\x18\x8a\ \x6a\x2c\x64\x5a\x30\x96\xe0\x43\x47\x53\xcb\xda\x92\x1b\x03\xbb\ \xd5\xc4\x4f\xa7\x26\xad\xf9\xee\xe6\x55\xfb\xa4\x51\x05\x9a\xc0\ \x44\x54\x5c\xd0\xe9\x10\xb0\x24\xa0\xb3\xa5\x65\xef\x83\xd7\xfa\ \x6b\xa7\x01\x2e\x2c\x48\x7b\x25\xed\xa7\x8b\x1b\x65\x21\x17\x88\ \x73\x2b\xc4\xcc\x4c\x8c\x1b\xc7\x71\x6d\xe7\x9e\xe7\x4a\x3b\xfa\ \x9a\xef\x8e\x9d\x48\x37\xd6\xdd\xbf\x69\xd5\xee\x04\xef\x3c\xb0\ \x91\xb1\x98\x3d\x98\xa8\x01\x9b\x3f\x0f\x5f\x39\x1c\x4d\x8b\xae\ \xf4\x6e\x66\x44\x84\x8e\x95\x45\x03\x7a\x69\x61\xaa\x00\x6d\xcc\ \x42\x00\x20\x00\xa2\xc5\x82\x50\x2a\xc7\x27\x2d\xaf\x3d\xff\xb3\ \x8e\x81\xed\x00\xf0\x56\xaa\xbc\xf1\xe1\x4d\xcf\x36\xe9\x5c\x7a\ \xe0\xb6\x2f\x6e\x0f\x00\x20\x9d\x08\xa6\xbf\xe5\xb5\x36\x1d\x4f\ \x66\x44\x84\x36\x43\x42\x59\xd6\xd3\x45\x07\x89\xb2\x19\x78\xcc\ \x9b\x09\x02\x10\x9e\x82\x40\xa6\x80\x93\xbb\x1c\x7f\x08\x0d\x07\ \xfc\x8f\x6e\x5c\xf9\xb2\xc6\x29\x80\x79\x6f\xcf\x29\x0e\xad\x06\ \x5a\x65\x10\x5f\xff\xe5\xfd\x55\x4b\x9c\xde\xb7\xa6\x9f\x81\xd3\ \x7a\xdd\x6a\x5b\x59\xc9\xeb\xc1\xf1\x0c\x16\x0e\xc6\x3e\x86\x30\ \x80\x20\x00\xd1\x92\x01\x5d\xb6\x1e\xe1\x80\x0f\xac\x8b\x83\x3c\ \x43\x60\x73\x68\x0b\x5a\x11\x86\xf4\x11\xf4\xbe\x7d\xa6\xba\xc4\ \x39\xb4\x0f\x98\x75\x0b\x4e\x4b\xfa\xd5\xf3\xcb\x8a\x5f\xf7\x0f\ \x2a\x2c\x14\x08\xab\xee\x00\x07\x10\x9a\x82\x48\x48\x4f\x03\x0b\ \x87\xc1\xdc\x1e\x08\x40\x5c\x00\x41\x2b\x22\x29\x3b\x8c\x9e\xd6\ \x33\xd5\x25\x3d\x93\xe2\x51\x00\x00\xd0\x26\xe9\xcb\xb3\x57\x94\ \x38\x46\x9c\x09\x2c\xe8\x8f\xbe\x0d\x91\x63\x88\xe0\x69\xa6\x3c\ \xbe\xb8\x06\xe6\x02\x1d\xba\xff\x7e\xb6\x76\xf1\x2d\xcf\xde\xbb\ \x63\x51\x00\x00\xd0\x26\x4b\xe5\x39\x65\x45\x0e\x6f\x27\xb1\xe0\ \x58\x50\xb5\x29\x8f\x34\x98\x43\x9c\x69\x04\xa4\x7d\x6f\x1e\x7a\ \x4f\xb4\xd7\x95\x7c\xe9\x8a\x9a\x21\xaa\x00\x00\xd0\xa6\xc8\xe5\ \xb9\x4f\x17\x3a\x3c\x9f\xfb\x63\x42\xc4\x33\x8d\xc1\x00\xd1\x9c\ \x8c\x94\x7c\x11\x3d\xff\x38\x57\x5f\x7c\xfd\x9b\x3f\xa9\x02\xc6\ \x7b\x1b\xbe\x6f\x92\xed\x39\xcb\x0b\x0f\xb8\x3f\x1e\x62\xa1\xd1\ \xe8\xc1\x32\xc3\x04\x01\xa2\x2c\x83\x49\x12\x42\x81\x00\xc6\x06\ \xfa\x61\x5b\x6a\x86\xeb\x4c\x57\x7d\xf1\xf5\x5e\x55\xf1\x39\x01\ \x00\xa0\x2d\x45\xb1\xe7\x3d\xb5\xc8\xd1\xff\xaf\x6e\x84\x02\x1c\ \x4c\x14\x01\x51\x04\x00\x50\x28\x04\x62\x0c\x4c\xaf\x07\x0f\x85\ \x10\x70\xbb\x31\xe1\xf1\x00\x3c\x8c\xfc\xd5\xc5\xe4\x3a\xdb\xd5\ \x50\x7c\xb5\x5b\x75\x6a\x46\x4c\x8c\xbf\x2c\x00\x20\x16\xe6\x13\ \xf0\xf7\x74\x23\xe4\x0b\xcc\x99\xad\x03\xc0\x04\x06\x81\x89\x88\ \xf3\xb6\x9f\xb6\xb8\x3b\xd0\x96\xa2\xd8\x73\x7e\xf9\x80\xc3\xd5\ \xda\x8e\xa0\x77\xe6\x78\x9d\x5d\x35\xfb\x41\x64\x3a\x11\x96\x55\ \x4b\xe1\x6c\xfb\xa2\x7e\xf1\xf5\xee\x7b\x3f\x82\xb6\x14\xc5\x9e\ \xfb\xd4\x83\x8e\xa1\xd6\x0b\x08\x0d\x8d\x46\x89\x47\x1c\xb8\xb3\ \xce\x68\x08\x2d\x52\xed\xa5\xe8\x7e\xf7\xd3\xda\xef\xdf\xfc\x66\ \x2f\x54\x4c\x15\xe0\x94\x49\xb1\xe7\xfd\xea\x21\xc7\xd8\xa1\xf3\ \x08\x7a\xd4\x67\x3b\x07\xc0\xa7\x6a\x05\xc6\x62\x6e\xb6\x46\xaf\ \x85\xd1\xfe\x08\xba\x4e\x5c\xac\x59\xd2\xe9\x7c\x6d\x4e\x80\x53\ \x8a\x5c\x9e\xb7\x62\x89\x23\xd8\x7a\x8e\x71\xb7\xfa\x6c\x8f\x4c\ \xc4\xd9\x00\xb1\xe6\x81\x60\x48\x80\xbe\xf2\x31\x7c\x79\xf4\x6c\ \xf5\xc3\x5d\xce\x7d\x77\xc7\x66\x00\x9c\x52\xe4\xf2\xbc\x5f\xff\ \xc0\x21\xb4\x7e\xc0\xf8\x80\x37\xae\x38\x11\x01\x26\x23\xf8\x44\ \x10\xc2\x88\x3f\xee\x2e\x00\x80\x30\xcf\x00\xb6\xe6\x49\x74\xbe\ \xfd\x5e\xd5\xb2\xee\xbe\xfd\x33\x00\xb6\x32\x26\x14\x99\x15\x7b\ \xc1\x33\x3f\xda\xa7\x3f\xf4\x4f\xc6\x9c\xee\x98\x8d\xf8\x94\xc3\ \x92\x82\xc1\xe5\x3f\x26\xae\xd5\x30\xc5\x71\x14\xa2\xd7\x37\xe7\ \x48\x66\x8a\x8c\x60\xf5\x4a\xdc\x78\xf3\xc8\x9a\x52\x67\xdf\x81\ \xc9\x15\x11\xe1\x70\xce\x77\xea\xae\xbd\x58\xc5\xfb\xb2\x32\x69\ \x90\xb1\x98\xee\x61\x8c\x5c\x8c\x51\xbf\xd5\x42\x9f\x6d\xa8\xe0\ \x7f\x4d\x92\x6b\xfe\x66\x49\xaf\xff\xb4\xb1\x96\x9c\x29\x26\x72\ \x4d\xe5\xc4\xeb\x31\x98\x6a\xa6\xfe\x5d\xaf\x50\xfb\x0f\x1f\xa9\ \x25\xa2\x49\x80\x8b\xbf\x29\x1f\xe8\x2d\x7d\x88\x46\x34\x02\x8d\ \x32\x16\xd3\x7d\x8c\xd1\x60\x96\x95\xae\x6c\xa8\xe2\xad\xb2\x5c\ \x15\xf9\xb2\x3d\x9a\x91\x56\x7b\xb9\xb1\x81\xbb\x2c\xe9\xe4\x8b\ \x53\x3f\x26\x08\xe4\xd7\x6a\x69\xb4\xa4\x90\x6e\xfe\x76\x7d\xdf\ \x34\xc0\xd1\x82\xec\x9d\x1d\x3b\x1a\xc9\x67\xcb\xa4\x00\x63\xaa\ \x3e\xce\x18\x0d\xe7\x66\xd1\xe5\x0d\x35\x33\xc4\x23\x7e\xd8\x94\ \x54\x7d\xe9\x85\x75\x7c\xc8\x66\xa5\xf1\x18\x3d\x02\x8c\x91\x3f\ \xcb\x4a\xbd\xaf\xbe\x44\xa7\xb2\xb3\xb7\x4c\x03\xfc\x6e\xd9\x32\ \xf1\x9d\xf4\xb4\xe6\xae\x97\x37\xd1\x88\xcd\xaa\x2a\xee\x5d\x90\ \x43\x97\xd7\xd7\xf2\x43\x92\x14\x25\x1e\xf1\x56\x59\xae\xba\xb4\ \xb9\x81\x7b\xf3\x72\x54\x21\xfc\x36\x2b\x75\x6f\xd9\x48\x27\x15\ \xa5\x29\x52\x33\xa3\xc1\xc9\x64\xa5\xa9\x6b\xeb\xf3\xe4\xcb\x9d\ \x3f\xa3\x70\xb8\x20\x9f\x2e\x3f\x57\xc3\x0f\xc7\x11\x9f\xde\x09\ \x49\xaa\xba\xb4\xbe\x96\x0f\x2f\xbc\x8f\x02\x92\x44\x01\xad\x76\ \x72\x11\x2a\xe2\x51\x00\x44\x84\x77\x15\x63\xd3\xcd\x6d\x9b\x69\ \x38\x3f\x77\x52\xfc\xbe\x02\xba\xb2\xae\x9a\x1f\x49\x4c\xac\xfc\ \xb6\x7f\x45\x47\x12\x13\x2b\xaf\xae\xaf\xe3\xbe\xd2\xa5\x14\x90\ \x24\x1a\xb7\x59\xa9\x47\x45\x5c\x15\x00\x00\x3b\x9e\x62\x6e\xee\ \xdc\xb2\x89\xdc\x3f\xff\x09\x5d\x5d\x5b\xc9\x8f\x25\x26\x56\xdc\ \xeb\xaf\xd9\x71\x93\xa9\xfa\xf3\x86\x35\xfc\xf6\x13\x8f\xc7\x14\ \x57\x05\x88\xf8\x7b\x49\x49\x2f\x5c\x7c\xe2\xf1\xae\xe3\x92\xb4\ \xe2\x5e\xc5\x23\xfe\x8e\x24\x95\x7d\xfc\x8b\xc7\x6e\x9d\x34\x99\ \x1a\x63\xe5\xcc\xf9\x3d\xf0\xbf\xb6\xff\x00\x3b\x5e\xa1\x62\x6e\ \xa6\x4e\x92\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x09\x5a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x30\x00\x00\x00\x34\x08\x06\x00\x00\x00\xcc\x93\xbb\x91\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x04\x0b\ \x12\x07\x1a\x3b\x2d\x7f\x2e\x00\x00\x08\xda\x49\x44\x41\x54\x68\ \xde\xd5\x5a\x4d\x6f\xdb\xc8\x19\x7e\x2c\xcb\x96\xe2\x0f\x79\x1d\ \x3b\xb6\x13\x67\x93\x2e\x7c\xd8\xde\x22\xc9\x88\xae\x4d\x2f\x45\ \x81\x6c\xcf\xc9\x1f\x08\xd0\x5b\x73\xce\xb9\xff\x21\xed\x71\xd1\ \xed\x35\x68\xe3\xa4\x76\xed\x20\x30\xdc\x58\xb1\x28\x4b\x5a\x2c\ \x16\x6b\xe4\x03\xdd\xa2\x8d\xbf\x2d\xc7\x92\x65\x4a\xe2\xc7\xbc\ \x7b\x20\x87\x9c\x19\x52\xb4\xdc\xb8\x80\x4b\x80\xb1\x34\x43\x8e\ \xde\x79\x9e\xe7\x7d\xde\xe1\x30\x00\xf0\x3b\x00\x74\x11\xce\x99\ \x99\x99\xdd\x9b\x37\x6f\xfe\x19\xc0\x5d\x00\x23\x00\xfa\xd0\xc5\ \x41\x6f\xdf\xbe\xa5\x8b\x70\xe8\xba\x4e\x95\x4a\x85\x1e\x3e\x7c\ \xc8\x27\x75\x13\xc0\x00\x80\x58\xe4\x04\xfe\x17\x47\xa1\x50\x20\ \xc6\xd8\x99\x4e\xd3\x34\x49\xd7\x75\xaa\x56\xab\xb4\xbc\xbc\xcc\ \x27\xf1\xc5\x69\x93\x38\xf7\xe0\x79\x40\xe2\xe7\x6e\xce\x66\xb3\ \x49\x1b\x1b\x1b\x44\x44\x54\xab\xd5\x68\x7e\x7e\xfe\xd4\x49\xc4\ \x70\x8e\x07\x11\xa1\x50\x28\x00\x00\x34\x4d\x03\x11\x41\xd3\xb4\ \x33\x8d\x61\x9a\x26\x00\x20\x95\x4a\x21\x97\xcb\xe1\xc9\x93\x27\ \x48\x24\x12\xff\x04\x30\x09\x20\x19\x16\xf3\xb9\x21\xae\x22\xaf\ \xfe\xed\x74\xda\xb6\x4d\xb6\x6d\x93\xae\xeb\xb4\xb0\xb0\x40\x44\ \x44\xb6\x6d\x13\x11\xd1\xfb\xf7\xef\xe9\x9b\x6f\xfe\x44\xa9\x54\ \x2a\x94\x89\xd8\xa7\x22\x4e\x44\x1e\xe2\x62\x3b\x67\x40\xfc\xae\ \xde\x27\xde\xef\xb4\x33\xd8\xb6\x0d\x00\xb0\x2c\x0b\xb6\x6d\x63\ \x66\x66\x06\x5f\x7e\xf9\x73\x3c\x7e\xfc\x18\x00\x44\x26\x7a\xe0\ \xfe\x43\xe2\x20\xdd\x06\x1e\x76\xf4\xf4\xf4\x48\x7d\xe2\x77\x22\ \x42\x2c\x16\x03\x63\x4c\x1c\x09\xe2\x50\xad\x56\x0b\x0b\x0b\x0b\ \xb8\x73\xe7\x0e\x36\x36\x36\x90\x4c\x26\x51\xad\x56\x31\x30\x30\ \x80\x44\xa2\x1f\x3f\xfe\xf8\x2f\xdc\xbf\x7f\xff\x0f\x00\x7e\x0f\ \x60\x1f\x80\x11\xff\xd4\xc0\x35\x4d\x43\x2e\x97\x93\x90\xce\xe5\ \x72\x28\x14\x0a\xc8\xe5\x72\x52\x3f\x63\x0c\x9a\x56\xc0\xed\xdb\ \xb9\xb0\xd1\xdd\x09\x11\x1e\x3c\x78\x00\x5d\xd7\x41\xc4\x38\xd0\ \x98\x9c\x9c\xc0\x57\x5f\xfd\x06\x00\x7e\x0b\xe0\x8f\x00\x1a\x00\ \xac\xae\x18\x38\xad\x9f\x23\xcd\xaf\xe3\x48\x3b\x7f\x6d\xc4\x62\ \xbd\x9e\x34\x00\xa0\xb7\x97\x7f\xf7\x19\x20\x22\xb4\x5a\x2d\xf4\ \xf4\xf4\xa0\x54\x2a\x61\x6f\x6f\x0f\xba\x7e\x82\xbd\xbd\x7d\x1c\ \x1d\x1d\xa1\x5e\xaf\xe3\xcd\x9b\x37\x58\x5a\x5a\x02\x80\x5f\x02\ \xd8\x00\x70\x10\x99\xc4\x51\x89\xb7\xb6\xb6\xe6\x25\x1f\x4f\xb8\ \xd7\xaf\x5f\x93\x6d\xdb\x64\x59\x16\xe5\xf3\x79\xb2\x2c\x4b\xf9\ \x6c\x92\x69\x3a\xe7\xea\xea\x2a\x99\xa6\x49\x86\x61\x90\x61\xb4\ \xc9\x30\xda\xd4\x6e\xb7\xc9\x34\x4d\x6a\x36\x9b\xd4\x6c\x36\x69\ \x7b\x7b\x9b\xf2\xf9\x55\x2a\x14\xd6\x68\x71\xf1\xef\xf4\xe8\xd1\ \x23\x6e\xab\xbf\x02\x30\x0d\xa0\x37\x94\x81\x4e\x88\xab\xed\xbe\ \xa6\x7d\x24\x7d\x74\xf9\x67\x0b\x44\x40\x3c\x1e\x87\x65\x59\x52\ \xc2\xf6\xf5\xf5\xc3\x30\x0c\xaf\x8d\x31\x86\x9e\x1e\x31\xc9\xc5\ \xfc\xd0\xf1\xe2\xc5\x4b\xdc\xbb\x77\x0f\x00\x7e\x0d\xe0\x7b\x00\ \x3b\xb1\x4e\xae\x12\xe6\x18\xa2\xdb\x10\x11\x6c\xdb\x46\x2c\x16\ \x03\x91\xdf\xee\x04\xec\xd4\x03\xcb\xb2\xbc\x20\xf2\xf9\x3c\x00\ \x02\x63\x0c\x8c\x31\x10\x01\x86\x61\xa0\x58\xd4\xc0\x98\x0d\xc6\ \x6c\x2f\x68\xc6\x78\xf0\xe4\xdd\xd3\xdf\x9f\x44\x32\x99\x0c\xca\ \x97\x33\x20\xba\x45\x87\x4c\x08\x45\x59\xec\x53\x51\x8e\xc7\xe3\ \x5e\x61\x22\x22\xf4\xf7\x73\xc4\xc9\x9d\xac\xe3\x48\x97\x2e\x5d\ \x42\xb3\xd9\x74\x93\x96\x03\x27\xfe\xa6\x73\xfd\xca\xca\x3f\x70\ \xf7\xee\xdd\x70\x06\x4e\x43\xbf\x50\xd0\x4e\xed\xb3\x2c\xd3\x73\ \x12\x4d\xd3\x60\x9a\xa6\x7b\x8d\x23\xb3\xd5\xd5\x57\x2e\x73\xcc\ \x0b\x1e\x20\xe8\xfa\x89\x5b\x37\xe0\x9e\xce\x3d\x4e\x3c\x14\x1a\ \x5b\x80\x01\x55\xcb\x61\x0c\xf4\xf6\xca\x08\x73\x64\x88\x80\xbe\ \xbe\x3e\x0f\x6d\xae\xf1\xfe\xfe\x04\xda\xed\xb6\x34\xe9\x64\x32\ \x89\x66\x53\x17\x40\xf0\xc7\x1a\x1c\x1c\x42\xa3\x71\x2c\x30\x00\ \x6f\x02\x00\xf0\xea\xd5\xea\x69\x0c\xa8\x92\x71\xb4\xcc\xfb\x9c\ \xe0\x45\x54\x00\x4d\x2b\xba\x6b\x18\xc3\x6d\x67\xae\xdf\x17\xbd\ \xe0\x9d\x36\x1b\x8c\x31\xac\xac\xac\x08\x3a\x27\x69\xbc\xe3\xe3\ \x63\xfc\xf0\xc3\x86\xdb\xce\x3c\x16\x38\x33\x91\x0c\xd8\xb6\xa5\ \xcc\xdc\x9f\x48\x3c\x2e\xa3\xab\x32\xd0\xd7\xd7\x2f\x21\xcd\xdb\ \x13\x89\x24\x74\x5d\x0f\x80\x32\x38\x38\x84\x93\x93\x86\xa0\x73\ \xf9\x47\x87\x87\x53\xa8\xd5\x6a\x0a\x03\x84\x7c\x7e\x2d\x8a\x01\ \x99\x36\xbe\x96\x21\x82\x10\xbc\x8c\x98\xa6\x15\xc1\x18\xb9\xc1\ \xfb\xed\x8c\x39\x79\xe1\x04\x4f\x02\x33\xce\x78\xcb\xcb\xcb\x2e\ \xba\x4c\x30\x0f\x5f\xfb\xb5\xda\x11\x4a\xa5\x75\x8f\xcd\xae\x72\ \xc0\xb2\xcc\x00\xfa\x8e\xae\x8d\x50\x66\xb8\x63\x24\x12\x49\xb4\ \x5a\x2d\x41\x86\xbe\x93\x0c\x0c\x0c\x4a\x48\x8b\x72\x1d\x1e\x4e\ \xa1\x5e\xaf\x2b\xcb\x08\x5e\x0f\x9c\x0f\xa3\xa3\xa3\xf8\xf8\xb1\ \xea\xb5\xaf\xad\x15\xa2\x19\x00\x80\x62\x51\xf3\x90\x34\x0c\x23\ \xc0\x8c\xa8\x71\x22\xa0\xd5\x6a\x0a\x68\x32\xef\xfa\x62\x71\x1d\ \x8d\xc6\xb1\xa0\x73\x78\xec\x10\x11\x5e\xbe\x7c\xe9\xb6\x33\xb7\ \x1d\x5e\x8d\xe0\xed\x87\x87\x55\xac\xaf\x97\x3d\x76\x22\x19\x30\ \x4d\xc3\x0b\x54\xf5\xeb\xe0\x00\xce\xe7\x64\xf2\x92\xbb\xe8\x22\ \xc5\x95\x9c\xbf\x43\x43\xc3\x38\x3e\x3e\x0e\xd5\x39\x11\x61\x64\ \xe4\x33\x1c\x1d\x7d\x0c\x8c\x2d\x32\x46\x04\x8c\x8d\x8d\xa3\x5a\ \x3d\x40\xa1\xa0\x75\x66\xc0\x71\x13\x07\x2d\xc3\x68\x2b\x55\x91\ \x49\xfa\xe7\xda\x3f\x39\x39\x91\xfa\x7c\x84\x81\x62\xb1\x88\xe3\ \xe3\xba\x87\x70\x98\xc7\xbf\x78\xb1\x24\xf4\x89\x7e\x2f\x5f\x7f\ \x70\xb0\x8f\x52\xa9\x14\xcd\x40\xbb\xdd\x46\x22\x91\x90\xac\x4f\ \x95\x97\x58\x58\x82\x4e\x22\xeb\x1c\x20\x0c\x0f\x8f\xb8\x6e\x22\ \xb7\x8b\x4b\x85\xcb\x97\xc7\x70\x78\x58\x95\x10\x57\xeb\x11\xff\ \xdd\x62\xb1\xd4\x99\x01\x80\x14\x3d\x43\x38\x7d\x8d\x17\x8b\x8e\ \xf6\x1b\x8d\x46\x48\xc5\xf4\x11\x2e\x16\xd7\x51\xab\x1d\x29\xfa\ \xb7\x61\xdb\x4c\xca\x8b\xa5\xa5\xc5\xc0\x13\x9a\x08\xd8\x69\x2e\ \x14\xf3\x57\x82\x32\x6d\x3c\x61\xb9\xfd\xf1\xfe\xd9\xd9\x59\x0c\ \x0d\x0d\x29\x45\x86\x84\xe2\xe3\x5f\x37\x32\xf2\x99\x17\x38\x5f\ \xc0\xc9\x96\x49\xc8\x66\x33\x18\x1b\x1b\x17\xcc\x42\x5c\xf0\x89\ \xfb\x5e\x88\x9e\x80\xea\xf1\x3c\x60\xdf\x15\x08\xeb\xeb\x45\x10\ \x11\xea\xf5\xba\xa4\x57\xff\x1e\x3f\xb0\xf5\xf5\x75\xd7\x02\x59\ \xa8\xc6\x45\xeb\x5c\x5c\x5c\x10\x02\x0f\x26\x74\x94\x0b\x49\x36\ \xea\x20\xcd\x04\x69\x30\x09\xb1\x6c\x36\x8b\xe1\xe1\x54\xc0\xd3\ \xe5\x65\x81\x23\xb9\x4c\x26\x83\xd1\xd1\x31\xa1\x4f\x5d\x08\xfa\ \x4c\xa7\xd3\x19\x8c\x8f\x4f\x84\x3c\xf0\xa3\x7b\x06\xb8\x9b\x88\ \xe8\xfb\x03\x39\x9a\x06\x80\x5a\xad\xe6\xb5\xfb\x34\xc3\x63\x8b\ \xb7\x95\x4a\x25\x54\xab\x07\x1d\x9e\x2b\xc8\x4b\x66\xce\xf0\xfc\ \xfc\x7c\x88\x9d\xfa\x0c\xc8\x9b\x01\x1d\x72\x40\xd5\x9d\x88\xc4\ \xec\x6c\x16\xa9\xd4\x48\xa0\xdd\x9f\x08\x93\x64\xe1\x6b\x9b\x94\ \x3a\x21\x07\xce\x27\x9f\xcd\xa6\x31\x39\x39\x15\x92\xc8\xbe\xa9\ \x74\x91\x03\xe1\xd9\x5f\x2a\x39\xe8\x3b\x45\x87\x49\xcc\xa8\x6b\ \x76\xff\x9e\x32\x0e\x0e\xf6\x25\xf4\x83\x81\xcb\xd2\x9b\x9f\xff\ \x5b\xa0\xe2\x47\xad\x44\x03\x39\xa0\xca\x82\xff\x48\x36\x9b\xf5\ \x1c\x45\x4d\xc8\xb0\xe2\x03\x10\x32\x99\x0c\xc6\xc7\xaf\x48\x93\ \x95\xad\x96\xa0\xfe\x76\x26\x93\xc6\xd4\xd4\xd5\xc0\x73\x42\x54\ \x1e\x48\x39\x10\x16\xa0\xb3\x2a\x24\x7c\xfc\x78\x28\x69\x5c\x96\ \x1a\x14\x26\x80\x72\xb9\x8c\xbd\xbd\xdd\xc0\xb8\x2a\xd3\x2a\x83\ \xcf\x9f\x3f\x0b\xb5\xcf\x2e\x5c\x88\x94\x1f\x20\x0f\xfd\xd1\xd1\ \xcb\x21\x49\xd4\x19\x7d\xc6\x18\xd2\xe9\x34\x26\x26\x26\x03\x4e\ \xa2\x32\xa0\x32\x99\xc9\xa4\x71\xed\xda\xf5\xae\xf7\xa5\x62\x9d\ \xf6\x3b\xb9\x97\x33\x46\x9e\x9b\x84\xed\x69\x8a\xc8\x8a\x3e\x5e\ \x2e\x57\xb0\xbb\xbb\x1d\xe2\xe5\xc1\x95\xa9\x1a\xe0\xf3\xe7\x73\ \xa1\x52\xeb\x8a\x01\x9e\x3c\x8c\x51\xa4\x93\x88\xe8\xf3\x4a\x2d\ \xf6\x65\x32\x69\x4c\x4e\x5e\x0d\x30\xe0\x57\xf5\xa0\xae\xf9\x44\ \xd3\xe9\x34\xa6\xa7\xaf\x77\xb5\xdd\x29\xe5\x80\xec\x3c\x25\x10\ \xc1\x75\x92\xa0\xd3\x88\xd6\x2b\xe7\x82\x33\x5e\xa5\x52\xc6\xce\ \xce\x96\xb4\xaa\x15\x27\x29\x06\x2c\xca\x8f\xf7\x3d\x7b\x36\x17\ \xb9\x5f\x15\xc1\x80\xf3\x3d\x9b\x15\x5d\x04\xd2\x6a\x53\x7e\xf0\ \x08\x0b\xc0\xa9\xae\x53\x53\xd7\x24\x07\x8a\xba\x5e\x65\x23\x93\ \x49\x63\x7a\xfa\xf3\xb3\x49\x88\xa3\xcc\xd1\xdf\xdf\xdf\x53\x0a\ \x10\x93\x92\x39\xb8\xb6\xf1\xb5\x5e\x2e\x97\xb0\xb5\xf5\x41\x71\ \x12\x74\xb5\x40\xe3\xe3\xce\xcd\x3d\x3d\x0b\x03\x90\xd0\xbf\x72\ \x65\x22\xa4\x00\x75\xb3\x09\xc6\xdc\x1c\xc8\x78\x6e\x12\x74\xb8\ \xb0\xa0\x83\xe3\xa6\xd3\xb7\x70\xfd\xfa\x8d\xee\x18\x50\xd1\x77\ \x3c\x5c\x2d\x40\x88\xdc\xbd\x13\xfb\x2a\x95\x0a\x36\x37\xff\x13\ \xb1\x51\x8c\x50\x77\x52\x01\x9a\x9b\xfb\x6b\xf7\x0c\x38\xe8\x67\ \x31\x31\x31\x29\x24\x34\x3a\x78\x39\x3a\xbc\x26\x12\x9d\xe4\xf3\ \x0e\x41\x87\x6b\x3f\x38\x16\xe1\xd6\xad\x5b\xb8\x71\xe3\x67\xdd\ \x31\x50\x2a\x95\xc0\x18\xc3\xce\xce\x76\xc8\x33\x82\x9c\x7c\xc1\ \x3d\x1d\x39\xb0\x4a\xe5\x5b\x97\x81\xd3\xb5\x1f\x16\xb8\xf8\xfd\ \xe9\xd3\xbf\x9c\x3e\x01\xc6\xfc\xb5\x88\xba\x94\x15\x19\x10\x37\ \xa8\xa2\x02\xe3\x2e\x12\x95\xb0\xa7\x05\xee\xe7\x42\xba\x23\x0b\ \x31\x5f\xb3\xce\xfe\xcb\xf6\xf6\x56\xa8\xc5\x05\x0b\x50\x74\x60\ \xe5\x72\x05\x1f\x3e\xfc\xfb\x93\x02\x17\x8f\x4e\x2c\xc4\xfc\x59\ \x66\x70\xf5\xea\xb5\x80\xd6\xd5\x62\xd5\xed\x6b\xd7\x4c\x26\x1d\ \x70\x90\xff\x26\x70\x91\x85\xb0\x23\x0e\x00\xef\xde\xbd\xc3\xd0\ \xd0\x00\xb6\xb7\x37\xcf\x3c\x70\x70\x3b\x85\x33\xfa\x6d\xc7\xc5\ \xd8\x59\x5f\xeb\xf2\x63\x73\x73\x33\x7c\x02\x3b\x3b\x3b\xee\x0e\ \xda\xf9\x1d\xbd\xbd\x71\x7c\xf7\xdd\xf7\xe7\x36\xde\xe6\xe6\xa6\ \xb0\x97\x2a\x23\x76\x61\xfe\xbf\x50\x97\xe7\xd7\x00\x7e\xe1\xbe\ \xb1\xef\xed\x71\x27\x71\x1b\xc0\x20\x80\x7e\xef\xcd\xf2\xc5\x3c\ \x08\x40\x1b\xc0\x2e\x80\x2d\x00\x0d\x1e\xec\xa8\x1b\x7c\xef\xff\ \xc1\x04\x6c\x00\x4d\x00\x3a\x7f\x53\xcf\xdd\xe8\x22\x07\x1e\x36\ \x11\x06\x00\x3f\x01\x23\x37\xba\x83\x98\xde\x14\xa8\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x08\x2a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x07\xa7\x49\x44\ \x41\x54\x58\x85\xbd\x97\x7d\x6c\x57\xd5\x19\xc7\x3f\xe7\x9c\x7b\ \x7f\xef\xbf\x5f\xdf\x0b\x2d\x85\x21\x2d\x2f\x62\x15\x1d\x75\x08\ \x93\xea\xc4\x0d\xdd\xdc\xe6\xb4\x18\xa2\xc6\xa8\xd9\x22\xce\xc4\ \x97\x39\x37\xe3\x16\x49\x17\x99\x9a\xa9\x43\xc0\x2c\xdb\x8c\x6f\ \x33\x11\xb3\x39\x35\xd3\x91\x4c\x0b\x0e\xcc\x86\x8a\xac\xbe\x94\ \x89\x20\x08\xd8\x96\xf2\x6b\xf9\xf5\xe5\xf7\x7a\xef\x3d\xe7\xec\ \x0f\x6c\x2d\x22\x0b\x9a\x6e\xdf\xe4\xe6\xdc\xdc\x7b\x9e\xe7\x7c\ \x9e\xe7\x3c\x79\xce\xbd\xc2\x5a\xcb\x04\x29\x02\x34\x02\x0e\xb0\ \x1b\xc8\x9d\x88\x91\x33\x51\xab\x7f\x0c\x30\xbf\xb3\x7f\xdb\x29\ \x77\xbd\x79\x6b\x63\x6f\x61\x5f\xf5\x59\x93\xce\xee\x99\x56\x36\ \xe3\xc1\x9b\xe6\xfe\xe2\xb5\xff\x07\x40\x7e\x7f\x7e\x7f\xd7\x7d\ \xdb\xda\xd7\x4e\x8e\x34\xa4\x4e\xab\x9c\xc7\xbc\xca\xb3\xc8\xea\ \xcc\x39\xc0\x94\xe3\x19\xc9\x09\x04\xf0\x16\x3f\x71\x7a\xdd\xb6\ \xee\x37\x52\xe7\xcf\x6a\xa5\x69\x6a\x2d\x19\xdb\xc3\xa3\xef\xae\ \xa9\x5f\xde\xb1\x60\xd6\xf1\x8c\x26\x32\x03\x78\xbe\x1f\x09\xdb\ \x10\x99\xd2\x61\xf2\x36\x8b\xd2\x82\x5c\xbe\x08\xfa\xf0\x71\xd7\ \xf9\xa2\x00\x31\x20\x09\x0c\x03\x85\xd1\x87\x3a\x8f\x0c\xc2\x86\ \x91\x52\x91\x11\x93\x23\xa2\x5d\xbc\x52\x80\x52\x88\x89\x06\xa8\ \x01\xe6\xbc\xde\xff\xfa\xde\x45\xbf\x5d\x30\x3b\x64\x54\x54\x59\ \x25\x1c\xa9\x16\x06\xd6\x90\xf3\x8b\x0c\x07\x79\x0c\x11\xfc\x92\ \xc1\x51\x7a\xe9\xe2\x3f\xcc\x98\x9b\x8c\x87\x6c\x2a\x9a\x18\x5e\ \x71\xf2\x7d\x9b\xcf\x9d\x7e\x6e\xf1\x84\x00\xda\xdb\xdb\x65\x3a\ \xd9\x7a\x91\x31\xba\xd9\x20\xba\xea\x72\xaf\xfe\x65\xe5\xca\x95\ \xf9\x35\x6f\xae\xa9\xba\xe7\xd5\x7b\xd6\x4b\xed\x96\x2b\x1d\xc2\ \xb1\x02\x47\x28\x94\x70\x28\xf8\x45\xf2\x41\x11\xd7\x96\x50\xc6\ \x01\xcf\xb9\x5f\x46\x15\x3a\x90\x28\xc2\xf4\x07\x3b\x07\x57\xbd\ \xf5\x68\xf3\xcf\xe6\x3d\xde\x2d\x8e\xd7\x07\xae\x59\xfd\xf7\xf2\ \xa4\x35\x37\x4b\x21\xbe\x0f\x4c\x31\xd6\x62\x2c\x04\x81\xe9\x43\ \xda\xf5\xeb\x83\x2b\xa6\xcf\xae\x9a\xf6\xdd\x45\x33\x5b\xd0\xc2\ \xc7\x28\x83\x14\x20\x80\x02\x23\x80\xc5\x95\x2e\x31\x99\x40\x09\ \x87\x88\x8c\x53\xf4\x2d\xe9\xa1\x34\xd5\x31\x4b\x1f\xef\xff\xfc\ \xb1\xd6\xd7\x56\x1d\x93\x81\x9b\xd7\x75\x9c\x2c\xac\xf3\x93\x4a\ \xc5\x32\x90\x71\x63\x46\x01\x05\x58\x8b\x14\x4c\xd2\x86\x9b\x62\ \xfe\x64\xc2\x2a\xc4\xee\xcc\x2e\x70\x40\x38\xe0\x2a\x45\xc8\x51\ \x47\x46\xe5\x22\x2c\x64\x83\x2c\x03\xf9\x0c\x3b\xd3\xbb\xd8\x3d\ \x70\x80\x7c\xde\x67\xd9\xdc\x56\x4c\xac\x30\xed\xa8\x2d\xb8\x6d\ \xdd\x96\x56\x63\xec\x9d\xae\x74\xcf\xb5\xc2\xaa\xcf\x4a\x8c\x40\ \xa3\x04\x08\x0c\x55\xa2\x91\xf7\x0e\x6c\x61\x4a\xa1\x1e\x11\x12\ \x84\xc2\x2e\xe5\xb1\x04\xbe\x52\x14\xe4\x20\x3e\x39\xa4\x80\xb8\ \x29\xc3\x37\x9a\x4a\x37\xc5\x9c\xf2\x26\x44\x99\x24\xa7\x0f\x13\ \xd2\x74\x8e\x01\x5c\xb6\x72\x43\x6b\x2a\xea\xbc\x58\x9e\x08\xa7\ \x2d\x56\x03\x0a\x60\x3c\x84\xb0\x1e\x2d\x27\xc5\x39\xad\xb1\x1a\ \x3f\xd0\x34\x7e\x70\x25\xf7\x6e\x7f\x9b\xce\xce\xb7\xc1\x07\x2c\ \x28\x29\x08\x87\x42\x2c\xbc\x60\x36\xd2\xf5\xa8\xa0\x96\xad\x6f\ \x76\x11\x8a\x38\x84\xa3\x8a\x48\xd4\x25\x12\x75\x6c\x3e\x70\x37\ \x06\x24\x9e\x18\x03\x88\x3b\xea\x91\x91\xac\xb7\xf6\xe1\xdb\xbf\ \x7e\xc7\x4d\xab\x5f\x59\xee\x3a\xe2\xa9\x4f\x47\x3f\xb5\xcc\xf2\ \xb5\x96\x69\xb8\xae\x0b\xc0\xe5\xf5\x8b\x68\x5b\xb0\x89\xcd\xff\ \xee\x62\xdb\xce\x6e\x76\x1c\xc8\xb1\x27\xf7\x4f\x3e\x2a\x3e\x83\ \x15\x9a\xa8\xeb\xe2\x5a\xd0\xda\x62\xe0\xdb\x41\x48\xbc\xa7\x85\ \xb6\x78\x3a\xbb\xe9\xaa\xfd\x7d\xa3\x7e\x1d\x80\xf2\x54\x58\x66\ \x07\xbc\x5e\x80\xc3\xc3\xa5\x9d\x95\xa9\x10\x4a\x7e\xd2\x24\x6d\ \x10\x30\xb3\x3e\x41\x38\x1c\xc6\x04\x45\x84\x70\xb1\x42\x10\x8d\ \x46\xb8\xb0\xe5\x4c\x96\x7e\x79\x3e\xe9\x4c\x96\xd5\x2f\xf5\xf1\ \xd8\x1b\x96\x52\xe0\x13\x15\x12\x25\x40\x5b\x43\x43\xff\x1d\xab\ \xc3\x3d\x27\x3d\x24\xad\x7c\xe2\xe5\x75\xdf\x1b\x18\x1f\x98\x04\ \x98\x5c\x15\x4b\x3b\x42\xae\xba\xec\xce\x17\x1f\x2d\x05\xc1\x73\ \xe9\xc1\x3c\xb9\xa2\x37\x36\x29\xa2\x0a\xcc\x99\x51\x0b\x40\xa2\ \x7f\x3b\xc9\x0f\x5f\x20\x9e\xde\x8e\x2c\x0d\x1f\x89\xc2\x71\xa8\ \xab\x49\xd1\x32\xb3\x9c\xea\x70\x88\x4c\x3e\x4b\x7f\x36\x47\x26\ \x97\xc5\x60\x01\xa7\x51\x08\xfb\x80\x95\xba\x67\xc9\x8d\x7f\x7a\ \xfa\xbc\x9b\xff\x38\xfb\x28\x80\xc1\xa1\xc2\x03\xf5\xd5\x89\xa4\ \x84\xab\x25\x4c\x33\x06\x86\xb2\x1e\x03\xc3\x05\x82\x40\xd3\x50\ \x01\x65\xa9\x24\xd6\x04\x04\xbe\x21\xd0\x02\xfa\x76\xe3\xbe\xf3\ \x0c\xea\xed\x3f\x23\x7a\xde\x45\x58\x8f\x49\xa9\x30\x55\xb1\x08\ \x3d\xe9\x21\x76\x1d\xea\x67\xc7\xfe\x34\x5a\x19\x2e\x3d\xbb\x99\ \xa9\xb5\x49\x84\x10\x21\xe0\x32\x61\xc4\x96\xf3\x6e\x7c\x76\xde\ \x18\xc0\xdd\x37\xb4\x3e\xdd\xd4\x50\xde\xad\xd4\xd1\x67\x53\xc9\ \xd3\xf4\x1d\x3a\xc4\xf4\x49\x09\x84\x10\x18\x63\x29\xa4\x9a\x28\ \xa6\x1a\xf1\x12\x0d\x04\x91\x5a\x4c\x6e\x08\xbd\x63\x13\xfe\x4b\ \xbf\xe1\xab\xa5\x10\xc4\x63\xd8\x5e\x49\xa8\xbb\x8c\xec\x80\xc7\ \xc2\xa6\xc5\xdc\x72\xf1\x12\xee\xfe\xe1\xd9\x7c\x6b\xd1\x49\x28\ \x29\x00\x6a\x84\xd0\x3f\x1e\xab\x01\x80\x7c\xc9\xfb\xdd\xcc\x29\ \xe5\xed\x7b\x7a\x07\xf1\x7c\x33\x06\x51\xe9\x66\x99\xd3\x34\xf5\ \x48\x2d\x20\x30\xd1\x4a\x6c\xbc\x1a\x13\x94\x50\xf9\x01\xc4\xf0\ \x41\xec\xf0\x00\x66\x30\x8d\xd9\xb5\x97\xa7\x6a\x97\xb2\xde\xee\ \xa7\xbf\x2c\xca\x19\x73\xbf\xc1\x95\x67\x5c\x8d\x10\x82\xba\xca\ \x38\x57\x5d\x70\x32\x5d\x7b\x07\xd8\xdb\x33\x04\x96\xc8\x51\x00\ \xc2\xf1\x7f\x55\x5b\x11\xbb\x75\xa4\xe0\xa5\x46\x72\x1e\xd9\xa2\ \x87\xef\x95\x98\x51\x1f\xa6\xac\xac\x8c\x63\x3a\x66\x28\x0a\xd1\ \x2f\x21\x6b\xa6\x43\xf6\x30\x22\xd3\x8b\x38\xd4\x4d\xf5\xc8\x00\ \xd7\xa7\xab\xd1\x87\x86\x30\xbd\xff\x62\xf8\xfd\x22\x7c\x65\x09\ \xf1\x59\xa7\x13\x0b\xbb\x38\x1f\x17\xb7\x45\xec\x18\xdb\x02\x80\ \x1f\xb5\x2d\x2c\x48\xc9\xf3\x91\x90\x43\x32\x1e\xa2\xb6\x3c\x46\ \x22\xa2\x48\xc6\xc2\x08\x71\xe4\x30\x1b\x1d\xc7\xc3\x58\x04\x24\ \xab\x71\xa6\xcf\x23\x74\xc6\x12\xa2\xa7\xb6\x12\x6d\x5e\x4c\x74\ \x4e\x0b\x4e\x55\x03\xf9\xbd\xef\xf1\xd1\xef\x7f\x49\xe9\x60\x37\ \x3d\x03\x39\xd2\x43\x79\x00\x23\x8c\x78\xe4\xa8\x0c\x00\x74\xf5\ \xa4\x6f\x6f\xaa\xa9\x5c\xbe\xef\xe0\xb0\x2b\x84\x20\x19\x8f\xd2\ \x3f\x3c\x48\x26\x93\xa1\xa2\xa2\x02\x63\xcc\x18\xc0\xe8\x35\x5e\ \x32\x1c\x45\xd6\x37\x12\x99\x36\x1b\x46\x0e\xe3\xf7\xee\x27\xbf\ \x6f\x37\x42\x29\xc2\x93\xa7\xf0\xce\xe6\x5d\x0c\x65\x4b\x20\xe8\ \xe8\x58\x77\xc9\xbe\xa3\x32\x00\xb0\xf6\x86\xf3\x7b\x3c\xdf\x3c\ \x19\x09\x1f\x69\x36\xd2\x09\x71\xd0\xab\x62\xfd\x5f\xb7\xf1\xca\ \xab\xdb\xc9\x64\x06\x8f\xc9\xc4\x28\xc4\xe8\xbd\xd6\x1a\x6d\x0c\ \xb2\xbc\x86\xf8\xa9\x0b\xa8\x5e\xda\x46\xe5\x39\x17\x91\x19\xce\ \xf3\xb7\x37\x0e\x60\x2d\x58\xc4\xc3\x63\xd0\x7c\x4a\xb7\x5d\xd1\ \x72\x2d\xd6\xfe\xd4\x58\xf6\x60\xc1\x09\xc5\x39\x64\x26\xb1\xe9\ \xfd\x80\xc7\x37\xec\xe0\x85\x57\x3a\xd9\xb3\xaf\x1b\xcf\xf3\x8e\ \x01\x30\xc6\x8c\x41\x04\x41\x40\x10\x04\x08\x37\x8c\x8a\x27\x79\ \xe7\x83\x7e\x3e\xec\x1d\x02\x18\xa8\xae\x34\xcf\x8d\xd5\xde\x7f\ \xfb\x2c\xbf\xfe\xfe\x8d\xe7\x29\xc1\x0a\x29\xb8\xc8\x5a\xa2\x16\ \xc0\x18\x08\x0a\xd4\x55\x49\x4e\x99\x5a\xc1\xa9\xb3\xea\x48\x25\ \x13\x38\xce\x27\xbb\x29\xa5\x44\x4a\x89\xe3\x38\x28\xa5\xd0\x5a\ \xf3\xeb\xa7\x3b\xe9\xd8\xde\x0d\xb0\xba\x63\x4d\xdb\x2d\x27\x04\ \x30\xaa\x15\xf7\x76\x94\x49\x61\xaf\x15\x52\x5c\x0d\xe2\x34\x8b\ \xc5\x02\x46\xfb\x84\x85\xa6\x79\x7a\x92\xf9\x73\x6a\x69\x98\x54\ \x81\xeb\xba\x08\x21\x10\x42\x20\xa5\x44\x29\xc5\xce\x7d\xfd\xac\ \x7a\xb2\x93\xc1\xac\x8f\x35\xa2\x79\xe3\xba\x4b\xbb\x3e\x17\xc0\ \x78\x5d\x77\x4f\xc7\x7c\x94\x5d\x21\x11\x6d\xd6\xda\x72\x63\xc1\ \x0b\x34\x3a\xf0\x98\x51\x1b\x65\xfe\xac\x0a\x9a\x1b\x6b\x48\x25\ \x62\x28\xa5\xf0\xfd\x80\xf5\x1b\x77\xf3\xfc\x3f\xba\x11\xd8\xad\ \x2f\xaf\x59\xb6\x70\xbc\xbf\xcf\x0d\x30\xaa\x1b\xd7\x6e\x08\xe7\ \xf3\xee\x15\x02\xae\x31\xd6\x2e\x0a\xb4\x96\x9e\x67\x30\x46\xe3\ \x8a\x80\x33\x67\x55\x52\x95\x0a\xd3\x37\xe8\xd1\xf1\x56\x3f\x25\ \xdf\x80\xe0\x07\x1d\x0f\xb6\x3d\x3c\xde\xcf\x17\x06\x18\xaf\x6b\ \xef\x7a\x69\xa6\x16\xe6\x3a\x6b\xb9\xdc\xf3\x83\xba\x6c\xde\xa7\ \x50\x0a\x90\x02\xcc\x27\xee\xb3\x46\xdb\xba\x4d\x0f\x2d\xcb\x4e\ \x38\xc0\xa8\xda\xdb\xdb\xe5\x2e\xbb\xe0\x3b\x05\xaf\x74\xcd\x60\ \xd6\xbf\x10\x70\x3f\x7e\xe5\x61\xb9\xb8\x63\x6d\xdb\x86\x4f\xdb\ \x4c\x28\xc0\x78\x2d\xbd\xfe\xd9\xda\xc0\x0d\xbe\x29\x2c\x4a\x0b\ \xd5\xb5\x69\xcd\x25\x5b\x3f\x6b\xde\xff\x0c\xe0\x44\x35\x91\xff\ \x86\x5f\x48\xff\x01\x1f\xdd\x84\xbd\x3a\xee\x0e\x80\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x09\x79\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x08\xf6\x49\x44\ \x41\x54\x78\xda\xb5\x57\x69\x4c\x54\x59\x16\x26\x93\xd1\x38\x31\ \x33\x13\x8d\x3f\x7a\x64\xda\xad\xd1\xc4\x2d\x71\x9f\xb8\xc7\x4e\ \x70\x46\xe3\xda\xe3\xbe\xef\x0b\xe0\x20\x3a\x82\x82\xb8\x83\x0a\ \x8e\x82\x2c\x02\x8a\xd8\x0a\xb4\x82\xdd\xb4\xe0\x82\x8a\x28\xa0\ \xa0\x80\x20\xc8\x2e\xc8\x5a\x2c\xc5\x52\xc5\x0e\x42\xbd\x6f\xce\ \xf7\x92\x4a\x64\x2c\xdb\xce\x4c\xe6\x25\x5f\xea\xd5\x7b\xf7\xde\ \xf3\xdd\x73\xbe\x73\xce\x7d\x66\x00\xfe\xef\x38\x76\xec\x98\xef\ \xf6\xed\xdb\x3b\x0f\x1c\x38\xd0\x71\xfe\xfc\xf9\x5a\x6f\x6f\x6f\ \x2b\xe3\xbb\xff\x6a\xc1\xa9\x53\xa7\x9a\x0b\x2c\x05\xb3\x04\x7f\ \xf8\xa5\xb1\x87\x0e\x1d\xda\xb8\x7a\xf5\xea\x4e\x7f\x7f\xff\x65\ \xfc\x3f\x7c\xf8\xf0\xbf\x9e\x3d\x7b\xb6\x71\xc7\x8e\x1d\x5e\xbf\ \x9a\xc0\x8c\x19\x33\x16\xd8\xd9\xd9\xa5\xba\xb8\xb8\x74\x9c\x3e\ \x7d\x1a\xbe\xbe\xbe\xb8\x7e\xfd\xba\xfa\x7b\xf1\xe2\x45\x1c\x3f\ \x7e\x5c\xb1\xb7\xb7\xaf\xd9\xb0\x61\xc3\x35\x92\xfb\x78\xee\xd2\ \xa5\x4b\xb3\x9e\x3e\x7b\x66\xc8\xcd\xcd\x8d\x36\x3e\x33\x37\x37\ \xff\xcb\xce\x9d\x3b\xbb\xbe\x48\x60\xd3\xa6\x4d\xcb\xc5\x7d\x4d\ \x87\x0f\x1f\x46\x48\x48\x08\x52\x53\x53\x51\x59\x51\x89\xe2\xf7\ \xc5\xc8\xcd\xce\x45\x41\x7e\x01\xca\x4a\xcb\x50\xa7\xad\x43\xa5\ \xa6\x12\xc9\xc9\xc9\xb8\x70\xe1\x82\x32\x6f\xde\xbc\x58\x21\x32\ \x80\x6b\xf8\xf8\xfa\xb6\x89\xdb\x91\xf3\xf6\x2d\xa2\x22\x22\x34\ \xc6\xb5\x47\x8e\x1c\xd9\xb0\x7b\xf7\xee\x6f\x3e\xe7\xe2\xdf\x88\ \x8b\xd2\xf6\xee\xdd\x8b\xf0\xf0\x70\x54\x94\x55\x20\xed\x75\x1a\ \x5e\xbc\x78\x81\xb8\xb8\x38\x44\x47\x47\xe3\x72\x40\x00\xae\x06\ \x06\x22\x22\x22\x02\xcf\x9e\x3d\x43\x42\x7c\x02\xb2\xde\x66\xa1\ \x51\xdf\x88\x77\x05\xef\xe0\xec\xec\x6c\x98\x3e\x7d\xba\x8d\xcc\ \xd7\xa6\xbe\x7a\x85\xd2\xc2\x42\x34\xd4\xd6\xe2\xcd\x9b\x37\x57\ \xc6\x8d\x1b\x37\x66\xe8\xd0\xa1\x06\xda\x32\x65\xfc\x6b\x2b\x2b\ \xab\x66\x07\x07\x07\xe4\xe5\xe6\x21\x3f\x2f\x5f\x35\xe0\x21\x3b\ \x73\x76\x72\x32\x38\xd8\xdb\x2b\xa7\x4f\x9d\xc2\x19\x17\x17\xb8\ \x9e\x3c\x89\xa3\xce\xce\xb0\xb6\xb2\x52\x76\x6e\xdf\xde\xcd\x77\ \xf1\xf1\xf1\x28\x29\x29\x41\x6b\x73\x2b\xee\xdd\xbb\x07\x17\x19\ \xfb\x36\x2d\x0d\x35\x95\x95\xd0\xe9\x74\x38\xef\x76\x5e\x99\x34\ \x69\xd2\x87\xd1\xa3\x47\x3f\xfc\x84\xc0\xe4\xc9\x93\xfb\xac\x5f\ \xbf\xbe\xcd\xd5\xd5\x15\xba\x7a\x1d\x5e\x09\xf3\xb0\xb0\x30\xfc\ \xeb\xec\x59\xe5\x46\x50\x10\x7e\xbc\x75\x0b\xbe\x12\xf3\xe8\xbb\ \x77\x55\xdc\xfd\xf9\x67\x44\xdc\xbe\x0d\xf7\x33\x67\xe0\x2f\x7a\ \x70\x13\x7d\xec\xd8\xb6\xcd\xb0\x67\xcf\x1e\xa4\x89\x51\xbd\x4e\ \x8f\xd8\x27\xb1\xb0\xb1\xb6\xc6\xd6\x2d\x5b\x1b\x9d\x9d\x9c\xbb\ \x17\x2c\x58\xa0\xf7\xf2\xf2\x0a\x30\x99\x05\x6b\xd7\xae\xd5\x1c\ \x39\x72\x84\x31\x55\xdd\xed\xed\xe5\x65\xa0\x81\xe7\x4f\x9f\x22\ \xf9\xe1\x43\x14\xe6\xe6\x22\x27\x23\x03\x55\x65\x65\xa8\x2a\x2f\ \x47\x85\xec\xb4\x28\x3f\x1f\x2f\x65\x6c\x62\x42\x02\xee\x47\x45\ \x21\xf8\xfb\xef\xe1\x7a\xea\x94\xf2\xf7\xa5\x4b\x15\x71\xb7\x4a\ \xe2\x61\xf4\x43\x4c\x99\x32\xe5\x9f\x1f\xdb\xfa\x84\xc0\xfc\xf9\ \xf3\x7d\x45\xc5\xc8\xce\xca\x56\xc5\xe4\xe7\xe3\x63\x88\x90\xf8\ \xbf\x17\x03\x35\x15\x15\xd0\x14\x17\xa3\x48\x88\xd4\x68\x34\x9f\ \x45\xd9\xfb\xf7\x48\x93\xb9\x24\xc2\x30\xc9\x9a\x4a\xbe\xcc\x6f\ \xa8\x6f\x40\x64\x64\xa4\x22\xe1\xfd\x93\x49\x02\xe3\xc7\x8f\xff\ \xad\xe4\x6a\x37\x05\x95\x9e\x96\x0e\x5f\x1f\x1f\x25\x2f\x2b\x0b\ \x85\x79\x79\x88\x7b\xf2\x44\x5d\x58\x2b\x31\xcc\xfc\xe1\x07\x68\ \xc5\x10\xef\x3f\x87\xdb\x12\xa6\x78\x21\x1a\x17\x1b\x8b\xc0\x80\ \x00\x65\xf6\xec\xd9\x28\x29\x2e\x41\x6d\x4d\x2d\x24\x9b\x92\x4d\ \x12\x10\xa6\x11\xfb\xf6\xed\x43\xc6\x9b\x0c\xdc\xba\x79\x13\xe9\ \xa9\xa9\x4a\x6d\x55\x15\x88\xb4\x94\x14\x92\x50\xef\x4b\x33\x33\ \x91\x1d\x12\xc2\x7b\x93\xf8\x49\x3c\x56\x22\x6a\xbf\x1f\x19\xa9\ \x92\x49\x49\x4a\x82\xa3\x83\x83\xc1\xd1\xd1\x11\x55\xf2\x9e\xe9\ \x2b\x5e\xf8\xe6\x13\x02\x2b\x56\xac\x68\x0f\x0d\x0d\xc5\xd3\xd8\ \xa7\x08\xbf\x79\xb3\xbb\xae\xba\x1a\xa6\x40\x23\x49\xc7\x8e\xa1\ \x56\xa3\x31\xf9\x3e\x5d\xc8\xde\x14\x2f\xe5\x65\x67\xa3\xae\xa6\ \x46\x45\xca\xcb\x97\x98\x6b\x69\xa9\x54\x0a\xa1\xd6\x96\x56\x48\ \x5d\xf9\xa9\x07\x81\x31\x63\xc6\x7c\xbd\x78\xf1\x62\x24\xc4\x25\ \x20\xec\x56\x18\x0a\x72\x72\x50\x2f\x13\x09\x0a\x2d\x5f\x76\xcd\ \x70\x68\x44\x78\x7c\x96\x17\x13\x83\x74\xc9\x04\xde\xab\xd0\x6a\ \xa1\x15\x62\x51\x77\xee\xa0\xa2\xb4\x54\xfd\x5f\x2d\x04\x0b\x0b\ \x0a\x50\x2b\xa4\xf8\xce\xd3\xc3\xa3\x8b\x15\x54\xd7\xa0\x63\x4a\ \x37\xf4\x20\x30\x6d\xda\x34\x0f\xa6\x4d\xcc\xa3\x18\x04\x06\x06\ \xd2\xfd\x48\x12\x45\x53\x54\x39\x62\xbc\x4a\x74\x50\x27\xec\x49\ \x86\x1e\xe0\xae\x62\xd6\xae\x45\x9d\xbc\x67\x61\x29\x97\x4c\x08\ \xf0\xf7\xc7\x8b\x04\x6e\xe0\x16\x7c\xbc\xbd\x21\x25\x1b\xa7\x44\ \x84\x34\x7a\xd1\xd3\x13\x97\x7c\x7d\x95\x85\x0b\x17\x42\x4b\x72\ \x55\xd5\xe8\x41\x80\x65\xf3\xa4\x14\x94\xa8\xc8\x28\xb5\xd8\xe8\ \x64\x51\x23\x32\xd3\xd3\xa1\x91\x5d\xbd\x12\x71\x56\x4b\x26\xd4\ \xca\x64\x5d\x5d\x1d\xd2\xaf\x5d\xc3\x03\x3b\x3b\xbc\x4a\x4c\x84\ \xab\x18\x0b\xba\x7a\x15\x47\x8f\x1e\x25\x58\x01\xe1\xe4\xe4\x04\ \xe3\xaf\xf1\x39\xd3\x9b\x22\x6f\xd2\x37\x41\x7a\x4b\x7f\x33\x33\ \xb3\xd1\x52\x0d\x6d\xcc\x2c\x2d\x2d\xf3\xa4\x7e\x23\x3c\x2c\x1c\ \xd7\x02\x03\xbb\xf5\x62\x40\x45\x7d\x3d\x4a\x8a\x8a\xd0\xa0\xd5\ \x1a\xdd\xcc\x67\x04\xd5\x0d\xaf\xde\xbd\xb1\xeb\xdb\x6f\x71\xe2\ \xc4\x09\xd5\xd0\xc1\x83\x07\xd5\x7e\xf1\xfc\xf9\x73\x30\xff\xdf\ \x4a\xed\xe7\x2f\xff\xb3\x69\xf1\x3d\xc7\xb1\x2f\x1c\x76\x72\xd2\ \x0a\x01\xf4\xeb\xd7\x2f\x95\x04\x8a\xce\x9d\x3b\x87\xe0\xe0\x60\ \x5c\x09\x08\xe8\x6e\x6c\x68\xc0\x47\xa0\x61\xee\xba\xc7\x33\xe9\ \x7c\x38\x6d\x6e\x0e\x7b\x5b\x5b\xde\xd3\xd5\x6a\xed\x28\x15\x6f\ \xd5\x50\x7c\x32\xbe\x41\xc6\xd5\x0b\xd9\x6a\xd1\x01\x4b\x73\xa2\ \x78\x8b\x4d\x8d\x25\xde\xd6\xd6\xb6\xa3\x57\xaf\x5e\x85\x7d\xfa\ \xf4\x89\x35\x9b\x39\x73\x66\xb2\xb4\x53\x04\x05\x05\x71\x80\xd2\ \x28\xf5\xba\xe9\x17\x10\x2f\x7d\xe1\x84\x8c\x3f\x22\x2e\xde\xbf\ \x7f\x3f\x58\xb6\xb3\x45\xf5\x8c\x6f\x63\x63\xa3\x4a\xa0\xb3\xb3\ \x13\x5d\x5d\x5d\xf8\xf0\xe1\x03\xda\xdb\xdb\xd1\xd4\xd4\xa4\x12\ \x29\x10\x61\x92\x00\xe7\x49\x27\x3c\xd9\xbf\x7f\xff\xbf\x99\x8d\ \x1d\x3b\x36\x54\x7a\x33\x2e\x5f\xbe\x8c\xfd\x52\x0b\xf2\x24\x0b\ \x5e\xcb\x6e\xe8\xf6\x66\xbd\xfe\x13\x14\x4b\x58\x28\x38\x76\x4a\ \x39\x23\x20\x5d\x74\x52\x2b\x7a\x69\x69\x69\x51\x0d\xca\x69\x47\ \xed\x03\x8a\xa2\x80\x17\x7f\xbb\xbb\xbb\xd1\xd6\xd6\xc6\x71\xf4\ \x14\xe7\x12\x1d\x02\x0b\xb3\x11\x23\x46\x8c\x9f\x3b\x77\x2e\xfc\ \x2e\xf9\xa9\xea\x7d\x27\xa5\xb3\x59\x76\xd2\x62\x0a\xb2\x13\x22\ \xf0\xca\x15\xd8\xd8\xd8\x80\xb5\x83\x05\xa6\xb9\xb9\x99\x3b\x56\ \x8d\xb9\xb9\xb9\x81\x85\x87\x44\x18\x0a\xe3\x45\x12\xad\xad\xad\ \xea\x78\x0f\x0f\x0f\xce\x27\xac\xd5\x54\x18\x3c\x78\x70\x97\x8f\ \xb7\x0f\x3c\x3d\x3d\xd9\xe3\x0d\x46\x43\xad\xb2\xb0\x29\x50\xd1\ \xbb\x76\xed\x02\x5b\x2f\x8d\x74\x74\x74\xc0\x60\x30\x80\x17\xdf\ \x59\x4b\xf7\x5b\xb7\x6e\x1d\x36\x6e\xdc\x88\xc7\x8f\x1f\x1b\xbd\ \xa1\x92\xd4\xeb\xf5\x7c\xc6\xf9\x44\x90\x4a\x40\xd2\x21\x43\x26\ \x49\x1a\x7a\x80\x0d\xa9\x58\x6a\x7f\xab\xb8\x94\xd0\x8b\x98\x32\ \xa5\x03\xb6\xc9\x3d\xa1\x13\x61\xc9\x61\x45\x35\x92\x94\x94\xc4\ \x1d\x91\x80\xd1\x08\xe3\x4b\xe3\x6c\x44\xa0\x67\xa5\xfd\x82\x69\ \x4e\xf7\x93\x24\x43\x55\x2c\x8d\x8d\x6b\xc8\x41\x35\x93\x04\x78\ \x50\xfc\xb3\xb4\x4b\xe5\x9c\xfb\x39\x30\x23\xa4\x34\x2b\x2d\xb2\ \xd3\x36\x71\x19\x63\xfc\x5a\x8a\x53\xbb\xdc\x13\xef\x45\x03\x5b\ \xb6\x6c\xa1\x92\x79\x44\xa3\xf8\xd4\xd8\x1b\x2f\xc9\x71\x8c\x1a\ \x35\x0a\x03\x07\x0e\x84\x78\x16\x13\x27\x4e\x24\x19\x66\x0a\xc7\ \xa9\x5a\xd0\x68\x34\x24\xc0\x75\x9a\x48\x40\xc5\x90\x21\x43\x52\ \x36\x6f\xde\x0c\x77\x37\x77\xd5\x3d\x21\xc1\xc1\x06\x1a\x68\x14\ \x97\x75\xc8\x24\x23\x18\x82\x6d\xdb\xb6\x71\x01\x23\x01\x55\xf5\ \xc6\x4b\x36\x82\x41\x83\x06\xa1\x6f\xdf\xbe\xf8\xea\xab\xaf\x20\ \xa7\x1f\xdc\xb8\x71\x83\x1a\xa0\x97\x54\x02\x45\xb2\x09\x39\x6f\ \x12\x89\x46\x02\x14\x63\x6f\x39\x26\xb5\x3b\x1e\x72\x54\x43\xb1\ \x75\xeb\x56\xf8\xc8\x99\xa0\x59\xb4\xd0\x21\xa9\xd4\x29\x20\x18\ \x06\xa6\x20\xe3\xcb\xa3\x1a\x9b\x0c\x17\x35\x86\x80\xed\x57\xd6\ \x81\x84\x15\x8b\x16\x2d\x02\xcf\x03\xc6\x8b\x21\xa0\x60\x1f\x3c\ \x78\xc0\x50\x13\x5e\x3d\x7a\xb3\x85\x85\xc5\x98\x59\xb3\x66\xf1\ \x88\x4d\xe3\x6a\x9c\xe5\x58\xad\x48\xfe\x2a\x9d\x12\xe7\x0f\xb2\ \xd3\x0c\xa9\x6e\x4c\x59\x39\x3d\xf1\x48\xce\x78\x32\xff\xd5\x1d\ \xf2\x62\xcd\x9f\x33\x67\x0e\xfc\xfc\xfc\x7a\x84\xc6\x28\x42\x16\ \x28\xf9\x2e\xe0\x7c\x62\x23\x0d\xf7\xc0\xb0\x61\xc3\x96\x4b\x75\ \x34\xec\xb3\xdb\x07\x96\x68\x6a\x62\xc9\x92\x25\x4c\x1d\x43\x4a\ \x4a\x8a\x81\x04\x72\xa4\xf0\xac\x59\xb3\x86\x3b\x60\x85\x63\x91\ \xa1\x17\x48\x42\x4d\xc1\x42\x39\x13\xfc\xe7\xc5\x77\xdc\x7d\x82\ \xd4\x10\xce\x95\x03\x90\x56\x30\xc0\xe4\xb1\xdc\x42\x2e\xd9\x45\ \xfb\xee\x5d\xbb\x21\x5f\x36\xd2\xed\x02\x48\x80\xc5\x83\x0a\xa7\ \x46\x98\xc3\xca\xaa\x55\xab\x28\x46\x56\x38\xaa\x9c\x79\xce\xca\ \x47\x57\x33\x24\x04\xef\xb9\x73\xd5\x78\x79\x79\x39\x95\x0f\x99\ \x47\x7c\xf7\xa5\x0f\x13\x7e\x3c\xdc\x11\xa1\x28\xb6\xff\xb0\x95\ \x2a\xb9\x9f\x4a\x56\xdd\x2f\x9f\x59\x24\xa4\xea\x60\xe5\xca\x95\ \x90\x63\x3c\x2b\x1c\x53\x92\x79\xce\x54\xa3\x47\x08\x1a\xa6\xdb\ \xb9\x73\x8a\x97\xe3\x89\xd0\x5f\xfb\x6d\xc8\x14\xfd\x9d\x1c\xd7\ \xef\x0a\xf3\x36\xe6\xb8\x83\xbd\x03\x28\x54\xe7\xc3\x6a\xbb\xa5\ \x92\x99\xb6\xaa\x5b\xdd\xdd\xdd\xf1\xe8\xd1\x23\xea\x82\xa9\xa6\ \xaa\xfd\xfe\xfd\xfb\x24\x4e\xa3\x1c\x47\x84\x0a\xfe\x68\x9a\xc0\ \x97\xc9\xfc\x7e\xc2\x84\x09\x9b\x45\x68\x97\x24\xfe\x31\x92\x29\ \x3f\xca\xaf\xeb\xb2\x65\xcb\x02\x64\xd1\x0e\x01\x08\x1a\x93\xef\ \x0b\xde\x7f\x0c\xad\xe0\xbb\xcf\x1c\xcb\xff\x77\x2c\x5f\xbe\xdc\ \x42\x60\x2d\x08\x12\x64\x0a\x9a\x04\x89\x02\x2f\xc1\x26\xc1\x00\ \x53\xf3\xfe\x0d\xad\xa6\xaf\x8a\xc2\xcf\x00\xd9\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\xdb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x04\x00\x00\x00\xd9\x73\xb2\x7f\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x01\x0a\x69\x43\x43\x50\x50\x68\x6f\ \x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ \x6c\x65\x00\x00\x78\xda\xad\xd0\x3d\x4a\x03\x41\x00\xc5\xf1\xff\ \x44\xd4\x46\xd4\x22\x58\x4f\xa9\x85\x0b\xc6\x6a\xcb\xcd\x87\x8b\ \x60\x9a\xcd\x16\xd9\x74\x9b\xd9\x21\x59\x92\xdd\x1d\x66\xc6\x98\ \xdc\xc1\x43\x78\x04\x8f\xe0\x0d\x52\x08\x5e\x44\xb0\xb6\x08\x12\ \x2c\x05\x7f\xd5\xe3\x35\x0f\x1e\x88\xd7\xa8\xdf\x1d\xb4\xce\xa1\ \xaa\xbd\x8d\x93\x28\x1b\x67\x13\x79\xbc\xe5\x88\x03\x00\xc8\x95\ \x33\xc3\xd1\x5d\x0a\x50\x37\xb5\xe6\x37\x01\x5f\x1f\x08\x80\xf7\ \xeb\xa8\xdf\x1d\xf0\x37\x87\xca\x58\x0f\xbc\x01\x0f\x85\x76\x0a\ \xc4\x09\x50\x3e\x79\xe3\x41\xac\x81\xf6\x74\x61\x3c\x88\x67\xa0\ \xbd\x48\x93\x1e\x88\x17\xe0\xd4\xeb\xb5\x07\xe8\x35\x66\x63\xcb\ \xd9\xdc\xcb\x4b\x75\x25\x6f\xc2\x30\x94\x51\xd1\x4c\xb5\x1c\x6d\ \x9c\xd7\x95\x93\xf7\xb5\x6a\xac\x69\x6c\xee\x75\x11\xc8\x68\xb9\ \x94\x49\x39\x9b\x7b\x27\x13\xed\xb4\x5d\xe9\x22\x60\xb7\x0d\xc0\ \x59\x6c\xf3\x8d\x8c\xf3\xaa\xca\x65\x27\xe8\xf0\xef\xc6\xd9\x44\ \xee\xd2\x67\x8a\x00\xc4\xc5\x76\xdf\xed\xa9\x47\xbb\xfa\xf9\xb9\ \x75\x0b\xdf\xbf\x06\x40\x2a\xe2\x79\x76\x40\x00\x00\x00\x20\x63\ \x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\ \x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\ \x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x03\x4b\x49\x44\x41\x54\x78\ \xda\x94\xd5\xcb\x8b\x1c\x55\x14\x06\xf0\x5f\x75\x55\xbf\x3b\x63\ \xcc\xe4\xa1\x24\x62\x34\x1a\x42\xc4\x07\x18\x22\x2e\x5d\xb9\xf1\ \x11\x04\x15\x57\x82\x20\xb8\x10\x51\xff\x8d\x20\x64\xe7\x26\x82\ \x64\x20\x59\x04\x8d\xd1\x8d\x3b\x5d\x89\x1a\x08\x26\x8a\x12\x13\ \x0c\xe6\x65\x42\x1e\x93\x74\x92\x9e\x99\x9a\xae\xba\x2e\xaa\xba\ \xab\x27\x3d\x2e\x3c\x0d\xc5\xbd\xa7\xea\x7e\xe7\x9c\xef\x7c\xf7\ \x74\x14\x54\xb6\x7b\x97\x1e\xfe\xfc\xf9\x92\x55\x6d\x77\xcf\x2e\ \x22\x3f\x7d\x5f\xf9\xa2\x80\xa3\xf7\x87\x9d\x91\x60\xfe\xf3\xf0\ \x18\xf1\xde\x35\x47\x22\xe4\x21\x12\x14\x01\x42\x80\xc5\xed\xe9\ \x01\x22\xdd\xdd\x01\xb5\x4b\x6f\x5c\x2c\x01\x8e\x7c\x76\xf2\x1d\ \x62\x2f\xda\x80\x1f\x9d\x12\xa9\x32\xab\xd6\xeb\xbc\x24\x92\xfa\ \xd2\x12\x76\x9c\x79\xf3\x71\x12\xe8\x3d\xb5\x56\xa4\xe1\x0b\x33\ \xb8\x66\xab\x20\x2a\x22\x97\x00\xc5\xee\x1f\x87\x40\x62\xad\xc8\ \xcc\x43\x65\x09\xaf\xae\x7f\xf7\xec\x7c\x2f\x35\x54\x2b\xa3\xe5\ \x9a\xe2\x71\x7c\xe3\x0c\x62\x35\x90\xc9\xb1\x25\xec\xdb\x78\xf4\ \x5a\x42\x63\xbf\xde\x3a\xe7\x3c\xed\xa2\x65\xf7\xe9\x7b\xd4\x29\ \xb3\x08\x25\xe0\xe8\x39\x82\x2a\xf6\xdd\xa8\xb1\xdf\x9e\x84\x7c\ \x7b\x4d\xdd\x7a\xb7\x6c\x95\x39\x6e\xc9\x83\xa8\xdf\xd3\x81\x30\ \xe6\x62\x04\x97\xc8\xb7\x93\x10\xea\x01\xf3\x5a\x4e\xc8\x3d\xec\ \xb4\x0b\x9a\x13\x2c\x14\x1c\x4c\x66\x31\x7a\x13\xea\x25\x89\xc1\ \x66\x9b\xb1\x0d\x3c\x32\xc5\xfe\xea\x3d\x29\xe0\x92\x62\xb1\xd3\ \xff\xb5\xdc\x05\xa1\x00\x88\xca\x94\x2a\x3b\xe3\x8a\x96\x67\x57\ \xf8\xfe\x72\x59\xd0\xf5\xcc\x98\x93\x50\xb6\x74\xbc\x2c\xec\x07\ \x73\x8e\x63\x93\xaf\x27\xbc\x77\xbc\xef\x3a\xb6\x39\x58\xc6\xcf\ \xe5\x23\x80\xc9\xf8\xbf\xfa\x68\xd5\x84\x3f\x75\x5d\x43\x3a\xd1\ \x93\xbc\x24\xb3\xb6\xf2\xc3\x1d\xb6\xf8\xd0\x73\x63\xc9\x14\xf6\ \x87\x6f\x3c\xe0\x79\x49\x41\x99\x5c\xb0\x2c\xa3\x00\x98\x2c\xa0\ \xee\xb0\xb7\xb4\x25\x13\x3a\x08\xf6\x49\xbc\x2d\xd6\x54\x2f\xab\ \x1f\x1a\x1a\x0a\xd3\x19\x14\x8e\x44\xbd\x8c\x05\x47\xfd\x6d\x9b\ \x57\xd0\x28\x01\x72\x43\x4b\x55\x06\xd1\x54\xc5\xf1\x38\x59\x6e\ \x38\xa4\xe1\x03\x89\x86\x86\x86\x5c\x2e\xb5\x64\xb1\x64\xa4\x56\ \x29\xab\xb2\x64\x02\xe0\xa0\x65\x33\xbe\xb5\xd7\x39\x89\x1b\x3e\ \x71\xc5\xb2\x45\x03\x69\x25\xa4\x30\x55\x46\x55\xc2\xbc\xba\xd4\ \xb1\x12\x38\x75\xcc\xcb\x6a\x06\x6e\x5b\x1a\xb5\x71\xba\x88\x9a\ \xda\x98\x9c\xd7\xbc\x50\xde\x86\xaf\x9c\x37\x6b\x8f\x96\x81\xbe\ \x9b\xd6\x54\x4a\x0c\x53\x1c\x54\x6d\x7c\xa2\xec\x44\xe6\x3b\xe7\ \xb5\x3c\x69\xe0\x96\x9b\xda\x9a\x95\x12\xa7\x3b\xb1\x52\x07\xb9\ \x20\xc8\x11\xdc\xd5\x77\x53\x5d\x47\x67\x35\x25\x16\xf6\x71\x29\ \xd3\xa2\xe7\xa1\x94\xcd\x7b\x06\x16\xcd\xbb\x25\xd1\xd5\xd5\xd3\ \x88\x48\xa8\x4d\x41\xc4\xe2\xf1\xd1\x60\x28\x33\xb4\x64\xc1\xc0\ \x6d\x7d\x6d\x6d\x5d\x5d\x6d\xb3\x09\x09\x2d\xca\x88\x11\xf2\xf1\ \xe8\x0a\x72\x79\x79\x38\xb5\xe8\xae\x3b\x16\x75\xb5\x75\x74\x74\ \xb1\x29\x26\xa1\x23\x18\x30\x1e\xa3\xa1\xac\x39\x93\xc9\xa4\x96\ \xa5\x16\xf4\xf5\xe5\x62\x0b\xea\x7a\x3a\xfa\xba\xb2\x9c\x84\x9e\ \xcb\xce\x8a\xd5\xc5\xf2\xf2\xaa\x66\xb2\xf1\xa5\xcd\xe4\x32\xb1\ \x59\x91\x04\x2d\x4d\x0d\x0d\xd7\xdd\x49\x49\xd8\xd4\xbc\xec\x6a\ \xe9\x2c\x7e\x99\xb8\x3c\x56\x93\xab\xc9\xc5\x86\x18\x4a\x65\x52\ \x2d\x6d\xc1\xef\x36\x34\x49\x58\xd3\x4c\x5d\x58\x31\xf1\xa2\xa9\ \x19\x3c\x3d\xd4\x23\x57\xad\x2d\x00\x4e\x9e\x7e\x7d\x63\x3e\x9e\ \xbe\xf7\x0e\xf2\x68\x62\x5f\xa9\x36\x88\x6c\x76\xf8\x34\x09\xbf\ \xcc\x9d\xd8\x11\x3a\xab\x8f\xce\x68\x15\x99\x8d\xe0\x6a\x83\x30\ \x47\x42\x7e\xc0\x6f\x61\xbd\xff\x18\xdc\x2b\xff\x9d\x26\xbf\x08\ \xd7\x1c\xe7\xdf\x01\x00\x5f\x88\x4b\x27\x67\x8d\x3a\x74\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0a\xc0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x0a\x77\x49\x44\x41\x54\x68\xde\xed\x59\x6b\x6c\x1c\xd5\ \x15\x3e\x77\x1e\xbb\x33\xb3\x6b\xaf\xbd\x7e\xc4\xde\xb5\x63\xc7\ \xc1\xd4\x5e\x3f\x28\x49\x70\x02\x09\x11\x24\x10\x5a\x89\x48\xfd\ \x01\x42\x94\x1f\x08\x95\x00\x85\x06\x12\xd2\x38\xe1\xd1\x90\x40\ \x48\x42\x48\x82\x52\x55\x20\x95\xb4\x7f\x68\x08\xb4\xfc\x40\x8a\ \xa2\xf2\x03\x21\x5a\xd5\xf8\x19\xfc\xb6\xe3\xd8\xf8\x19\xbf\xe2\ \x5d\xaf\xed\xdd\x9d\x9d\xd9\x9d\x99\xdb\x33\xe3\x47\xf3\x30\x45\ \x14\xdb\xa1\x52\x8e\xf6\x7a\x6c\xef\xce\xee\x77\xbe\x73\xce\x77\ \xcf\xb9\x0b\x70\xd3\x6e\xda\x4d\xbb\x69\x37\xd2\xc8\x52\x7f\xa0\ \x7f\xfb\x33\x0c\x7f\xdf\x03\xb7\xfe\xa9\xa9\x39\xb7\xb9\xbb\x07\ \x74\x5d\x07\x9b\xcd\x36\x89\x4f\xd5\x9c\x3a\x75\x4a\xff\xbe\xef\ \xc7\x2d\xb5\x03\x94\x42\x91\xd1\xdb\x7d\x62\x55\x6e\x6e\x59\x38\ \x16\x07\xca\x71\x84\x61\x98\xe0\xd0\xd0\xd0\xb3\xdb\xb6\x6d\xfb\ \xec\xfd\xf7\xdf\xff\x5e\x4e\xb0\x4b\x05\xfc\xd2\xa6\x0d\x64\xcf\ \x96\xfb\x4a\x89\xdd\xfe\xa1\x3e\x3a\xb2\x36\x5d\x8b\xdb\x97\x79\ \xbd\xbc\x2c\x39\x6c\xc9\xa9\xa9\x49\x18\x85\xcd\xb1\x58\x4c\x5e\ \xb7\x6e\xdd\xf9\xaa\xaa\x2a\xfa\xa3\x73\xa0\x7c\xf3\xa6\x52\x22\ \x8a\xef\x18\xb2\x5c\x46\x55\x95\xd0\x89\x09\xe2\x52\x15\x00\xa7\ \x53\x1f\x33\x28\x71\x24\x26\x3a\x79\x9e\x5f\xe7\xf7\xfb\x7b\xee\ \xb8\xe3\x8e\x8e\xda\xda\x5a\xe3\x47\xe1\x40\xff\xd6\x9f\x31\xbb\ \xef\x5c\x5b\x0c\x82\xf0\xa1\x21\x47\xcb\x0c\x45\x21\x14\xf3\x9e\ \xc6\xe3\x60\x04\x83\x24\x39\x1c\x06\x7b\x4a\x4a\x7c\xcc\x66\x63\ \x9d\x4e\xa7\x24\x08\xc2\x3d\xaa\xaa\x1a\x6b\xd6\xac\xa9\xad\xae\ \xae\xfe\x4e\x27\x98\xc5\x76\x80\x4d\x4a\x2e\x00\x51\x7c\x5b\x8f\ \x44\x8a\x0c\x25\x4a\xa8\xa6\x81\x61\x82\x9f\x59\xc0\xb2\xf1\xfc\ \xf5\x1b\x68\x7e\x7e\xbe\x86\x46\xdd\x6e\x77\xaa\xc7\xe3\xd9\x4b\ \x29\x7d\x64\xef\xde\xbd\xec\x0d\x8b\x40\xf7\x03\xf7\x31\xbb\xca\ \xd6\x14\x12\x41\xfc\xc4\x90\x23\x6b\x0d\x33\x6d\x34\x64\x1e\x97\ \x61\x5e\x75\x83\x32\x1e\x8f\xea\xd8\xf1\x22\x70\x39\x39\x42\x7a\ \x7a\x3a\x96\x87\x5d\x1f\x1e\x1e\x66\x1c\x0e\x87\x88\xb6\x39\x14\ \x0a\xb1\x18\x89\x1a\x8c\x84\xb6\xe4\x0e\xec\x5c\x7d\x7b\x11\x91\ \xa4\xe3\x46\xc4\x04\x1f\x9b\x4e\x9b\xb9\xa5\x01\xe3\xf1\xaa\xd2\ \xe3\x4f\x50\x6e\x45\x9e\x40\xd0\x4c\x49\x4f\x4a\x4a\x62\xb0\x90\ \xb5\x40\x20\x60\x3a\x21\x60\x4d\xac\x9a\x9a\x9a\x1a\xc1\xc2\x6e\ \xc7\xc2\xd6\x96\x44\x46\x2f\x94\xad\x26\xb6\xec\xec\x62\x14\xf7\ \xd3\xda\xd4\x54\x31\x8d\xc5\x88\xa9\x9d\x60\x18\x40\x71\xe1\xef\ \x06\x9b\xe9\x89\x25\xbc\xb8\x1b\xd8\xcc\x4c\xc1\x04\x4e\xa9\x25\ \x3a\xa6\x9c\x92\x22\x3b\xaf\xf1\xdf\x74\xc6\xdb\xbd\xd9\x62\x72\ \x72\x72\x12\xc7\x71\x87\x83\xc1\xe0\x37\xf8\xfc\x97\x4b\xe2\x00\ \xe7\xf1\x16\x83\xdd\xfe\x8e\x16\x0e\x4f\x83\x9f\x06\x3d\x0d\x1e\ \x17\x97\x93\x1b\x73\x3e\xb9\x8d\x4e\xfa\xfd\x02\x8f\x69\xe5\xcc\ \xc9\x01\x33\x00\xd4\xb4\xb1\xcb\xaa\x76\xec\x08\x64\x77\x75\xd9\ \xe4\x35\x6b\xe3\x83\x65\x77\xf2\x5e\xaf\x57\xc4\xcd\x4e\x5c\xf4\ \x8d\xac\x6d\xfd\x3a\x86\x4d\x4a\xf2\x01\xc7\xcd\x31\x6f\x31\xab\ \x9b\x0e\x18\x26\x40\x83\x47\xf0\x8e\xe7\xb6\x83\xbf\xbf\x5f\x08\ \xf7\xf5\x11\x5d\x96\x21\x7d\xc3\x06\x70\x15\x14\x50\xb8\xd8\xa1\ \xc4\x4e\x1c\xa5\x7a\x73\x93\xc8\x18\x06\xb9\xf5\x1f\x5f\xe8\x1e\ \x8e\xd3\x07\x7f\xfe\x20\x9d\x89\xd0\xe2\x3a\xc0\x24\xba\x0a\xb0\ \x60\x8f\xcd\x31\x6f\xb1\x6e\xa6\x8e\x6e\x82\x07\x3e\x2b\x4b\x45\ \xe6\xc1\x48\x48\x10\xfc\xb5\xb5\xc4\xe6\x72\x81\xfb\xf6\xdb\xc1\ \xbc\x42\xc0\xaf\xaa\xc7\x8e\x50\xbd\xad\x55\x80\x78\x9c\x98\xf7\ \x10\x4d\x63\x9d\x9f\x9d\x23\x48\xbf\x61\xf7\x2e\x5f\xbc\x5e\xa8\ \xb1\x6c\x0d\xc3\xb9\x5c\x05\x8c\x20\xfc\x0d\x35\xbe\x90\xaa\x26\ \x78\x33\x5d\xa8\x99\xee\x66\xfa\x50\x2e\x3b\x5b\x49\xda\xbd\x07\ \x22\x53\x53\x02\x63\xb7\x13\x29\x2b\x0b\x7a\x3f\xfe\x18\x96\x6f\ \xdd\x4a\xf9\x80\x3f\xaa\x1e\x3e\x08\x7a\x6b\xb3\x88\x69\x46\x00\ \x0b\x1c\x15\x0a\x48\x42\x22\xe0\xde\x41\x63\x43\x97\xbe\xd4\x1d\ \xce\x5f\x17\x0e\x8c\x76\x2c\xca\x3e\xc0\x38\x9c\x3e\xd4\xbf\x13\ \x5a\x38\x52\xa8\x47\xa3\xc4\xd0\x4c\x7d\xd7\x40\x9f\xd1\x79\xc6\ \xeb\x55\x12\x9f\x7e\x86\x86\x27\x27\x85\xcb\x55\x55\x24\x8e\x1b\ \x57\xb8\xa7\x07\x72\x1e\x7e\x98\xf2\x86\xae\x46\xdf\x3a\x48\xe3\ \x6d\xcd\x02\xde\x47\xac\xbd\xc1\xec\x8f\x18\x84\x95\x98\x48\xa3\ \x7e\xff\x37\xc1\xb8\xf1\x92\x3c\x19\xea\x5c\xf0\x08\xd4\x16\x16\ \x10\x3e\x35\xb5\x88\x11\xc4\xd3\xb8\x41\x95\x98\xed\x81\xa5\x36\ \xb3\x05\x8b\xf4\x23\xf3\xaa\xfb\x95\x57\x20\x46\x41\x10\x33\x33\ \x49\xef\x99\x33\xc0\xf2\x3c\xa4\xad\x5f\x0f\x62\x54\x96\x95\xa3\ \x87\xa8\xde\xd8\xe0\xa0\x98\x32\xa0\x4d\x4b\x2c\x49\x4c\x34\xd9\ \xa7\xa1\x81\x81\xca\xf1\xb8\xbe\x63\x93\xac\xd6\x2e\x4a\x37\xca\ \xb9\xdd\x45\x33\x6a\x53\x42\xe3\xd3\x6a\x43\xe7\xe4\x92\x82\x2d\ \x2f\x4f\x4d\xde\xfe\x1b\x2a\x47\x64\x51\xf5\xfb\xc9\x78\x5d\x1d\ \xb8\x57\xad\x02\x4e\x92\xa8\x28\x08\xaa\xfc\x72\x39\xd5\xda\x5b\ \x45\x30\x77\x63\xf3\x1e\xdc\xa1\xb1\xb7\x06\x46\x72\xd2\xd0\xd0\ \x70\xf7\xa8\xaa\xed\xec\x65\x84\xf3\x00\xea\xc2\xce\x03\x55\x3e\ \x1f\x83\x4d\x8b\x8f\x15\xec\xc8\xbc\x52\x62\xa8\xb3\x05\x3b\x2d\ \x97\xe6\x2f\x26\xf8\xb4\xfd\x07\x80\xcf\xce\x16\x46\xbe\xf8\xc2\ \x52\x1b\x56\x14\x21\x61\xe5\x4a\x6a\x9f\x9a\x8c\x46\x0f\x1f\xa4\ \x5a\x63\x83\x84\xcc\x13\x98\xd9\xdc\xac\xab\x61\xd0\x10\x61\x2b\ \xc6\x80\x2d\xdf\xaa\xc6\x2a\x17\x65\x1e\x60\x25\xe9\x27\x58\x88\ \x6f\x6b\x91\x48\x09\x8d\xc5\xaf\xd2\x79\x4b\x6d\x96\x2f\x57\x92\ \xb7\x3f\x0f\x72\x38\x2c\x32\x9d\x9d\x24\xed\xae\xbb\x40\x1e\x18\ \xb0\x9e\xb7\xf3\xbc\x1a\x39\xf8\x3a\xd5\x5a\xb0\x60\xe3\xd3\xf7\ \x5a\xcc\x9b\x57\xbc\x3b\x0c\xec\xe0\x10\xf0\x2f\x8e\x31\xfc\xd7\ \x00\xb1\x85\x1d\x68\x2a\x6f\xb9\x85\x20\xf3\x05\xd8\x7c\xfd\x15\ \x75\xbe\xe8\x3f\x52\x39\xe3\x80\xa5\xf3\x39\x6a\xfa\xa1\x43\xc0\ \xa6\xa7\x8b\x1d\x6f\xbc\x41\x18\x9b\x0d\x6c\x29\x29\xe0\xd9\xb2\ \x85\x0a\xd1\x68\x74\x6a\xcf\x6f\xa9\xd6\xdc\x24\x4d\xab\x8d\x3e\ \xa3\x52\xd3\x8f\x49\x60\x2b\x06\x19\xdb\xae\x5f\xaa\x51\xcc\x79\ \x65\xe1\x27\x32\x46\x14\x7d\xc4\x66\x3b\x66\x76\x95\xb3\x3b\xec\ \x6c\xce\x9b\x0e\xf0\xb9\xb9\x8a\x7b\xc7\x0e\xca\x79\xbd\x92\x99\ \x9a\xd8\x22\x43\xda\xc6\x8d\xe0\x2a\x2e\xa6\xd4\x3f\xa6\xce\x80\ \x9f\x63\x7e\x6e\x42\xb3\xc0\x33\x3d\x03\x8c\x7d\xcf\x08\xc3\x63\ \xce\x47\x17\x76\x26\xae\xf0\x78\x80\x75\xb9\x8a\x31\x6d\xfe\xa2\ \x2b\x4a\xe9\xac\xda\xd0\x19\xc5\x41\x30\x06\x76\x93\x4a\x2a\x32\ \x8f\x7d\xbc\x38\xd9\xd2\x42\x3c\x0f\x3e\x08\xfe\xca\x4a\x70\xaf\ \x5e\x0d\xa4\xbf\x5f\x0e\x1d\xd8\x47\xe3\x0d\xf5\x0e\x6a\x5c\xdd\ \xde\x9b\xef\x10\x20\x6c\x75\x3f\x63\xdf\xb9\x4d\x89\x54\xfd\x4f\ \x62\xf2\x9d\xcc\x27\x24\x14\x11\x9e\x3f\xa1\x87\xc3\xa5\x26\x7b\ \xf4\xca\xde\x06\xaf\xb6\x95\x2b\x95\xe4\xf2\x72\x1a\x1a\x1d\x95\ \x62\x38\xa0\x4c\xb6\xb5\x59\xfa\x9f\x7e\xef\xbd\x94\x44\xc2\xca\ \xc4\x2b\x7b\x69\xbc\x15\xd5\x66\x1e\xf0\x41\xc2\xf6\x74\x33\xc2\ \xce\x2e\x4e\xa8\x01\x88\xc0\x82\x3a\xf0\xaf\x8c\x0c\xc2\x48\x92\ \x0f\x5b\xc4\xd3\x7a\x28\x54\x6a\x5c\xc9\xfc\x34\x18\x83\x37\xc1\ \xbf\xf6\x1a\xe8\x82\x20\x71\xb2\x4c\x86\xce\x9d\x83\xe5\x8f\x3e\ \x0a\x09\xf9\xf9\x54\x6b\x6d\x89\x8e\xef\xdf\x67\xc4\x9b\x9b\x1d\ \xd7\x46\xda\x04\x3f\x4a\xf8\xca\x3e\xc6\x56\xfe\xbc\x12\x46\xe6\ \xc3\x0b\x7f\xac\xf2\xd5\xca\x95\x99\x0c\xcf\x9f\x44\x09\x7c\xc8\ \x6a\xcc\x66\x65\x72\x56\x6d\x72\x73\x65\xf7\xab\xaf\x1a\xaa\xcd\ \xe6\xc0\xbf\xad\x9c\xc7\xfa\x00\x4c\x35\xec\x00\xec\xd1\xc0\xd3\ \x4f\xe9\xc8\xbc\x84\xaf\x67\xae\x05\xef\x27\xdc\x50\x17\x2b\x3c\ \x34\xca\xf0\xb5\x6f\xc9\x01\xfd\x87\x74\x02\xf3\x0e\x34\x6f\xbe\ \xf9\x26\xd7\x59\x50\xf0\x74\x2c\x2b\xeb\x71\xb1\xa3\x43\x64\x15\ \x05\x66\xf5\x1a\x1d\x31\x10\x7c\x34\xed\xe4\x49\xe0\xf2\xf2\xa4\ \xfe\x33\x67\x48\x6c\x6c\x0c\xec\x69\x69\x80\xfd\x10\xe5\x27\x27\ \xe4\xc0\x8e\x1d\x46\xac\xa5\xc5\x74\x8c\xa1\xd3\xa0\xad\x85\x48\ \xe9\x10\xc3\x57\x76\xb0\xe2\x93\xe5\xca\x54\x55\x45\x3c\x4a\x7f\ \x68\x2b\x73\x9d\x03\xfb\xf6\xed\xe3\x71\x94\xfb\xc5\xe6\xfb\xef\ \x3f\xf2\xd3\x2d\x5b\x92\x07\xa7\xa6\x08\xbd\x70\x01\xb8\x68\xd4\ \x72\xc0\x04\xef\x7e\xf9\x65\xc3\x56\x58\x28\x11\x96\x25\x42\x46\ \x06\x84\xda\xdb\x21\x01\x5b\x62\x1c\x09\xd5\xf1\xdd\xbb\x8d\x18\ \x32\x8f\xc8\xae\x02\x6f\xc6\xef\x32\xe1\x7a\x2f\xb2\xe2\x73\x23\ \x2c\x5f\x5d\x1d\x97\x7f\x30\xf8\xeb\x52\xe8\xe8\xd1\xa3\x1c\x8e\ \x71\x2f\xe0\x1c\xfa\x92\xcf\xe7\x4b\x31\x53\x25\x1c\x0a\x41\xe3\ \x07\x1f\x00\x77\xf2\xf7\x46\x62\x5a\x6a\x34\xfd\xbd\xf7\x00\xf5\ \x5e\x9a\x19\x03\xe7\x4e\xab\xd4\xa6\xa6\x48\x70\xff\x7e\x1a\x6b\ \x6e\x72\x5e\x77\x98\x85\x8f\x01\x86\xaf\xe9\x64\xc5\x9d\xaf\x2b\ \x13\x95\xb0\x80\x36\x57\xc4\xc7\x8f\x1f\xe7\x14\x45\x79\x64\xe3\ \xc6\x8d\x2f\xad\x58\xb1\xc2\x02\x6f\x2e\x87\xd3\x09\x25\x8f\x3d\ \x06\xf5\xd8\x61\xa6\xdc\x9a\xcf\x22\x78\xfb\x95\xe0\xcd\x69\x43\ \x1f\x19\x51\x02\xbf\x7b\x95\xc6\xda\xdb\xa5\x6b\x3f\xc0\x64\x7e\ \x84\xf0\x7d\x17\x10\xfc\x30\x6b\xaf\x5e\xf0\x53\x0f\xf3\xc7\xae\ \x5d\xbb\x58\x8f\xc7\xf3\xc2\xdd\x77\xdf\x7d\x28\x2f\x2f\x2f\x65\ \x66\xc4\x9b\x05\x68\x9e\x5d\x42\xb2\xcf\x47\x7a\x43\x61\x8e\xb7\ \xf1\x44\x10\x84\xb9\x31\x50\x6d\x68\x88\xfa\xa7\xd3\xc6\x71\x6d\ \x7b\x6e\x82\xef\x63\xec\x55\x6d\x9c\xf4\xec\x61\x25\xf8\x55\x7d\ \x3c\x42\x17\xda\x01\xeb\x03\x3b\x3a\x3a\x24\xcc\xdf\x27\xd0\x89\ \x39\xe6\xaf\x5d\x0e\x49\x02\x5f\x61\x01\xf4\xf6\xf6\x43\x70\x62\ \xc2\xba\xd9\x64\x7e\xfc\xc0\x01\x23\xd6\xd6\x86\xcc\x9b\x51\x21\ \x30\xbb\x70\x24\xa1\x03\xc4\x3e\xd2\xc6\x8a\xbb\x2e\xb3\x7c\x25\ \x2c\x92\x59\x11\xb8\x78\xf1\x62\xcc\xed\x76\xb7\x21\xb3\xa5\x99\ \x99\x99\x19\xb3\x29\x72\x65\x14\xac\x7c\xe3\x38\x48\x4a\x72\xc1\ \x85\x8b\x38\x5f\xf4\xf6\xaa\xe1\x3d\x7b\x4c\xa9\x74\xe0\x0b\xae\ \x62\xde\x54\x9b\x6e\xc6\x5e\xdd\xc2\x4b\xbf\x3a\xa1\x8c\x57\x36\ \x2c\x02\xf3\xd7\xa9\x90\x24\x49\x97\x50\x7d\xba\x5c\x2e\xd7\xa6\ \xb4\xb4\xb4\x04\xf3\x88\xe3\x5a\x07\x2c\xfd\xc7\x81\x24\x09\xe7\ \xd8\xc6\xb3\xe7\x18\xe3\xf3\xcf\x79\x41\xd3\xae\x03\xdf\xcf\xd8\ \xfa\x9a\x31\x6d\x02\x2c\x5f\xd5\x14\x0b\x2f\x1a\xf8\xab\x1c\x18\ \x18\x18\xa0\xe7\xcf\x9f\xef\x76\x3a\x9d\x0d\xc8\x74\xa9\xd7\xeb\ \xb5\x22\x31\x9f\x13\x66\x4d\xa4\x16\xf9\x48\x17\x41\x27\x1b\x1b\ \x41\xc0\x39\x96\xcc\x80\xef\x64\x84\xba\x06\xce\xf1\xd4\x1f\xa2\ \xfe\x8a\xc5\x06\x3f\xef\x3e\xe0\x70\x38\x06\x82\xc1\x60\x4b\x42\ \x42\xc2\x03\xb3\x91\x98\x2f\x9d\x2c\x27\x0a\x0b\xe1\x42\x60\x1c\ \x98\xae\x2e\xb0\xe9\x1a\xed\x61\xec\x97\xbe\xe6\xa5\x6d\x91\x25\ \x60\xfe\x5b\x1d\xe8\xeb\xeb\xa3\xf5\xf5\xf5\xfd\x29\x29\x29\x75\ \x2c\xcb\xfa\x32\x32\x32\xbc\xf3\xd5\x84\x15\x09\xbb\x0d\xdc\xb7\ \x95\xd2\xa6\x70\xa4\x3e\xd8\xda\xd1\x58\xc5\x49\xe5\x7f\x8e\xfa\ \xff\xb9\x54\xe0\xff\x6b\x33\x87\x85\x5d\x81\xec\x3f\x2f\x8a\xe2\ \x27\x25\x25\x25\xd9\xe8\x0c\xcc\x97\x4e\x81\xf1\xf1\xd1\xc0\xf2\ \xac\xc3\xa3\xac\xbd\x72\x98\x90\xd1\xa5\xfe\xc6\xe7\x5b\x0f\x77\ \xbb\xbb\xbb\x69\x4d\x4d\xcd\x60\x7a\x7a\xfa\x97\xe8\xc8\x6d\x78\ \xf5\x5e\x59\xd8\x1a\x8e\x82\x6d\x6d\x6d\xf2\xbb\xef\xbe\x7b\xa8\ \xae\xae\xee\xf4\xdf\x07\x7b\xc7\xbb\xe3\xb2\xf1\xa3\x71\x60\xd6\ \xb0\x0e\x46\x65\x59\x6e\x42\x95\xda\x82\x52\xeb\xc2\x48\x58\x4e\ \x74\x76\x76\x2a\x9f\x7e\xfa\xe9\x29\xdc\x43\x8e\x34\x36\x36\xca\ \x37\xea\x5b\xca\xef\x74\x00\x53\x09\xaa\xab\xab\x07\x97\x2d\x5b\ \x56\x81\xa5\x60\x45\x62\x04\xed\xa3\x8f\x3e\x7a\x02\xff\xff\xc7\ \xa6\xa6\xa6\x1b\x06\xfe\x7b\x7d\x3f\x80\x45\x3d\x8c\xfb\x44\x1d\ \x76\xd3\x59\x5d\x5d\x5d\xc7\xcf\x9e\x3d\xfb\x49\x6b\x6b\x6b\x1c\ \xfe\xdf\x0c\xbb\x54\xb8\x69\x0b\x68\xff\x06\x63\xde\x08\xfb\xfb\ \x15\x1f\x62\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xd9\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ \x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x0c\ \x18\x0d\x34\x0f\xb0\xff\x69\x73\x00\x00\x00\x06\x62\x4b\x47\x44\ \x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x06\x66\x49\x44\ \x41\x54\x78\xda\xcd\x57\x5b\x6c\x54\x55\x14\x5d\xf7\xde\x99\x7b\ \xe7\x4d\x29\x52\x5a\x52\xcb\x4b\xb1\x01\x84\x16\x2c\x09\xd0\xc4\ \x34\x41\x62\xd4\x5f\x13\xff\x88\x12\x3f\xf4\x43\x88\x26\x7e\x98\ \x18\x54\x62\xa2\x21\x3e\x82\x5f\x6a\x13\x8d\x31\x35\x81\xaf\x06\ \x09\xc1\xd8\x94\x0f\x04\x22\x08\x2d\x94\x02\xad\xa5\x40\xb1\x03\ \x6d\x69\x87\x0e\x74\x66\xee\xd3\xbd\xf7\xb4\x27\x33\xa5\x24\x7c\ \x40\xf4\x24\xab\xe7\xdc\x73\xce\xde\x6b\xed\xc7\x9d\x99\xe2\xbf\ \x1e\xda\xcc\xa2\x8f\xd6\x15\x91\x88\xe9\x27\x93\x56\xd8\x30\x74\ \xed\x11\x13\x05\x04\x37\x16\x0b\xb4\xb1\xb1\x7c\x66\x72\xd2\x5e\ \x49\x5b\x4a\x40\x86\x66\x77\xfb\xf6\x06\x6d\xd1\xa2\xd6\xcc\xf1\ \xe3\x0d\xce\xc8\x88\x2e\x46\xb3\x9d\xa8\x79\xee\x3d\xb5\x7e\xc0\ \x59\x7c\xf9\xf2\x60\x41\x73\x73\x97\x7d\xee\xdc\x8e\xd8\xfe\xfd\ \x5d\x15\xb4\x1d\x02\x8d\x9c\x65\x59\xa1\xda\xda\xd6\xd0\xb6\x6d\ \xeb\x8d\x4d\x9b\xa0\x6b\xda\xfd\x11\x3c\x8a\x74\xeb\xe4\x39\x95\ \x6a\xcc\x5f\xbb\xf6\xbd\x66\x59\xcd\x28\x14\xf2\x22\xc0\xd1\xf5\ \xe8\x3f\xed\xed\x0d\xc9\xfa\x7a\xd8\xb6\x8d\xc7\x39\x7c\x0a\xae\ \xaf\xa3\xa3\x71\x35\x71\x02\x28\x0a\xf0\x82\xc0\x98\xe8\xe9\xd1\ \xad\x6c\x16\x1e\x1e\xef\xf0\x0a\x05\x4c\x52\x89\x99\x93\x9f\x8b\ \x19\x08\x02\xdd\x07\xe0\xe6\xf3\xf7\x09\xc8\x38\x0e\x6e\x9b\x26\ \x0c\xca\x4c\x5d\x28\xa4\xca\x13\x04\x01\x86\x72\x39\x59\x3f\x19\ \x8d\x42\x2b\xd9\xbf\x4a\x36\x5e\x38\x8c\x27\x68\xae\x30\xcd\x72\ \x01\xb4\x47\xe4\xc2\xa9\x04\x10\xb9\xee\xf1\xe1\x2c\x01\x59\x42\ \xb4\xb9\x19\x9b\x97\x2d\x83\xe7\x79\x18\x38\x7a\x14\x89\xe1\xe1\ \xe2\x59\x4d\x0d\xd6\xb7\xb4\xc8\xba\xbf\xb3\x13\xa9\x74\x5a\xd6\ \x77\xaa\xaa\x64\xdf\x30\x0c\x0c\x0d\x0e\x22\x73\xe2\x04\x92\xa5\ \x25\xb0\x6d\x2e\x83\x70\x02\xd3\x7f\x7c\xdf\x27\x01\x92\x01\x85\ \x02\xc1\xdc\xb0\x01\x4b\x96\x2f\x17\x67\xd4\xa7\x58\xb1\x7e\xbd\ \x3a\x5f\x49\xcd\x9a\x48\x24\x18\xbc\x56\xfb\x2b\xc8\x26\x1a\x8d\ \x8a\x4d\x1d\xd9\x86\x1a\x1b\x91\x2f\xf1\xeb\x73\x06\xa6\x39\x95\ \x00\x8f\x1e\x54\x09\xa6\x91\x5f\xbc\x18\xcb\x56\xad\x82\xae\xeb\ \x0c\x71\xe8\xa6\xd3\xea\x9c\x04\xa9\x33\x5a\xab\x7d\x8c\x8e\xf2\ \x5d\x86\x9c\x2d\xa1\xc6\xce\x55\x57\xcb\x99\x80\x33\xc0\x9c\xa5\ \x02\x5c\x55\x82\xa2\x4a\x9b\x54\x56\x6f\xdc\xa8\x08\x18\x0e\x91\ \x0f\x1d\x3e\xac\x22\xd1\x00\xae\xbb\x40\x2f\xc9\xde\x75\xbe\x73\ \xf3\x26\x0b\x50\xa8\x6a\x6a\xe2\xb7\x4b\x65\x80\x4a\xc0\x9c\x25\ \x19\x28\x69\x42\x06\xa8\x8e\x95\x04\x15\x3d\x80\x81\xb6\x36\x78\ \xb9\x29\x04\x36\x91\x3b\x14\x89\xef\x71\x1a\x19\xbc\x96\x3d\xd8\ \xb4\x3f\x75\x0f\x03\xbf\xb4\xb1\x8d\xca\x5c\xe5\xc2\x85\xf0\xc9\ \x5f\x89\x00\xe6\x2c\x11\x00\x68\xb2\x59\x28\x48\x16\x92\x54\xbb\ \xd2\xe8\x27\xba\xbb\x51\x18\x49\x0b\x89\xee\x16\xe1\x7b\x1e\xbc\ \x22\x64\xad\x7b\xea\x0c\x85\x5b\x69\x64\xce\x9f\x2b\x2b\x5f\x92\ \x1a\x59\x4a\x50\x14\x20\x9c\xe5\x19\xd0\x75\xae\x8f\x5c\x4a\xd4\ \xd4\x70\x6a\x15\xb2\x17\x7b\x84\xc0\xf0\x15\x66\x09\x70\x61\xb0\ \x00\x9f\xe0\x09\xd8\x86\xc9\x95\x8f\x78\x75\xb5\x04\x68\x55\xcc\ \x23\x3e\x9f\x50\xf2\x1a\xba\x25\x02\x5c\x52\x68\x25\x12\x6c\xa4\ \x22\xb0\x47\xd3\xc5\xe8\x0c\xc0\x08\x00\x5d\xe3\x2e\x76\x85\x9c\ \x06\x8b\x11\x51\x9a\x0f\x01\x08\xf6\x48\xba\x2c\x8b\x91\x54\x0a\ \x01\x95\xeb\xf4\xde\xbd\x54\xa9\x02\xdc\xd9\x9f\x03\x01\x79\x1d\ \xef\xbd\x00\x2d\x12\x05\x5c\x57\x29\x07\x98\xcc\x91\x08\x0d\xb0\ \x00\x02\x99\x06\x9e\xf4\x00\x7f\xf0\x48\x06\xc2\x9a\x07\x2d\x1e\ \x87\x66\xc5\x99\x80\xe6\x70\x59\x16\x9d\x4c\x06\x7d\x07\x0e\x20\ \x1c\x8f\x81\xb8\x98\xb3\x4c\x80\xc6\x19\xc8\x0e\x5d\x47\xfe\xee\ \x14\xb2\x57\xae\x20\xb5\x74\x29\x66\x86\x1f\xb1\x60\x0f\xfd\x0d\ \x33\x12\x82\x6e\x85\x44\x41\xe0\xd8\x9c\x01\x11\x00\x87\x22\xba\ \xde\x8b\xc2\x9d\x49\xe4\x6e\x4f\xc0\x76\x7c\x24\x5f\x7d\x93\x4d\ \x55\x10\x79\x7a\x33\xe4\x99\xc9\x29\x78\xbf\xb4\x07\x84\x84\xf3\ \xaa\x17\x1f\xef\x9c\xef\x2e\x33\x8e\x35\x6d\xa1\x57\x6b\x10\xee\ \x8d\x3e\xb8\xd7\x7a\xe1\x5d\xef\x01\xba\x3a\x55\x83\x69\x67\x3b\ \x81\x91\x41\x18\x53\xb7\x61\x85\x7d\x98\xa6\x86\xd4\xd6\x57\x94\ \x0f\xc6\x64\xcf\x39\x61\xd4\x0c\x5d\xb8\x66\x46\xa8\xe4\x5b\x8a\ \xd5\x89\x86\x5b\xbf\x1f\xc1\xea\x5d\xef\xaa\x4b\x35\x0d\x4d\x18\ \xde\xfc\x02\xac\xb3\xbf\xc1\x0c\x03\x61\xb2\xba\xd7\xfa\x01\x52\ \x97\xfe\x00\x40\xeb\x63\x87\x10\x31\x01\xc7\x63\x42\x7a\x6e\xda\ \x8a\xea\x75\xcf\x71\x76\x94\x88\x91\x8e\x23\xec\x5b\x38\x02\x4d\ \x09\x50\x19\xe0\xba\x88\x3a\x43\xe3\x0c\x9c\x41\xb6\xa7\x4b\x39\ \x90\x8f\xd5\xf7\x3e\x43\x76\x49\xbd\x08\xb0\x88\x2c\x12\xf2\xe1\ \xfe\x79\x10\xde\xa9\x83\x88\x84\x7d\x11\x60\xd1\x59\xb6\xee\x19\ \xd4\xee\xfc\x94\x6d\x14\xc9\xdd\xf3\x5d\x98\xbc\xd0\xc5\x95\x93\ \xac\xf9\xfa\x9c\x02\x54\x06\xe4\x62\xdf\xe7\xbb\x39\x65\x2a\x82\ \x85\x35\x8b\xb1\xe8\x93\x9f\x71\xb5\xf1\x25\x04\xc4\x44\x6d\x81\ \x28\x81\x88\x19\xb2\x37\xb0\xf6\x45\xcc\xff\xf0\x07\x2c\xa8\xae\ \x51\xe5\xe3\xbf\xfd\x7b\x77\x4f\x93\x73\x09\x28\x03\x73\x96\x40\ \x32\x40\xd0\x20\x98\x38\x7d\x1c\xc3\x3f\x7e\x83\xda\x1d\xbb\x54\ \x1d\x17\xd2\xbb\x9c\x7c\x7f\x1f\xfa\xa9\x9e\x76\x77\x07\x8c\xd1\ \x41\xc9\x92\x5d\x59\x07\x63\xcd\xf3\x78\x7a\xf5\x5a\xfe\x22\x52\ \xf7\x39\xda\x1b\xad\x5f\x22\x73\xe6\xa4\xf8\xd4\x19\x86\x46\x5c\ \x98\x43\x80\x18\x88\x00\x85\x81\xaf\x3f\x46\x82\x48\x2b\x5e\x7e\ \x8d\x3b\x5e\x1c\x86\xc3\x61\xac\x7c\x76\x1d\x9c\xfa\x55\x70\x1c\ \x07\xae\xeb\x8a\x88\x50\x28\xc4\x50\xef\x3d\xaf\x33\xbf\xb6\x61\ \x70\xdf\x1e\xe5\x0f\x2c\xe0\xc1\x3d\x00\x91\x58\x36\xc8\x71\xdf\ \xee\xb7\x30\xf6\xed\x1e\x58\x86\x5e\xf2\x2d\xa7\xd6\x0a\x44\xa8\ \x10\x09\x19\x18\xff\x6e\x0f\xfa\x3f\x7a\x5b\xc4\x95\xff\x2e\x14\ \x3c\xa8\x09\x85\xb3\x1c\x7e\x40\xa5\xf8\x02\x57\x5f\xdf\x04\xed\ \xe4\x21\xc4\xb9\xfe\x91\x88\x64\xc2\x34\x4d\x59\xc7\x62\x31\xf9\ \x5d\x50\x11\x8f\xc2\xfc\xeb\x08\x6e\xec\xd8\x82\xf4\x4f\x5f\xdd\ \xe7\x0b\x0c\xe6\x99\xfb\x35\x94\x66\x53\x97\xfd\x19\xf8\x80\x47\ \x98\xba\xda\x8f\xe1\x3d\x6f\x20\x3a\x3f\x85\x54\x53\x0b\x52\x4f\ \xad\x85\x56\x51\x55\x14\x3f\x71\x0b\x85\x81\xf3\x18\x3f\xd5\x89\ \xa9\xcc\x24\xf2\x05\xb6\x61\x5b\xe5\x47\xf9\x94\xe8\xb5\xd9\x3d\ \xa0\x4a\x20\x97\x94\x31\x95\x1d\xee\xcc\xec\x02\x0e\xa7\x8f\x08\ \xfc\xa3\xed\x08\x1f\x6b\x97\xce\x06\xe4\xbe\x9c\xdb\x04\x97\xc1\ \xf7\x95\xad\x0a\x42\x66\x48\xa0\x65\x25\x90\x3d\x4f\x4f\x54\x06\ \xb1\xaa\x14\x5f\x24\x88\x03\x05\xc7\x2d\xc2\x76\x8a\x28\xd8\x90\ \x28\x73\x02\x5a\x33\x78\x5f\xce\x8b\x77\xdd\x72\x31\xca\x6f\xac\ \x6a\x1e\xed\x6b\x3e\x73\xaa\x0c\x04\xc0\xb8\x15\x4f\x5e\x4e\xae\ \x59\x5a\x6f\xc4\x4c\x18\xbe\xcb\x9f\x76\x02\xea\x27\x35\x1b\x04\ \x8d\xc0\xd9\x72\x09\x2a\x12\xe9\x15\x7a\x26\xe8\x84\xb0\x47\x6b\ \x97\x6c\x68\xb6\x68\x8e\x4d\x07\xe0\x19\x61\xb8\xc9\xf9\xd0\x7a\ \x6f\x5d\x66\x4e\x25\x80\x5f\x7b\xf3\xe2\xa5\x77\xae\x64\x26\xf6\ \x4d\xdc\x1e\x5b\xe9\xe4\x72\xfa\xc3\xff\x1b\xf6\xf0\xc3\x8c\xc6\ \xfc\x88\x3e\x74\xb9\x3a\x7b\x77\x27\x73\xa2\xb4\x1d\x3a\x8b\xe5\ \x98\x4f\xa8\x0c\x00\x03\x8f\x61\x48\xda\x8b\x91\x4f\xb4\x00\x3e\ \xfe\x0f\xe3\x5f\x2e\x8d\xb8\x7b\x20\x62\xac\xd3\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x3f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\x01\x7d\xd5\ \x82\xcc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\x0c\x02\x0b\x13\ \x3a\x70\x62\x14\x07\x00\x00\x01\x81\x49\x44\x41\x54\x28\xcf\x45\ \x90\xbd\x6b\x53\x01\x00\xc4\x7f\x97\xe4\x69\xf2\xf2\xac\x1d\x14\ \x95\x82\x7f\x80\x5a\x44\x68\xa0\x8b\x42\x50\x71\xf0\x63\x48\x1d\ \x0a\x46\x53\xac\xb6\xb8\x68\x6d\xd1\x16\xd4\x4d\xa2\x46\xa9\x1f\ \x9b\x20\xb8\xf8\x0f\xb8\xb8\x68\x06\x9d\x5d\x3a\xbb\x54\x10\x45\ \x44\xfc\x48\xde\x4b\x1f\xc6\x9c\xc3\xab\x7a\xc3\x71\x70\xc3\xfd\ \x38\x60\x02\xb8\x3e\x1b\x04\x50\x05\x60\x0c\x20\x7f\xe3\x02\x4c\ \x01\xd4\x80\x93\x77\x9e\xfb\x59\x02\x70\x98\x71\x00\x1e\x74\x5f\ \xf8\xfc\x3d\x68\x20\xa8\xb5\x8e\x5d\x49\xbd\x41\x41\xef\x4c\x08\ \x00\x8f\xe2\x62\xd8\xf7\xb0\x5e\x2f\x3f\x5e\x50\x7d\x7a\xf4\x49\ \xdf\x92\x1d\x68\x38\x9d\x29\xc2\xfd\x24\x2d\x0d\x8c\xec\x21\xbd\ \x9b\x15\xb9\xb9\x1f\x41\x84\x11\x96\xb6\x7d\x4b\xfb\xdf\xb7\xda\ \x08\x0f\x54\x4a\x6e\x0e\x09\x60\xbe\xf3\x33\xc2\xc8\xce\x4b\xfc\ \x5e\xaf\xb7\xf7\x9a\x21\x68\x2f\x2b\xc0\x7c\x67\x35\xca\x1b\x65\ \x0c\xf6\x46\x8d\xf4\x5a\x21\x1c\x20\xb7\xc2\x3e\x60\x79\xd3\xce\ \x0f\x1d\xad\xd1\x23\x65\x8d\xaf\xda\xfc\xa9\x15\xc2\x41\xde\x50\ \x80\x02\x00\xbf\xb4\xca\x7f\xed\xfa\x97\x34\xc6\x5b\xe0\x52\xf7\ \x55\x19\x4b\x06\x04\xb6\x0e\xf5\x1e\x86\xb0\x3f\x5b\xbd\xdc\x69\ \x47\x32\xb2\x11\xc8\x08\x5b\x47\x92\xbb\x65\x50\xa9\x78\xf1\xcb\ \xcb\x08\x4b\x36\xaa\x7e\xcc\xa9\xbd\x03\x4b\xd8\x3a\x1e\x3f\xdd\ \x52\x98\x3e\xfd\x39\xe3\x37\xaa\x26\xad\x11\x58\x8a\xdb\x61\xf6\ \xcb\xfb\xf2\xe4\x24\x70\xf6\x56\xdd\x95\x41\xc5\x57\xe3\xbf\x60\ \x8b\xf1\xb8\x2b\x83\x53\x6e\x34\x81\x13\xc0\xd4\xed\x73\x5e\xe8\ \x02\xec\x61\x14\x80\x6b\xf1\x8c\x1b\x4d\x38\x0a\x99\x4d\xd4\xc9\ \xc3\x6e\x60\xdd\x73\xb5\x7a\xd6\xfc\x01\xa4\xa4\x95\x3c\x31\xad\ \x4d\xf5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\xe4\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x07\x61\x49\x44\ \x41\x54\x78\xda\xc5\x97\x6b\x6c\x14\xd7\x15\xc7\xff\xe7\xce\xcc\ \xee\xec\xae\x1f\xeb\xc7\x62\x30\x26\x3c\x64\x67\x21\x24\xd0\x00\ \x01\x85\x2a\x12\x52\x24\x54\xe5\x5b\xd5\x82\x22\xd4\x36\x54\x6a\ \x9b\xb6\x28\xad\x08\x7d\x24\x6a\x25\x44\xd5\xa4\x1f\x92\xd0\x2a\ \x69\x28\x8a\x92\x3e\x92\xb6\x48\x45\x4d\xdb\x7c\x48\xa5\x56\x51\ \x9b\x84\x84\x36\x3c\x02\xa6\x84\x87\x03\x36\x60\x9b\x35\xbb\x6b\ \xf6\x35\xbb\x3b\x33\xf7\xde\xd3\x1b\x77\x65\x61\x84\x8d\x1b\x3e\ \xe4\x27\xfd\x74\xe6\xcb\xcc\xf9\xdf\x73\xe6\xc3\x0c\x31\x33\x6e\ \x0d\x22\xe0\xe3\x3f\x64\xd6\x01\xf6\xef\xdf\x6c\xf5\xa5\x06\xee\ \x8b\xda\x2d\x9b\x1c\x77\xfe\x7a\xd7\xed\xe9\x8e\xc4\x17\x74\xd8\ \x76\x1b\x05\xfe\x95\x62\xe8\x5d\xca\x48\xef\xd2\x7b\x7e\x79\x70\ \x5f\xc6\x6d\x79\x63\xc3\x86\x7f\xc8\x59\x07\x18\x1d\xfd\xc5\x5d\ \x7e\xf5\x4c\x79\x71\xef\xcf\x86\x70\x1d\x47\x8e\xac\x89\x3b\x55\ \xf5\x6d\x30\xed\x48\xba\x3d\x1d\x89\xb8\x83\x58\x32\x0a\x3b\x96\ \x82\x15\x6f\x07\x21\x0a\xe5\x87\xd0\x81\x42\x50\xae\xc1\x1b\xbf\ \x82\x7c\xe6\xc0\x55\x84\xea\xa7\xca\xab\xee\x5e\xf1\xc5\x8c\x77\ \xd3\x00\xe7\x07\xb6\x0f\x46\xb5\x58\x94\x2b\x1e\xd8\xbd\x72\xed\ \xbf\x77\xa0\x41\xff\xdb\xab\x1e\x24\xf0\xee\xb6\x68\x6a\x5e\xe7\ \xc2\x3b\x61\xb9\x0a\x60\x1f\x33\x42\x11\x13\xa6\x03\xc5\x8b\xe7\ \x90\x1b\x7c\x6b\x8c\x58\x7e\x77\xd9\xa6\xe1\x57\x66\x0c\x70\xec\ \xf0\xbd\xc5\xa5\x3d\x1b\x5b\x46\x47\x8e\xa2\x22\x33\x4f\xad\x58\ \x77\xf8\xb1\xe3\xef\xae\x7e\xd2\xd5\xf6\xf7\xe7\x75\x2d\x46\xb4\ \x35\x09\x80\xf1\xff\x21\x20\xab\xcd\x18\x3b\x7d\x00\xc5\xec\xd0\ \xb3\x77\xbb\xa3\x8f\x62\x13\xab\x1b\x06\x38\x7e\x68\x5d\x31\x3d\ \x6f\x7d\x8b\xd6\xc0\xe5\xcc\x19\x78\xe1\xd8\x99\xa4\xdb\x9b\xee\ \xec\xec\x06\x59\x35\xdc\x12\x9c\xc0\xc8\xc9\x53\x18\x38\x75\xf8\ \x6f\xb1\x52\xf6\x81\x0d\x3b\xa7\x86\xb0\x01\x03\x03\xda\x57\x60\ \xf2\x31\x37\xb5\x0c\x61\xb0\x34\x1d\x89\x02\xac\xab\x46\x60\x12\ \x86\x81\x1b\x95\x00\xe5\x80\x1c\x0b\xac\xeb\x33\x4c\xa8\x82\xee\ \x74\x1f\x8a\xa5\xda\xc6\x53\xf9\x63\x2f\x01\xd8\x3a\x35\x40\x03\ \xa5\xd4\xe4\x0d\x96\x00\x54\x48\x00\x4d\x6d\xae\xc3\x00\xb5\xd1\ \x8b\x08\xc7\x33\x90\xf9\x2c\x64\x39\x0b\xb2\x2c\x44\xda\x7b\x60\ \xb7\xce\x81\xdb\xb5\x08\x91\x8e\x36\xe0\xba\x49\x33\xaa\xe8\x5b\ \x7e\x07\x06\x07\xc7\x1e\x7a\xe1\xd1\x96\x13\x5f\xdb\x5d\x7a\x66\ \xea\x0a\xfe\xb5\xb6\xb8\xa8\x79\x55\x0b\x43\x81\x44\xa3\xab\x29\ \xdc\xc8\xc0\xc6\x60\x7c\x04\x85\x73\xef\x41\xd7\xab\x40\xa8\x41\ \x46\x0e\x19\xac\x19\x36\x4b\xa0\x41\xac\x67\x39\x9a\xd2\x6b\x41\ \xf6\x0d\x66\x51\x92\x78\xe1\x97\x7f\x2e\xcf\x8d\x89\xdb\xbe\xb1\ \xa7\x50\xb8\x66\x05\x0c\x25\x25\x88\x18\x9a\xc9\x54\x00\x44\x13\ \x01\x98\x25\x2a\x23\xef\xa3\x9e\x3f\x0f\x58\x80\x6f\xdb\x38\x31\ \x62\xe1\x7c\x86\x90\x29\xa0\x5a\xab\x2b\x50\x18\xc6\xbb\x13\x0a\ \x9f\x49\x87\xe8\x1a\x3e\x09\x3f\x3b\x84\x96\xe5\x1b\xe1\xb4\x36\ \xe3\x5a\x12\x2e\x21\xdd\x97\x6e\x3e\x72\xf4\xe4\x5e\x00\x0f\xc2\ \x20\xd0\x08\xa0\x95\x84\x32\xb2\x0a\xa1\xb5\x91\x43\xb0\xb1\x3c\ \x76\x14\x7e\x6d\x08\x14\x17\xb8\x5c\x14\x78\xf5\x90\x5b\x1f\x1c\ \x8f\xee\x26\xc7\x4d\xef\xd9\x97\x4f\xfc\xea\x4f\x85\x44\xcf\xdc\ \xc4\xa7\x4a\x22\xf6\xdc\xee\x37\x5d\xff\x9f\xe7\x6c\xa8\xba\x87\ \x52\xff\x5f\x21\x3d\x1f\xda\x0f\xa6\x78\xdf\xda\x5e\x5c\xcc\xf2\ \x67\x77\x7d\x99\xdc\xc9\x09\x10\xf3\xc4\x7e\xc9\x26\x30\xd1\xe4\ \xfb\x14\x56\x2f\x23\x0c\x2e\x98\xe6\x04\xdf\x63\xf4\x8f\x34\x15\ \xbb\x7b\xac\xf5\x0f\x3f\x7e\xe1\x03\x5c\xc3\x8f\x5e\xbc\x72\x1c\ \xc0\xb7\x9e\xdf\x91\xda\x35\x34\xee\xbc\xd1\x9e\xab\x2d\x5f\x91\ \xaa\x8b\xca\xc0\x41\x6a\xea\x5b\xc7\x60\x2d\x26\x57\x64\x01\x77\ \x2c\x99\x1b\x09\x6a\x99\x2f\x00\x78\x51\xc0\x50\xf7\x35\x94\x0a\ \x1a\x9a\xd4\x1c\x80\x8d\xb0\x08\x76\x53\x0b\x84\xcb\x88\xa5\x18\ \x4b\x17\xaa\xd6\x64\x4c\x6f\xc7\x34\x6c\x7b\x26\x9b\x5f\xbe\xc8\ \xfd\x74\xd1\x49\x5c\xf0\x94\x55\x0c\xaf\x5e\xbc\x54\xcf\x9c\xcb\ \xe9\xc0\x2f\x1b\x43\xa3\x36\xaa\xbb\xd3\xed\xba\xea\xf3\xe7\x27\ \x57\x50\xae\x28\xf2\x46\xfb\x11\x14\x86\xa1\x83\x3a\xb4\x09\xa2\ \x75\x00\x11\x6d\x42\x22\xb5\x0a\x89\x8e\x3b\xe1\xb4\x34\xa1\xef\ \x9e\x2a\x96\x74\xab\xaf\xbc\xf3\xbb\x85\x3f\xc6\x34\x6c\xd9\x99\ \xf1\x7a\x7b\x22\xdb\xca\x76\xec\x20\x80\x73\x41\x76\x70\xd0\x34\ \x1d\x35\xe6\x8d\x25\x63\x7d\x41\xca\xad\x14\x3d\x5e\x3c\x19\xa0\ \x56\x95\xc3\x7e\x39\x83\x6a\xee\x24\xca\xa3\x6f\xa1\x9a\x35\x7b\ \x2f\x5f\x80\xf2\xc7\xa1\x82\x02\xd8\x26\x44\x9a\x17\x21\xd6\xd6\ \x85\xee\x35\x15\xb4\xb6\xe8\x1f\x7c\xf8\xf6\xfd\x7d\x98\x86\x79\ \x49\xbc\x6b\xbb\x4e\x06\xc0\x98\xaa\x15\x33\xca\xaf\x8f\xea\xff\ \x39\x66\xcc\xc6\x2c\x5d\x29\x79\xcc\x93\xef\x80\x5f\xd7\x5b\x8e\ \x78\x5d\xaf\xfa\xe3\x6a\x61\xe8\x2b\x48\xc9\xd0\x2a\x07\x42\x96\ \x2d\x62\x76\x2c\x13\xc0\x01\xc5\x1c\x12\x6e\xa4\x95\x3b\xe7\xa4\ \x8a\xa9\x56\x9e\x07\x60\x00\x37\xa0\x6f\x4b\xa6\x3c\xfa\x5c\xe7\ \x98\x64\x4a\xda\xa4\x6b\xca\xbb\x2a\x85\xe3\x06\x00\x3c\xa3\x9b\ \xb0\x39\x5a\xf2\xb4\xbf\x6b\x17\x09\x1b\x86\xcf\x6d\x3d\x7d\x0c\ \xc0\x12\x4c\xc3\xcb\x3f\xe9\xc1\x97\x1e\x1b\xc6\xec\x21\xb0\x6a\ \x2f\x13\x26\x88\xc9\x4a\x46\x0a\xcb\x0d\x98\x55\x8d\xb5\x74\xa5\ \x54\x81\xd4\x88\xee\xdc\xc9\xda\xc6\x0c\xfc\x70\x5b\x17\x49\xc9\ \x42\x10\x68\xcf\xae\x1e\xf9\xcd\x9d\xb3\x0b\xf1\xc1\x6f\x53\xe6\ \x90\xb2\x66\x11\x6b\x00\x75\xe5\xe5\x02\x05\x04\x00\x5c\x63\x78\ \xa5\x2c\xa2\xf1\x88\x68\xac\xe0\x3a\xf6\x7e\x27\x49\x31\x48\x34\ \x5b\x92\xee\xef\x50\x94\x8c\x83\x0e\xe7\xdb\x44\xbe\x18\x0a\x00\ \x1a\xb3\x40\x91\xb5\x20\x1a\x41\x05\x92\x6a\x60\x76\x01\x04\x0d\ \xa3\xc6\xb0\x50\xb3\x23\xf1\x88\xf2\x61\x10\xb8\x8e\xaf\x3f\x5d\ \xe0\x87\x9e\xae\xf0\x5d\x1d\x3e\xf7\x24\x99\x13\x31\x81\x95\xf3\ \x7c\x1a\x2b\x5a\xd1\x9f\xef\xea\xc6\xcd\x38\xb1\x6f\xbe\xa3\x2d\ \xd1\xdb\x6c\xeb\x12\x3b\x76\x15\x42\x14\x00\x14\x8d\x57\x8d\xc3\ \x30\x75\x20\x67\x17\x3a\x9a\xe9\xc3\x46\x80\x1b\xd3\xf7\x3d\x66\ \xb6\x2d\xc0\xb6\xa8\x35\xae\xc5\xbd\x4b\x2c\x6b\x78\x8c\xdd\x97\ \x9f\xec\xc2\x74\x1c\xda\xdf\x23\x02\xc7\x5a\x16\x41\xb4\x4e\xba\ \x5e\x31\xf7\x96\xcc\x33\xaa\xb0\x44\x09\xc0\xe5\x46\x90\xe2\xe9\ \x8c\x5d\x68\x6b\xa6\x43\x30\xd8\x98\x86\xb3\xcf\x46\x89\x2d\x1b\ \x30\x21\xd8\x12\x7a\x45\x77\x55\x89\x68\x92\x8f\x0f\xd7\xad\xbd\ \x4f\x74\xeb\xf6\x16\x87\x37\x3f\x72\x01\x30\xfc\xfd\x37\xb7\x91\ \xeb\x88\x88\x9b\x88\xa5\x1c\xaf\x02\x11\xd4\x3d\x73\x5f\xc8\x80\ \x43\x40\x60\x2a\x13\xc3\x81\xd6\xce\x55\xdf\x75\xf2\x9e\xb4\x56\ \x2f\x0c\x4f\xcd\xf8\x51\x7a\xf6\xf9\x38\xb1\x6d\x1b\x2d\xc0\xfa\ \x28\x84\xc5\xb0\x04\xaa\x1c\xa7\x13\xc3\x55\x28\xa7\x5d\x28\xd4\ \x45\x53\x9c\x44\x67\x32\x66\x25\x50\xb2\xdb\xa3\x31\x17\xd5\x42\ \x2b\x94\x8a\x93\x52\x0e\x49\xe5\x40\x2a\x65\x6a\x84\xa4\x8c\x42\ \x4a\x7a\xed\xec\x1c\x3b\x73\x25\x9f\x79\xea\x2f\xf2\xfd\x19\x27\ \x60\x1a\x22\xfd\x70\x49\x9f\xfe\x75\x27\x2d\xdd\x9a\xe3\xc9\x37\ \xfc\x8f\x0b\x71\xcf\xed\x2e\x20\xea\x9a\xac\xa8\xa9\x16\x38\xf0\ \x00\x26\xb0\xaa\x86\xb0\x2d\x9f\x88\xc0\x20\x07\x0c\x45\x0c\x9b\ \x99\x43\xb0\x08\xf3\xf5\x36\xfb\xfc\x65\x8f\x56\xce\x57\xfd\x33\ \x7e\x96\x1f\x7f\x69\x11\xb9\xfa\x2a\xd2\x5f\x2d\x32\xa6\xe1\x3f\ \xaf\xdf\x4e\x20\x12\x60\x10\x98\x05\x69\x2d\xa0\x74\x84\x94\x8a\ \x41\xa9\x28\x49\xa9\x21\x95\x45\xa1\xb4\xcc\xb5\xa3\xa4\x15\x79\ \xbd\x3f\x6a\x85\xe5\xf1\xcc\xe3\xbf\x0f\x33\x30\x4c\x3b\x81\x33\ \x25\x81\xcd\xdb\x4d\xf3\x19\x60\xc7\x06\x88\x34\x18\x02\xcc\x1a\ \x5a\x03\x42\x49\x10\x42\x02\x87\x6c\x46\x48\x9a\x05\x2c\x61\x81\ \x1d\x79\x26\x97\x94\xa2\x3e\xec\x4d\x36\x9f\x32\x81\x8f\x49\xff\ \x9b\x2b\x09\x13\x31\x98\xa0\x14\x91\x39\x31\xa4\x12\x24\xe5\x47\ \x27\x17\x13\xc2\x16\x63\x79\xdb\x1e\x38\x35\xa2\x5a\x73\x61\x7e\ \xd3\x1f\x18\xb7\x1a\x60\x6a\x88\x77\x56\x13\xb4\x86\x69\x4e\x30\ \x5e\xd3\x9c\x22\x4e\x8c\xbc\x6c\x55\x8c\x9c\xbf\x22\x1f\x78\xc2\ \xaf\x03\x3c\xcd\xaf\xd9\x2d\x72\xfc\xe0\x1a\xa2\x70\xe2\xd3\xcc\ \xa8\x44\xcc\x8e\x8a\xe0\xe2\x25\x8a\x48\xd6\x15\xcf\xd3\x2b\xb7\ \xfb\x7a\x96\xff\x86\xb7\xce\xd0\x6b\x69\x92\xd9\x1c\x49\xdf\x67\ \x5b\x79\xdc\xfb\x08\xdf\xfc\xdf\xf0\x93\x44\xe0\x13\xe6\xbf\x92\ \x72\x1f\x2a\x41\x39\x0f\x72\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x06\xb8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd7\x07\x04\x11\x23\x35\x0b\x53\xb7\x75\x00\x00\x06\x45\x49\x44\ \x41\x54\x58\xc3\xa5\x97\xdd\x6f\x53\xc9\x19\x87\x9f\x33\x33\xc7\ \xc7\x07\x3b\x8e\x93\x98\xac\x0d\x74\x93\x10\xb3\x0d\xa1\x1f\x44\ \x2a\x52\x43\xa1\x12\xbd\x43\xea\x6a\xb9\x58\x40\x6a\xd4\xa5\xe5\ \x1f\xe8\x1f\xd0\xcb\x5e\xb4\x17\xdb\xab\xed\x55\xa5\xb6\x5c\xb4\ \xf4\x82\xad\xa8\x8a\x44\xb9\x08\xbb\x02\xb4\x04\x2a\x05\x89\x6c\ \x8d\x8d\x12\x05\x27\xa4\x09\x6d\xec\x26\xc1\x1f\x27\xc9\xb1\x67\ \x7a\x91\xf5\x91\x49\x1c\x62\xca\x48\xaf\x66\x34\x3e\x3a\xef\x33\ \xbf\xf7\xc3\x73\x2c\xf6\x18\xe7\xce\x9d\x8b\x1b\x63\x12\xc6\x18\ \xc7\x18\xc3\x76\xd3\x5a\xd3\x6a\xdf\x18\x03\xe0\x6b\xad\x97\x36\ \x37\x37\xcb\x13\x13\x13\xa6\xd5\xfb\xad\xdd\x1c\x9f\x3f\x7f\xde\ \xd5\x5a\x8f\x19\x63\x2e\x34\x03\x68\xad\x01\x5e\xeb\xb8\xe9\x39\ \x5f\x6b\xbd\x68\x8c\xb9\xd5\xdb\xdb\xfb\xc9\xb5\x6b\xd7\x4c\x5b\ \x00\x63\x63\x63\xae\xd6\xfa\x9a\x6d\xdb\x67\xbb\xbb\xbb\x45\x38\ \x1c\x46\x29\xb5\xfd\x74\xaf\x3b\x39\xc6\x18\x7c\xdf\xa7\x54\x2a\ \x51\x2c\x16\xa9\x54\x2a\x7f\x16\x42\xfc\x6c\x7c\x7c\x7c\xb9\xd9\ \x97\x6a\x05\x20\x84\x18\x0b\x87\xc3\x67\x93\xc9\xa4\x70\x1c\x67\ \x2f\x99\x77\xfd\xcd\x71\x1c\x42\xa1\x10\xd1\x68\x94\x67\xcf\x9e\ \x7d\xe0\xfb\xfe\x7d\xe0\x37\xaf\xf8\xda\xee\xfc\xf2\xe5\xcb\x71\ \xa5\xd4\x85\x54\x2a\x25\x62\xb1\x18\xa1\x50\x88\x50\x28\x84\x6d\ \xdb\x28\xa5\x76\x98\x94\x72\x87\x85\xc3\x61\xd2\xe9\x34\x1d\x1d\ \x1d\x48\x29\x71\x5d\x97\x03\x07\x0e\xec\x53\x4a\x7d\xb4\xdd\xdf\ \x0e\x05\xa4\x94\x09\x63\x4c\x22\x16\x8b\xa1\x94\x42\x6b\xfd\x8a\ \xb5\x4a\xbc\xee\xee\x6e\xf6\xef\xdf\x4f\xb1\x58\xa4\x5a\xad\x72\ \xfa\xf4\x69\x06\x0e\x1f\xe6\xaf\xd7\xaf\x33\x37\x37\x87\x31\x06\ \xd7\x75\x71\x1c\xe7\xe8\x9e\x00\x4a\x29\x07\x70\x22\x91\x48\x4b\ \xc7\x8d\x75\xbd\x5e\x0f\xf6\x1c\xc7\xe1\x83\x0f\x2f\xf2\xef\x72\ \x1d\x47\x68\xfe\x59\xac\x51\x40\x04\x0a\x18\x63\x1a\x4a\x46\xdb\ \x01\xc0\x18\x13\x9c\x7e\xbb\xe3\xc6\x5a\x08\x11\xac\xd7\xd6\xd6\ \x58\x29\x7b\xdc\x9a\xad\x51\xf5\x35\x45\x4f\xf3\xa3\x63\x51\x06\ \x06\x06\x98\x9e\x9e\x0e\x9e\x57\x6a\x67\xca\x89\x56\x00\x4a\x29\ \x6c\xdb\x7e\xad\x35\x72\xa3\x91\x1f\xac\x97\xf8\x5a\x87\x42\x5a\ \x16\x07\xa2\x8a\x6c\x61\x93\x77\xbf\x71\x82\x0b\x17\x2f\x92\x48\ \x24\x82\xf7\xfe\xdf\x0a\xec\xa6\x84\xd6\x9a\x74\x3a\x8d\x8c\x76\ \xb3\xb9\xb6\x49\x2a\x2a\x51\xc2\xa2\x3f\xae\x08\x49\x8b\xae\x78\ \x9c\x68\x34\x1a\x24\xe8\x9e\x00\xb9\x5c\x0e\x29\x25\x87\x0e\x1d\ \x42\x08\x11\x9c\xb2\x39\x21\x9b\x01\x6c\xdb\x66\x70\x70\x10\xc7\ \x6c\xf0\xfd\x94\x45\x4d\xb8\x14\xbc\x3a\x87\x42\x1e\xf7\xef\xdc\ \x27\x93\xc9\x50\xab\xd5\x90\x52\xb6\xa7\xc0\x8d\x1b\x37\xb0\x2c\ \x8b\xce\xce\x4e\xa4\x94\x81\xc4\x91\x48\x84\x78\x3c\x4e\x6f\x6f\ \x2f\x52\xca\x00\x00\xe0\xf1\xe3\xc7\x38\xb9\x1c\x00\xa3\x27\x4f\ \x32\xd8\xd5\x43\x7e\x66\x89\x99\x99\x99\x20\xf6\xf5\x7a\xbd\x3d\ \x80\x46\x63\xb1\x2c\x8b\x5a\xad\x86\xef\xfb\x68\xad\x29\x14\x0a\ \xe4\xf3\x79\xa4\x94\xf4\xf4\xf4\x90\x4a\xa5\x88\x46\xa3\x44\x22\ \x11\x2a\x95\x0a\xe5\x72\x19\xad\x35\x9f\x7f\xf6\x19\xa3\xa3\xa3\ \x64\x32\x99\x40\xc1\x06\x6c\xdb\x00\x5f\xf5\x83\x20\xd3\x9b\x33\ \xde\x18\x83\x94\x92\xa9\xa9\x29\xc2\xe1\x30\x9d\x9d\x9d\x24\x12\ \x09\x92\xc9\x24\x4a\x29\x2a\x95\x0a\x13\x13\x13\x94\x4a\xa5\x20\ \x9f\x1a\xce\xdf\x18\xa0\xa1\x44\x63\x16\x42\x30\x32\x32\xc2\x47\ \x3f\xf9\x29\xb3\x33\xd3\x5c\xb9\x72\x85\xa5\xa5\x25\x16\x17\x17\ \xc9\x64\x32\x1c\x3c\x78\x90\xbe\xbe\x3e\x2c\xcb\x42\x29\x85\x10\ \x22\x00\xd8\x2d\x04\x62\x37\x80\x46\x9b\xdd\xde\x6e\x47\x47\x47\ \x19\x5f\x94\x74\xf6\x0d\x73\xe6\xcc\x99\x60\x5f\x6b\xcd\xfc\xfc\ \x3c\x93\x93\x93\x64\xb3\x59\x7c\xdf\x0f\xda\x77\x73\x1b\x7f\xab\ \x10\x84\xc3\x61\x06\x87\xbf\xc5\x2f\x6e\xae\xf2\x47\x0b\x7e\x7b\ \xf6\x7d\x72\xb9\x1c\xb9\x5c\x2e\xe8\x8c\x9e\xe7\x31\x37\x37\xc7\ \xc2\xc2\x02\xa9\x54\x8a\x81\x81\x01\x62\xb1\x58\x00\xf1\x56\x21\ \x18\x1e\x1e\x66\xb1\x2a\xf8\x57\xa9\x46\x7e\xb5\xc6\xa7\x39\x8f\ \x4b\x97\x2e\x31\x3b\x3b\x1b\x54\x44\xa1\x50\xe0\xde\xbd\x7b\xbc\ \x78\xf1\x82\x85\x85\x05\x0a\x85\x02\xa9\x54\x8a\x74\x3a\xfd\x66\ \x00\x4a\x29\x2c\xcb\x22\x99\x4c\xd2\xd5\xd5\xc5\xf0\xf0\x30\xef\ \x7d\x7d\x88\xeb\x73\x1b\xac\xd7\x0c\x11\xdb\xe2\x57\xf7\x57\xd0\ \x27\xe3\xa8\xc8\xb7\x11\xd6\xd6\xe5\xe2\xe2\x77\xa3\xb8\xae\xcb\ \xd5\xab\x57\x31\xc6\xb0\xb9\xb9\x49\x3e\x9f\x27\x9f\xcf\x6f\x75\ \xcc\x76\x01\x1c\xc7\xe1\xc4\x89\x13\x9c\x3a\x75\x0a\xe1\x76\xf0\ \x65\x41\xf3\xa7\x99\x0d\xbe\x78\xee\xd1\x1d\x96\x84\x84\x45\xb5\ \x66\xf8\xe5\x17\xab\x78\xbe\xa1\xea\x6b\xce\xf4\xef\xe3\xdc\x80\ \x60\x7a\x7a\x7a\x87\x82\x2b\x2b\x2b\x3c\x7a\xf4\xa8\x7d\x80\x48\ \x24\xc2\xd0\xd0\x10\x2b\x56\x8c\xbf\x7d\x59\xe1\xf9\xcb\x1a\x5e\ \xcd\x20\x85\xe1\x9d\x88\x60\x9f\x6d\xe1\x7d\xa5\x84\xe7\x1b\x8e\ \xee\x77\xf9\xf8\x07\x5d\x8c\xff\xfd\x2f\x64\x32\x99\xa0\x73\x36\ \x00\xa4\x94\xac\xaf\xaf\xb7\x5f\x05\xeb\xeb\xeb\xdc\xbd\x7b\x97\ \x2e\xca\x7c\x78\x34\x4a\xba\xcb\xa6\x27\x2c\xe9\x71\x25\xdd\xae\ \xa4\xc7\x15\x81\x25\xa3\x92\x9f\x7f\x2f\x4e\xf9\x79\x96\x07\x13\ \x13\x08\x21\x82\x0a\x6a\xae\x22\xcb\xb2\xda\x07\x90\x52\xb2\xb8\ \xb8\xc8\x1f\x7e\xff\x3b\x96\xb2\x93\xfc\xf8\xd8\x3e\x4e\xbf\x1b\ \xa6\x37\x22\x79\x67\x9b\x1d\xea\x90\xbc\xd7\x69\x78\xf8\xf0\x21\ \x5a\xeb\x1d\x37\xa4\x06\x44\xcb\x5c\xdb\xab\x0a\xaa\xd5\x2a\xb7\ \x6f\xdf\xc6\x75\x5d\x8e\xf5\x0f\x93\x5f\xab\xe1\x29\x83\x23\xb7\ \x72\x20\x24\xb7\x42\xb0\x50\x15\xf4\xf7\xf7\xf3\xe4\xc9\x93\x57\ \xa4\x6f\xcc\x42\x88\x37\x53\xa0\xf9\xde\x67\x8c\xa1\x5c\x2e\x63\ \x4b\x2b\x38\xf5\x50\x4f\x88\xef\xa4\x1c\x06\xbb\x6c\x92\x51\x49\ \xb6\xe0\x73\x7c\x64\x64\xd7\xbb\x63\xab\x12\x7c\xa3\x3e\x60\xdb\ \x36\xb6\x80\x84\x2b\x70\x3b\x2c\x8e\x74\x87\x70\x6d\x8b\xe5\x6a\ \x9d\xe7\x2f\x6b\xfc\xa7\x52\x27\x1c\xdb\xba\x1b\x2e\x2f\x2f\xb7\ \xad\x40\x2b\x80\x0d\x60\xa3\x5c\x2e\x13\x8b\xc5\x82\x2e\x68\xdb\ \x36\xae\xb2\xf8\x66\x6f\x08\x55\x5b\xe7\xfe\xdd\x71\xb2\xd9\x2c\ \x47\x8e\x1c\xe1\xf0\xe1\xc3\x1c\x4d\xa5\x60\xa3\x12\xfc\xf1\x6c\ \xbf\xba\xd5\xeb\x75\x7c\xdf\x2f\xb7\x03\x50\x00\x0a\xf3\xf3\xf3\ \x1c\x3f\x7e\x3c\x88\xe7\xea\xea\x2a\x61\x65\x51\x5d\xfb\x2f\x9f\ \xdf\xbb\x47\x2e\x97\x43\x6b\xcd\xe4\xe4\x24\x53\x53\x53\x24\x12\ \x09\x00\x3c\xcf\x0b\x32\xbe\xb9\x95\x97\x4a\x25\x3c\xcf\xcb\xee\ \x50\xba\x55\x05\x02\xce\xf2\xf2\xf2\x0f\xfb\xfa\xfa\xac\x78\x3c\ \x8e\x10\x82\x95\x95\x15\x9e\x3e\x7d\xca\x83\x07\x0f\x28\x16\x8b\ \x81\x03\xcb\xb2\xd0\x5a\x53\x2e\x97\x79\xf9\xf2\x25\x96\x65\xed\ \xb0\xd5\xd5\x55\x6e\xde\xbc\x59\xf5\x3c\xef\xd7\xc0\x3f\xf6\x02\ \x00\xc8\x56\x2a\x95\x91\x7c\x3e\x9f\xee\xe8\xe8\xb0\x5c\xd7\xc5\ \xb6\x6d\x3c\xcf\x0b\xe2\xda\x6c\x0d\x90\xe6\x19\xa0\x5a\xad\x92\ \xcd\x66\xb9\x73\xe7\x0e\x85\x42\xe1\x53\xe0\x63\xa0\xda\xd6\xc7\ \x29\xe0\x02\x63\xc0\x05\x20\x01\x38\xbc\xf9\xf0\x81\x45\xe0\x16\ \xf0\x09\xd0\xde\xc7\xe9\xb6\x11\x7f\x4b\x80\x25\xa0\xdc\xca\x39\ \xc0\xff\x00\x27\xf2\xcd\xbe\x4f\x7b\xc5\xe3\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x00\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ \x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x0c\ \x1c\x11\x27\x1e\x21\xfe\xc5\x50\x00\x00\x00\x06\x62\x4b\x47\x44\ \x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x05\x8d\x49\x44\ \x41\x54\x78\xda\xdd\x57\x5b\x6c\x54\x55\x14\xdd\xf7\xdc\x47\x67\ \xa6\x2d\x9d\xb6\x81\xb1\x0f\xfb\x9a\xb6\x84\xda\xa4\x40\x89\xb6\ \x55\x14\x04\x14\x09\xa6\x14\xe5\x61\xf4\xa3\x1a\xf5\x83\x68\x24\ \x24\x18\xf8\x30\xd4\x18\x7f\x90\x68\x44\x8c\xa2\xa9\x4a\x8b\xd5\ \xf8\xa1\x3f\x7c\x54\x21\x88\x4d\x13\x40\xd2\xa8\xc1\x17\x41\xc1\ \xf0\x2a\x6d\x81\x4e\xcb\x74\x66\xee\xf3\xb8\xce\x61\x28\x76\x78\ \x19\xe3\x94\xe8\x6d\x76\xf6\xed\xbd\xe7\x9c\xb5\xf6\xde\x6b\x9f\ \x3b\x47\xa3\x5b\x7c\xfd\x7f\x08\xac\xdd\xda\x1b\x9a\x37\xb3\x30\ \x6c\xe8\xec\xd0\x92\xc6\x32\x7b\xd2\x08\x54\xad\xfc\x88\x38\x51\ \xeb\xc9\xb3\x91\xb7\xca\x0b\xaa\xb3\xda\x77\xfd\xd4\xcb\x39\x9f\ \xab\x28\x4a\xfa\x09\x54\x2c\xdf\x9e\xe3\xda\xf1\x77\xc2\xc5\xc1\ \xc7\x5a\x1f\x9d\x4d\xae\xdf\x4f\xbd\x7d\x47\xef\x21\x9a\x97\xfe\ \x12\x54\x2c\x7b\xbb\x91\x5c\xf3\xe3\xe6\xfb\x67\x94\x37\x2f\xad\ \x27\x8f\x18\x45\x4c\x97\x86\x06\x07\x08\xd1\xa7\x8f\x40\x78\x45\ \x3b\xe3\xb6\xb9\x31\x2f\x5b\x6d\x7b\x66\xf5\xdd\x5a\x71\x69\x88\ \x2e\xc6\x12\xc4\x39\x11\x60\xc1\x69\x34\x7d\x22\xac\x5c\xd5\x51\ \xc4\xed\xf8\xce\x39\x35\x53\xe7\x2d\x5f\x52\x47\x8a\xa6\x52\x34\ \x1a\x23\x2e\xd0\x29\x49\x20\x71\x31\x3d\x04\xaa\x56\x77\x36\xfb\ \x34\xde\xde\xbc\x68\x7a\xfe\xf4\xaa\x69\x94\xb0\x6d\x52\x60\x12\ \x16\x17\x27\x2e\x53\xef\x5a\xd1\x7f\x97\x00\x80\xfd\x08\x71\x4b\ \x69\x28\xb0\x66\xe9\x7d\xb7\x53\x86\x4f\xa5\xb1\x58\x42\x82\xe1\ \x0f\xf8\x49\x02\x5c\xde\xa2\x04\x37\x26\x80\x6c\xc9\x09\x98\xcf\ \x6f\x4a\xa0\x6a\x55\x67\x2d\x23\xfe\x49\x53\x5d\x7e\x6d\xdd\xf4\ \x5c\x4c\x76\xc8\x34\x21\x37\x85\x91\xc2\xd8\x04\x02\x97\x59\x78\ \x76\x8c\x72\x67\x3c\xcc\x15\xcd\x47\x4c\xf7\x13\xd3\xfc\xa4\xc0\ \x13\xe6\x90\xe7\xd2\x23\xcf\x6f\xa3\xb9\xf5\x95\x07\x41\xa4\x41\ \x04\xa1\x5d\x27\x6a\xb1\xd8\x9a\x9c\x4c\xb6\x65\xfe\xec\x3c\x7f\ \xce\x14\x9d\x62\x71\x93\x54\x55\x25\xc6\x84\x21\xdd\xc2\x14\x96\ \xa2\x78\x4e\xaf\xbd\xb9\x99\xb8\xe7\x91\xc7\x61\x2e\xcc\x73\xe1\ \x5d\x72\x5d\x07\xe6\x12\xc7\xf3\xed\x1d\xdd\x77\xad\x6d\x5d\x7c\ \xcd\x12\x20\xea\x8e\x7c\x2c\xd0\x1e\x2e\xd0\x9b\xeb\x2a\x03\xa4\ \xa9\x22\x6a\x85\x80\x4d\xaa\x46\xf0\x0a\x31\x61\x9c\x0b\x22\x13\ \x08\x88\x32\x8c\x8c\x59\x00\xf5\xc6\x41\x1d\x07\xde\xb1\xe1\x61\ \xd0\x0c\x43\xe6\x07\xcf\x5d\x18\x9f\xa7\x4d\x54\xf9\x8e\xf9\xba\ \xea\x75\xd6\x96\xa8\x45\x53\x83\x1c\xc0\x16\x16\xd1\x49\xf3\x90\ \x2a\x4d\x11\xbd\x2e\x15\xaf\x4a\x30\x85\x00\x8f\x05\xff\xaa\x03\ \x2e\xa3\x77\x31\x1e\xf8\x04\x7c\x00\x7b\xd2\x6c\x0b\x66\xbb\xe4\ \xd3\x19\x06\xba\x13\x45\x88\xde\x16\xfe\xe5\x9c\x0c\x6b\x43\x75\ \x21\x31\x43\xb3\x29\x9e\xd0\xc8\xd0\xb1\x08\x4f\x02\x03\x96\x83\ \xbd\xc4\x02\x00\x09\x0d\x70\xf1\x0c\x7e\x42\x11\x14\x99\x09\x8f\ \x33\xcc\x95\x44\x40\x80\x93\x0d\x12\x16\x08\x04\x0c\xf5\x6a\x02\ \x8a\xe7\x76\x17\x04\xed\x05\xb7\x4d\x71\xc9\x31\x01\x6a\x29\xa4\ \x1b\x19\x58\x48\x02\x63\x40\xb2\xe6\xb8\x65\x00\x67\xe2\x39\x0c\ \x2f\xae\xd8\x78\x33\xe2\x5d\xd2\x7b\x22\x13\x30\x54\x41\x12\x10\ \x54\x73\x32\xfd\x57\x13\xf0\x5c\x0b\xcf\x1c\x1a\x8e\x44\xc9\x40\ \xd8\xaa\xaa\xc9\x08\x20\x65\xc1\x4e\xa0\x22\x60\x38\xa9\x03\x86\ \x77\xd0\x04\x8c\x48\x88\x50\x95\x1d\x21\x2f\xa4\x5f\xe4\x0b\x75\ \x90\x25\x32\x74\x83\xb2\x7c\x1a\x8d\x45\x11\x14\xca\xd9\x3f\x38\ \x42\x07\xfa\x8e\x88\xf7\x29\x04\x1c\x6b\xf1\xc9\x21\x67\x93\xce\ \x9d\x8d\xb1\xe1\x13\x6a\x66\xc0\x4f\xb9\x79\xb9\x14\x0c\x06\x69\ \x4a\x0e\x51\x16\x86\x69\x3a\x49\x30\x0d\x6a\x34\x34\x8d\x7c\x19\ \x3a\xe9\xba\x0e\x6d\xa0\x2b\x92\x65\x70\x41\xc0\x46\xb8\xa6\xa0\ \x81\xb4\x9f\x8f\x8c\x51\xff\x50\x04\x04\x2e\x52\x0c\x2c\x84\x69\ \x62\x21\x4a\xc9\xc0\x1f\xbb\xd6\x39\x70\x2f\x15\x2f\x6c\xdb\xed\ \x0b\x16\x76\xaa\x8a\x59\x72\x61\x38\x4a\x71\x53\xa8\xda\xa5\xcc\ \x2c\x87\x02\x99\xee\x25\x0b\x38\xe4\xf7\xf9\x60\x19\xe4\xf3\x71\ \x64\xcc\x20\x5d\xac\xa2\x88\x7a\xa3\xce\x96\x43\x09\x44\x9b\x48\ \x98\x14\x8f\x3b\x32\x9b\x00\x95\x86\x7b\x89\x98\x5a\x82\xf1\xeb\ \xd4\x9e\xb6\x9e\x82\x7b\x5f\x9c\x69\xa9\x7c\x7b\x5e\x6e\xf6\x8a\ \x0c\xe8\x40\x65\xb2\xf7\x31\x79\xdc\x64\xd4\x3a\x50\x51\x2e\x90\ \x30\x44\xaa\x65\x5b\xd9\x68\x35\x4a\x66\x02\xed\x77\x65\x0e\x80\ \x59\xf2\x1e\x95\x49\x29\x41\xca\xd5\xdf\xb3\x79\x38\xd4\xf8\xdc\ \xca\x81\x33\x63\x4f\x06\xf3\xb2\xb7\x16\x96\x94\x66\x31\x26\x6a\ \xcd\x40\x44\xb6\x1d\x3c\x93\x86\x05\x11\xfd\x25\x12\x72\x8c\x89\ \xb5\x19\x08\x40\xb0\xae\xe2\xc1\x7b\xe4\x09\xd1\xab\x1e\xcc\x25\ \x08\x07\xef\x5d\x2a\x2b\x2f\xa6\xbe\xc3\xc7\xa9\x5c\x29\xbf\xf6\ \x4e\x38\xb0\x7f\x9b\x70\x1f\xba\xf5\x4f\xf5\x46\x47\x22\x5d\x95\ \xb5\x35\x73\xb2\x75\x88\x81\xa7\x6e\xec\x52\xf7\xc9\xfe\xc7\x3f\ \x10\xe8\xeb\x1b\x5a\xc9\x8c\x27\x88\x18\xb2\xa2\xea\x10\xa8\x0e\ \x60\x18\x31\xb9\x0b\x86\xa6\xe5\x53\xb8\xa2\xb4\xb7\x8c\xca\x6e\ \xfe\x31\x3a\xd7\xf7\xc1\xd1\xbc\xba\x27\x9a\x7e\x3c\x78\xf0\x95\ \xc2\xf0\xc0\xfa\xda\xd9\x4d\x0c\xbb\x9c\xd8\x52\xa5\x39\xe8\x1c\ \xdb\xb2\x25\x11\xf9\x25\xc4\x6a\x26\x6a\x1f\xf9\xfd\x80\x72\xbd\ \x35\x5f\x00\xd9\x4d\x24\xc7\xff\xbd\xaf\xe1\x85\x1f\x76\xda\x70\ \x1b\x1c\xab\xe5\xab\xf3\x67\x4e\x74\xcc\x59\xf0\x60\x51\x91\xbf\ \x82\x6c\xdb\x41\xda\x25\x38\xea\xed\x48\x11\x7a\x06\x43\xb4\x37\ \x5e\xb2\x0d\xe3\xda\xfe\xc9\xef\x81\x91\x9f\xbf\xd8\xcb\xab\x16\ \xd7\xed\xfb\xac\xf3\xfd\xea\x86\xc6\x96\xfa\x86\x07\x88\x9b\x42\ \x70\x97\xc4\x26\x37\x48\x8e\x54\x33\x2d\x7d\xbf\x88\x46\x8f\x76\ \x9f\xcf\xaa\x5c\xb4\xfc\x97\x6f\xf6\x3e\xdb\x7f\xec\xc8\x1b\x4d\ \xcb\x1e\x0f\x84\xbc\xa9\x74\x79\x4f\xf4\x20\x3a\xc8\x3d\xbd\xe7\ \x82\xe8\x6f\xbb\x85\x7b\xcf\xf3\x1a\x7b\xba\xdf\xdd\xd2\x75\xc7\ \x43\xcd\xb3\x6a\xaa\xef\x24\x16\xb7\x89\x6b\xa2\x0b\xd8\xe4\x1c\ \x4c\xe2\x27\xf7\xff\xea\x2b\x6e\x68\xf8\xfe\xf3\x4f\x5f\x3d\x5d\ \x73\x78\xdd\xac\x85\x2d\x2c\xdb\x08\x90\xa1\x19\x93\x77\x32\x4a\ \x9c\x3a\x60\xc1\xad\x1f\xf4\xf8\x97\xfb\x8e\x1f\xdb\xd1\xf8\x74\ \x6b\x61\xa8\xb4\x64\x74\xe8\xbb\x49\x3e\x9a\x99\xfd\x87\xf6\xf8\ \xc3\xf3\x67\xf4\x7f\xdb\xb7\xf4\xec\xe9\x81\x63\xb7\xe2\x6c\x88\ \xde\xff\x7a\x14\xd6\xf5\x9f\x3b\x1d\xff\x09\x52\x8c\x88\x1d\x89\ \xb8\x00\xd4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0a\xa0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd6\x00\x00\x0d\xd6\ \x01\x90\x6f\x79\x9c\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\ \xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x0a\x12\x49\x44\x41\x54\x78\ \xda\xb5\x96\x79\x50\x54\x57\x16\xc6\xbf\xf7\xba\x9b\xee\x7e\x0d\ \x4d\x03\xdd\x74\xb3\xc9\xbe\x37\x04\x10\x41\x68\xd9\x44\x56\x05\ \x04\xc3\x26\x8b\xc6\x25\x8a\xa2\x18\x15\x53\x2e\x89\xc6\xa9\x49\ \x8c\xe2\x18\x4c\x2a\xe3\xb8\x64\x9b\xc1\x4c\x74\x80\x38\x51\x23\ \xc5\xbe\x88\x8a\xc1\x88\xa8\x48\x26\xee\x49\xd4\xb8\x94\x49\x34\ \x38\x59\xfa\xcc\x85\xbc\x22\xa4\xca\x9a\x3f\x66\xe2\xd7\xf5\xab\ \xdb\xaf\xeb\xdc\x7b\xbe\x77\xee\x79\xb7\x1f\x46\xd4\xcc\x68\x19\ \x43\xab\x38\x76\x01\x0a\x28\x21\x08\x02\x04\xa5\x00\xa5\x5c\x80\ \xb7\xb7\x37\x86\x45\x44\x28\x2c\x2c\xf4\xce\xc8\xc8\x70\x5e\xbe\ \x7c\x39\x16\xcc\x5f\x08\xbc\x01\x78\xbe\x09\x78\xbc\xf6\x0b\xfe\ \xbb\x81\x82\x21\x09\x0a\x87\x78\xe4\xfd\x1b\x98\xf9\x23\xb8\xf2\ \xfb\x1e\xfc\xf6\xf3\x65\xd8\x73\xb1\x12\x55\x5f\x14\x00\x68\x62\ \x74\x30\xda\x45\x5a\xc1\xb1\xe4\x1c\xd7\xcc\x41\xbb\x4f\x87\x35\ \x99\xeb\x91\x6d\x3f\x13\x13\xa3\xe2\x30\x46\x2a\x66\x6a\x8f\x8b\ \x8b\xcb\x03\xad\x56\xdb\x03\x40\x01\xd1\xd4\xb9\xfb\x3d\x29\x9f\ \x3d\x3c\x55\x7f\xfc\xdb\x83\x87\xdf\xb9\xb3\x6e\xef\x1b\x5f\x97\ \xbd\xb8\xe1\xab\xa9\x59\x8b\x2e\x04\xb9\x10\xcd\xc7\x01\xe7\x3a\ \x34\x0c\x6d\xe1\x5e\xf8\x3a\x8e\x7b\xfd\xfb\x02\x71\xb9\x56\x91\ \x96\x51\x03\x12\x1c\x04\x38\x13\x07\xcc\x07\x66\xd0\xd3\xc0\x1c\ \xc0\x41\xe9\xa4\x0f\x53\x44\x7a\x2b\x7d\x54\x09\x50\x60\x48\x26\ \x91\x99\x6d\x6c\x6c\x08\xc0\x34\xd8\x00\xd8\x08\xcd\xe2\xc1\xc9\ \xd7\x37\x7f\x39\x9f\x16\x5d\x89\xf8\x79\xda\x45\x81\x72\xae\x59\ \x99\xf3\x6f\xaa\x29\xff\xb6\xf2\xce\xd3\x5f\x73\x87\x16\xdd\xf4\ \xcc\xbf\xda\x79\x5b\x0a\x02\x2a\xae\x8c\x07\xd0\x38\x6a\x80\x17\ \x4d\x94\xb1\xb1\x4d\x7e\x84\x93\x4f\x79\xc3\x92\xc3\x66\x8c\x48\ \x80\xc6\x4a\xea\xca\x65\xdb\x24\x28\xcb\x35\x4b\xe5\x1b\xe1\x83\ \xcb\x6e\x8e\x6e\xf4\xca\xa6\x57\x68\xd7\xae\x5d\x07\x3a\x8f\x74\ \x82\x40\xf0\x68\xc6\x2c\xe3\x71\x1c\x1e\x7f\x0a\xf5\xd1\x3d\xa8\ \x8e\x6a\xc3\x5f\x62\x3a\xd1\x9d\x72\x1e\xdf\x4f\xbf\x05\x2a\xbe\ \xaf\xa4\x8d\xdf\x24\xb4\x2c\xbb\x1c\x6f\xd8\x72\x75\xce\x18\x03\ \xac\xec\xe2\x18\xcf\xb5\x60\x89\xaa\x5e\xce\x39\xed\x12\x60\x93\ \x2c\xf8\x6b\x17\x09\x15\x56\x2b\x25\x9b\xa5\x45\xd8\x22\x24\xc9\ \x56\xa4\x95\x4f\x4e\xdb\xb0\x61\xc3\xba\xa6\xa6\x26\x7a\xf8\xf0\ \xa1\xf9\xd2\xa5\x4b\x8f\xb6\x6e\xdd\xea\x5f\x5d\x5d\x8d\xbd\x7b\ \xf7\x72\xf5\xf5\xf5\x30\x44\xa8\xa1\xb2\xb5\x04\x10\xc4\xb0\x97\ \x3c\x55\xc5\x05\x27\x1d\xe5\x76\xa7\x7f\x89\x47\x4b\xbf\xf3\x62\ \x26\x92\x1b\x91\x00\x29\x5c\xba\x00\xd4\x31\xde\x07\xa2\x4e\x58\ \xf2\x49\xad\x1e\x5c\xe8\x21\x0d\xbc\x3f\x50\xf8\x3b\xbd\xcb\x6f\ \xb2\xdb\xc8\x1d\x50\x2d\xc4\x3a\x5d\xa6\x26\xd1\x14\x12\x13\xfc\ \x5e\x55\x8d\xc9\xfc\x90\x4c\xfd\xfd\xfd\x99\x07\x0f\x1e\xbc\x3d\ \x38\x38\x48\xb7\x6e\xdd\xa2\xc6\xc6\xc6\xf5\x03\x03\x17\xb0\xe5\ \xec\x2a\x99\x81\x80\x34\x02\x97\x72\x0f\x7c\xf6\x03\xf0\x1b\xbe\ \x00\xe6\xb1\xeb\x02\x02\x92\xce\xa0\xa2\xe4\xae\x1d\xd5\x0c\x55\ \x52\xf9\x0d\xcf\x19\x98\x7a\xc6\x1e\xb9\x03\xce\x88\x3c\x69\xc1\ \xfb\x9c\x00\x9c\x5a\xe0\x6c\xfc\x48\xd8\xeb\x5b\xa3\xea\x75\xae\ \xb2\x28\x83\x3f\x5c\xed\xe1\xe8\x7a\xe7\x4f\xf7\x1c\xaf\x5e\xbd\ \xea\x7f\xf0\xe3\x8f\x52\xcf\x9d\x3f\x3b\xe5\xd1\xa3\x47\x91\x75\ \x75\x75\x07\xce\x9c\x39\x43\xc3\xea\xed\xed\xed\x03\x20\x61\x20\ \x2c\x31\x10\x88\x00\xdc\x37\x01\xaf\x12\x70\x84\x11\xf6\x31\x24\ \x48\x04\x2c\x3a\xe0\xb0\xe2\x4e\xc4\xbd\xea\x07\x85\x54\x76\xd3\ \x6d\x09\xf0\x6e\x10\x72\xcf\xb8\xf0\x59\x9f\x68\x10\x74\x54\x36\ \x23\xf1\x84\xe3\x77\xd1\xb5\x8e\x3b\x85\x30\xa9\xf3\x5c\xd4\x48\ \xdc\xd7\x79\xf8\x2a\x1a\x15\x9d\xe1\xdd\xe1\x6b\xe7\x9d\x9f\x97\ \xfd\x69\xf3\x69\x53\x43\x73\xc3\x54\x22\x8a\xea\xec\xec\x5c\xb4\ \xbd\x7a\x3b\x6d\xab\x7a\xcd\xbc\xf6\xf9\xb5\x66\x8c\xa4\x05\x04\ \x85\xc0\x5b\x5b\x68\x00\x51\xd1\x3d\x4a\xfe\xd5\x6f\xb2\x24\x1f\ \x3c\x2a\x47\xd9\xe5\xd0\xca\xd5\x77\x63\x69\xda\x4d\xdc\x4d\xee\ \x83\x11\xf1\x3d\x1a\xce\xf2\x28\x0b\x3a\x25\x5b\x3f\xb3\x3f\x94\ \xe6\xf5\xc7\x3f\xbb\xf2\x74\x16\x34\x10\x6c\xfd\x5e\xf6\x09\x91\ \xb7\xc9\x8f\xa1\x15\x84\x16\x50\x6a\x4f\xea\x1c\xfa\x89\xbc\xeb\ \x0f\xd5\x67\xd7\xd4\xd4\x24\xee\xdf\xb7\x3f\x46\x61\xa9\x38\xa5\ \xd0\xcb\xe9\xd9\x97\x67\x93\x7f\x96\xc7\xb6\x19\x6b\xd2\x90\xb1\ \x6c\x0a\x0f\x02\xc2\x5a\x15\x7c\x7a\x9f\x1b\x8f\x02\x00\xe5\x90\ \x16\x5f\xf0\x79\xa9\xe2\xab\xc8\x9f\x33\xae\x59\x50\xf2\x59\x94\ \xa7\x7c\x03\xc0\xf7\x0c\x30\xa9\x0f\x65\xf3\x3e\x8b\xa0\xad\xd7\ \x96\xee\xbf\x4b\x5f\x62\x1b\x95\xf1\xd3\x96\xa7\xcb\x7f\x68\xfb\ \xc1\xce\xa9\xc3\x69\x15\xd7\xca\x7d\x27\x6f\x95\x9f\xcc\xe9\xca\ \x29\xa2\x1f\xc8\x6d\xc9\xf2\x25\xf1\x00\xb2\xb3\x92\x72\xc2\xc7\ \x67\x07\x6d\x85\x27\x28\x6f\x59\x36\x15\xce\xcf\xbb\x0c\x40\x4d\ \x44\xd0\x2d\xe4\xb9\x5a\xf2\xc3\x76\xb2\x42\x78\x87\xc4\x94\x7f\ \xde\xab\xbb\xe4\x92\x0f\x4d\x19\x94\x0e\xc5\x9d\xc4\x92\x49\x04\ \x64\x10\x38\x94\x74\x07\x3b\xbe\x74\x35\xff\x8b\xed\x37\x96\xd1\ \xda\x8b\xb9\xe5\xbb\x6e\xac\xc3\xfa\x73\xc5\x52\xba\x4c\xa0\x17\ \x48\xba\xa0\x65\xa1\x6f\x62\x4f\x62\x1c\x11\xd9\x2e\x5e\x5f\x3e\ \x41\xad\x52\x1b\xe7\xce\x9d\x1b\xe0\xea\xea\x3a\x43\x29\x28\xa7\ \xcc\x2a\x99\x3d\x1d\xc0\xfd\xc0\x00\x23\x55\xae\xa8\x24\x76\x2e\ \x3c\x6d\xaf\xd7\x83\x8f\x16\x64\xc1\x0d\xb2\x98\x84\xe3\x76\x75\ \x99\x7d\xe3\x7e\x4a\xeb\xb7\xa3\x89\x9f\xa0\x3b\xa2\x89\x9f\x18\ \xf4\x2f\x20\xf1\x2a\xf8\xd8\xd9\x0e\x40\x55\xdf\xe2\xe9\x2b\x2f\ \x25\xd2\xaa\xeb\xa9\xb4\xfa\xf3\xec\x35\x6b\xae\x64\xa3\xf2\xda\ \x34\x49\xe4\x69\x05\x87\x4f\xc1\xef\xd9\xff\xba\xba\xbf\xe1\xb4\ \x7e\xc3\x8e\x75\x4e\x33\x8a\xa6\xbb\xf1\x4a\x2e\x6a\x9c\x8f\x4b\ \x40\x5e\x51\x6e\xac\x54\x26\x2d\x2a\x4a\x2f\x09\xd1\x69\x74\x1f\ \x4a\x79\x29\x55\x2c\xaa\xa0\x84\xfc\x49\x0d\xfa\x03\x58\x18\xd6\ \xa4\x3e\x15\x7b\x54\x6f\x4e\x38\x61\x4f\xa6\x6e\xd5\x60\x48\x23\ \x66\xb9\xcd\xd6\x48\x01\x25\x92\x07\xc0\x87\x54\x03\x21\x6f\x02\ \xf8\xf8\xd4\x7e\xaf\xca\x73\xa9\xb7\xa7\xb2\x53\x2b\xef\x33\xd7\ \x5b\xb9\x9f\x7a\x17\xa4\x1e\xf0\x52\xfa\x6d\xb2\x44\xe4\x26\x4f\ \x58\x2a\x82\xa1\xe3\xb3\x25\x00\x54\xef\xba\x1d\x97\x17\xeb\xca\ \x98\x6d\xde\x38\x2f\x7a\xb1\x7b\x54\x64\x74\x91\x3e\x5e\xfb\xcc\ \xb8\x12\xfd\x6e\x59\x1a\xc8\x7b\x9b\xf6\x67\xdf\x5a\x2b\x73\x40\ \x83\x60\x8e\x6c\xd6\x99\xa3\x9b\xed\x8f\x47\x1e\xb2\x2d\x0c\xad\ \xb6\x55\x84\xef\xb4\x46\xc2\xe7\x12\x2e\xf6\x34\xf8\x69\x04\x64\ \x32\x46\xb4\xad\xf7\x39\x6c\xeb\x5e\x99\xf9\xc2\xf9\x19\xf7\xe6\ \x5c\x34\x52\xd6\x05\x3d\x4d\xee\x13\x6e\x84\x1e\xc7\x21\xff\x0e\ \x54\x85\xb7\x5b\xac\x1e\xdf\xa4\x7c\xce\xe7\x2d\xf9\x5a\xaf\x6a\ \xe1\x0f\x91\x35\x6e\x5b\x42\x76\xb8\x1c\x76\xdf\xa9\x3e\xe6\xfa\ \x37\xf5\x4d\xdb\x5d\x12\xd2\xd5\xc8\xcd\xee\xb5\x1a\x73\xe0\x3e\ \xc3\x4f\x29\xef\x45\x90\x69\x73\x60\x6b\x4a\x93\xd1\x98\x38\x71\ \xaa\x24\x6e\xd2\x04\xa4\x5f\xb7\x84\xe9\xb4\x84\x37\xee\x04\x82\ \xf6\x00\xa1\xff\xe0\x10\x5a\xcb\x61\x44\x5b\x4e\x2c\xe5\x96\xd6\ \x66\x63\x6e\xcd\x14\xc7\xf5\x3d\x25\x2b\x56\x9d\xcd\xec\x5c\x36\ \x98\xf2\xed\x82\x81\x49\x34\xe7\x6c\xb8\x39\xbe\xc7\x89\xa2\xbb\ \xf5\x94\x7e\xd4\x9b\x62\x0f\xb9\x93\xa9\xde\x9d\x26\x1f\x36\x9a\ \xe3\xeb\x8c\x64\xaa\x0b\x78\x18\x57\x33\xfe\x4a\xec\x9f\x23\xda\ \x43\x9e\x09\xec\xd2\x38\xaa\xa9\xb4\x78\x16\xa5\x4d\x4e\x3f\x46\ \x44\x60\x70\x61\x75\x56\x92\xa8\x77\xec\x11\xbb\xdf\x01\xb1\x87\ \x0d\x88\x6f\xd1\xc3\xa3\x54\x83\x51\x7d\x42\x6f\x63\xd7\xf9\x17\ \xb9\xf7\x2f\x54\x01\x79\x00\x16\x40\xb2\xae\x22\x5b\x88\x69\x0b\ \x2c\xf2\xef\x72\x1b\xb0\xee\xb0\x7a\xe0\xda\x61\x18\x9c\x75\x2c\ \xed\xa5\xf2\xf6\xdc\xb9\xb3\x77\xe7\xcc\x2e\xac\xce\x98\x5e\xba\ \x39\x37\x2b\x3c\x26\x2c\x23\x60\x5c\x60\x8c\x8b\xda\x35\xcf\x4e\ \xa9\x9b\x0f\x60\x68\xc2\x84\x09\x54\x5c\x5a\x4c\xbc\x94\x8b\x97\ \x70\x12\xd8\xda\xd8\xf2\x6a\x85\x06\xae\xd3\xec\xf0\x58\x6d\x18\ \xc8\x47\x65\xef\x54\x94\xd4\x4e\xe4\xaa\x2f\x2e\x91\xfc\xf1\x56\ \x05\x67\xd3\xae\x06\x1a\xa1\x40\x33\x06\xd0\x02\x62\xe3\x03\x76\ \x5d\x84\x23\x80\x74\xb5\x8c\x07\x60\x65\xaf\x72\xb0\x0e\x09\x0c\ \x0d\xd1\xda\x6b\x4d\x9e\xbe\x9e\xb9\x7e\x46\xbf\x52\x5e\xc2\x9f\ \xb4\xb6\xb6\xa6\xd2\x92\x52\x32\x1a\x8d\x3b\x8a\x8b\x8a\x51\x90\ \x5d\xc0\xe3\x18\xf8\xb1\xff\x37\x63\x19\x91\xd3\x2b\x80\x61\x13\ \x80\xbf\x03\xdc\x47\xe0\x46\x5e\x44\x5a\x65\x8e\x7c\x2b\xf7\x36\ \x0b\x3a\xce\xb5\xe2\x2d\x34\x01\x31\xad\xa1\x16\x44\x04\x83\x9f\ \x56\x05\x39\x9c\x42\xc6\x3f\xe5\x1c\x14\x14\x64\xd2\xda\x69\x53\ \xbd\xbd\xbc\x67\x6a\x34\x9a\x1d\x00\x28\x39\x39\x99\x12\x13\x13\ \xbf\x02\x30\x7a\xdb\x52\xf6\x19\x11\x8d\xf2\x18\xb5\xfd\xc6\x1d\ \x27\x5e\x2b\x18\xfa\x91\xef\x5d\x18\x15\x07\xce\x12\x80\x21\x30\ \x30\xd0\xcb\xd3\xd3\x33\x41\xa7\xd3\x15\xb8\xb9\x0d\x9f\xed\xb8\ \xeb\xee\xee\x4e\x59\x59\x59\xa4\x56\xab\x4b\xb5\x4e\x5a\x70\x47\ \xb8\x29\x68\x87\x35\x5a\xe0\xc7\xd0\x32\x20\xf2\x5b\x89\x65\x1a\ \x0b\x27\x82\x11\x3e\x00\x64\x0e\x32\x8c\x91\x86\xe3\x38\x83\x8f\ \x8f\x4f\xb0\x83\x83\x43\x96\xa3\xa3\xe3\x2c\xb9\x5c\xde\x24\x95\ \x4a\x29\x2d\x2d\x8d\xfc\x02\xfc\x1a\x93\xba\x92\xc0\x4e\xd2\x0f\ \xd9\xfc\x7b\x8c\xeb\x0c\xf7\xd1\xb5\x1f\x67\xe0\xf1\x88\x7b\xd7\ \xc0\xf0\x02\x78\x9e\xc7\xb0\x58\xc9\xc1\x64\x6b\x61\x61\xe1\xcc\ \x4e\xc6\x68\xbd\x5e\x5f\xc4\x7a\xa0\x0a\x80\x39\x38\x24\x98\x4c\ \xe1\xa6\xfb\x58\x8a\x45\xe8\xc6\x2d\x34\x83\xd0\x3a\x42\xfe\x98\ \x35\xff\x77\xb1\x3b\x07\x4b\x3c\x0c\x0f\xc0\x4e\xa9\x54\x7a\x18\ \x0c\x86\x74\xf6\x8e\x58\x01\xe0\x8a\xb5\xc6\x9a\xe2\x4c\x71\xa4\ \x9a\xa4\xda\x87\xb3\x78\x1e\x4d\x30\xb3\x84\xfb\x19\x45\x0c\x88\ \xfc\xff\x92\x48\x24\x90\x32\x01\xd0\x31\x13\xc1\xf6\xf6\xf6\x85\ \x6c\x1b\xfe\x09\x80\xc2\xc2\xc2\xc8\xdd\xd5\xbd\x17\x80\x9c\x6b\ \xe7\x96\xe3\x08\xac\xd0\xfc\x3b\x26\x1f\x5b\x0d\xb6\x2d\x72\x00\ \x0e\x0a\x85\x22\x96\x35\xdf\x46\x00\x43\xac\x2f\xcc\xfe\x01\xfe\ \x04\x20\x8d\x01\xcc\x81\x0c\x27\xc1\x8f\x1a\x68\xc3\xef\x2b\x66\ \x42\x01\xc0\x9d\x99\xc8\x67\x45\xe9\x97\xc9\x64\xe4\xe7\xe7\x47\ \x2a\x41\xf5\x57\x5f\xf8\xc2\x61\xa2\x03\x6f\xb7\xd8\x0e\x78\x28\ \x3e\x51\x4f\x42\xac\x1a\x2a\x00\xc1\x2c\xf9\x1e\x00\xc4\x9e\x0c\ \x62\x8f\xe8\x1d\x00\x8e\x10\x43\x9e\x54\xe2\xd1\x9e\x60\xb2\x64\ \x14\xb1\xdf\xee\x0b\x82\x60\x66\x7d\x41\x00\xca\x20\xb6\x0d\x03\ \x2a\x95\x0a\x4f\x5a\x06\x46\x13\xdb\x96\xe1\x97\x14\x62\x5b\xd2\ \xce\x9a\x12\xec\xe0\xc2\x93\xd6\xd8\x32\x97\x32\x88\xf5\xc4\x8f\ \xc3\xfd\x00\x60\xa2\x58\x2d\x9e\x19\xfa\xaf\x93\x79\x86\x94\x61\ \xc1\x90\x33\x14\x0c\x25\x43\x78\x0c\x4a\x11\x85\x18\x6b\x21\x22\ \x11\xfb\xa1\x8f\x6d\x0b\x79\x78\x78\xdc\x88\x8e\x8e\x0e\x4a\x4a\ \x4a\x42\x64\x64\x24\x17\x1a\x1a\xfa\x6b\x42\x71\xa2\x9a\x61\xcf\ \x18\xc7\xf0\x62\xf8\x33\x8c\x63\x08\x14\x7f\xf3\x63\xf8\x88\x31\ \x1e\x0c\x37\x71\x8e\xb3\xd8\x68\x06\x71\x1d\x1d\x43\xc5\x88\xb1\ \xb5\xb5\x5d\x98\x93\x93\x33\x1c\xc3\x33\x53\x72\xf1\xe6\x78\x8c\ \x11\xcf\x90\x31\x04\xd1\x88\x9d\xb8\x88\x83\xb8\xa8\xf3\x18\x9c\ \x18\x8e\x63\x92\xe9\xc5\x58\xad\x38\xcf\x86\x61\xcd\xb0\x12\x9b\ \x51\xca\x92\x42\xf2\x8b\x2c\xc4\x5c\x1c\x44\xfd\x07\xcf\xba\x95\ \x22\xfd\xc9\x7e\xbc\x00\x00\x00\x22\x7a\x54\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x00\x78\xda\x2b\x2f\x2f\xd7\xcb\xcc\xcb\ \x2e\x4e\x4e\x2c\x48\xd5\xcb\x2f\x4a\x07\x00\x36\xd8\x06\x58\x10\ \x53\xca\x5c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\xb8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x03\x4a\x49\x44\x41\x54\x78\xda\x62\ \xfc\xff\xff\x3f\xc3\x40\x02\x80\x00\x62\x04\x11\x16\x93\x1e\x1a\ \xfe\xff\xf7\x57\xf0\xef\xcf\x1f\x4c\xff\xfe\xfe\x65\xf8\xf7\xf7\ \x1f\xc3\xbf\x3f\x20\x0c\x65\x23\xf3\x41\xf4\x3f\x08\xfd\x17\x2c\ \xff\x9f\xe1\x3f\x48\xec\xef\x5f\x14\x3d\x7f\xc1\xfc\xff\x60\x71\ \xb0\x3c\x5c\xcd\xef\x0f\xff\xce\xa7\x9f\x07\x5a\xfb\x0f\x88\xff\ \x03\x04\x10\xa3\xc5\xe4\x47\x89\x8c\x4c\xcc\xf3\x44\xf9\xd9\x80\ \x06\x02\x35\xfe\xfe\x0f\xa1\xa1\xf8\xcf\x6f\x18\x1b\x28\x0e\x64\ \xff\x01\xab\x81\x8a\x81\xf9\xff\xe1\x6c\x14\xf5\x40\x73\xfe\xc0\ \x2d\xfe\xc7\xf0\xff\x1f\x90\xfe\xfd\x87\xe1\xdf\xcf\x57\x0c\xff\ \x7f\xbe\xca\x67\xb8\x52\x38\x07\xe8\x80\x1f\x00\x01\xc4\x02\xb2\ \xdc\x54\x4d\x80\x41\x46\x98\x8b\xe1\xf7\x6f\x06\x30\xfe\xf5\x0b\ \x15\xff\x44\x66\xff\x44\xa3\x41\xe2\x3f\x21\x7c\x38\x1b\x48\xff\ \x06\x86\x2d\xd0\x0d\x0c\xff\x40\x61\xcc\x0a\x0d\x6f\xa0\x23\x18\ \xbf\x9f\x60\xf8\xcf\xf6\x7f\x22\x90\xb7\x09\x88\x5f\x00\x04\x10\ \x13\x48\x1c\x6e\xf9\x1f\x88\x03\xfe\x00\x69\x60\x48\xc2\xf1\x5f\ \x24\x0c\x34\x83\x01\xe8\x21\x30\x0d\xc6\x50\xb1\x7f\xff\x51\xe9\ \xff\x20\x8c\x9e\xbc\x98\x98\x18\x18\xff\x8b\xc0\x78\x20\x06\x07\ \x40\x00\xb1\x80\x58\x20\x9f\x80\x2c\x05\x39\x00\x99\xfe\xfb\x07\ \xd5\x72\xb8\x23\xfe\x42\x1c\x81\xe2\xa0\xbf\x98\x0e\x22\x90\xbe\ \xd9\x80\x98\x19\x20\x80\xc0\x0e\xb0\x96\x44\xf2\x01\xcc\xd0\xbf\ \x08\x83\xff\xe2\xc1\xe8\x21\xf4\x07\xe6\x78\x60\xe2\x04\xf1\x61\ \xb9\x0c\x42\xfd\x67\xf8\xf9\x86\x8b\xa1\x6b\x19\xc2\x15\x00\x01\ \xc4\x02\x14\x63\x70\x90\xa3\x5e\xb6\x02\x59\xf8\x1f\xec\x99\xff\ \x50\xf6\x7f\x28\x1b\x22\xf7\xe9\x23\x27\x8a\x03\x00\x02\x88\x89\ \x9a\xe5\x00\x36\xcb\xff\x43\xa3\x02\xd9\x31\xc8\x00\x20\x80\xa8\ \xe6\x00\x5c\x96\xa3\xf2\x41\x0e\xf8\x87\xa2\x0f\x20\x80\x58\xfe\ \x23\xb9\xa8\xa9\xa9\x09\xa7\x05\x75\x75\x75\x44\xa9\xc3\x05\x8a\ \x8a\xca\xa0\x39\x07\xd5\x01\x00\x01\xc4\x82\x9c\x54\x91\x2d\xc1\ \x07\x90\xd5\xe1\x0e\xf6\xff\x68\xe9\x80\x01\x6b\x14\x00\x04\x10\ \x45\x51\x40\xaa\xe5\xd8\xa2\x00\x20\x80\x98\xfe\xff\xfb\x4f\x91\ \xe5\xc8\xf1\x8b\x69\x39\x03\x86\x1a\x50\xf6\x44\x06\x00\x01\xc4\ \x82\x1c\x02\xb4\x4c\x03\xb9\xb9\xc5\xd0\xd0\x42\x0d\x01\x80\x00\ \x42\x49\x84\xc4\xa4\x01\x90\x21\x35\x35\xb5\x58\x7c\x4a\x1c\x1f\ \xdd\x01\x00\x01\x44\x52\x1a\xc0\x0c\x72\xd2\x2c\xc7\x96\x08\x01\ \x02\x88\x89\x81\xc8\x34\x80\x6e\x39\x72\xe9\x46\x4a\x48\xa0\x87\ \x00\x40\x00\x11\x9d\x06\x60\xc1\x0e\xc2\x6d\x6d\xad\x24\xa7\x81\ \x8c\x8c\x42\x88\x63\xfe\xa2\x3a\x00\x20\x80\x58\xfe\xff\x63\xc0\ \x9b\x06\x30\x7d\xce\xc0\x50\x5e\x5e\x85\x35\x24\x88\x0d\x19\x64\ \x00\x10\x40\x78\xd3\x00\x36\xcb\x31\xf9\x0c\x38\x1d\x83\x35\x1a\ \xd0\xec\x00\x08\x20\x02\x0e\x20\x64\xf9\x7f\x92\x43\x02\x1d\x00\ \x04\x10\xd1\x75\x01\x72\xb0\x77\x77\x77\x90\x9c\x06\x92\x93\xf3\ \x20\xc1\x8f\xe6\x08\x80\x00\xc2\x5a\x17\xe0\xab\xd1\x40\x3e\x2f\ \x2a\x2a\x27\x2b\x24\xb0\x45\x01\x40\x00\x61\x14\xc5\xf8\xab\x53\ \xf2\xa3\x01\x5b\x19\x00\x02\x00\x01\x84\x92\x06\x08\x59\x8e\xdf\ \x31\xb8\x13\x20\xb2\x3c\x7a\x42\x00\x08\x20\x70\x1a\xf8\xfc\xf9\ \x1b\xb8\x80\x80\x15\x95\xff\xa1\x34\x84\xff\x1f\x45\x0e\xab\x9a\ \xff\x48\xe2\x50\x4b\xe0\xd6\x20\x47\x3b\x50\xfc\x37\xa8\xc1\x88\ \x04\x00\x02\x08\x5c\x10\x99\x34\xdd\x82\x77\x20\x40\x3d\x9b\xbf\ \xe8\x3d\x1d\xe4\x1e\x0f\x72\x8f\x09\x4d\x0e\xbd\x90\x21\x06\x00\ \x04\x10\xa8\xdb\xc0\x07\xc4\xb2\x40\xcc\x4f\xe7\x6e\xe1\x47\x20\ \x7e\x0c\x10\x40\xb0\x7e\x0b\x27\x52\xff\x85\x5e\x00\xd8\x05\x62\ \xf8\x0e\x10\x40\x8c\x03\xdd\x3b\x06\x08\x20\x26\x86\x01\x06\x00\ \x01\x06\x00\x37\xa7\x3b\x50\x1d\xe2\x87\x14\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\xda\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x07\xa1\x49\x44\x41\x54\x78\xda\xd5\x57\x79\x54\x54\xd7\ \x1d\xc6\x2a\x35\x36\xc7\x0a\x0a\x08\xca\x80\x30\x33\x20\x3b\xb2\ \x0c\xfb\x30\x0c\x03\x61\x33\x30\x20\x9b\x44\xd3\x10\xa0\x04\x18\ \x04\x37\x5c\x18\x4b\xac\x82\x26\x24\x42\x53\x69\x4c\x48\xaa\x69\ \x40\x83\x1a\x2d\xa9\xa8\x6c\xc5\x28\x14\xb5\x4a\xa9\x01\xec\xc2\ \x11\xd2\x63\x1a\xa1\x16\x9c\x61\x87\x79\x5f\xef\x7d\xe4\x9d\xaa\ \x13\x59\xda\xfc\x93\xef\x9c\xef\x5c\xe6\x9d\x3b\x7c\xdf\x6f\xbb\ \xf7\x8d\xce\x1c\x60\x40\xb8\x60\x96\x3d\x4b\x75\xbe\x2b\x2c\x59\ \xb2\xc4\x94\x2c\x2e\x84\x4e\x7c\x3e\xbf\x42\x99\x9f\xcf\x58\x09\ \x85\xfd\xe4\xb3\x94\x3e\x7f\x8a\x12\x47\x07\xc7\xaf\x76\x6c\xdb\ \x36\x65\x60\x60\x50\x4e\xbf\x43\x9f\xcf\x46\x56\x63\x06\x04\x80\ \xa0\xa1\xa1\x11\x8a\xcc\x2c\x38\xd8\x3b\x30\x3c\x53\x1e\x53\x55\ \x55\x85\xa7\x51\x5d\x5d\x0d\xe3\x95\xc6\x8c\xa7\x87\x27\x93\x9d\ \x95\x85\xda\xda\x5a\xcc\x05\x6c\x30\x33\x60\x9f\x5c\x2e\x47\x42\ \x7c\x02\x48\xf4\xb0\xb3\xb1\x85\xbf\xaf\x18\xf1\xf1\xf1\xf8\xa2\ \xa3\x03\x25\x25\x25\x38\x5a\x56\x86\x7b\xf7\xee\x41\x1a\x20\x85\ \xc4\xdf\x1f\x76\xb6\x76\xf8\xf9\xeb\xfb\x11\x17\x1b\x8b\x58\xc2\ \x93\xa7\x4e\x61\x78\x78\x18\x83\x8f\x1e\x3d\xc1\x47\x84\xb3\x19\ \x48\xcc\xdb\x99\x87\xb4\x94\x54\xa6\xf0\xc0\x41\xc8\xa3\xa2\x10\ \x1e\x1a\x86\x88\xb0\x70\xb8\x38\xaf\x23\xd9\x70\x84\xa3\x93\x0b\ \x42\x43\xc3\x21\x93\x05\xc3\xcd\xc5\x15\x51\x2f\x46\x22\x24\xf8\ \x05\x6c\x88\x8e\x41\xf1\xe1\x37\xf0\xee\xd1\x32\xe4\xe6\xe4\xa0\ \x8c\x98\xa4\x26\x54\x2a\xd5\xe3\x9c\xd1\xc0\x0f\x52\x5e\x4d\x51\ \xb5\x5c\xbd\xc6\x1c\x2e\x2a\x82\xc8\xcd\x1d\xbe\xde\x3e\x94\x24\ \xd2\x00\x78\x79\x78\x22\x50\x2a\xc3\x3e\xe5\x3e\xe4\xef\x51\xc2\ \xcb\xdb\x1b\xde\x9e\x5e\x90\x88\xfd\xd9\x3d\x7e\x3e\xbe\xec\x9e\ \xea\xf3\xd5\x68\xb9\xd6\x8c\xb4\xd4\x54\x7c\xfd\xe0\x01\xd4\x6a\ \x35\xd4\x43\x43\x1c\x67\x34\x90\x5e\xfe\xde\xfb\xc8\xd9\x92\x03\ \xb1\x9f\x1f\xd6\x39\xad\x83\xed\x5a\x1b\x78\xb8\x8b\x58\x01\x37\ \x57\x37\xbc\x48\xa2\xfd\xf4\xec\x19\x34\xd6\x37\x40\x4a\xcc\xd0\ \x0c\x70\xe2\x3e\xc4\x50\x66\x7a\x06\xf6\x17\xbc\x8e\x8a\xdf\x7c\ \x8c\xba\xcb\xb5\xc8\xcd\xcd\xc5\xd8\xd8\x18\xcd\x04\xc7\x67\x1a\ \x58\x14\x2d\x8f\xfe\x57\xf5\xf9\xdf\x32\x97\x2e\x5e\xc4\xd1\x77\ \x7e\x89\xe8\x28\x39\xf4\xf5\xf4\x60\xc6\xe3\x51\x13\x54\x84\xcd\ \x8a\xb3\x93\x33\xbc\x48\xe4\xee\xc4\x10\x7d\xc6\x45\xee\x29\xf2\ \xc0\x9b\x87\x0e\xe3\xdc\x99\xb3\xb8\xda\x74\x05\x0d\x75\xf5\x58\ \x1f\x11\x81\xfe\xfe\x7e\x8c\x8c\x8c\x4c\x73\x74\x84\x33\x10\xf0\ \xe4\xa0\x1b\xac\x48\x57\x64\x29\x10\x1c\x14\x04\x89\xa7\x3b\xc2\ \x64\x12\x36\x0b\xcb\xf5\x97\x63\x8d\xb9\x39\x84\x7c\x3e\x64\xd2\ \x40\xf8\x78\x79\x43\x16\x28\xa3\x35\xa7\x91\xd3\xbf\x59\xe1\x8d\ \x09\x89\x64\xdf\x1a\x88\x7d\x7d\x21\xf3\xf3\x42\x48\x80\x18\x41\ \x81\x81\xc8\x56\x28\x50\x48\xca\x39\x39\x39\x89\xd1\xd1\x31\xa8\ \xfe\xd6\x83\xce\x94\x54\x9c\x94\xcb\xcb\xa8\xee\x4d\x7b\xfb\x69\ \x03\x42\x81\xa0\x47\x2c\x72\x61\x5e\x0e\x74\x45\xfe\xe6\xf5\x78\ \x7b\x7b\x1a\x8e\x15\x29\xb1\x39\x21\x16\x42\xa1\x10\xde\x44\xf8\ \x67\xa4\xf6\x99\xaf\x65\xe0\xe5\xcd\x9b\x91\xfc\x4a\x32\x76\xe5\ \xed\xc2\x1b\x24\xe2\xf8\xd8\xb8\x69\x53\x12\x5f\x24\x4a\x5c\xa1\ \x7c\x45\x8e\xd2\xbc\x74\x7c\xf8\x66\x01\xd6\x87\x04\xc3\xc5\xc5\ \x05\x0c\xc3\x90\x06\xec\xc7\xd7\x15\xd6\xe8\x0e\x0b\x42\xab\x89\ \x09\x6e\x08\x04\x97\xb9\x04\xac\xb2\x25\xa3\xb6\x7e\x9d\x05\xd2\ \x5c\x8c\xb0\xcd\x6b\x15\x94\x21\xb6\x50\x46\x7a\x20\x4d\x6c\x0d\ \x63\x43\x03\x88\xdc\xdd\xb1\x35\x27\x97\x4d\x7b\xe3\xef\x1b\xd1\ \xd4\xd4\x44\xd3\xce\x3e\x0b\x96\x05\xc1\x5a\x20\x84\xdc\xd9\x0c\ \xaf\xba\xae\xc4\x0e\x09\x1f\x45\xb1\x5e\x28\xda\x28\x41\x9c\xa7\ \x35\x56\xac\x30\xc4\xad\x5b\x6d\x78\xd8\x60\x85\xae\xd3\xc6\x90\ \x58\x0b\x71\x5d\x77\x31\x2e\x2e\x5d\x8a\xab\x0b\x17\x26\x51\x03\ \x96\x0e\x0e\x8e\xd8\xe4\x64\x84\x1d\xde\xc6\x78\x3f\xc6\x1e\xc7\ \x37\x79\xa2\x40\x6a\x81\x22\xb9\x13\xdc\xec\xd7\x22\x3b\x3b\x1b\ \x5d\x77\xef\x62\x70\x70\x90\xa4\x72\x14\x1c\x7b\x7a\x7b\x91\x4f\ \xce\x0a\x37\x47\x3b\x6c\xb0\xd1\xc3\x1e\x89\x05\x3e\x48\xf2\x40\ \x79\x8c\x1d\xf6\xfb\xaf\x46\x41\x98\x1d\x4c\x4d\x2d\x51\xfb\x2b\ \x4b\xf4\x5d\x32\x86\x8d\x35\x1f\x46\x2b\x57\x21\xd6\x4d\x67\xea\ \x23\xfd\x05\x28\x5f\xa0\xb3\x51\x87\xc2\xd4\x94\x37\x92\x97\x10\ \xca\x1c\x8f\xb2\xc2\x35\x85\x1f\x9a\x73\xa4\xf8\x38\xce\x1e\xb9\ \x01\x42\x78\x91\x5a\xd7\xd7\xd7\x63\x68\x78\x98\xe5\xf0\x74\x43\ \x51\x03\x6c\x87\xdf\xb9\x73\x07\xce\xe4\x8c\x48\x17\x5b\x11\x61\ \x5b\x34\x65\x07\xe0\x0f\x5b\xc4\xf8\x24\xd6\x1a\xca\xc4\x20\xf0\ \x78\x6b\x30\xd6\x6c\x0e\x6f\x77\x3e\x2c\x2c\x2c\xe0\x24\x58\x88\ \x9e\xd3\x0b\xf0\xa7\x8f\x16\x17\xd3\xd1\x9f\xae\x81\x89\x89\xd4\ \x4f\x2c\x41\xc5\x81\xad\xcc\xad\x03\x49\x68\xd9\x1b\x8d\x9a\xa2\ \x2c\x28\x77\xe7\x21\x95\xcc\xf3\xc4\xc4\xc4\x7f\xc5\x89\x30\x27\ \x3e\x3e\x3e\x0e\x8a\xed\xdb\xb7\x93\xb9\x4f\xc1\x67\x85\x0a\x5c\ \xd9\x2d\xc7\xed\x83\x49\xa8\x2e\xce\x43\x50\x48\x24\xae\x94\xdb\ \x20\x36\xdc\x0e\x02\x81\x00\x66\xc6\xcf\xe1\xef\xa7\x74\x71\xfd\ \xbd\xc5\xf5\x44\x56\x8f\x70\xa1\x0e\x87\x65\x3f\x5e\x26\xb0\x59\ \xbb\xf6\x7c\x64\x44\x84\x8a\x9e\xeb\x3b\xc9\x3f\x2d\xff\xe0\x43\ \x56\x64\x68\x68\xe8\x5b\xc5\xa9\x31\x4a\x8a\xca\xca\x4a\x24\x27\ \x27\x43\x91\x91\x8e\xec\xcc\x4c\x28\x92\x83\xd0\x76\xda\x0d\x7b\ \x32\xdc\x61\x69\x29\x80\xa1\xa1\x1e\xda\x7e\xad\x8b\xfe\xab\x52\ \x10\xb9\x4d\x33\xdd\xa0\xbe\x00\xa8\x00\x1b\x35\x2b\x4e\x56\x36\ \xed\xda\xe2\x74\xc4\xd8\x75\x6a\x6a\x0a\x1c\xc6\x1e\xde\x06\xfe\ \x1c\x88\xf2\x43\xa1\xe0\x99\x59\xc2\x90\xd4\xbd\xb1\x74\x11\xbe\ \xaa\x31\x27\xf7\x49\x17\x35\x10\xc7\x46\xff\x0c\x48\x41\xa0\x52\ \xab\xe7\x2c\x4e\x57\x6a\x80\x9d\x77\x55\x2f\x46\x6e\x47\xa2\xf9\ \x74\x02\x78\xe6\x42\xac\x5c\x65\x81\x53\x05\xba\x78\x70\x41\x0f\ \x4d\x8d\x97\xe8\x25\x46\x0d\x84\x53\xa1\x19\x0d\xd0\x33\x9c\xad\ \xfb\xdc\xc4\x09\x27\x31\x36\xfa\x08\xea\xb6\x97\xd0\x59\x97\x02\ \x4b\xa1\x1d\x56\x9b\x09\x71\x64\xcb\x8f\x30\x70\xf9\x39\xd4\xfd\ \xee\x38\xae\xb7\xb6\x62\x60\x60\x00\x54\x63\x36\x03\x5a\xd1\x73\ \xe2\x74\xd5\x16\xd7\x60\x4a\xa3\x81\xaa\xfd\xa7\xe8\xbb\xa5\x80\ \x9d\xbd\x23\xe9\x78\x21\xb6\x26\xe9\x61\xa8\x5e\x17\xb5\x67\x0b\ \x51\x47\x8e\xe6\xce\xce\x4e\x10\xcc\xd9\x80\x56\xf4\x94\x9c\x30\ \x27\x4e\xa9\x61\x80\xc1\xf6\x1c\xa8\xbb\xf6\xc2\x43\xe4\x0a\x3e\ \x5f\x88\xc4\x50\x13\x8c\x36\xea\xa2\xe1\x93\x74\x9c\x39\x7b\x0e\ \xcd\xcd\xcd\x34\x98\x39\x1b\xf8\xb6\xe8\xb5\xc4\xe9\xca\x80\x88\ \x77\x28\x81\x2f\x0f\xe2\x85\x00\x67\x22\x2e\x80\xcc\xc7\x0c\xea\ \xba\xc5\x68\xad\x8a\xc0\xb1\xf2\x13\xec\x9b\xd3\xfd\xfb\xf7\xd9\ \xa0\x34\xf3\x30\xf0\x54\xf4\xda\x26\x68\xe4\x03\x77\xdf\x22\xe2\ \xf9\x48\x88\x74\x65\xc5\x5d\x9d\x2c\xd1\x7f\x61\x09\x6e\x56\xd8\ \x60\xe7\xae\x02\x14\x17\x17\xb3\xaf\x6a\x5d\x5d\x5d\xe8\xee\xee\ \x66\x3a\xee\xfe\x95\x1a\xf0\x9c\xcd\xc0\xe3\x9d\xcf\xd5\x5e\x2b\ \xf5\x23\xc3\x43\xf8\x67\x73\x22\x32\x37\x0a\xb0\x86\xcc\xba\x95\ \x95\x00\xdd\x67\x9e\xc7\x3f\x6a\xf8\x38\x50\xf4\x36\x4e\x9c\x38\ \x81\xf6\xf6\x76\x50\x68\x34\x53\x4c\x4f\xcf\x3d\xb8\x8b\xdc\x72\ \xf4\xf4\xf5\x7f\x38\x37\x03\xda\x9d\xcf\x91\x6d\xbc\xbe\x2f\x3b\ \xd0\xf3\x45\x35\x5e\x8a\x0b\xc4\x6a\x9e\x00\x7f\x3c\xbe\x8c\x9c\ \xf9\x06\xe4\x7e\x50\xa2\xb4\xf4\x17\x34\x72\x7a\x13\x92\xfd\x13\ \xac\x78\xcc\x86\x98\x7c\xfa\xee\x41\x45\xe6\x62\x40\x6b\xf4\x28\ \xb9\xda\x53\xfc\xe5\xe6\x49\xdc\xa8\xd9\x89\x2b\x15\x21\xa8\x2e\ \xb5\xc2\xe4\xe7\xcf\xe3\x27\x9b\x62\x70\xe4\x48\x09\x6a\x6a\x6a\ \xa6\xb3\x46\xbe\xd3\xdb\xdb\x83\x8c\xcc\xd7\x0e\x71\x87\xcf\x7c\ \x0d\x3c\x31\x7a\x5c\xfa\xd5\x2a\x15\x2a\xdf\x49\x46\x53\x65\x14\ \x6a\x8e\xf9\xa3\xfe\x5c\x21\xea\x6b\x2f\xb2\x17\x17\x07\x4e\x7c\ \xf7\xde\x5d\xef\x72\x3f\x6e\xe6\x6e\xe0\xb1\xfa\x6b\x1b\xd0\x90\ \x77\xc3\x2a\x2c\x5f\xbe\x02\x9f\x5f\x28\xc1\xe8\xb0\x1a\x93\x1a\ \x06\x0f\x1f\xfe\x1b\x2d\x2d\x2d\x20\x20\x7b\xc7\x19\x2a\xbe\x87\ \x8a\xcf\x13\xd4\xc0\x33\x1b\x90\x92\xe2\xc2\x67\x9f\x62\x62\x7c\ \xec\x9b\x06\xd3\xb0\x7b\xfb\xfa\xfa\xd0\xda\x7a\x1d\x0c\xa3\x61\ \x6b\x9e\x91\x95\x51\x44\xaf\xdc\xef\xda\x00\xcd\x02\x15\xa5\xa4\ \x4d\xf6\x84\x81\xb6\xb6\x36\xa6\x87\x44\x1e\x1f\x1f\xb7\x9b\x13\ \x9f\xbf\x81\xff\x11\x43\xa3\xe3\xb8\xd1\xd6\x0e\x91\x87\x48\xc1\ \x35\xdc\xbc\xa1\xab\xab\x2b\xa0\x26\xfe\x0f\x8a\x0c\x8d\x8c\x16\ \xe9\x7c\x5f\xf0\x1f\x30\x1f\x06\xab\x8e\x52\x17\x9e\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xbd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x02\x84\x49\x44\x41\x54\x78\xda\x63\x64\xa0\x10\x30\xe2\ \x92\x38\x7d\xfa\xb4\xf4\xe7\xcf\x9f\x37\x70\x72\x72\x4a\x7c\xfa\ \xf4\xa9\xcb\xdd\xdd\x7d\x32\x41\x03\x8e\x1d\x3b\x26\xf1\xee\xdd\ \xbb\x19\x40\xe6\x6f\x20\x16\x32\x37\x37\x77\x62\x66\x66\x66\x78\ \xf4\xe8\xd1\xc7\x3b\x77\xee\x2c\x10\x12\x12\xb2\xfc\xfa\xf5\xeb\ \x74\x5f\x5f\xdf\x05\x58\x0d\xd8\xb4\x71\xe3\x4e\x73\x0b\x0b\x37\ \x90\x26\x18\xf8\xff\xff\x3f\x03\x23\x23\x44\x19\x88\x7e\xfc\xe8\ \x11\xc3\xeb\x37\x6f\x4c\x5c\x5d\x5d\xcf\x62\x18\xb0\x71\xe3\xc6\ \x5d\xa6\xa6\xa6\xae\x4c\x4c\x4c\x38\xfd\xfc\xf2\xe5\x4b\x86\x17\ \x2f\x5e\x98\x00\xbd\x84\x30\x60\xdf\xbe\x7d\x4c\x6f\xdf\xbe\x4d\ \x97\x90\x90\x68\x50\x54\x54\x14\xc3\x17\x68\xbf\x7f\xff\x66\x38\ \x71\xe2\xc4\x5a\x29\x29\xa9\x4a\x7b\x7b\xfb\xdb\x8c\x50\x9b\xfd\ \x94\x95\x95\x37\xf2\xf1\xf1\x31\xfc\xfb\xf7\x0f\xee\xdc\x07\x0f\ \x1e\x7c\x04\xfa\xf9\x8d\x82\x82\x82\x32\x17\x17\x17\xdc\x10\x16\ \x16\x16\x86\x93\x27\x4f\x1e\x0f\x0e\x0e\xb6\x02\x1b\xb0\x7e\xdd\ \xba\x1a\x4d\x2d\xad\x66\x64\xbf\xbf\x78\xfe\x9c\xe1\xe3\xc7\x8f\ \xda\x3e\xbe\xbe\xd7\x16\x2f\x5a\xb4\x16\x18\x36\x41\xc8\x61\x71\ \xf3\xc6\x8d\xcf\xde\x3e\x3e\x7c\x60\x91\x6d\x5b\xb7\x2a\x7d\xf9\ \xf2\x65\x37\xd0\x10\xa5\xbf\x7f\xff\x42\x0c\x78\xf1\x82\xe1\xfb\ \xb7\x6f\xd2\x81\x41\x41\xcf\x66\xce\x9c\x39\xcf\xc2\xc2\x22\x11\ \x14\xa0\x20\xf0\xed\xdb\x37\x86\xbb\x77\xee\xd4\xc4\xc6\xc5\xb5\ \xc2\x03\x71\xee\x9c\x39\x93\xf5\x0d\x0c\x72\x90\x9d\x79\xed\xda\ \xb5\x1b\x5f\x3e\x7f\x3e\xa7\xae\xa1\x11\xc5\xcb\xcb\x0b\xf7\x1e\ \x30\x5a\x7f\xb3\xb2\xb0\x88\xfa\xfa\xf9\x7d\x84\x1b\xb0\x6c\xd9\ \xb2\x97\x2a\x2a\x2a\x62\x30\x17\x80\x9c\xc9\xce\xce\xce\x00\xf2\ \xd6\x8f\x1f\x3f\x18\x60\xe2\x20\x00\x32\x08\xe8\x85\x94\xa4\xe4\ \xe4\xb9\x70\x03\x26\x4d\x9c\xb8\xd2\xc6\xd6\x36\xec\xcf\x9f\x3f\ \x0c\xbf\x7e\xfd\xc2\x1a\x03\x20\xc3\xd8\xd8\xd8\x18\x9e\x3d\x7b\ \x06\x4a\x0f\xaa\x59\xd9\xd9\x77\xe0\x06\x00\xfd\xa9\xf0\xf1\xc3\ \x87\x32\x1e\x5e\x5e\x6b\x1d\x1d\x1d\x3d\x98\x73\x61\x00\x94\x36\ \x80\x51\xfd\xe6\xde\xbd\x7b\x5b\x80\x61\x71\xb4\xa4\xa4\x64\x0e\ \x4a\x42\x9a\x35\x6b\x16\xf3\x99\x33\x67\x78\x59\x98\x99\x9d\x3c\ \x3d\x3d\xd7\xf2\xf1\xf3\x83\x53\xe1\x4f\xa0\xf3\xb9\x79\x78\xc0\ \x6a\x8e\x1f\x3f\x7e\x00\x98\x47\xe2\xd4\xd4\xd4\xde\xc9\xc8\xc8\ \x7c\xcb\xc8\xc8\xf8\x0f\x37\xa0\xb9\xa9\x89\xf5\xf2\x95\x2b\x32\ \x40\xbf\x2b\xca\xcb\xcb\x47\x01\x5d\x11\x02\xf4\xe7\xc1\x37\x6f\ \xde\x5c\x36\x35\x33\x4b\xff\xfc\xe9\xd3\x93\x8b\x97\x2e\x4d\xfd\ \xfe\xfd\xfb\x35\xa0\xf2\x3b\xc0\x58\x79\x5b\x58\x58\xf8\x17\x25\ \x29\x57\x55\x55\xb1\x00\x03\x8c\x05\xe4\x62\x20\x66\x05\xfa\x99\ \x09\xea\xca\xff\x40\x2f\xfd\x01\x06\xe4\x5f\xa0\xab\xfe\x02\x53\ \xe1\xef\xf2\xf2\x72\xb0\x1f\x01\x06\xd5\x24\x20\x57\x92\xb9\xc4\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\xce\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x07\x4b\x49\x44\ \x41\x54\x78\xda\xc5\x57\x5b\x6c\x9c\x47\x19\x3d\xdf\xfc\xd7\x5d\ \xef\xae\xed\xf5\x35\x59\xdf\x73\xb7\x93\x40\xd3\x5c\x68\xd2\xd2\ \x14\x24\xc2\xfd\x22\xd4\x08\x95\x07\x78\xe1\xa2\xbe\x10\xd4\xc2\ \x03\x12\x2a\x95\x0a\x82\x16\x91\x8a\x07\x10\xd0\x07\x54\x28\x54\ \x89\x44\x1f\x40\x82\x20\x55\x80\x42\x15\x10\xa9\xdb\x26\x21\x57\ \x12\xe3\xfa\x12\x67\xbd\xeb\xb5\x77\xff\xfd\xef\x33\xc3\xfc\xeb\ \xd4\x51\x12\xdb\x84\x12\xa9\x67\x75\x76\x66\xb5\x3b\x73\xce\x77\ \xbe\x59\xe9\x1f\x92\x52\xe2\xff\x01\x81\x48\xe2\xed\x6f\x72\xc7\ \x06\x0e\x1e\x25\xad\xb2\x66\xfd\x03\x39\xab\xf5\xe1\x1e\xab\x7f\ \x6f\x21\xd5\xbf\x76\x6d\xaa\xbf\xad\xc5\xc8\xd3\x7c\x58\x5a\x98\ \x0d\xa6\x66\xae\x05\x93\xff\x28\x05\x13\xbf\xd6\xa4\xf7\xf2\x4f\ \xee\x3d\x19\xdd\x15\x03\x3b\x5f\x2d\xa4\x6d\xdf\xfc\x8a\x49\xc6\ \x63\xdb\x5b\x76\xb6\x0d\x66\x87\xd0\x6e\xe7\x91\x36\x6c\xd8\x9a\ \x09\x8e\x08\x95\xb0\x82\x52\x54\x82\xe3\xfb\xf0\x03\x17\x63\xce\ \xa9\x79\x08\xf1\xc3\xb8\x29\x7e\xe6\xc8\xf0\x19\x07\xb7\xe0\xf0\ \xa5\x47\x7b\x36\x64\xdf\xdd\xfd\xd1\xee\x2f\x9e\x5c\xd5\xc0\xae\ \xe3\x7d\x9f\xb1\xa0\xfd\x60\x4f\xfb\x83\x6b\xb6\xe7\x87\x11\x50\ \x15\x91\x0c\xb1\x1a\x74\x32\x00\x6e\xe2\xd4\xdc\x28\x16\xdc\x89\ \x22\x11\xbe\xf6\x8b\x9d\xa3\xcf\xe3\x3a\xbe\x34\xba\xe7\x5b\x9b\ \x5a\xf6\x3d\x91\x86\x5e\xf9\xf2\xd0\xd3\xf9\x65\x0d\x10\x88\xbd\ \xeb\x77\x6b\x9f\x2e\xb4\xf5\x3c\xf6\x50\xe1\x7d\x10\xe4\x82\x4b\ \xfe\xbf\x9e\x0d\xcc\x45\x0b\xb8\x56\xfd\x17\x24\x0f\x9e\xf5\xc7\ \xd6\x3d\x9e\x5d\x37\xf6\xcd\x8c\xd1\xfd\xc4\x48\xfb\x7d\x78\x7d\ \xe6\xb7\xf8\xd1\x3d\x27\x48\x5f\xee\x50\x6d\x7a\xb1\xf3\xa5\x8d\ \x3d\x5b\x3e\x3e\xd2\x35\x82\x72\x54\xc4\xdb\x85\x06\x03\xeb\x9a\ \x77\x62\xc1\x2f\x1d\x2a\x0d\x5d\xf8\x90\xad\x77\x6f\x6a\x6b\x1a\ \x42\x29\x9c\x5d\x32\x79\x5b\x02\x1b\x7e\xde\x76\x78\xf3\xda\x6d\ \x87\x36\x0f\xac\x87\xc7\x5d\xac\x06\x5b\x4b\x81\x4b\x89\x58\x04\ \x90\xb8\xb1\x0f\x03\x81\x96\x2a\x22\x34\x69\x4d\xd0\xa4\x0e\xc1\ \x04\x6a\x51\x15\x19\x3d\x8b\xb9\xda\x1b\x58\xb3\xe3\x6f\x37\x27\ \x30\xf0\xb3\xfc\x67\x7b\x9a\x7a\x0e\x15\x0a\x05\xcc\x06\xe5\xdb\ \x2b\x22\x0d\x0b\xb1\x87\x71\x77\x1a\xa5\xa0\x84\x49\x6f\xa6\xd1\ \x9a\x76\x33\x8f\x56\x2b\x8b\x1e\xab\x0b\x85\x54\x27\x52\xcc\x04\ \x11\xe1\x2d\x4f\x01\x57\x06\x25\x96\x4c\xea\x64\x81\xcb\x5b\xfe\ \x05\x85\x9f\x16\x52\x96\x17\x8e\xdd\x7f\xdf\xfd\x5d\xae\xee\xe1\ \x56\x24\x8b\x4e\xd7\x2e\xe0\xac\x62\x02\x46\x84\x9c\x96\x69\x88\ \xd4\xb8\xa3\x44\x0d\x58\xa4\x23\xad\xa7\xb0\x2d\xbb\x11\x9d\x76\ \x07\x08\x4b\x1e\x20\xaf\xcb\x27\x7a\x19\x23\x8b\x30\xb8\x82\xea\ \xe5\xbe\x1b\x09\xc4\xe5\xda\x53\xc3\x03\x5b\xbb\x4a\x34\x0f\xc9\ \x6f\x6e\x0b\x07\xc3\x89\xf2\x2b\x70\x94\x50\x07\x6f\x81\x3c\x1b\ \xa1\x23\x50\xa3\x17\x3a\x9a\x65\x08\xbb\xd5\xca\xd5\x9a\x00\xa3\ \xcf\x82\x2f\x3d\x5c\x72\x2e\xa1\x12\x54\x30\x90\xee\x87\xa6\x69\ \x37\x89\x73\x08\x58\x3c\x82\x90\xc0\x48\xc7\x2c\x18\x14\xe8\x20\ \x69\xa6\x63\x7e\xc1\xe8\xb1\xe1\x44\x1e\xea\x91\xbf\xc4\x30\xe6\ \x78\xa5\xfc\x77\x84\x32\x40\x76\xc2\x42\xee\xaf\x86\xdf\xea\x59\ \xcf\x68\x46\xb4\xed\xdc\x77\x8b\xd9\x33\x4f\x4e\x35\x0b\xae\x0f\ \xa6\x2b\xe6\x93\x99\x7f\x9a\x6e\x6f\xdc\x85\x0c\x99\xf0\xe2\x2a\ \xa6\xfc\x71\xc4\x71\xd4\x60\xa4\x18\x72\xc5\x38\x46\xa0\x46\x90\ \xc4\x74\xb6\xb6\xd8\x82\xce\xa7\x32\x1f\xec\x6f\xe9\xfb\xbd\xdc\ \x6e\xde\xda\x73\x39\x11\x4c\xcb\xab\xc1\x8c\xd8\x12\xf4\xf2\xe8\ \xa2\x7b\xce\xb6\xcd\x03\xa7\x0f\x4d\x17\xb1\x0c\xf6\x3c\x37\x30\ \xc8\x38\x9d\x68\xde\x9c\xe9\xaa\xc9\x1a\x04\x24\xf2\x86\x3a\x13\ \x7a\x06\x22\xa9\xfe\x7a\x02\x39\x33\x03\x8b\xca\x30\xa5\x58\x6c\ \x01\xd7\xe4\x27\xec\x6e\x4b\xce\x71\x4f\x02\x48\xc8\x13\xfa\x32\ \x8c\x94\x78\xd4\xa7\x77\x06\xf2\x5a\x38\x9f\xea\xc6\xfe\x53\x9f\ \x9f\x5e\xc0\x0a\xd0\x32\xe2\xd1\xf6\xd6\x7c\x57\xc4\x42\xa4\xa4\ \x0e\x92\x1a\x34\x02\x84\x88\x95\xb8\x40\xac\xc8\xa1\x28\x42\x84\ \x9e\x40\xbd\xdd\x47\xc3\x80\x8c\xe4\xb0\xc8\x90\xe7\x8b\x30\x11\ \x0e\x15\x03\x45\xb7\x18\x16\x5d\x00\x7e\x7b\x90\x76\xdd\x66\xef\ \xfb\xa7\x3e\x5d\x5a\x51\xfc\x81\x63\x03\x5f\xef\xe8\x6b\x7b\x9c\ \x91\x04\x13\x1a\xb2\xd4\x0e\xc6\xcc\x44\x54\x91\x83\x2b\x4a\x09\ \xf8\xd2\x05\xe2\x08\x99\x28\x46\xb6\x58\x5f\x34\x60\x93\x65\x39\ \x70\x4a\x9e\xf0\xc3\x44\x50\xd1\x23\x90\xeb\x4a\xcf\x6b\xd2\x2d\ \x2f\xf6\x23\x8f\x6c\x9c\xc0\x0a\xf8\xdc\x99\x87\x7a\x87\xba\x0b\ \xdf\x33\x62\x80\x25\x95\x93\xd6\x88\x3b\x96\x00\x27\x42\xc0\x95\ \x09\x11\xa2\xce\x1d\x84\xe0\x68\xd2\xb2\x88\x3c\x59\xac\x7b\xbb\ \x16\x0d\x64\x0c\x0b\x73\x70\x66\x03\x1e\x04\x6f\x19\x10\x52\xf8\ \x8a\x5e\xb7\xd5\xe2\x3b\xd3\x7e\xf5\xca\x99\x72\x05\x1f\xc1\xb2\ \x48\x33\x74\x3a\x75\x59\x9d\xa8\x96\xd5\xce\x04\x8a\x49\x20\x82\ \x24\x0e\xa8\x77\x52\x23\x29\x20\x47\x16\x18\x23\x80\xc5\x13\xaa\ \xed\x07\x8f\x3c\x7c\x04\x3a\x1a\x10\x73\x5e\xec\xb2\x1a\x0b\x02\ \x02\xf9\x44\xa4\xc4\xb9\x9f\x98\x61\x24\x03\x21\xe1\x60\x18\x2b\ \xe2\xc7\xc3\x7f\x7a\x15\x40\xf3\x4d\x2d\xf9\x55\x3f\x8e\x3f\x32\ \x8e\xff\x86\x86\x81\x6a\x10\x8e\x2b\x77\xb9\xb2\xac\x2d\x26\x20\ \x91\x8c\x8d\xf9\xd5\x60\x21\xd8\x9c\xef\x0e\x36\xea\x5a\x0e\xc0\ \x02\xee\x00\xef\x79\xa1\x07\x62\x81\xe9\xbb\x9f\xed\x95\x42\x4a\ \x71\xf2\xab\x93\x72\x55\x03\x4e\xe8\xbe\xd9\x4b\x6b\xba\xc7\xe4\ \xd2\x01\x6c\x8c\x09\x9d\x28\x08\x72\xcd\x76\xe8\x54\xeb\x7d\x00\ \x4e\xe3\x0e\xc0\x3d\x62\x83\xeb\xdb\xb4\x2b\xa9\x12\x37\x23\x9d\ \xed\xfb\xc3\xa0\x34\x23\x4d\x9a\xb1\x8e\x63\x9f\x3a\x2f\x6f\x33\ \x40\x26\xce\xa5\x7c\xdd\x82\x95\x08\x27\xbc\x61\x44\x27\x16\x3a\ \x96\x17\x66\xac\xd4\xc0\x3d\x7f\xee\xbc\xf8\xda\xfe\x62\x80\x55\ \xb0\xf7\x97\xeb\x91\x13\x29\xeb\x4d\x7d\x4e\x5c\x76\x4b\x88\x55\ \x06\x91\xe0\xd2\xff\x58\xbc\x6c\x0a\x0c\x09\x34\x39\xaa\xd5\xb4\ \x0a\x80\x84\xf3\xd7\x59\x55\xe2\x55\x93\xb4\xda\x85\x5a\xb1\x56\ \xe8\x6c\xa9\xeb\xc2\xdc\xb2\xfb\x2f\x6b\xb4\x55\x7b\x5a\x87\x5e\ \xd8\xd2\x82\x49\x31\xcf\x2c\xd2\x49\xad\x87\xff\xe1\x58\xae\xfa\ \x48\x46\x20\x0c\x7d\xbb\xfd\x11\x7b\x97\x8e\xb3\xd1\x4c\x04\x20\ \xd6\x40\xa1\xc9\xf4\xc8\x62\x5a\x64\x90\x16\xe5\x8d\x74\xc4\x04\ \xdc\x7e\x3b\x3f\x5f\x0d\xfc\xa2\x88\x64\x78\xe2\xc0\xb8\x6c\x54\ \xfd\xd2\x20\xa4\x27\x28\x17\xa7\xa9\x77\x7d\x2b\x1d\xf7\x2f\x31\ \x55\x39\x8b\x92\xea\x25\x8f\x93\x04\x4a\x07\xea\x72\xc5\x33\x20\ \xd5\xab\x29\xb6\x5e\x7f\xaf\xb3\x61\xf0\xac\x35\x13\x13\x10\x1b\ \x4c\x8b\x13\x61\xc5\xd8\x54\xf3\x50\xc4\xc9\xdc\x4b\xa5\xcd\x68\ \x21\xf4\x52\x5b\x3b\x7a\x8d\x4f\xfe\x71\x2b\x67\x21\xf1\x91\x96\ \x35\xe2\x74\x30\x29\x9b\x36\x19\x62\xd4\x1f\x97\x16\xd3\x85\xa6\ \x0c\x30\xc9\x41\xa2\x91\xf3\x8a\x58\xfa\xca\x45\x78\xfe\xc2\x85\ \x6b\x95\xdd\xf6\x80\xa3\xa2\x6f\xd0\x20\x56\x57\xa2\x0d\x9a\x4a\ \x5c\x19\x09\xc6\xab\xe5\x90\x6b\x32\x3e\xef\x4e\xf3\x74\x97\xc5\ \xad\x1e\x43\x8c\x59\x45\x69\xf5\xe8\x72\x36\xaa\x61\xf4\xc1\x29\ \x79\x6a\xff\x55\xa9\x7e\x2b\x4c\x52\x64\x9a\x54\xeb\xef\xec\xa9\ \x38\xf3\x1d\x2b\xbf\xa3\xaf\xaf\x77\x66\x6d\x2d\x9e\x8d\x16\xb8\ \xaa\x84\x5b\xa4\xc8\x12\xaa\x24\x48\x8f\xd4\x86\xbe\x32\x16\xe9\ \xa4\x71\x9d\x48\x10\x91\x24\x90\x4c\x70\x6c\xef\xc5\x65\x63\x5e\ \xf7\x72\x1b\xed\x68\xed\xc7\xd1\x1d\xa3\x72\xc5\x04\x12\x38\xdf\ \x08\xe6\x4e\x4e\x8d\x4f\x8d\xc4\x5d\x6e\x4e\x4f\xb9\x3a\x98\xa7\ \x53\x83\x4a\x54\x0b\x0c\xc6\x42\x55\x95\x32\xd1\x30\x25\x2c\x66\ \xc8\x14\x33\x84\xcd\xf4\x15\xc5\x13\x5c\x7e\x7f\x59\x7a\x93\xfe\ \x9d\xdf\x0b\xb2\x87\x8d\xd6\x03\xf7\x6e\x35\xa6\x58\x45\x94\xc3\ \x7a\x22\x20\x12\x41\x7b\x31\x89\x48\x25\x21\x92\x88\x55\x12\x52\ \x23\x86\x17\x77\xbd\x71\xf7\x6f\x46\x99\xe7\x52\xd6\xbe\x0d\x03\ \x66\xbe\x35\x25\xce\x57\x66\x92\x83\x25\x6d\x66\xf0\x86\x19\xd2\ \x44\xf2\xd9\x60\x1a\x5e\xd8\xf9\xda\xd2\x06\x77\xfd\x6a\xd6\x7a\ \xd4\x66\x6d\xad\x19\x2d\x04\xc7\x07\x0a\x9b\xe4\xbf\x2b\x73\xd2\ \x24\x26\x93\xc8\x7f\xb3\xe7\xcc\x2a\xc2\x77\xf1\x6e\x48\x47\x09\ \xf9\x5c\x8a\xda\xed\x0c\xf6\x74\xf6\xe1\xf9\x2d\x27\x97\x16\xdc\ \x35\x03\xef\x24\x18\xde\x61\xfc\x07\x3b\x00\xdf\x09\xb1\xdb\x7c\ \x84\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xad\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x06\x2a\x49\x44\ \x41\x54\x78\xda\xc5\x57\x7b\x4c\x93\x57\x14\xbf\xb4\xa5\xef\x77\ \xe9\x83\x52\xa0\x1f\x6d\x11\x69\x29\x53\x40\x5b\x11\xa6\x18\x74\ \x02\x3a\x94\x49\xd4\x0d\x11\xe3\x4c\xa6\xc4\xcd\xa1\xd3\x85\x29\ \x59\xb2\xcd\x91\x19\x03\x19\x3a\x23\x9b\x6e\x1a\x66\x82\xd9\xd4\ \x8d\x44\x81\xb8\x38\x1f\x30\xdd\x2b\xbe\x75\xa2\x2c\x6e\xce\x49\ \x34\x3a\xd4\x4c\x51\x39\xfb\xdd\x46\xfe\x59\x00\x15\x9b\xd8\xe4\ \xc7\xfd\xee\xfd\xce\xbd\xe7\x77\xcf\xf9\xdd\x73\x3f\x18\x11\x3d\ \x53\x3c\xd2\x00\x3f\x91\x5c\x2e\x17\xd0\x46\x3e\xee\xa2\xf8\x69\ \xf8\x9c\x70\x11\x90\x68\x34\x9a\x0f\xd0\xaa\x9e\x80\x40\x34\xe6\ \xac\x08\x0b\x01\x0e\xb3\xd9\x3c\x0f\x0b\x2e\x9d\xc4\xd8\x22\xbe\ \xbb\x81\xec\xb2\x19\x1b\x13\x64\x6c\x94\x56\xab\xdd\xac\x54\x2a\ \xd3\xc3\x46\x00\x3f\x83\xcb\xe5\xaa\x1f\xcf\x58\x71\x11\x63\xe5\ \xe8\xcb\xfa\xb1\xd1\x2d\x60\x6c\xab\x99\x31\x4f\x6c\x6c\xec\x06\ \xf4\xa5\xe1\x24\x20\x31\x18\x0c\xeb\x54\x2a\x95\x3f\x8b\xb1\x91\ \x65\x0a\x45\xb9\x89\xb1\x52\x9b\xcd\x96\xac\xd3\xe9\x5c\x29\x8c\ \xcd\x9d\xce\xd8\xc2\x0c\x95\xca\x86\x48\x4d\x45\x04\x56\x61\x4e\ \x44\x38\x09\xa8\x05\x41\xe8\xc4\xe2\x05\x7c\xa7\x32\x69\xc4\x9e\ \xd2\x42\xe3\x49\x87\x3d\xea\x5f\x8f\x60\xea\x2e\xce\x51\x9e\xc4\ \x78\x03\x20\xb5\xdb\xed\xcb\x1d\x0e\xc7\x6e\x2e\xda\xb0\x11\x30\ \x1a\x8d\xb1\x3e\x9f\xaf\x0d\x8b\x9a\x9a\xb6\xe7\x1d\xfe\x68\xa5\ \x70\x27\x2b\x60\x25\x85\x42\x4e\x6a\x95\x9c\x52\xbd\x51\xb4\x7a\ \xa1\xb8\x7b\x53\x8d\xf0\x2d\x6c\x1d\x99\x99\x99\xed\x9c\x74\xd8\ \x08\x44\x45\x45\x45\x7b\xbd\xde\xb5\x5b\xeb\xec\x07\x7a\xbb\x86\ \xd3\xa6\x5a\x23\x39\x9d\xce\x10\xa2\xa3\xa3\x49\xaf\xd7\xd3\x92\ \x22\x31\xfd\xf1\x8b\x96\x56\x57\xc6\x34\xe6\xe6\xe6\xd6\x81\x80\ \x32\x9c\x29\x90\x43\x03\x0d\xef\xcf\x17\xf7\xa6\xf9\xf4\x14\x1f\ \x1f\x4f\xf5\xf5\xf5\x54\x5d\x5d\x1d\x7a\x06\x41\x44\x43\x41\x12\ \x31\xa3\xb7\x4b\xd8\x3d\xbf\xdf\xbf\x86\xd7\x8f\x70\x12\x88\x00\ \x36\xcb\x64\x32\x32\x99\x4c\x21\xa7\x35\x35\x35\x54\x55\x55\x45\ \x71\x71\x71\xa1\x31\x14\x1e\x6e\xd8\x87\x35\xe1\xac\x84\x52\x88\ \xaf\xac\x42\xa1\xde\x5e\x6a\x32\xf7\x16\x58\x6d\x54\x98\x26\xd0\ \x94\xac\x61\x34\xd2\x9b\x48\x23\xbc\x2e\xca\x0f\x3a\x29\x37\xc9\ \x4e\x05\x46\x23\xbd\xa6\x37\xde\x2f\x97\x29\x3f\x01\x59\xf7\x53\ \x13\xe0\x61\x84\xf3\x8a\x09\x6a\xdd\xf5\xc3\x22\x4d\x6f\x27\x13\ \xd3\xdf\x98\x72\x23\x5e\x4d\xbf\x1f\x9a\x4a\x63\x33\x03\x34\x26\ \x18\xa0\xd6\xcf\x5e\xa0\x7f\xec\x7a\xba\xca\x18\xde\x8b\xe8\x34\ \x53\xf6\x8e\x8d\xb2\x9e\xc6\x71\xcc\x78\xd4\x71\x1c\xcc\x79\x24\ \xce\xfd\x44\x8b\xc5\x72\xb3\x55\xa4\xbd\x7c\x1e\x0b\x5f\x82\xf9\ \x35\xe0\x3a\x72\x9e\xe7\xf7\x53\x6a\x6a\x2a\x65\x64\x64\x50\x26\ \xda\x1b\x42\x02\xdd\x50\xa9\xa9\x0b\xef\x2f\xca\x14\xb4\x5f\xa4\ \x39\x97\x92\x92\x72\x02\x6b\xa4\x3c\x11\x01\x1e\x72\x94\xd1\xc9\ \x28\x30\xd5\x6e\xb7\xfb\xd3\x77\x64\xba\x8d\xcb\x1c\xf1\xb4\xc9\ \x62\xc1\xee\xe0\x1c\xb9\xbe\xbb\xec\x2d\x7a\xa3\xa4\x84\x92\x92\ \x92\x08\x82\xa3\xe1\x68\x6f\xa5\xa5\xd3\xcd\x68\x7b\x88\x60\xa3\ \xdb\x4d\xbb\x62\x5d\x0f\x2a\xa4\xda\x55\x31\x31\x31\x6b\x13\x13\ \x13\xeb\xa0\x95\x09\x8f\x24\xc0\x43\xce\x1d\x43\x54\xef\xf1\x33\ \x0f\x28\x6a\xd4\xa6\x53\x38\x82\x34\xce\xe5\xa2\x3f\x25\x12\xea\ \x16\x04\xba\xbf\x73\x27\x75\x6c\xd9\x42\x53\x12\x3d\x34\x33\x30\ \x8a\x6a\xb3\x32\xa9\x67\x6c\x16\xdd\x76\x0a\x74\x5a\x26\xa7\xe4\ \xe4\x64\x5a\x90\x9d\x4d\xcd\x2a\xd3\x3e\x5e\x0f\x90\x8a\xd1\x28\ \x50\xeb\xb1\xee\x07\x3c\x25\x83\x46\x00\xe2\x71\xf1\xd2\xfb\x90\ \x90\xbe\xd2\x64\xfe\xcb\xe3\xf1\x50\x16\xd4\x7e\x85\xe7\x5f\xad\ \xa6\x3b\xf9\x05\x74\x65\xdc\x38\x6a\x4e\xf1\xd2\xd1\xe2\x69\xd4\ \x53\x38\x95\x7a\x82\x99\x74\x2b\x2e\x9e\xae\x8a\x44\x94\x0e\x5b\ \x14\x2e\xfa\xce\x33\xfc\xd7\xbe\x5b\x14\x3f\x3b\x60\x7b\x52\x11\ \x5a\x57\xc5\x0b\xb7\x9f\xc3\x82\x5f\xe2\x9c\x5f\x86\x79\x97\x58\ \x42\x37\x1d\xb1\x74\x29\x71\x18\x35\x27\x24\xd0\x99\x9c\x1c\xea\ \xc9\x7e\x9e\xba\x92\x7d\xd4\x0d\x6d\x70\x21\x6e\x00\x49\x01\x91\ \x6a\x4d\xf1\x5f\xc4\x1a\xc6\x21\x9f\x82\x34\xc6\x5c\x3f\xba\xdd\ \xbd\x67\x23\x22\xa8\x35\x32\x92\xf2\x71\xcc\xe2\xcc\x66\x9a\x69\ \x30\x52\x1b\xda\xdd\x66\x0b\x75\xf8\x53\x69\x3b\x42\x1f\x83\x7e\ \x3a\x08\x70\xbb\xe3\x88\x42\x03\x08\x9f\x1f\x1d\xb8\x05\x02\x51\ \x43\x26\x30\xd7\x60\x48\x39\x04\x85\x1f\x07\x81\x8d\x10\x1f\xaf\ \x78\x46\x90\x70\xe9\x74\x54\x09\x07\x4d\xc8\xf7\x09\x88\xd3\x81\ \x52\x8c\x4a\x19\x7a\x97\x80\xa2\xd4\x89\x65\x3b\x61\x73\x2a\x3b\ \xbb\xc7\xc6\x98\xf9\x69\xea\x80\xa1\x65\x44\xda\xb5\x36\x8d\x86\ \x1a\x21\x40\x5e\xf3\x21\x52\x4a\x44\x88\x97\x4a\xa5\xb4\x0b\xd3\ \xcf\xa1\x3a\x46\xa3\x0f\xa1\x85\xde\xd9\x80\x0b\x18\x3f\x0b\xdd\ \xb4\x05\x82\x1d\x5c\x84\x4f\x43\x40\xd9\xe0\xf3\x1d\x69\xb6\xdb\ \xe9\x20\x4c\x17\xc3\x99\x01\xce\x66\xc1\xf9\x01\x44\xe5\x2b\x8c\ \x9d\xc1\x58\x09\xfa\x38\xef\x64\x03\x56\xa2\x7f\x12\xe3\x3f\x07\ \x02\xb4\xd3\xe7\xdb\xc3\x8f\xf5\x90\x09\xe0\x82\x09\xce\x8e\x8b\ \xfb\xbe\x11\xbb\xc1\x6e\x43\x24\x8e\x03\xe7\x80\xa3\x40\x23\xf0\ \x1b\x1c\x5e\xe0\xcf\xc8\xfb\x36\x00\xb2\xa7\xbd\xc0\x3e\x88\xf3\ \x15\xab\x75\x07\x08\x68\x87\x42\xa0\xaf\x26\x6c\xc8\x53\x6a\xab\ \x2a\xa1\x83\x02\xec\xb2\x16\xbb\x6e\xc1\x94\x76\xe0\x10\xd0\x00\ \x9c\x02\x81\x63\x68\x7f\x02\xf6\x03\x75\x20\x31\x1e\x63\x0d\x59\ \xd9\xf7\x05\xa3\xb1\x05\xba\x98\x3f\x54\x02\x72\x14\x8f\x46\xb4\ \xc6\x02\xa7\x70\x99\xe7\xd8\x02\x85\xd7\x62\xca\xd7\xc0\x0e\x60\ \x3d\x08\xed\xc6\x58\xd3\xc3\xb1\x8f\x01\x25\x9c\x5b\x70\x22\x2a\ \x04\xcf\x0f\xdc\xb9\xd5\x6a\xe5\x6b\x88\x87\x42\x40\x8f\xf2\x79\ \x04\xad\xa2\x88\xc9\xca\xfd\x0e\x47\x28\xcf\x39\xd8\xe1\x3a\x4c\ \x9b\x0f\xe7\xaf\xe3\xb9\x1c\x04\x96\xa0\x5f\x03\xcc\xc0\x58\x24\ \xfa\x79\x4e\xe7\x83\x62\xb1\xb2\x10\x95\xef\x45\x7c\x9e\xf1\x35\ \xa4\x43\x21\xe0\xc0\x45\xc4\x55\x6c\x06\xe4\x45\x11\xd2\xf6\x04\ \x38\x9c\x04\x27\x55\xdc\x19\x30\x19\xcf\x6e\x38\x9c\x83\xe7\xa5\ \x40\x31\xfa\x41\x9d\x9e\x66\x89\x15\x4d\xbc\x9a\x62\xf7\xf3\xf0\ \xed\xb0\x77\xb0\xef\xc3\x81\x9c\xcb\x50\xcf\xdf\xc5\xe7\xf5\x17\ \x10\x62\x1c\x1f\x4b\x60\x4c\x37\x9d\x45\x1e\x29\xc3\x94\x37\x81\ \x15\xc0\x62\x38\x5c\x04\x6d\x2c\xe0\x11\x01\x4a\x51\xe6\x8b\x58\ \x64\x6b\xdf\xd1\xc3\x57\x73\x19\xb0\x0d\x55\x71\xe2\x40\x69\xe8\ \xcf\xb9\x06\xdf\x7a\xab\x81\x0f\xff\x5f\x46\x1d\xe8\xe7\x32\x71\ \xfb\x1c\x26\xba\xb7\x08\x53\x5f\x05\x5e\x46\xce\x5f\x42\x9b\xcf\ \x44\x77\x73\x98\xb8\xa5\xcf\x79\x9f\x90\xd5\x6a\xb5\x17\xb7\xe1\ \xe7\xb8\x9a\x67\xf7\x97\x8a\xfe\x8e\xde\x34\x4c\x9a\x31\x20\x63\ \x44\x27\xc8\xd8\x24\x84\xff\x60\xbe\x48\xd4\x31\x5a\x22\x39\x96\ \xca\xd8\x37\xb1\x8c\xa5\xf3\x50\x0f\x34\x07\x57\xfb\x72\x5c\xcd\ \x89\x8f\x13\x01\x51\x9f\xf3\xc1\xc0\x6d\x00\x09\xc7\xe3\xfc\x13\ \x32\x90\x1d\xff\xf3\x4c\xf1\x1f\xa2\x17\x92\x97\x18\xd7\x80\x27\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x14\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\ \x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x05\x91\x49\x44\ \x41\x54\x78\xda\xed\x97\x7f\x4c\x53\x57\x14\xc7\xeb\x98\x9b\xd3\ \x45\xa7\x9b\x1b\x9b\x28\x0b\xc2\x1f\x83\x00\x02\x5a\x40\x60\x02\ \xc3\x04\xb7\xb1\xb1\xca\x0c\x24\xb0\xe8\x60\xa0\x53\x5c\x07\x34\ \x51\x34\x44\x58\x25\x13\x59\x52\x98\x22\x55\x99\x06\x51\x11\x1c\ \x3f\x6c\x71\x22\x02\x85\x82\x53\xac\xb5\x84\x9f\x45\x29\x14\xf9\ \x8d\x02\x42\x64\x6d\xa1\x3d\x3b\xa7\x49\xc9\xc0\x1f\x40\x13\xdd\ \x1f\xdb\x4b\x3e\x79\xef\xf6\xdd\x73\xcf\xf7\x9e\x7b\xee\xb9\xaf\ \x0c\x00\xf8\x57\xf9\x6f\x0a\xd0\xe9\x74\x96\xfe\x89\x37\xca\x4c\ \x58\x82\x84\x97\xee\x5c\xa3\xd1\x38\xdc\xbd\x7b\xb7\x67\xff\x69\ \x89\xda\x96\x5d\x79\xea\xa5\x39\xee\xef\xef\x5f\xda\xd7\xd7\xc7\ \x69\x6e\x6e\x1e\x93\xcb\xe5\x70\x4c\x50\x37\xce\x4a\x96\xe5\x3f\ \xd3\x20\x3a\x3a\x7a\xde\xde\xbd\x7b\x99\x71\x71\x71\x1b\xb9\x5c\ \xae\x63\x52\x52\xd2\x2a\x1e\x8f\xb7\x68\x2e\x4e\x1b\x1a\x1a\x4c\ \x5a\x5a\x5a\x6c\x15\x0a\x45\x24\xce\xba\xbb\xad\xad\x0d\x0c\x64\ \x97\xc9\x27\xb6\x1e\xad\x2f\x9d\x62\x10\x12\x12\xb2\x2c\x34\x34\ \xd4\x65\xc7\x8e\x1d\xac\x98\xf8\x23\xa7\xb6\x1f\x95\x4c\x84\x1e\ \x91\xea\xb6\xa7\x49\xb4\xbb\xd2\x6e\xaa\xa2\xf8\xd7\x47\x62\xf9\ \xe5\x5d\xf1\x27\x4a\x6e\xf1\x7e\xbb\x98\x92\x99\x99\x19\x90\x9d\ \x9d\x1d\x90\x97\x97\x17\x20\x10\x08\x02\x8a\x8b\x8b\x03\xca\xcb\ \xcb\xb7\xd4\xd4\xd4\xc4\xa2\x73\x21\x3a\x55\x74\x76\x76\x6a\x70\ \xe6\x30\x1d\xd1\x9d\x0e\x6d\x5c\xf6\xbd\x5b\x0c\x5f\x5f\xdf\x45\ \x7e\x7e\x7e\x5f\x72\xb8\xfc\x92\x1f\x4e\xd4\x8e\x07\xa7\xd6\xc2\ \xd7\xbf\xdc\x81\xcd\x87\xa5\xb3\x42\xd9\x33\x04\x23\x23\x23\x93\ \x8c\x8e\x8e\xce\x8a\x3a\xc5\x80\x8e\x27\x54\xca\x19\x71\xa9\x17\ \x8a\x82\x0f\x95\x01\x2b\xfe\x32\xec\x4e\xbf\x0d\xec\x8c\x06\x88\ \x48\x6f\x84\x08\xfe\xcc\xec\x3c\xd9\x04\x6a\x8d\x06\x34\x46\xa0\ \xec\x1b\xd5\xf1\xaf\x76\x76\x32\xce\x5c\x6d\x1a\x0c\xe7\x89\x20\ \x88\x7b\x19\xf6\x9f\x91\x41\xcc\xa9\x7a\x48\xca\x6f\x83\xc3\x05\ \x33\x73\xb2\xe4\x3e\xe0\x96\x32\x8a\xfe\x61\x15\x0a\xb8\x3f\xcc\ \xc8\x2a\x6f\xd7\xb0\x8f\xdf\x80\xed\xa9\x95\x90\x70\xa1\x11\x22\ \x8f\x49\x20\xa5\xa8\x63\x56\xfc\xfe\x67\x2f\xa8\xd5\x6a\xa3\x18\ \x18\x7a\x8c\x63\x28\xd5\x8c\x83\xb9\xcd\x9a\x6f\x53\x6b\x20\x3c\ \xed\x36\xec\xca\x68\x82\x80\x83\x15\xf0\x7d\x86\x7c\x56\x24\xe6\ \x2b\x68\xdd\x8d\xa2\xb3\x6f\x08\xb8\x17\xdb\x26\x18\x9c\x74\xf1\ \xc3\x00\xae\x08\x36\xed\x13\xc2\x17\x09\x22\xf0\x8c\x11\x02\xeb\ \xd0\x2d\xd8\x9c\x24\x99\x91\x10\x9e\x14\x70\x7f\x1b\x45\xa3\xa2\ \x47\xb7\xe7\xec\xbd\x11\x46\x70\xcc\xaf\xc5\xee\xec\x3c\x70\x8d\ \xcc\x81\xf5\xec\x22\xb0\xd9\x76\x0e\x9c\x76\xa1\x88\x9f\x2a\x70\ \x59\xae\x3f\xc1\xd6\x64\x31\x38\x47\x95\x4c\x52\x2f\x57\x80\x52\ \xa9\x9c\x33\xd5\x32\x85\x6e\x67\x86\xbc\x97\x61\x6f\x6f\xff\x2e\ \xb2\xe5\xf3\xe8\x33\x5d\xf6\x11\xb9\xb0\xdc\xff\x38\xd8\x85\x9e\ \x83\xf6\xf6\x76\x68\x6d\x6d\x9d\x84\x8a\x47\x47\x47\x07\x74\x75\ \x75\xc1\xa1\xf3\xb7\xc1\x72\x6b\xae\x9e\xc2\x32\x29\x60\x65\x9b\ \x33\x42\x71\x83\xee\x9b\x14\x59\xeb\x94\x42\xc4\x64\x32\x4d\xdd\ \xdc\xdc\xfc\x7c\x7c\x7c\xe2\x07\x06\x06\xf4\x05\xa3\xa8\xa8\x08\ \x86\x86\x86\xf4\x7b\x77\x6c\x6c\x8c\xb6\x10\x09\x1a\xe7\x70\x38\ \x61\xb1\xb1\xb1\x41\x07\x0e\x1c\x08\x4a\x4c\x4c\x0c\x4a\x4e\x4e\ \x0e\x4a\x49\x49\x09\xe2\xf3\xf9\xdf\x15\x14\x14\xf0\xaf\x5d\xbb\ \x26\xae\xae\xae\xee\x93\x48\x24\x5a\xa9\x54\x0a\xd3\x39\x2d\xb8\ \xa9\xfd\x34\x5e\x5c\xfb\xd4\x12\xea\xe1\xe1\xb1\xf6\xc1\x83\x07\ \x3a\x84\x04\xe8\x93\x46\xab\xd5\xea\x05\xd4\xd5\xd5\x01\x0e\xfe\ \x17\x9b\xcd\xde\x34\x53\x29\xce\xca\xca\x5a\x90\x93\x93\xc3\x14\ \x0a\x85\xfb\x2a\x2a\x2a\x06\xab\xaa\xaa\xc0\xc0\xe1\xcc\xb2\x09\ \x26\xfb\x8f\xaa\xa7\x1a\xba\xb8\xb8\x2c\x16\x89\x44\xc3\x2a\x95\ \x4a\x3f\xe3\xe1\xe1\x61\x42\x2f\x44\x26\x93\x81\x58\x2c\x06\x2c\ \xb9\x8f\xa3\xa2\xa2\xcc\x66\x7b\x2e\x14\x16\x16\x9a\x62\xa9\xfe\ \xb9\xb4\xb4\x54\x85\x00\x27\x45\x30\xbe\x2a\xf8\x7c\xd1\x33\x0d\ \x5c\x5d\x5d\xd7\x62\x48\x6f\xe4\xe7\xe7\x0f\x52\x0e\x3c\x7a\xf4\ \x88\xf6\xaf\x7e\x59\x9a\x9a\x9a\x00\x07\x19\x8c\x8c\x8c\x5c\x31\ \xd7\x53\xf1\xca\x95\x2b\xee\x68\xfb\x70\x5b\xc2\x45\xf5\xc2\xcf\ \x4e\x9c\x9b\xd1\xc0\xdb\xdb\x3b\x10\x0f\x15\xa0\xe5\xa0\x68\x50\ \x14\xba\xbb\xbb\x21\x37\x37\xb7\x05\x0f\xad\x85\xc6\x1c\xcd\x18\ \x09\x6b\xff\x3d\x17\xca\xe6\xfb\x1e\x8f\x9f\xb1\xb3\xbb\xbb\xbb\ \x69\x49\x49\xc9\x08\x6e\x9d\x29\x51\x20\x41\x61\x61\x61\xac\x97\ \xf2\x49\x86\xd9\x7e\x16\x1d\x4e\x89\x42\x4f\x4f\x0f\xe0\x51\xdc\ \x18\x1e\x1e\xfe\xfe\x8b\x16\x40\xf9\xb0\x0e\xd7\x5d\xf3\xcf\x28\ \x50\x35\x23\x11\xf8\x2d\xd0\x16\x11\x11\xb1\xec\x85\x0a\x20\x30\ \xdc\xdc\xde\xde\xde\x29\x51\x40\x41\x94\x0b\x4a\xfc\x88\x59\xf0\ \x3c\x5b\xbc\xe6\x21\xaf\x78\x7a\x7a\xbe\xea\xe4\xe4\x34\x9f\xee\ \x4f\x08\xa0\x0e\xf4\xd2\xc6\xc6\xe6\x35\x73\x73\xf3\x05\xf8\xbc\ \xd0\xd2\xd2\x72\x31\xce\x7e\x19\x16\xa8\xb7\x91\x95\xe9\xe9\xe9\ \xf5\x94\x80\x14\x05\xda\x96\x95\x95\x95\xaa\xc0\xc0\xc0\xaf\xb0\ \x92\x2e\x32\x80\xf6\x6f\x5a\x58\x58\x2c\x21\xbb\x35\x6b\xd6\x2c\ \xc7\x71\x4c\x1d\x1d\x1d\x57\x59\x5b\x5b\x5b\x60\xfb\x23\xc4\x16\ \xfb\x59\x92\xaf\x49\x01\x78\x99\xe0\x0f\x2b\x11\x7b\xbc\x9c\xd0\ \x60\x1d\x76\x74\xc6\xbb\x2b\xf2\x31\x3e\x6f\x70\x70\x70\xd8\x80\ \xef\x59\xa9\xa9\xa9\xf7\x6a\x6b\x6b\xb5\x97\x2e\x5d\x1a\xf1\xf2\ \xf2\xda\x4d\x7d\xd0\xc6\xc5\x80\x9d\x9d\x1d\xb5\xdd\xa9\x3f\x3e\ \x7b\xa3\xed\xc6\xe9\xe0\xbb\xf5\x24\x72\x52\x00\xa9\x41\x23\x6b\ \x72\x84\x77\x2f\xec\xe0\x43\x1d\x9f\x61\xec\xef\xec\xec\xfc\x23\ \x46\x24\x90\xda\xc6\x40\x93\xa2\x08\x4d\x59\x02\x0a\x1f\x0a\x79\ \x87\xc2\x86\x61\x7c\x0f\xdb\x1f\x90\x28\xc4\x85\x14\x4f\x17\x45\ \x6d\xec\xbf\x16\xdf\x5b\x61\xdb\xdc\xd6\xd6\x76\x05\x41\xe1\xc6\ \xf6\x6a\x43\xb8\x11\x47\xec\xcb\xa4\xc8\xe0\xb3\x1b\x45\x86\xa2\ \x6c\x66\x66\xf6\x06\xf9\x7d\x6e\xe2\x50\x64\x48\x18\x1a\xbe\x85\ \x83\x7f\x48\x86\x88\x87\x41\x0c\xde\x3f\x21\x81\xe8\x74\x35\xe5\ \x8e\x21\xd9\x10\x13\x43\xc2\x19\x72\x8a\xc6\x31\xe4\x06\xfe\xbe\ \x84\xfa\xcd\x69\x17\xd0\xa0\x56\x56\x56\xaf\x93\x18\x8a\x10\x25\ \x17\xdd\x51\xd8\x52\xfa\x9d\x9c\xff\xff\xe7\xd4\x18\xfe\x06\x2a\ \x81\xc7\xa1\x0a\xa9\x40\xa3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x06\x5b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ \x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ \x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ \x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ \x46\x00\x00\x05\xd1\x49\x44\x41\x54\x78\xda\x62\x3c\x72\xe1\xe9\ \x7f\x06\x32\xc1\xcd\x5b\x77\xee\x27\x87\xd9\x2b\x31\x50\x00\x00\ \x02\x88\x01\xe4\x80\xdf\xff\x09\x83\x7f\x40\xfc\xf5\xd7\xff\xff\ \x6f\x3f\xff\xfb\xff\xe4\xf5\xcf\xff\x37\x1e\x7e\xfa\x7f\xe8\xc2\ \xcb\xff\xcb\x37\x1d\x79\x40\x89\xfd\x00\x01\xc4\x04\x22\x18\x89\ \x50\xf8\xeb\x1f\x03\xc3\xdf\xbf\x40\xfc\xef\x3f\x10\xff\x03\x63\ \xc9\x3b\x39\x0c\xde\xc2\x07\xe4\x9f\xad\x6b\xf9\x7f\x77\x56\xfe\ \xfc\x35\x06\x0c\x0a\xa4\x3a\x00\x20\x80\xc0\x21\xf0\x87\x88\x10\ \xf8\x0d\x0b\x81\x2f\xff\xfe\x3f\x7b\xfb\xeb\xff\xed\x6b\x57\xfe\ \x7f\xdd\xc3\xf0\xff\xdf\x13\xbb\xff\xff\x5e\x1c\xfe\xff\xef\xcd\ \xe5\xff\xef\x8e\x2e\xfe\xbf\xc9\x53\x34\x85\x14\xfb\x01\x02\x88\ \x89\x58\x85\xcc\x20\x0c\x54\xcd\xc2\xcc\x08\xa4\x99\x18\xb8\x1f\ \x4e\x67\xe0\xd4\x02\x0a\x3e\x3b\xc4\xc0\x70\xce\x97\x81\xe1\x46\ \x1d\x83\x00\xdb\x07\x06\x7e\x21\x8e\x0c\xa0\xa8\x30\xb1\xe6\x02\ \x04\x10\x0b\xb1\x0a\x41\xd1\x04\xb4\x17\x82\x7f\x7f\x64\xe0\xe1\ \x5d\x02\x91\x78\x03\xc4\x3f\x3f\x30\x30\x5c\xda\xcf\xf0\xfb\xcd\ \x09\x86\x77\xe2\xae\xaa\x0c\x0c\x8b\x40\x0e\x78\x4b\x8c\xb9\x00\ \x01\xc4\x44\x52\x70\x01\x5d\x01\xd2\xc0\x74\x6d\x12\x03\x87\xd4\ \x47\xa0\xe5\x40\x81\x5f\x40\xfc\x17\x88\x3f\xf2\x30\xbc\x78\xc7\ \xca\x20\x1f\xdf\xc2\x37\x6f\xf5\xc1\xc3\xc4\x9a\x09\x10\x40\x4c\ \x24\xa7\x5a\xa0\x0e\x0e\xc6\x85\x0c\x8c\x1c\x40\xce\x4b\x36\x60\ \xbc\xb0\x32\x30\x7c\xe0\x05\xcb\x9d\xfb\xa1\xc7\x70\xea\xc6\x63\ \x60\x82\x65\x11\x9b\xb1\xf2\x28\x51\xd9\x1b\x20\x80\x48\x72\x00\ \x28\x1a\xfe\x5c\x59\xc0\xc0\x21\xff\x94\x81\xe1\x2b\xd0\xf2\x3f\ \x40\xcc\x00\xc4\x1f\xf8\x18\x1e\xdd\xfb\xc2\xc0\xe6\x59\xca\x20\ \x23\x25\xce\x20\x26\x2a\xc6\xf0\xe6\x0d\x28\x6e\x18\x8c\x09\x99\ \x09\x10\x40\x2c\xa4\xa6\x58\xa6\x97\xad\x0c\x8c\x92\x40\xef\x3f\ \x63\x83\x08\x7c\x03\x86\x00\x13\x3b\xc3\x73\x69\x7b\x06\x36\x09\ \x79\x86\x7f\x7f\xff\x33\x30\x32\x31\x12\x6d\x26\x40\x00\x91\xe4\ \x80\x3f\x8f\x0e\x30\xb0\xab\x00\xe3\xfe\x27\x17\x03\xc3\x0f\xa0\ \xc5\x2c\xc0\x82\xe1\x83\x00\xc3\xeb\x57\x5f\x18\x7e\x18\x06\x32\ \xb0\xb3\xb1\x02\xf3\xe5\x7f\x86\x3f\xff\x88\x77\x00\x40\x00\x91\ \xe4\x80\xbf\x8f\xbb\x18\xd8\xd4\x81\xf1\xfd\x0c\x9a\x1a\x3f\x02\ \x1d\xc1\xc8\xcd\xf0\x84\x51\x8e\x81\x4b\xdb\x96\xe1\x1f\xb0\x70\ \xfa\xcf\xfc\x9f\x81\xe9\x1f\xf1\x31\x0b\x10\x40\x44\x3b\xe0\xdf\ \xeb\x0b\x0c\x8c\xbc\x37\x80\xc1\xc0\xcd\xc0\xf0\x19\x68\x01\xf3\ \x1f\x60\x28\xf0\x31\x7c\xff\xf6\x93\xe1\x87\x4e\x0c\x03\x27\x2b\ \x33\xd0\x01\x8c\x0c\xa0\x94\x47\x8a\x03\x00\x02\x88\x68\x07\xfc\ \x7e\x32\x97\x81\x4d\x5e\x82\x81\xe1\x35\xb0\x4c\x66\x01\xe2\x6f\ \x9c\xc0\x20\xe1\x65\xb8\x7d\xff\x27\x83\x80\xbf\x2f\xb0\x98\xfe\ \xcf\xf0\x0f\x1a\xf7\xcc\xff\x99\x89\x76\x00\x40\x00\x11\xe5\x80\ \xff\x9f\x1e\x30\x30\xfe\xda\x03\x64\xc8\x00\x2d\xfe\x0d\xf4\x22\ \x30\xee\x7f\xf0\x32\xfc\xfe\xf3\x8f\xe1\xa7\x61\x3a\x03\x27\x33\ \x33\x30\x7b\x02\xeb\x08\x50\x79\xf0\x1f\xe8\x10\x46\x42\x21\x20\ \x0f\x72\x21\x30\xb0\x1e\xfe\x03\x08\x20\x82\x0e\xf8\x07\x4a\xe8\ \x77\x56\x30\x70\x6b\xe8\x00\x13\xdc\x4f\xa8\x9b\x81\x7a\xff\xf0\ \x33\xdc\xbf\x76\x9b\x41\x34\x2f\x16\x68\x27\xd0\xd2\xff\xa0\x6c\ \xca\x04\x96\xfb\xfb\x1f\x9b\x03\xe4\x41\x82\xec\x40\xcc\x01\xc1\ \xff\x81\x71\x28\xff\x16\x20\x80\xf0\x3a\xe0\x2f\xc8\xf2\x4f\x1f\ \x18\x38\x58\x0e\x02\x4d\x17\x07\x72\x40\xe1\x0b\x74\xfc\x57\x6e\ \x86\xdf\xc0\xaa\xf1\x8b\x8c\x0f\x83\x28\x90\xff\x17\xc8\x06\x85\ \x3e\x23\x23\x23\xd0\x21\xc0\x6c\x08\x77\x00\x28\x28\xe4\x38\x11\ \x96\x82\xbd\x04\x14\xfb\x0f\x54\xfd\x0f\x98\x82\xff\xf1\x03\x04\ \x10\x5e\x07\xfc\x02\xba\x91\xf9\xc1\x12\x06\x66\x69\x39\x88\xe5\ \xff\x81\x4e\x62\x04\xe2\x3f\x02\x0c\x2f\x1f\xdd\x67\x10\xf1\xcb\ \x02\x57\x50\x8c\x8c\xcc\xe0\x34\x00\x0c\x07\x20\x9b\x81\xe1\xfb\ \x8f\x5f\x0c\x3f\xbe\x7f\x07\x6a\xe0\x12\x02\x12\x02\x48\x96\xa2\ \x05\x0d\x23\x17\x40\x00\xe1\x74\xc0\xaf\xff\x90\x62\x97\xe1\xdb\ \x6e\x06\x46\x76\x50\xf0\xbf\x07\xba\x06\xe8\x89\x5f\xc0\x50\x64\ \xe3\x60\x78\xfd\x43\x8e\x41\x8a\x5f\x08\x9c\xf5\xc0\x25\xe4\x9f\ \x9f\xc0\x1c\xf1\x83\xe1\xe7\xcf\x5f\xc0\xd0\x01\x26\xda\x5f\xbf\ \x61\xc9\x97\x15\x4f\xd9\xca\x0c\x10\x40\xb8\x43\x00\x5a\x92\xff\ \x7d\x0f\x0c\xf2\xdf\x3c\x0c\xe0\x20\x60\x02\x9a\xf5\x9f\x9f\xe1\ \xd9\xc5\x8b\x0c\xa2\xfe\x7d\x0c\x7f\x7e\xff\x66\xf8\xfa\xf5\x3b\ \xc3\xf7\x9f\x3f\x18\xfe\x02\x6d\xfd\xf7\x1f\xa2\x91\x89\x89\xf8\ \xe2\x05\x20\x80\x58\x70\xc5\x3d\xc8\x5b\x20\x9f\xfd\xfc\xca\xc1\ \xc0\xf9\xd7\x03\x18\x83\xd7\x80\x9c\x97\x0c\x7f\x99\xfe\x31\x3c\ \xff\xab\xca\xc0\xc3\xc2\xc7\xf0\xfb\xfd\x07\x70\x0b\x09\x94\x08\ \x19\x41\xc1\xf5\x17\x58\x10\x01\x43\x9a\x91\xa8\x62\x00\x14\x9f\ \x7f\xbf\x03\x04\x10\x5e\xa7\x02\xcd\x65\xf8\x09\x8a\x4a\x46\xa0\ \xcf\x39\xf4\x19\x7e\x31\xff\x65\x38\xb1\x62\x16\x83\x80\x77\x01\ \xd0\xae\xbf\x90\x40\x64\x84\xb8\x16\xd8\x6a\x04\xfa\x9c\x11\xac\ \xe7\x1f\x5e\x4b\xff\xfd\x80\x98\xfa\x01\x14\x47\xff\x01\x02\x88\ \x05\x4f\xe8\x83\xe9\xfb\x5f\x44\x18\x80\xe9\x9f\xe1\xfb\xfb\xb7\ \x0c\x07\xa7\x4f\x62\x90\x4d\xe8\x64\x60\xe5\xe6\x03\x27\x3a\x90\ \x0a\x50\xca\x07\x87\x00\x28\x07\x80\xd2\x03\x90\x66\xfc\x8f\xdf\ \x52\x28\x06\xb9\xf3\x3f\x40\x00\xb1\x60\xb3\xfc\xff\x7f\x44\xf5\ \x7b\xf6\xfa\x7b\x86\x8b\x33\x37\x31\x28\x02\x9b\x3e\xca\xb9\xd3\ \xc1\x72\xff\xff\x21\x9c\xf9\x1f\xaa\xf8\xff\x3f\xe4\x36\x03\x13\ \x03\x2b\x1b\x28\xed\xfd\xfc\xc4\xc0\xf0\xfc\x15\xba\xa5\xc8\xf6\ \x01\x04\x10\xc1\xd4\xf2\xeb\xf3\x17\x06\x71\xde\x27\x0c\xca\x69\ \x0d\xd0\x44\x06\x09\xf6\xff\x0c\x90\x7c\x0f\x73\x2d\x28\x09\xb0\ \x03\x73\x07\x3b\x07\x3b\x03\x0b\x1b\x27\x03\x07\x27\x28\xfb\xff\ \xf9\x05\x4d\x52\x38\x63\x05\x20\x80\x58\xb0\x95\x7c\xb0\xf8\xff\ \xf3\xe7\x2f\x83\x91\x99\x15\x83\x72\x40\x0a\xc3\x8f\x9f\xbf\x11\ \x6a\xfe\x21\x7c\xcf\x09\xb4\x90\x8d\x1d\x68\x29\x2b\x2b\x24\x74\ \xfe\x83\xca\x03\x46\x6c\x46\x62\x05\x00\x01\x84\xe1\x80\xbf\x48\ \x01\xc4\x0c\x2c\xe5\x4c\x93\x4b\x21\xa6\xfc\x67\x80\x5a\x00\xcc\ \x95\xc0\x2c\xf7\x13\x58\x4a\x31\x03\x4b\x21\x70\xa2\x03\x15\xc5\ \xb0\xe0\xf9\x0f\x6d\x3c\x12\x09\x00\x02\x88\xe4\x36\x21\x2c\x8e\ \xd9\x80\x71\xcc\xc4\x44\x96\x76\x14\x00\x10\x40\x60\x13\x7e\xfc\ \x63\x18\x30\x00\x10\x40\xe0\x28\x98\x30\x63\xd3\x80\x39\x00\x20\ \x80\x60\x91\x65\x4c\x43\x3b\xce\xe2\x93\x04\x08\x20\x46\x58\x3e\ \x1e\x28\x00\x10\x60\x00\x17\xfc\x74\xfe\xb0\xa1\xf6\x72\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0d\xee\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x0a\x43\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\ \xf7\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\ \xc8\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\ \x56\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\ \x28\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\ \x7d\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\ \x0f\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\ \x1f\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\ \xcb\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\ \x01\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\ \x50\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\ \xc8\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\ \x00\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\ \x00\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\ \x99\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\ \x00\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\ \x80\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\ \xcc\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\ \xd2\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\ \x4b\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\ \x6c\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\ \x48\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\ \xe7\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\ \x22\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\ \x5f\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\ \x56\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\ \x79\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\ \x25\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\ \xfc\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\ \xfd\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\ \x23\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\ \xf1\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\ \xe2\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\ \x4f\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\ \xd2\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\ \x79\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\ \x00\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\ \x81\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\ \x17\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\ \x0a\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\ \x11\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\ \x17\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\ \x21\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\ \x48\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\ \xa9\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\ \x90\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\ \xd4\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\ \x5d\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\ \xe8\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\ \x5c\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\ \x8f\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\ \x8b\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\ \x58\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\ \x27\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\ \x58\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\ \x48\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\ \x48\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\ \x6d\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\ \x92\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\ \xa4\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\ \x51\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\ \x2f\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\ \xa3\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\ \x1e\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\ \x0d\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\ \x19\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\ \x67\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\ \x3a\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\ \x0b\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\ \x09\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\ \x8f\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\ \x46\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\ \xf1\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\ \xec\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\ \x66\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\ \x4a\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\ \x66\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\ \xeb\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\ \x09\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\ \x79\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\ \x17\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\ \x38\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\ \x11\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\ \x67\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\ \x6b\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\ \x6b\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\ \xc9\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\ \xa5\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\ \x4d\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\ \x5c\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\ \xcb\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\ \xd2\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\ \x39\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\ \x74\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\ \xa9\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\ \x4b\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\ \xcb\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\ \xd9\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\ \xc3\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\ \xc2\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\ \x26\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\ \x3d\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\ \xbe\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\ \xfa\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\ \x01\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\ \x07\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\ \x1f\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\ \x15\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\ \x86\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\ \x47\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\ \x2e\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\ \xbd\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\ \x6c\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\ \xf1\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\ \x73\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\ \xa2\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\ \x85\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\ \x6e\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\ \xb7\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\ \x68\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\ \x23\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\ \x94\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\ \x2b\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\ \xf9\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\ \x4c\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\ \xdf\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\ \xb3\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\ \x77\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\ \x96\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\ \xa5\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\ \xb9\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\ \x95\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\ \xd5\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\ \xeb\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\ \xad\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\ \xcd\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\ \xa1\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\ \x26\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\ \xec\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\ \x8f\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\ \x7b\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\ \xb2\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\ \xed\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\ \x7b\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\ \xeb\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\ \xef\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\ \x63\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\ \xe3\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\ \x99\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\ \x5f\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\ \x25\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\ \xeb\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\ \x7f\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\ \xec\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\ \x77\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\ \xfa\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\ \xc3\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\ \xcc\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\ \x64\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\ \xab\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\ \xbf\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\ \xce\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\ \xbd\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\ \xf7\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x80\x39\x25\x11\x00\ \x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\ \x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\ \x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdb\ \x0b\x1e\x08\x14\x3b\xe2\x8d\x38\x38\x00\x00\x03\x2c\x49\x44\x41\ \x54\x38\xcb\x4d\x93\xdf\x4f\xdb\x65\x14\xc6\x3f\xef\xfb\xfd\xf6\ \x4b\xe9\x8a\x14\x26\x94\x11\xa3\x42\xc7\xac\x6b\xa6\x74\x9b\x64\ \x81\xf0\x6b\xb2\x91\x91\x18\xae\xdc\xd8\x26\x7a\xe1\x1f\xd0\x0b\ \xff\x1e\x2f\x99\x5e\xa8\x68\x8c\x59\x9c\x84\x31\x4d\x17\xb3\xe8\ \x24\x30\xa4\x6e\x30\x40\x59\x19\x2b\xa5\xbf\x28\xf4\xdb\xf6\x7d\ \x5f\x2f\x2a\xcc\xe7\xea\x9c\x93\xe7\xc9\x73\x9e\x93\x1c\x31\x3e\ \x3e\x8e\x10\x02\x29\x25\x42\x08\xfa\x87\xaf\xb7\x68\x6d\xbf\x8d\ \x21\x08\xbc\x42\x0d\x79\x04\xdb\x18\xbd\x1c\xff\x79\x2a\x65\x8c\ \x41\x6b\x8d\x31\x06\xfb\x3f\x02\x03\x43\x13\x75\x20\x7b\xbc\xf5\ \xaf\xf5\xf5\xf7\x86\x6e\xb4\xb7\xf9\xcf\x28\x6d\x00\xb0\xa4\x60\ \x33\xb9\xb7\x18\xff\x75\xf5\x56\xdf\xc0\xcd\xb8\x14\xd5\x07\x73\ \xb3\xb7\x5c\x00\x2b\x1c\x0e\x33\xf4\xfe\x8d\x3a\x8c\xbc\x7c\x2a\ \x7c\xf6\xa3\xcb\x17\x4f\x7e\xb6\xf5\xbc\x18\x7c\xb4\x9c\xe6\xe1\ \xfc\x16\x89\xc7\x69\x5e\xec\x94\x70\x1c\x19\xec\xbb\xf0\xe6\xc8\ \x7e\xc9\x67\xa5\x52\xdb\x6e\x47\x28\xb2\xb1\xbe\xb6\xa8\x6c\x63\ \x0c\x46\x9b\x0b\x6f\x85\xbb\x3f\x8c\xbe\x13\x9c\xfc\xe1\xc7\x35\ \x00\x02\x8d\x0e\xed\x6d\xb5\x04\xe5\x8a\xe6\xaf\x27\x19\x1e\xaf\ \x64\x19\x19\x7a\xfd\x63\xa5\xde\x15\x6b\xab\xbf\xe7\x8d\x31\xf7\ \xe4\xe0\xf0\xb5\xa0\xcf\xdf\xd6\x7f\x2e\x7a\x62\xf2\xce\xec\x3a\ \x8e\x47\xd2\xe0\xf7\x90\xda\x39\x60\x6c\xb4\x93\xb1\xd1\x4e\xd2\ \xbb\x07\xf8\xfd\x0e\x96\x25\xf8\xe9\xee\x06\x67\xbb\x5b\x27\x3d\ \x75\xc1\xfe\xc1\xe1\x6b\x41\xa9\xb4\x89\xf4\x9c\x0f\x4f\x2c\x2d\ \xa7\x51\xaa\x96\x39\x9b\x2b\xa3\x54\xe5\xf0\x3c\x28\x55\x21\x9f\ \x2f\x03\x50\xa9\x28\x9e\xac\x64\x88\x76\x77\x4d\x28\x6d\x22\x36\ \x46\xb7\x07\x5b\x8f\x45\x96\x12\x69\xea\xbd\x16\xd9\x6c\xb6\x26\ \xd2\x15\x72\x79\x17\xd7\x55\xec\x17\x9f\x83\xd1\x00\xd4\xd5\x1f\ \x67\x6b\xdb\xe6\x7c\xb4\x2d\x82\xd1\xed\xb6\xd6\x3a\x50\xdc\xaf\ \x50\x28\xe4\x68\x68\x68\xe4\xd3\x4f\xde\x63\x37\x53\xe2\xa0\xa4\ \xc8\xe5\x5c\x6c\x5b\x72\xfd\xea\x20\x52\x4a\x2c\x4b\x30\xf5\x45\ \x9c\x42\x01\xdc\x72\x0b\x5a\xeb\x80\xad\x8d\x96\x4a\x19\x8c\x51\ \x94\x4a\x65\x36\x93\x7b\x68\x0d\x1e\x5b\x60\xdb\x35\xd1\xa1\xd8\ \xb2\x04\x86\x1a\xd7\x68\x83\x36\x5a\xda\x98\x6a\xc1\xb6\x25\x5e\ \x6f\x00\xd7\x2d\xf0\xdd\xf7\xf1\xa3\xec\x87\xce\x53\x5f\xde\x3d\ \x9a\x49\xe9\xe0\xf5\x06\x6a\x8d\xa9\x16\xa4\xd6\x3a\xf9\xf7\x66\ \x3e\xd1\xda\xe2\x43\x55\x5d\x6c\xdb\x87\x94\x0e\x52\xda\x47\xce\ \xb5\xda\x41\x4a\x07\x80\xd6\x16\x1f\x5b\xdb\xc5\x84\xd6\x3a\x29\ \x8d\x51\x0b\xf3\x7f\xfc\x36\x1d\x3e\xd5\x8c\xed\xf1\x62\xb4\x42\ \x4a\x1b\x78\xb9\x36\x48\x04\x02\xd0\x38\x75\x7e\xba\x42\x4d\x24\ \x96\x1f\x4e\x1b\xa3\x16\xac\xcc\x6e\x72\x2f\x14\x0a\x79\x32\xf9\ \xa6\xfa\x4b\x17\xbb\x4e\xaf\x3c\xdd\xa1\x5a\x2e\x20\xa4\xe4\xd1\ \xd2\x33\x16\x16\xff\xc1\xa0\x50\xd5\x12\x1e\xa7\x81\xb1\xd1\x33\ \xfc\x12\xdf\xf8\x3a\xf5\x62\x71\xfa\x9b\xaf\x3e\x9f\xb7\x8c\x31\ \x44\xa3\xe7\x9e\x65\x33\x6b\x32\x93\x6f\x92\x1f\x5c\x89\x84\x2b\ \x55\x1f\xc5\x03\xc3\x5e\x21\x49\xa5\xb2\xcf\xb1\x86\x13\x74\x76\ \xbc\xc1\xf0\xc0\x49\xee\xcc\xae\x7c\xbb\xfe\x74\x66\x5a\x2b\xf7\ \xf6\xbd\xb9\x99\xaa\x88\xc5\x62\x12\xf0\x5a\x96\xa7\xd9\xb6\xbd\ \xc3\x8d\xcd\x1d\x3d\xbd\xbd\x23\x57\x4e\x87\x5f\x0d\xf1\x3f\xfc\ \x99\xd8\x59\xbd\x7f\x7f\xe6\x76\x6e\x77\xed\x41\xb5\x5a\x9a\x53\ \xaa\x92\x06\x4a\x22\x16\x8b\x59\x40\x00\x38\x0e\xf8\x2d\xcb\x0a\ \x08\x61\x85\x84\x10\x2d\x06\xf1\xf2\x9d\x8d\x4e\x69\xad\x57\xb5\ \xae\x66\x81\x22\xb0\x03\x64\xff\x05\x05\x52\x84\x85\xbb\x22\xa3\ \xb6\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x08\x6d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x07\xff\x49\x44\x41\x54\x78\xda\x62\ \xfc\xff\xff\x3f\x03\x08\x30\x32\x32\x32\x30\xf8\xee\x60\x30\x30\ \x94\x64\xb0\xd5\x14\x61\x10\xe3\x63\x67\x20\x07\x5c\x7c\xfc\x99\ \xe1\xfc\xee\xa3\xf2\x40\xa6\x01\x10\x7f\x48\x48\xf2\x38\x88\xae\ \xa6\xc6\x4b\x18\xce\x06\x08\x20\x16\x18\xa3\x79\xeb\x1b\x30\xfd\ \xea\xd3\x4f\x86\xc3\xd7\xdf\x30\x5c\x38\xff\x9c\x81\x61\xb3\x07\ \x56\x4b\x58\xa3\x0f\x31\x18\x6a\x89\x30\xc8\x89\x89\x32\x9c\xdf\ \xb1\xd3\x1e\x6a\x99\x02\x94\x76\x60\x66\xe5\x66\x60\x64\x66\x65\ \xf8\xf3\xe3\xc3\x85\x87\x9f\xd9\x0c\xf1\x39\x18\x20\x80\x18\x61\ \x21\x90\xba\xf2\x33\x5e\x9f\xed\x5f\xbd\x49\x1e\x6a\x89\x03\xd4\ \x22\xb0\xa5\x82\x82\x02\x0c\x8a\xd2\x42\x0c\x5a\x0a\x82\x0c\x12\ \xa2\x82\x40\xb6\x20\x83\x9c\x08\x1b\xc3\x86\xb3\xff\x19\xe6\x2e\ \x5e\xc6\xa0\x60\x69\xc5\x28\x27\x23\xca\xc0\xc5\xc1\x0c\x37\x6b\ \x8a\x3f\x27\x9c\x0d\x10\x40\xf0\x10\x60\xe7\x80\x33\x19\x76\x2c\ \x5e\xa7\x8f\x64\x09\x18\x33\xb3\xb0\x0a\x68\x02\x2d\x91\x96\x12\ \x67\x10\x15\xe4\x66\xd0\x90\x87\x58\xc6\xce\xcc\x08\xd6\xf3\x1f\ \x4a\x80\xe8\xef\xbf\x19\x18\xf4\xe4\x80\x66\x72\x09\x30\x3c\x38\ \x7e\x4c\x9f\xc1\xd2\xea\xe2\xb9\x5b\xaf\x19\xde\xcf\x32\x87\x38\ \x00\xea\x69\x10\x00\x08\x20\x16\x24\x4b\x41\x41\x39\x01\x64\x19\ \xc8\x27\x22\x42\xdc\x0c\x6a\xb2\x82\x0c\x4a\x72\x10\x0b\x65\xc4\ \x78\x18\x40\xfa\x18\x91\x83\x05\xc8\xff\xf1\x07\xc1\x86\x19\x0b\ \x52\x27\xc0\xc5\x08\x74\x00\x0f\xc3\xcf\x6f\x1f\x0c\xac\x4d\x15\ \x2f\x02\x31\x03\x43\xf4\x7f\x8c\x90\x05\x08\x20\x16\x24\x76\x81\ \xb9\x81\xba\x41\x96\x9f\x3a\xc3\xd7\x5f\xcc\x0c\xac\x5c\x5c\x0c\ \x8c\x50\xdb\x40\xf4\x8f\xdf\x50\x36\x9c\x60\x80\xdb\x88\x6c\x31\ \x8c\x06\x61\x35\x39\x41\x86\x33\x6f\x9e\x18\xf0\xf1\x30\x2c\x04\ \x5b\xc6\x04\x4c\x56\xe7\x81\x51\x6d\xc7\x0b\xb7\x14\x20\x80\x90\ \x1d\xe0\xc0\x26\xa4\xc1\xc0\x04\x0c\xd2\xaf\xdf\x7e\x31\x70\xb2\ \x41\x1c\x00\xc3\x18\x96\x33\x60\xf7\xf9\x7f\x28\x1f\x44\xcb\x03\ \x43\xef\xcc\xb9\xcb\x06\x5c\x9c\x08\x7d\xc1\x96\xbc\x28\xda\x01\ \x02\x08\xd9\x01\x02\xaf\xbf\x73\x03\xd3\xc2\x1f\x86\x6f\x3f\xbe\ \x31\x30\xff\x83\xe8\xc1\xeb\x08\x2c\x96\xc3\xd8\xff\x80\x58\x0c\ \x18\x95\xa0\x28\xcd\xd2\x42\x75\x75\x26\x52\x1a\x00\x08\x20\x64\ \x07\x3c\xf8\xf1\xf3\x8b\xc2\xbb\x1f\xdc\x0c\x7f\x7e\xff\x66\xf8\ \xfd\x17\xd5\x72\xe4\xe8\x60\x40\x8a\x4a\xf4\x60\x47\xc6\xfc\xdc\ \x6c\x0c\x2c\xac\xac\x02\xca\xc1\x4b\xe4\xab\x7b\xa2\x1f\x62\xcb\ \x5d\x00\x01\xc4\x84\xec\x00\xc6\xbf\x5f\x19\x3e\x7c\x67\x04\x6a\ \x62\x66\xf8\xf1\xf3\x17\xc3\x1f\xa0\x21\x7f\xa1\x18\x99\x8d\x82\ \x19\x30\xc5\xfe\x00\x6d\x07\x61\x6e\xb6\xff\x0c\x02\xc2\x90\x50\ \xb8\xf5\xee\x33\x03\x08\xf3\x71\xa0\x3a\x00\x20\x80\x50\x1c\xf0\ \xfb\xc7\x7b\x86\x27\x1f\x18\x18\x98\x59\x59\x81\x0e\xf8\x0d\xb6\ \xf4\x0f\xb2\xe5\x0c\x50\x3e\x03\x14\x23\x39\x0e\x59\xec\xcf\x7f\ \x46\x86\x3f\xff\x18\xc1\xa1\xa8\xa8\x20\x0e\x76\x80\xa5\x1a\x2f\ \x03\x08\xb3\xf2\xa0\x3a\x00\x20\x80\x90\xa3\xe0\xc2\xcf\xaf\x1f\ \x18\xde\xff\x60\x64\x50\x91\x60\x67\x78\xff\xee\x2f\x03\x1b\x28\ \x28\x19\xa1\x69\x81\x01\x91\x26\x10\xc5\x18\x6a\xa2\x03\xc7\x3d\ \x52\x1a\x78\xfe\x89\x91\x81\x83\x1f\x12\x02\xfe\xbc\x8c\x48\xd1\ \x86\x88\x43\x80\x00\x42\x38\x80\x91\xf1\xc2\xef\x9f\x5f\x19\xbe\ \x01\xbd\xc1\xc1\xc9\xca\xf0\xed\xfb\x77\x06\x4e\x41\x88\x81\x4c\ \x0c\xa8\x8e\x80\xa5\x43\xb0\xc5\x50\x01\x64\x8b\xdf\xff\x60\x60\ \x78\xf8\x96\x81\xe1\xdb\x4f\x60\x68\xb2\x03\xbd\xcc\xcc\x64\xb0\ \x1b\x6a\xe9\xb3\xe7\xcf\x51\x42\x00\x20\x80\xe0\x51\x70\x77\x4d\ \xf4\xc1\x8f\xef\xdf\x32\x7c\xfb\x0b\x8a\x02\x60\xb1\xf9\xff\x1f\ \xc3\x3f\x46\x88\x05\x60\x9a\x09\xc2\x06\xd1\x20\x17\xfd\x67\x42\ \x88\xc1\xd4\x81\xa2\xe0\x09\x30\x9b\x3f\xf9\x04\x51\xc3\xc6\xca\ \xc0\x20\x22\x26\xc8\xc0\xc8\xc4\xac\x90\x19\xb5\x9a\xdf\x15\x18\ \x7c\xf1\x52\x52\x28\x0e\x00\x08\x20\x26\x54\x1e\xd3\x83\x1f\xc0\ \x68\x78\x07\x2c\x88\x58\x58\x18\x81\xf1\xfb\x0f\xd5\x72\x66\x84\ \x23\x90\x1d\x04\xc2\x3f\x80\x41\xf0\xe4\x0b\x03\xc3\x4f\xa0\x47\ \xd9\xd9\x80\x96\x43\xf1\x3f\xa0\xb8\xac\xa2\x38\xa8\xb6\x35\xc0\ \x96\x0b\x00\x02\x08\xc5\x01\x8c\xcc\x4c\x17\xbe\x7d\xf9\xc8\xf0\ \x15\x58\xea\xf1\xf2\xb2\x32\xfc\x02\x66\x47\x06\xa8\x8f\x19\x98\ \xd1\x68\x24\xf6\x77\xa0\x25\xef\x81\x4a\x81\x69\x17\x6e\x31\xc8\ \xf7\x20\xfe\x5f\xa0\x9c\x84\x94\x20\xc8\x73\x58\x1d\x00\x10\x40\ \xa8\x0e\x60\x62\xbe\xf0\xf3\xe7\x77\xb0\x2f\x38\x81\xb5\xd7\xcf\ \x1f\xbf\x20\x41\xce\x0c\xc1\x8c\x50\xcc\x00\x4c\x39\x8c\x2c\x10\ \xf6\x0f\xa0\xda\x9f\x0c\x08\x5f\xb3\x23\x59\x0e\xa3\xb9\x78\x40\ \xd5\x33\x76\x07\x00\x04\x10\x0b\x0a\x0f\x18\x02\x6f\xde\xbc\x63\ \xf8\x09\x72\x35\x37\x0b\xc3\xcf\xf7\xdf\xe0\x96\x32\x32\x41\x31\ \x52\xa1\x04\xca\x66\x20\xc7\xb0\x33\x41\x7c\xfa\x17\xc8\xff\xfb\ \x07\x53\x9d\x90\x08\x3f\xce\x10\x00\x08\x20\x16\xd4\x10\x60\xba\ \xf0\xe1\xc3\x17\x86\xef\xa0\x10\xe0\x62\x81\x44\x01\x92\xcf\x99\ \x90\x0c\x06\xa5\x76\x66\x20\x9f\x9d\x05\x12\xcf\x60\xcb\x81\xf8\ \x37\x48\xcd\x1f\xd4\x22\x5b\x5c\x54\x04\x64\x36\x56\x07\x00\x04\ \x10\x4a\x14\xdc\x9c\xeb\xfb\xf0\xf7\x9f\x7f\x1f\xfe\xff\xfb\xcd\ \xf0\x97\x85\x95\x81\x8d\xf1\x2f\x03\x13\x34\xb8\x99\x41\x18\x18\ \x9c\x2c\x20\xcc\x02\x09\x5a\x76\x36\xd4\x04\x87\x1c\xec\x60\xcc\ \x02\x51\xfb\x03\x18\x47\x92\x52\x02\x0c\x1a\xa9\x5b\xf5\xd1\x1d\ \x00\x10\x40\x4c\x18\x4e\x02\x46\xc3\xc7\x8f\x9f\x19\xfe\x02\x5d\ \x2f\xc0\xc3\xc2\xf0\xe7\xe7\x0f\xb0\xa1\xec\x40\x0c\x6a\xd4\x70\ \x02\x31\x17\x10\x73\x43\x31\x88\xcd\xc9\x02\x91\x67\x43\xb2\x18\ \x66\x39\x88\xfe\x0d\x0c\x11\x21\x60\xfb\x02\x5b\x34\x00\x04\x10\ \x86\x03\x40\x09\xf1\xf9\xcb\x0f\x0c\x7f\x40\x0e\xe0\x63\x63\xf8\ \xf7\xfb\x17\x03\xa8\xb1\x84\x62\x31\x0b\x04\x73\xc1\x1c\xc0\x0c\ \x71\x1c\xb2\xef\x59\xa0\x0e\x60\x66\x86\xc4\x84\x84\x38\x1f\xd6\ \x68\x00\x08\x20\x16\x0c\x07\x00\x43\xe0\x2d\x30\xf1\xfd\x02\xb2\ \x79\x79\x58\x19\xbe\x7e\xfe\xcd\xc0\xc1\x04\x49\x68\x6c\x40\x0c\ \x2c\x1e\x18\x98\x61\xa5\x1f\xb4\x1e\xf8\xf5\x0f\x51\x5a\x82\xd2\ \x0c\xb8\x44\xfc\x07\x4d\x1b\xcc\x10\x47\x48\x49\x09\x01\x15\xdd\ \xc7\x70\x00\x40\x00\xb1\x60\xa6\x0a\xa6\x07\x9f\xbf\xfe\x02\x47\ \x81\xa8\x00\x3b\xc3\xd3\xd7\x5f\xc1\x0e\x00\xfb\x10\xe4\x08\xa0\ \x38\x13\xb4\x7e\x00\x55\x44\xbf\xff\x43\x1c\x04\x4a\x98\xa0\xc2\ \x16\x5e\x3b\x42\x2d\x66\x86\x26\x5e\x01\x01\x1e\xac\x21\x00\x10\ \x40\x18\x0e\xb8\x36\xc1\xe1\x20\x7b\xd9\x11\xb0\x81\x2c\xc0\x36\ \x14\x33\x30\x27\xb0\x41\x43\x80\x03\x29\x14\x18\xa0\x16\xfd\xfa\ \x87\xa8\x17\x60\x35\x23\x28\x27\x80\x72\xc8\x87\x0f\x5f\x19\x9e\ \xbf\xfc\xca\xf0\xee\xc3\x0f\x86\x97\xaf\x3e\x80\x5c\x22\xa0\x95\ \xbf\x1f\x98\x27\x19\x3e\xc2\xec\x03\x08\x20\x16\x6c\x59\x83\x83\ \x85\xe9\xc2\x8b\xe7\x9f\x0c\x94\x55\xf8\x18\xb8\x80\x36\xfe\x05\ \x16\x48\x6c\x3c\x6c\x70\x47\xb0\x32\x41\x2c\x05\xf9\x1e\xe4\xd0\ \x77\x9f\x7f\x31\xbc\xf8\xf8\x8b\xe1\x0e\xb0\x2c\x7e\xfa\xfa\x1b\ \xc3\xdb\x8f\x3f\x19\x5e\xbe\xfe\xc2\x20\xcc\xcb\xc6\xa0\x20\xca\ \xc1\x60\x25\xc5\xc5\xb0\xe1\xc9\x4f\x60\x73\x8f\x39\xe1\x4a\x9f\ \xdd\x47\x86\x09\x88\xda\x10\x20\x80\xb0\x3b\x80\x8d\xf9\xc2\xb7\ \xaf\xbf\x0c\x40\xbe\xe3\x03\xb6\x6a\xfe\xfe\xfa\x03\x0c\x66\x36\ \x06\x56\xa0\x65\x8f\x81\x3e\x7a\xf5\xee\x07\xd0\xd2\xdf\x0c\x8f\ \xde\x7c\x67\x78\xf2\xfa\x07\xd8\xff\x32\xc2\x1c\x0c\xb2\x22\x1c\ \x0c\x26\xba\x02\x0c\x22\x7c\xac\x0c\xba\x72\x88\xb6\xdf\xed\xe7\ \x5f\x19\xce\xdf\xff\xc4\xf0\xf2\xd3\x2f\x01\x74\xbb\x00\x02\x08\ \xbb\x03\x58\x99\x1f\x7c\x04\x06\xdb\xfd\xe7\x5f\x18\x5e\xbf\xf8\ \xc1\xf0\xea\xda\x07\x86\xef\xbf\xfe\x33\x7c\x06\x56\x12\xca\x62\ \x6c\x40\x9f\xb1\x02\x2d\x61\x63\x08\x32\x11\x66\x50\x10\xe7\x66\ \xe0\x62\x87\x74\x3a\xbe\xfd\xfc\xcb\xf0\x10\xe8\xa0\x07\xaf\xbe\ \x33\x1c\xbc\xfa\x9e\xe1\xce\x8b\x6f\x0c\x37\x9f\x7d\x05\x66\xc3\ \x7f\x17\x7e\xfd\xfd\xf7\x80\x95\x99\xe9\x00\xba\x5d\x00\x01\x84\ \xd5\x01\x9c\xac\xcc\x07\x1e\x3f\xfc\xc0\xf0\xfb\xcd\x7b\x06\x0d\ \x71\x66\x06\x1b\x79\x16\xb0\xa5\x32\xc2\xdc\xc0\x02\x07\x18\x12\ \xc0\x7c\xf6\xf5\x17\x13\xc3\xab\xcf\xff\x80\x16\x7d\x60\xb8\x05\ \xb4\xe4\xcd\xa7\xdf\x0c\xaf\x80\xd1\xf0\xfb\xdf\xbf\x03\x7f\xfe\ \xfe\xbf\xf0\x1b\x68\xe1\x2f\xa0\xc5\x3b\x6a\x4c\x0e\xe2\xeb\x71\ \x01\x04\x10\x56\x07\xb0\x00\xb3\x22\x23\x30\x8f\x39\xa9\xfc\x67\ \x50\x10\x01\xf6\x17\xbf\x31\x32\xbc\xfd\xfa\x9f\xe1\xce\xeb\x5f\ \x40\xfa\x17\xc3\xe3\x77\xe0\xde\xc8\x07\x50\x2b\xea\xdf\xbf\xff\ \x07\x80\x4a\x2f\xfc\xfd\xff\xff\xc1\xac\x2c\xad\x8b\xa4\x76\x66\ \x01\x02\x88\x11\xa5\x77\x8c\x04\x92\xa7\x5e\x7d\x2f\xc9\xc7\x20\ \xf0\xe9\x07\x33\x30\x45\x33\x5d\x60\x61\x66\x7c\xc0\x04\x6c\x35\ \x01\xb3\xe0\x01\x10\xdd\x1a\xab\xfc\x91\x81\x4c\x80\xdc\x24\x03\ \x08\x20\x16\x5c\x8a\x80\xf1\xe5\xf0\xf1\x07\xa3\xc0\xe4\x54\x8d\ \x83\x0c\x34\x04\x00\x01\x06\x00\x88\x5f\xed\x60\x25\x2c\xb3\xaa\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ " qt_resource_name = "\ \x00\x05\ \x00\x6f\xa6\x53\ \x00\x69\ \x00\x63\x00\x6f\x00\x6e\x00\x73\ \x00\x0e\ \x06\x0c\x0a\x07\ \x00\x61\ \x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x0d\x80\x00\xa7\ \x00\x73\ \x00\x74\x00\x6f\x00\x63\x00\x6b\x00\x5f\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x0d\xbc\x57\x67\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x5f\x00\x69\x00\x74\x00\x61\x00\x6c\x00\x69\x00\x63\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0c\xe4\x02\xa7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x63\x00\x6c\x00\x65\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x0c\xc6\xe8\x07\ \x00\x6d\ \x00\x61\x00\x74\x00\x68\x00\x5f\x00\x6d\x00\x61\x00\x74\x00\x72\x00\x69\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x08\x1a\x9d\x27\ \x00\x64\ \x00\x6f\x00\x77\x00\x6e\x00\x6c\x00\x6f\x00\x61\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x08\x12\xae\xa7\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x72\x00\x65\x00\x63\x00\x6f\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x07\xd5\x57\x07\ \x00\x65\ \x00\x6d\x00\x62\x00\x6c\x00\x65\x00\x6d\x00\x2d\x00\x66\x00\x61\x00\x76\x00\x6f\x00\x72\x00\x69\x00\x74\x00\x65\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x0c\ \x00\x66\xb9\xc7\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x2d\x00\x78\x00\x6d\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1c\ \x00\xde\x25\xe7\ \x00\x73\ \x00\x74\x00\x6f\x00\x63\x00\x6b\x00\x5f\x00\x6e\x00\x65\x00\x77\x00\x5f\x00\x74\x00\x65\x00\x6d\x00\x70\x00\x6c\x00\x61\x00\x74\ \x00\x65\x00\x5f\x00\x67\x00\x72\x00\x65\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x06\x47\xb0\xc7\ \x00\x70\ \x00\x6c\x00\x75\x00\x73\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x04\x63\x2d\x47\ \x00\x67\ \x00\x6f\x00\x2d\x00\x66\x00\x69\x00\x72\x00\x73\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1b\ \x0e\x09\xa0\x87\ \x00\x73\ \x00\x74\x00\x6f\x00\x63\x00\x6b\x00\x5f\x00\x6e\x00\x65\x00\x77\x00\x5f\x00\x74\x00\x65\x00\x6d\x00\x70\x00\x6c\x00\x61\x00\x74\ \x00\x65\x00\x5f\x00\x62\x00\x6c\x00\x75\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x08\xa4\x4e\x67\ \x00\x70\ \x00\x61\x00\x75\x00\x73\x00\x65\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x05\x44\xe3\x07\ \x00\x6b\ \x00\x70\x00\x65\x00\x72\x00\x73\x00\x6f\x00\x6e\x00\x61\x00\x6c\x00\x69\x00\x7a\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x0b\ \x0e\x9d\x3c\x67\ \x00\x63\ \x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x02\x71\xef\x27\ \x00\x61\ \x00\x6e\x00\x6b\x00\x69\x00\x2d\x00\x6c\x00\x6f\x00\x67\x00\x6f\x00\x2d\x00\x74\x00\x68\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x14\ \x02\x93\x52\xe7\ \x00\x65\ \x00\x6d\x00\x62\x00\x6c\x00\x65\x00\x6d\x00\x2d\x00\x69\x00\x6d\x00\x70\x00\x6f\x00\x72\x00\x74\x00\x61\x00\x6e\x00\x74\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x1c\ \x08\x86\x2d\x47\ \x00\x70\ \x00\x72\x00\x65\x00\x66\x00\x65\x00\x72\x00\x65\x00\x6e\x00\x63\x00\x65\x00\x73\x00\x2d\x00\x64\x00\x65\x00\x73\x00\x6b\x00\x74\ \x00\x6f\x00\x70\x00\x2d\x00\x66\x00\x6f\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x09\ \x0b\xc1\x8a\x47\ \x00\x67\ \x00\x72\x00\x65\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x0c\x2b\x1f\xc7\ \x00\x67\ \x00\x6f\x00\x2d\x00\x6e\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x0c\x33\x5a\x87\ \x00\x68\ \x00\x65\x00\x6c\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x03\x45\xee\x87\ \x00\x68\ \x00\x65\x00\x6c\x00\x70\x00\x2d\x00\x63\x00\x6f\x00\x6e\x00\x74\x00\x65\x00\x6e\x00\x74\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x14\ \x07\x40\xa2\xc7\ \x00\x61\ \x00\x70\x00\x70\x00\x6c\x00\x69\x00\x63\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2d\x00\x65\x00\x78\x00\x69\x00\x74\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x00\x47\x5a\xe7\ \x00\x66\ \x00\x69\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x00\x49\x46\x27\ \x00\x72\ \x00\x61\x00\x74\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x08\x51\xc9\x27\ \x00\x63\ \x00\x6f\x00\x6e\x00\x66\x00\x69\x00\x67\x00\x75\x00\x72\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x02\xaf\x0f\x07\ \x00\x6b\ \x00\x68\x00\x74\x00\x6d\x00\x6c\x00\x5f\x00\x6b\x00\x67\x00\x65\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x09\x42\xd3\x47\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x73\x00\x74\x00\x61\x00\x74\x00\x69\x00\x73\x00\x74\x00\x69\x00\x63\x00\x73\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x0c\ \x05\xec\xa3\x87\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x5f\x00\x73\x00\x75\x00\x62\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1a\ \x0f\x6c\x48\x47\ \x00\x73\ \x00\x74\x00\x6f\x00\x63\x00\x6b\x00\x5f\x00\x6e\x00\x65\x00\x77\x00\x5f\x00\x74\x00\x65\x00\x6d\x00\x70\x00\x6c\x00\x61\x00\x74\ \x00\x65\x00\x5f\x00\x72\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x02\xeb\x96\x67\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x63\x00\x61\x00\x6c\x00\x65\x00\x6e\x00\x64\x00\x61\x00\x72\x00\x2d\x00\x74\x00\x61\x00\x73\ \x00\x6b\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0f\xff\xc3\x67\ \x00\x64\ \x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x16\ \x05\x33\x96\x27\ \x00\x70\ \x00\x61\x00\x63\x00\x6b\x00\x61\x00\x67\x00\x65\x00\x5f\x00\x67\x00\x61\x00\x6d\x00\x65\x00\x73\x00\x5f\x00\x63\x00\x61\x00\x72\ \x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x18\ \x02\xa3\x42\xe7\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x73\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x64\x00\x65\x00\x73\x00\x63\x00\x65\x00\x6e\x00\x64\ \x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x05\xd1\x31\x27\ \x00\x68\ \x00\x65\x00\x6c\x00\x70\x00\x2d\x00\x68\x00\x69\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x09\x10\x6a\x47\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x73\x00\x74\ \x00\x6f\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x08\x7b\x1f\x07\ \x00\x67\ \x00\x6f\x00\x2d\x00\x6c\x00\x61\x00\x73\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0b\x27\xb1\x67\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x66\x00\x69\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1a\ \x05\x8e\xb5\x67\ \x00\x73\ \x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x2d\x00\x73\x00\x6f\x00\x66\x00\x74\x00\x77\x00\x61\x00\x72\x00\x65\x00\x2d\x00\x75\ \x00\x70\x00\x64\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x0f\x97\x5d\x67\ \x00\x61\ \x00\x6e\x00\x6b\x00\x69\x00\x62\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x01\xdc\xdb\xc7\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x5f\x00\x73\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x03\x31\x99\x67\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x5f\x00\x75\x00\x6e\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x06\xbf\x2d\x67\ \x00\x75\ \x00\x73\x00\x65\x00\x72\x00\x2d\x00\x69\x00\x64\x00\x65\x00\x6e\x00\x74\x00\x69\x00\x74\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x0d\ \x03\xb8\x1d\x87\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x5f\x00\x62\x00\x6f\x00\x6c\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x00\x7e\xc6\xe7\ \x00\x70\ \x00\x61\x00\x75\x00\x73\x00\x65\x00\x5f\x00\x6f\x00\x66\x00\x66\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x0a\xa9\xcd\x67\ \x00\x73\ \x00\x70\x00\x72\x00\x65\x00\x61\x00\x64\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x19\ \x0a\x48\x46\xa7\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x73\x00\x74\ \x00\x61\x00\x72\x00\x74\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0f\x31\x9c\x67\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x5f\x00\x73\x00\x75\x00\x70\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x03\xb6\x51\x87\ \x00\x67\ \x00\x6f\x00\x2d\x00\x6a\x00\x75\x00\x6d\x00\x70\x00\x2d\x00\x74\x00\x6f\x00\x64\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x0a\ \x0e\x44\x00\x67\ \x00\x64\ \x00\x65\x00\x63\x00\x6b\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0f\x82\x9b\xc7\ \x00\x6d\ \x00\x61\x00\x74\x00\x68\x00\x5f\x00\x73\x00\x71\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x01\x1b\xc7\xe7\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x65\x00\x78\x00\x70\x00\x6f\x00\x72\x00\x74\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x0a\ \x05\x46\x02\x47\ \x00\x73\ \x00\x74\x00\x61\x00\x72\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x06\xbc\x23\xa7\ \x00\x61\ \x00\x64\x00\x64\x00\x74\x00\x61\x00\x67\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x07\x0f\x60\xa7\ \x00\x70\ \x00\x72\x00\x6f\x00\x64\x00\x75\x00\x63\x00\x74\x00\x5f\x00\x64\x00\x65\x00\x73\x00\x69\x00\x67\x00\x6e\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x0e\ \x01\x12\x8a\xc7\ \x00\x63\ \x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x2d\x00\x69\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x08\x15\x13\x67\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x01\x31\x80\x47\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0c\x59\x82\x67\ \x00\x73\ \x00\x74\x00\x61\x00\x72\x00\x5f\x00\x6f\x00\x66\x00\x66\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x0f\xdd\x68\xa7\ \x00\x64\ \x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x74\x00\x61\x00\x67\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x0d\xfc\xcc\x07\ \x00\x66\ \x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x2d\x00\x73\x00\x74\x00\x72\x00\x6f\x00\x6b\x00\x65\x00\x2d\x00\x63\x00\x6f\x00\x6c\ \x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x0f\x09\x67\xc7\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x73\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x61\x00\x73\x00\x63\x00\x65\x00\x6e\x00\x64\x00\x69\ \x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x02\x71\xe5\xa7\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x5f\x00\x63\x00\x6c\x00\x65\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x01\x1a\x51\xe7\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x69\x00\x6d\x00\x70\x00\x6f\x00\x72\x00\x74\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x0e\ \x02\x94\xdd\x27\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x2d\x00\x73\x00\x70\x00\x65\x00\x61\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x0c\xbc\x2e\x67\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x6e\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x18\ \x0b\xa7\x9e\x07\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x70\x00\x61\ \x00\x75\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x06\x48\x59\xe7\ \x00\x6e\ \x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x04\xd2\x59\x47\ \x00\x69\ \x00\x6e\x00\x66\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x07\ \x0a\xcb\x57\xa7\ \x00\x74\ \x00\x65\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x09\ \x07\x49\x98\x07\ \x00\x61\ \x00\x64\x00\x64\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0c\x95\x22\x87\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x63\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x16\ \x06\x50\x67\xa7\ \x00\x70\ \x00\x72\x00\x65\x00\x66\x00\x65\x00\x72\x00\x65\x00\x6e\x00\x63\x00\x65\x00\x73\x00\x2d\x00\x70\x00\x6c\x00\x75\x00\x67\x00\x69\ \x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x06\xc9\x05\x47\ \x00\x6c\ \x00\x61\x00\x79\x00\x6f\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x08\xfa\xe2\xc7\ \x00\x63\ \x00\x6f\x00\x6e\x00\x74\x00\x65\x00\x6e\x00\x74\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x02\x4f\xbf\x87\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x5f\x00\x69\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x06\xd3\x61\x07\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x66\x00\x69\x00\x6e\x00\x64\x00\x20\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x02\xe7\xa4\x87\ \x00\x6d\ \x00\x61\x00\x69\x00\x6c\x00\x2d\x00\x61\x00\x74\x00\x74\x00\x61\x00\x63\x00\x68\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x11\ \x0d\x5c\x76\xa7\ \x00\x73\ \x00\x71\x00\x6c\x00\x69\x00\x74\x00\x65\x00\x62\x00\x72\x00\x6f\x00\x77\x00\x73\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x0c\ \x09\xc6\x19\x27\ \x00\x6c\ \x00\x69\x00\x73\x00\x74\x00\x2d\x00\x61\x00\x64\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x09\ \x07\xd8\xb7\x27\ \x00\x69\ \x00\x6d\x00\x61\x00\x67\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x18\ \x0f\xa4\x86\x47\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x73\x00\x74\ \x00\x61\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x08\xe0\xe9\x07\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x72\x00\x65\x00\x6e\x00\x61\x00\x6d\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x05\xca\x2d\x47\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x70\x00\x69\x00\x6d\x00\x2d\x00\x6e\x00\x65\x00\x77\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x0a\ \x06\x9b\x1b\x27\ \x00\x63\ \x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x07\x74\x6f\xc7\ \x00\x61\ \x00\x6e\x00\x6b\x00\x69\x00\x2d\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x0c\xec\x59\x67\ \x00\x6b\ \x00\x65\x00\x78\x00\x69\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x09\xd0\x7a\x07\ \x00\x61\ \x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x75\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0a\xb5\x05\xe7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x64\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x16\ \x0d\x84\xb0\x87\ \x00\x73\ \x00\x74\x00\x6f\x00\x63\x00\x6b\x00\x5f\x00\x6e\x00\x65\x00\x77\x00\x5f\x00\x74\x00\x65\x00\x6d\x00\x70\x00\x6c\x00\x61\x00\x74\ \x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x0a\x76\xa2\x27\ \x00\x61\ \x00\x64\x00\x64\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x01\xd1\x21\x47\ \x00\x70\ \x00\x6c\x00\x61\x00\x79\x00\x65\x00\x72\x00\x2d\x00\x74\x00\x69\x00\x6d\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x15\ \x0f\x47\x47\x27\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x70\x00\x69\x00\x6d\x00\x2d\x00\x63\x00\x61\x00\x6c\x00\x65\x00\x6e\x00\x64\x00\x61\x00\x72\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x09\x8d\x54\xe7\ \x00\x74\ \x00\x65\x00\x78\x00\x74\x00\x5f\x00\x72\x00\x65\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x03\xf4\x6e\xe7\ \x00\x73\ \x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x2d\x00\x73\x00\x68\x00\x75\x00\x74\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x0c\ \x05\x11\x0e\x07\ \x00\x64\ \x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x03\xd2\xbe\x67\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x75\x00\x6e\x00\x64\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x05\x1c\x5a\x47\ \x00\x61\ \x00\x6e\x00\x6b\x00\x69\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x0e\x36\x76\xc7\ \x00\x67\ \x00\x6f\x00\x2d\x00\x70\x00\x72\x00\x65\x00\x76\x00\x69\x00\x6f\x00\x75\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x04\x4d\x7d\x87\ \x00\x67\ \x00\x61\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x73\x00\x6f\x00\x6c\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x05\x0e\xfb\xe7\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x5f\x00\x74\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x15\ \x08\xcd\xb5\x87\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x66\x00\x69\x00\x6e\x00\x64\x00\x2d\x00\x72\x00\x65\x00\x70\x00\x6c\x00\x61\x00\x63\x00\x65\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x09\ \x08\x96\x8c\x27\ \x00\x67\ \x00\x65\x00\x61\x00\x72\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0c\xd2\xbf\xe7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x72\x00\x65\x00\x64\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x09\xbe\x72\x67\ \x00\x6b\ \x00\x62\x00\x75\x00\x67\x00\x62\x00\x75\x00\x73\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x03\xf7\x3c\xe7\ \x00\x6b\ \x00\x62\x00\x6c\x00\x6f\x00\x67\x00\x67\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x0b\x07\x5a\x27\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x02\xe3\x4a\xa7\ \x00\x70\ \x00\x6c\x00\x75\x00\x73\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0f\xae\x0e\x47\ \x00\x63\ \x00\x6f\x00\x6e\x00\x74\x00\x65\x00\x6e\x00\x74\x00\x73\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\ " qt_resource_struct = "\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x70\x00\x00\x00\x02\ \x00\x00\x03\x94\x00\x00\x00\x00\x00\x01\x00\x00\xc4\x5e\ \x00\x00\x03\xaa\x00\x00\x00\x00\x00\x01\x00\x00\xcb\x45\ \x00\x00\x01\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x44\xce\ \x00\x00\x06\xba\x00\x00\x00\x00\x00\x01\x00\x01\x4f\x64\ \x00\x00\x01\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x4a\xe3\ \x00\x00\x08\x4c\x00\x00\x00\x00\x00\x01\x00\x01\x93\xf8\ \x00\x00\x09\x80\x00\x00\x00\x00\x00\x01\x00\x01\xf2\xf9\ \x00\x00\x07\xbe\x00\x00\x00\x00\x00\x01\x00\x01\x71\xd8\ \x00\x00\x08\x94\x00\x00\x00\x00\x00\x01\x00\x01\xae\x10\ \x00\x00\x0d\x3c\x00\x00\x00\x00\x00\x01\x00\x02\xa6\xf3\ \x00\x00\x06\x2a\x00\x00\x00\x00\x00\x01\x00\x01\x3d\x21\ \x00\x00\x0b\x0c\x00\x00\x00\x00\x00\x01\x00\x02\x4b\xb6\ \x00\x00\x09\x5e\x00\x00\x00\x00\x00\x01\x00\x01\xe6\xb8\ \x00\x00\x02\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x84\xe4\ \x00\x00\x02\x88\x00\x00\x00\x00\x00\x01\x00\x00\x9d\x5d\ \x00\x00\x09\xac\x00\x00\x00\x00\x00\x01\x00\x01\xf7\xd9\ \x00\x00\x05\x10\x00\x00\x00\x00\x00\x01\x00\x01\x0d\xf9\ \x00\x00\x03\xe4\x00\x00\x00\x00\x00\x01\x00\x00\xdc\x89\ \x00\x00\x0f\x5a\x00\x00\x00\x00\x00\x01\x00\x03\x1b\xd4\ \x00\x00\x0b\x56\x00\x00\x00\x00\x00\x01\x00\x02\x5c\x37\ \x00\x00\x04\x8a\x00\x00\x00\x00\x00\x01\x00\x00\xf6\xf0\ \x00\x00\x06\x50\x00\x00\x00\x00\x00\x01\x00\x01\x47\xef\ \x00\x00\x03\x3e\x00\x00\x00\x00\x00\x01\x00\x00\xb7\x37\ \x00\x00\x07\x5c\x00\x00\x00\x00\x00\x01\x00\x01\x5d\xf2\ \x00\x00\x06\x9a\x00\x00\x00\x00\x00\x01\x00\x01\x4e\x30\ \x00\x00\x0d\xfe\x00\x00\x00\x00\x00\x01\x00\x02\xd3\x33\ \x00\x00\x0d\xb4\x00\x00\x00\x00\x00\x01\x00\x02\xc0\x13\ \x00\x00\x0f\x26\x00\x00\x00\x00\x00\x01\x00\x03\x0f\x5d\ \x00\x00\x0e\x58\x00\x00\x00\x00\x00\x01\x00\x02\xe7\xdb\ \x00\x00\x01\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x60\x05\ \x00\x00\x0a\x40\x00\x00\x00\x00\x00\x01\x00\x02\x0d\x29\ \x00\x00\x0e\x7c\x00\x00\x00\x00\x00\x01\x00\x02\xf2\x7f\ \x00\x00\x0d\xe0\x00\x00\x00\x00\x00\x01\x00\x02\xc6\xf0\ \x00\x00\x0e\x1e\x00\x00\x00\x00\x00\x01\x00\x02\xdb\x1b\ \x00\x00\x04\xde\x00\x00\x00\x00\x00\x01\x00\x01\x05\x28\ \x00\x00\x02\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x6f\xf1\ \x00\x00\x07\xea\x00\x00\x00\x00\x00\x01\x00\x01\x76\xe7\ \x00\x00\x05\xd6\x00\x00\x00\x00\x00\x01\x00\x01\x2e\x03\ \x00\x00\x0c\x3a\x00\x00\x00\x00\x00\x01\x00\x02\x74\xbf\ \x00\x00\x05\x46\x00\x00\x00\x00\x00\x01\x00\x01\x12\x50\ \x00\x00\x04\x32\x00\x00\x00\x00\x00\x01\x00\x00\xf0\xfe\ \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x53\x6d\ \x00\x00\x0a\x2a\x00\x00\x00\x00\x00\x01\x00\x02\x0b\xbf\ \x00\x00\x0a\xa2\x00\x00\x00\x00\x00\x01\x00\x02\x34\x20\ \x00\x00\x0c\x62\x00\x00\x00\x00\x00\x01\x00\x02\x79\x18\ \x00\x00\x08\x04\x00\x00\x00\x00\x00\x01\x00\x01\x83\x23\ \x00\x00\x06\x72\x00\x00\x00\x00\x00\x01\x00\x01\x49\x04\ \x00\x00\x0a\xd4\x00\x00\x00\x00\x00\x01\x00\x02\x3b\x07\ \x00\x00\x0b\x32\x00\x00\x00\x00\x00\x01\x00\x02\x55\xd4\ \x00\x00\x08\x22\x00\x00\x00\x00\x00\x01\x00\x01\x8f\x9a\ \x00\x00\x03\x66\x00\x00\x00\x00\x00\x01\x00\x00\xbd\x7a\ \x00\x00\x0a\x6a\x00\x00\x00\x00\x00\x01\x00\x02\x21\xf9\ \x00\x00\x0c\x7c\x00\x00\x00\x00\x00\x01\x00\x02\x82\x13\ \x00\x00\x01\x02\x00\x00\x00\x00\x00\x01\x00\x00\x2e\x68\ \x00\x00\x0b\xc8\x00\x00\x00\x00\x00\x01\x00\x02\x67\x18\ \x00\x00\x00\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x27\x31\ \x00\x00\x00\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xfa\ \x00\x00\x08\x6e\x00\x00\x00\x00\x00\x01\x00\x01\xa1\xa4\ \x00\x00\x00\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x19\xf6\ \x00\x00\x03\xc4\x00\x00\x00\x00\x00\x01\x00\x00\xcf\x6a\ \x00\x00\x05\x9a\x00\x00\x00\x00\x00\x01\x00\x01\x21\xdf\ \x00\x00\x02\xb6\x00\x00\x00\x00\x00\x01\x00\x00\xa3\x91\ \x00\x00\x0e\xcc\x00\x00\x00\x00\x00\x01\x00\x02\xfe\x19\ \x00\x00\x01\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x6d\xed\ \x00\x00\x0e\x9c\x00\x00\x00\x00\x00\x01\x00\x02\xf6\x3b\ \x00\x00\x0c\x16\x00\x00\x00\x00\x00\x01\x00\x02\x72\xcb\ \x00\x00\x0a\xee\x00\x00\x00\x00\x00\x01\x00\x02\x42\x0f\ \x00\x00\x05\x66\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x4e\ \x00\x00\x05\x66\x00\x00\x00\x00\x00\x01\x00\x01\x18\xbd\ \x00\x00\x04\x06\x00\x00\x00\x00\x00\x01\x00\x00\xe4\xd7\ \x00\x00\x0d\x90\x00\x00\x00\x00\x00\x01\x00\x02\xb5\x4f\ \x00\x00\x0f\x04\x00\x00\x00\x00\x00\x01\x00\x03\x08\xac\ \x00\x00\x0b\xaa\x00\x00\x00\x00\x00\x01\x00\x02\x62\x15\ \x00\x00\x0c\xb0\x00\x00\x00\x00\x00\x01\x00\x02\x8a\xd0\ \x00\x00\x07\x02\x00\x00\x00\x00\x00\x01\x00\x01\x58\x24\ \x00\x00\x0d\x22\x00\x00\x00\x00\x00\x01\x00\x02\x9e\xc5\ \x00\x00\x06\xde\x00\x00\x00\x00\x00\x01\x00\x01\x51\x54\ \x00\x00\x0c\xce\x00\x00\x00\x00\x00\x01\x00\x02\x8e\x73\ \x00\x00\x0a\x56\x00\x00\x00\x00\x00\x01\x00\x02\x19\x45\ \x00\x00\x0f\x44\x00\x00\x00\x00\x00\x01\x00\x03\x15\x75\ \x00\x00\x05\xb6\x00\x00\x00\x00\x00\x01\x00\x01\x28\x17\ \x00\x00\x09\xf4\x00\x00\x00\x00\x00\x01\x00\x02\x07\x42\ \x00\x00\x02\xf4\x00\x00\x00\x00\x00\x01\x00\x00\xa8\xcd\ \x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x00\xab\x3b\ \x00\x00\x03\x28\x00\x00\x00\x00\x00\x01\x00\x00\xb1\x00\ \x00\x00\x08\xb0\x00\x00\x00\x00\x00\x01\x00\x01\xb5\xd0\ \x00\x00\x0a\x82\x00\x00\x00\x00\x00\x01\x00\x02\x2d\xe2\ \x00\x00\x09\xce\x00\x00\x00\x00\x00\x01\x00\x02\x01\xbc\ \x00\x00\x00\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x17\x75\ \x00\x00\x0e\xe4\x00\x00\x00\x00\x00\x01\x00\x03\x00\xda\ \x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x16\xa4\ \x00\x00\x0c\x9a\x00\x00\x00\x00\x00\x01\x00\x02\x86\x31\ \x00\x00\x0b\x82\x00\x00\x00\x00\x00\x01\x00\x02\x60\x2b\ \x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x03\xf2\ \x00\x00\x0c\xf0\x00\x00\x00\x00\x00\x01\x00\x02\x95\x67\ \x00\x00\x00\x56\x00\x00\x00\x00\x00\x01\x00\x00\x15\xc1\ \x00\x00\x08\xf6\x00\x00\x00\x00\x00\x01\x00\x01\xce\x88\ \x00\x00\x01\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x66\x46\ \x00\x00\x0e\x34\x00\x00\x00\x00\x00\x01\x00\x02\xe1\xd7\ \x00\x00\x07\x84\x00\x00\x00\x00\x00\x01\x00\x01\x63\x96\ \x00\x00\x02\x42\x00\x00\x00\x00\x00\x01\x00\x00\x78\x95\ \x00\x00\x09\x2a\x00\x00\x00\x00\x00\x01\x00\x01\xe2\x25\ \x00\x00\x07\x3a\x00\x00\x00\x00\x00\x01\x00\x01\x5c\xc1\ \x00\x00\x0d\x60\x00\x00\x00\x00\x00\x01\x00\x02\xb0\x70\ \x00\x00\x04\x50\x00\x00\x00\x00\x00\x01\x00\x00\xf2\x19\ \x00\x00\x07\x9e\x00\x00\x00\x00\x00\x01\x00\x01\x6f\xfa\ \x00\x00\x06\x10\x00\x00\x00\x00\x00\x01\x00\x01\x38\x23\ \x00\x00\x0b\xe0\x00\x00\x00\x00\x00\x01\x00\x02\x6e\x80\ \x00\x00\x0f\x7e\x00\x00\x00\x00\x00\x01\x00\x03\x29\xc6\ \x00\x00\x08\xd2\x00\x00\x00\x00\x00\x01\x00\x01\xc2\x0f\ \x00\x00\x04\xbe\x00\x00\x00\x00\x00\x01\x00\x00\xfc\x9d\ " def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() anki-2.0.20+dfsg/aqt/forms/editcurrent.py0000644000175000017500000000303512167474725020105 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/editcurrent.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(400, 300) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setSpacing(3) self.verticalLayout.setMargin(12) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.fieldsArea = QtGui.QWidget(Dialog) self.fieldsArea.setObjectName(_fromUtf8("fieldsArea")) self.verticalLayout.addWidget(self.fieldsArea) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Dialog")) anki-2.0.20+dfsg/aqt/forms/reposition.py0000644000175000017500000000657312167474726017763 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/reposition.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(272, 229) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.label = QtGui.QLabel(Dialog) self.label.setText(_fromUtf8("")) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.start = QtGui.QSpinBox(Dialog) self.start.setMinimum(-20000000) self.start.setMaximum(200000000) self.start.setProperty("value", 0) self.start.setObjectName(_fromUtf8("start")) self.gridLayout.addWidget(self.start, 0, 1, 1, 1) self.label_3 = QtGui.QLabel(Dialog) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.step = QtGui.QSpinBox(Dialog) self.step.setMinimum(1) self.step.setMaximum(10000) self.step.setObjectName(_fromUtf8("step")) self.gridLayout.addWidget(self.step, 1, 1, 1, 1) self.verticalLayout.addLayout(self.gridLayout) self.randomize = QtGui.QCheckBox(Dialog) self.randomize.setObjectName(_fromUtf8("randomize")) self.verticalLayout.addWidget(self.randomize) self.shift = QtGui.QCheckBox(Dialog) self.shift.setChecked(True) self.shift.setObjectName(_fromUtf8("shift")) self.verticalLayout.addWidget(self.shift) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.start, self.step) Dialog.setTabOrder(self.step, self.randomize) Dialog.setTabOrder(self.randomize, self.shift) Dialog.setTabOrder(self.shift, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Reposition New Cards")) self.label_2.setText(_("Start position:")) self.label_3.setText(_("Step:")) self.randomize.setText(_("Randomize order")) self.shift.setText(_("Shift position of existing cards")) anki-2.0.20+dfsg/aqt/forms/findreplace.py0000644000175000017500000000671312167474725020037 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/findreplace.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(367, 209) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.find = QtGui.QLineEdit(Dialog) self.find.setObjectName(_fromUtf8("find")) self.gridLayout.addWidget(self.find, 0, 1, 1, 1) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) self.replace = QtGui.QLineEdit(Dialog) self.replace.setObjectName(_fromUtf8("replace")) self.gridLayout.addWidget(self.replace, 1, 1, 1, 1) self.label_3 = QtGui.QLabel(Dialog) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) self.field = QtGui.QComboBox(Dialog) self.field.setObjectName(_fromUtf8("field")) self.gridLayout.addWidget(self.field, 2, 1, 1, 1) self.re = QtGui.QCheckBox(Dialog) self.re.setObjectName(_fromUtf8("re")) self.gridLayout.addWidget(self.re, 4, 1, 1, 1) self.ignoreCase = QtGui.QCheckBox(Dialog) self.ignoreCase.setChecked(True) self.ignoreCase.setObjectName(_fromUtf8("ignoreCase")) self.gridLayout.addWidget(self.ignoreCase, 3, 1, 1, 1) self.verticalLayout.addLayout(self.gridLayout) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Help|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.find, self.replace) Dialog.setTabOrder(self.replace, self.field) Dialog.setTabOrder(self.field, self.ignoreCase) Dialog.setTabOrder(self.ignoreCase, self.re) Dialog.setTabOrder(self.re, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Find and Replace")) self.label.setText(_("Find:")) self.label_2.setText(_("Replace With:")) self.label_3.setText(_("In:")) self.re.setText(_("Treat input as regular expression")) self.ignoreCase.setText(_("Ignore case")) anki-2.0.20+dfsg/aqt/forms/__init__.py0000644000175000017500000000215512252273051017276 0ustar andreasandreas# This file auto-generated by build_ui.sh. Don't edit. __all__ = [ "about", "addcards", "addfield", "addmodel", "browser", "browserdisp", "browseropts", "changemap", "changemodel", "customstudy", "dconf", "debug", "dyndconf", "editaddon", "editcurrent", "edithtml", "exporting", "fields", "finddupes", "findreplace", "getaddons", "importing", "main", "modelopts", "models", "preferences", "preview", "profiles", "reposition", "reschedule", "setgroup", "setlang", "stats", "studydeck", "taglimit", "template", ] import about import addcards import addfield import addmodel import browser import browserdisp import browseropts import changemap import changemodel import customstudy import dconf import debug import dyndconf import editaddon import editcurrent import edithtml import exporting import fields import finddupes import findreplace import getaddons import importing import main import modelopts import models import preferences import preview import profiles import reposition import reschedule import setgroup import setlang import stats import studydeck import taglimit import template anki-2.0.20+dfsg/aqt/forms/changemodel.py0000644000175000017500000001372412167474724020030 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/changemodel.ui' # # Created: Thu Jul 11 18:24:36 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(362, 391) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setSpacing(10) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setVerticalSpacing(4) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label_6 = QtGui.QLabel(Dialog) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridLayout.addWidget(self.label_6, 0, 0, 1, 1) self.oldModelLabel = QtGui.QLabel(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.oldModelLabel.sizePolicy().hasHeightForWidth()) self.oldModelLabel.setSizePolicy(sizePolicy) self.oldModelLabel.setText(_fromUtf8("")) self.oldModelLabel.setMargin(4) self.oldModelLabel.setObjectName(_fromUtf8("oldModelLabel")) self.gridLayout.addWidget(self.oldModelLabel, 0, 1, 1, 1) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 1, 0, 1, 1) self.modelChooserWidget = QtGui.QWidget(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.modelChooserWidget.sizePolicy().hasHeightForWidth()) self.modelChooserWidget.setSizePolicy(sizePolicy) self.modelChooserWidget.setObjectName(_fromUtf8("modelChooserWidget")) self.gridLayout.addWidget(self.modelChooserWidget, 1, 1, 1, 1) self.verticalLayout.addLayout(self.gridLayout) self.tgroup = QtGui.QGroupBox(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tgroup.sizePolicy().hasHeightForWidth()) self.tgroup.setSizePolicy(sizePolicy) self.tgroup.setObjectName(_fromUtf8("tgroup")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.tgroup) self.verticalLayout_2.setMargin(0) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.scrollArea = QtGui.QScrollArea(self.tgroup) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth()) self.scrollArea.setSizePolicy(sizePolicy) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName(_fromUtf8("scrollArea")) self.templateMap = QtGui.QWidget() self.templateMap.setGeometry(QtCore.QRect(0, 0, 330, 120)) self.templateMap.setObjectName(_fromUtf8("templateMap")) self.scrollArea.setWidget(self.templateMap) self.verticalLayout_2.addWidget(self.scrollArea) self.verticalLayout.addWidget(self.tgroup) self.fgroup = QtGui.QGroupBox(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.fgroup.sizePolicy().hasHeightForWidth()) self.fgroup.setSizePolicy(sizePolicy) self.fgroup.setObjectName(_fromUtf8("fgroup")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.fgroup) self.verticalLayout_3.setMargin(0) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.scrollArea_2 = QtGui.QScrollArea(self.fgroup) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea_2.sizePolicy().hasHeightForWidth()) self.scrollArea_2.setSizePolicy(sizePolicy) self.scrollArea_2.setWidgetResizable(True) self.scrollArea_2.setObjectName(_fromUtf8("scrollArea_2")) self.fieldMap = QtGui.QWidget() self.fieldMap.setGeometry(QtCore.QRect(0, 0, 330, 119)) self.fieldMap.setObjectName(_fromUtf8("fieldMap")) self.scrollArea_2.setWidget(self.fieldMap) self.verticalLayout_3.addWidget(self.scrollArea_2) self.verticalLayout.addWidget(self.fgroup) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Help|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Change Note Type")) self.label_6.setText(_("Current note type:")) self.label.setText(_("New note type:")) self.tgroup.setTitle(_("Cards")) self.fgroup.setTitle(_("Fields")) anki-2.0.20+dfsg/aqt/forms/preview.py0000644000175000017500000000307212167474726017240 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/preview.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Form(object): def setupUi(self, Form): Form.setObjectName(_fromUtf8("Form")) Form.resize(335, 282) self.verticalLayout_3 = QtGui.QVBoxLayout(Form) self.verticalLayout_3.setMargin(0) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.groupBox = QtGui.QGroupBox(Form) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.frontPrevBox = QtGui.QVBoxLayout(self.groupBox) self.frontPrevBox.setMargin(0) self.frontPrevBox.setObjectName(_fromUtf8("frontPrevBox")) self.verticalLayout_3.addWidget(self.groupBox) self.groupBox_2 = QtGui.QGroupBox(Form) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.backPrevBox = QtGui.QVBoxLayout(self.groupBox_2) self.backPrevBox.setMargin(0) self.backPrevBox.setObjectName(_fromUtf8("backPrevBox")) self.verticalLayout_3.addWidget(self.groupBox_2) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): Form.setWindowTitle(_("Form")) self.groupBox.setTitle(_("Front Preview")) self.groupBox_2.setTitle(_("Back Preview")) anki-2.0.20+dfsg/aqt/forms/profiles.py0000644000175000017500000000727512167474726017413 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/profiles.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(352, 283) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/anki.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) Dialog.setWindowIcon(icon) self.verticalLayout_3 = QtGui.QVBoxLayout(Dialog) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout_3.addWidget(self.label_2) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.verticalLayout_2 = QtGui.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.profiles = QtGui.QListWidget(Dialog) self.profiles.setObjectName(_fromUtf8("profiles")) self.verticalLayout_2.addWidget(self.profiles) self.passLabel = QtGui.QLabel(Dialog) self.passLabel.setObjectName(_fromUtf8("passLabel")) self.verticalLayout_2.addWidget(self.passLabel) self.passEdit = QtGui.QLineEdit(Dialog) self.passEdit.setEchoMode(QtGui.QLineEdit.Password) self.passEdit.setObjectName(_fromUtf8("passEdit")) self.verticalLayout_2.addWidget(self.passEdit) self.horizontalLayout.addLayout(self.verticalLayout_2) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.login = QtGui.QPushButton(Dialog) self.login.setObjectName(_fromUtf8("login")) self.verticalLayout.addWidget(self.login) self.add = QtGui.QPushButton(Dialog) self.add.setObjectName(_fromUtf8("add")) self.verticalLayout.addWidget(self.add) self.rename = QtGui.QPushButton(Dialog) self.rename.setObjectName(_fromUtf8("rename")) self.verticalLayout.addWidget(self.rename) self.delete_2 = QtGui.QPushButton(Dialog) self.delete_2.setObjectName(_fromUtf8("delete_2")) self.verticalLayout.addWidget(self.delete_2) self.quit = QtGui.QPushButton(Dialog) self.quit.setObjectName(_fromUtf8("quit")) self.verticalLayout.addWidget(self.quit) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.horizontalLayout.addLayout(self.verticalLayout) self.verticalLayout_3.addLayout(self.horizontalLayout) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.profiles, self.passEdit) Dialog.setTabOrder(self.passEdit, self.login) Dialog.setTabOrder(self.login, self.add) Dialog.setTabOrder(self.add, self.rename) Dialog.setTabOrder(self.rename, self.delete_2) Dialog.setTabOrder(self.delete_2, self.quit) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Profiles")) self.label_2.setText(_("Profile:")) self.passLabel.setText(_("Password:")) self.login.setText(_("Open")) self.add.setText(_("Add")) self.rename.setText(_("Rename")) self.delete_2.setText(_("Delete")) self.quit.setText(_("Quit")) import icons_rc anki-2.0.20+dfsg/aqt/forms/browserdisp.py0000644000175000017500000000660112221205034020072 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/browserdisp.ui' # # Created: Fri Sep 27 13:31:24 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(412, 241) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) self.qfmt = QtGui.QLineEdit(Dialog) self.qfmt.setObjectName(_fromUtf8("qfmt")) self.verticalLayout.addWidget(self.qfmt) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout.addWidget(self.label_2) self.afmt = QtGui.QLineEdit(Dialog) self.afmt.setObjectName(_fromUtf8("afmt")) self.verticalLayout.addWidget(self.afmt) self.label_3 = QtGui.QLabel(Dialog) self.label_3.setObjectName(_fromUtf8("label_3")) self.verticalLayout.addWidget(self.label_3) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.font = QtGui.QFontComboBox(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(5) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.font.sizePolicy().hasHeightForWidth()) self.font.setSizePolicy(sizePolicy) self.font.setObjectName(_fromUtf8("font")) self.horizontalLayout.addWidget(self.font) self.fontSize = QtGui.QSpinBox(Dialog) self.fontSize.setMinimum(6) self.fontSize.setObjectName(_fromUtf8("fontSize")) self.horizontalLayout.addWidget(self.fontSize) self.verticalLayout.addLayout(self.horizontalLayout) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.qfmt, self.afmt) Dialog.setTabOrder(self.afmt, self.font) Dialog.setTabOrder(self.font, self.fontSize) Dialog.setTabOrder(self.fontSize, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Browser Appearance")) self.label.setText(_("Override front template:")) self.label_2.setText(_("Override back template:")) self.label_3.setText(_("Override font:")) anki-2.0.20+dfsg/aqt/forms/taglimit.py0000644000175000017500000000612112167474726017367 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/taglimit.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(361, 394) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.activeCheck = QtGui.QCheckBox(Dialog) self.activeCheck.setObjectName(_fromUtf8("activeCheck")) self.verticalLayout.addWidget(self.activeCheck) self.activeList = QtGui.QListWidget(Dialog) self.activeList.setEnabled(False) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(2) sizePolicy.setHeightForWidth(self.activeList.sizePolicy().hasHeightForWidth()) self.activeList.setSizePolicy(sizePolicy) self.activeList.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) self.activeList.setObjectName(_fromUtf8("activeList")) self.verticalLayout.addWidget(self.activeList) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) self.inactiveList = QtGui.QListWidget(Dialog) self.inactiveList.setEnabled(True) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(2) sizePolicy.setHeightForWidth(self.inactiveList.sizePolicy().hasHeightForWidth()) self.inactiveList.setSizePolicy(sizePolicy) self.inactiveList.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) self.inactiveList.setObjectName(_fromUtf8("inactiveList")) self.verticalLayout.addWidget(self.inactiveList) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QObject.connect(self.activeCheck, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.activeList.setEnabled) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Selective Study")) self.activeCheck.setText(_("Require one or more of these tags:")) self.label.setText(_("Select tags to exclude:")) anki-2.0.20+dfsg/aqt/forms/modelopts.py0000644000175000017500000000567312167474725017575 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/modelopts.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.setWindowModality(QtCore.Qt.ApplicationModal) Dialog.resize(276, 323) Dialog.setWindowTitle(_fromUtf8("")) self.verticalLayout_2 = QtGui.QVBoxLayout(Dialog) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.qtabwidget = QtGui.QTabWidget(Dialog) self.qtabwidget.setObjectName(_fromUtf8("qtabwidget")) self.tab = QtGui.QWidget() self.tab.setObjectName(_fromUtf8("tab")) self.verticalLayout = QtGui.QVBoxLayout(self.tab) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.label_6 = QtGui.QLabel(self.tab) self.label_6.setObjectName(_fromUtf8("label_6")) self.verticalLayout.addWidget(self.label_6) self.latexHeader = QtGui.QTextEdit(self.tab) self.latexHeader.setTabChangesFocus(True) self.latexHeader.setObjectName(_fromUtf8("latexHeader")) self.verticalLayout.addWidget(self.latexHeader) self.label_7 = QtGui.QLabel(self.tab) self.label_7.setObjectName(_fromUtf8("label_7")) self.verticalLayout.addWidget(self.label_7) self.latexFooter = QtGui.QTextEdit(self.tab) self.latexFooter.setTabChangesFocus(True) self.latexFooter.setObjectName(_fromUtf8("latexFooter")) self.verticalLayout.addWidget(self.latexFooter) self.qtabwidget.addTab(self.tab, _fromUtf8("")) self.verticalLayout_2.addWidget(self.qtabwidget) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Help) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout_2.addWidget(self.buttonBox) self.retranslateUi(Dialog) self.qtabwidget.setCurrentIndex(0) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.qtabwidget, self.buttonBox) Dialog.setTabOrder(self.buttonBox, self.latexHeader) Dialog.setTabOrder(self.latexHeader, self.latexFooter) def retranslateUi(self, Dialog): self.label_6.setText(_("Header")) self.label_7.setText(_("Footer")) self.qtabwidget.setTabText(self.qtabwidget.indexOf(self.tab), _("LaTeX")) anki-2.0.20+dfsg/aqt/forms/exporting.py0000644000175000017500000000736112167474725017602 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/exporting.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_ExportDialog(object): def setupUi(self, ExportDialog): ExportDialog.setObjectName(_fromUtf8("ExportDialog")) ExportDialog.resize(295, 202) self.vboxlayout = QtGui.QVBoxLayout(ExportDialog) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.gridlayout = QtGui.QGridLayout() self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.label = QtGui.QLabel(ExportDialog) self.label.setMinimumSize(QtCore.QSize(100, 0)) self.label.setObjectName(_fromUtf8("label")) self.gridlayout.addWidget(self.label, 0, 0, 1, 1) self.format = QtGui.QComboBox(ExportDialog) self.format.setObjectName(_fromUtf8("format")) self.gridlayout.addWidget(self.format, 0, 1, 1, 1) self.label_2 = QtGui.QLabel(ExportDialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridlayout.addWidget(self.label_2, 1, 0, 1, 1) self.deck = QtGui.QComboBox(ExportDialog) self.deck.setObjectName(_fromUtf8("deck")) self.gridlayout.addWidget(self.deck, 1, 1, 1, 1) self.vboxlayout.addLayout(self.gridlayout) self.vboxlayout1 = QtGui.QVBoxLayout() self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.includeSched = QtGui.QCheckBox(ExportDialog) self.includeSched.setChecked(True) self.includeSched.setObjectName(_fromUtf8("includeSched")) self.vboxlayout1.addWidget(self.includeSched) self.includeMedia = QtGui.QCheckBox(ExportDialog) self.includeMedia.setChecked(True) self.includeMedia.setObjectName(_fromUtf8("includeMedia")) self.vboxlayout1.addWidget(self.includeMedia) self.includeTags = QtGui.QCheckBox(ExportDialog) self.includeTags.setChecked(True) self.includeTags.setObjectName(_fromUtf8("includeTags")) self.vboxlayout1.addWidget(self.includeTags) self.vboxlayout.addLayout(self.vboxlayout1) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.buttonBox = QtGui.QDialogButtonBox(ExportDialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.vboxlayout.addWidget(self.buttonBox) self.retranslateUi(ExportDialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), ExportDialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), ExportDialog.reject) QtCore.QMetaObject.connectSlotsByName(ExportDialog) ExportDialog.setTabOrder(self.format, self.deck) ExportDialog.setTabOrder(self.deck, self.includeSched) ExportDialog.setTabOrder(self.includeSched, self.includeMedia) ExportDialog.setTabOrder(self.includeMedia, self.includeTags) ExportDialog.setTabOrder(self.includeTags, self.buttonBox) def retranslateUi(self, ExportDialog): ExportDialog.setWindowTitle(_("Export")) self.label.setText(_("Export format:")) self.label_2.setText(_("Include:")) self.includeSched.setText(_("Include scheduling information")) self.includeMedia.setText(_("Include media")) self.includeTags.setText(_("Include tags")) anki-2.0.20+dfsg/aqt/forms/getaddons.py0000644000175000017500000000451012167474725017524 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/getaddons.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(367, 204) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.label = QtGui.QLabel(Dialog) self.label.setWordWrap(True) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout.addWidget(self.label_2) self.code = QtGui.QLineEdit(Dialog) self.code.setObjectName(_fromUtf8("code")) self.horizontalLayout.addWidget(self.code) self.verticalLayout.addLayout(self.horizontalLayout) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Install Add-on")) self.label.setText(_("To browse add-ons, please click the browse button below.

When you\'ve found an add-on you like, please paste its code below.")) self.label_2.setText(_("Code:")) anki-2.0.20+dfsg/aqt/forms/fields.py0000644000175000017500000001272712167474725017033 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/fields.ui' # # Created: Thu Jul 11 18:24:37 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(412, 352) Dialog.setModal(True) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.fieldList = QtGui.QListWidget(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.fieldList.sizePolicy().hasHeightForWidth()) self.fieldList.setSizePolicy(sizePolicy) self.fieldList.setMinimumSize(QtCore.QSize(50, 60)) self.fieldList.setObjectName(_fromUtf8("fieldList")) self.horizontalLayout.addWidget(self.fieldList) self.verticalLayout_3 = QtGui.QVBoxLayout() self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.fieldAdd = QtGui.QPushButton(Dialog) self.fieldAdd.setObjectName(_fromUtf8("fieldAdd")) self.verticalLayout_3.addWidget(self.fieldAdd) self.fieldDelete = QtGui.QPushButton(Dialog) self.fieldDelete.setObjectName(_fromUtf8("fieldDelete")) self.verticalLayout_3.addWidget(self.fieldDelete) self.fieldRename = QtGui.QPushButton(Dialog) self.fieldRename.setObjectName(_fromUtf8("fieldRename")) self.verticalLayout_3.addWidget(self.fieldRename) self.fieldPosition = QtGui.QPushButton(Dialog) self.fieldPosition.setObjectName(_fromUtf8("fieldPosition")) self.verticalLayout_3.addWidget(self.fieldPosition) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem) self.horizontalLayout.addLayout(self.verticalLayout_3) self.verticalLayout.addLayout(self.horizontalLayout) self._2 = QtGui.QGridLayout() self._2.setObjectName(_fromUtf8("_2")) self.label_5 = QtGui.QLabel(Dialog) self.label_5.setObjectName(_fromUtf8("label_5")) self._2.addWidget(self.label_5, 0, 0, 1, 1) self.fontFamily = QtGui.QFontComboBox(Dialog) self.fontFamily.setMinimumSize(QtCore.QSize(0, 25)) self.fontFamily.setObjectName(_fromUtf8("fontFamily")) self._2.addWidget(self.fontFamily, 0, 1, 1, 1) self.rtl = QtGui.QCheckBox(Dialog) self.rtl.setObjectName(_fromUtf8("rtl")) self._2.addWidget(self.rtl, 3, 1, 1, 1) self.fontSize = QtGui.QSpinBox(Dialog) self.fontSize.setMinimum(5) self.fontSize.setMaximum(300) self.fontSize.setObjectName(_fromUtf8("fontSize")) self._2.addWidget(self.fontSize, 0, 2, 1, 1) self.sticky = QtGui.QCheckBox(Dialog) self.sticky.setObjectName(_fromUtf8("sticky")) self._2.addWidget(self.sticky, 2, 1, 1, 1) self.label_18 = QtGui.QLabel(Dialog) self.label_18.setObjectName(_fromUtf8("label_18")) self._2.addWidget(self.label_18, 1, 0, 1, 1) self.sortField = QtGui.QRadioButton(Dialog) self.sortField.setObjectName(_fromUtf8("sortField")) self._2.addWidget(self.sortField, 1, 1, 1, 1) self.verticalLayout.addLayout(self._2) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Help) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.fieldList, self.fieldAdd) Dialog.setTabOrder(self.fieldAdd, self.fieldDelete) Dialog.setTabOrder(self.fieldDelete, self.fieldRename) Dialog.setTabOrder(self.fieldRename, self.fieldPosition) Dialog.setTabOrder(self.fieldPosition, self.fontFamily) Dialog.setTabOrder(self.fontFamily, self.fontSize) Dialog.setTabOrder(self.fontSize, self.sortField) Dialog.setTabOrder(self.sortField, self.sticky) Dialog.setTabOrder(self.sticky, self.rtl) Dialog.setTabOrder(self.rtl, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Fields")) self.fieldAdd.setText(_("Add")) self.fieldDelete.setText(_("Delete")) self.fieldRename.setText(_("Rename")) self.fieldPosition.setText(_("Reposition")) self.label_5.setText(_("Editing Font")) self.rtl.setText(_("Reverse text direction (RTL)")) self.sticky.setText(_("Remember last input when adding")) self.label_18.setText(_("Options")) self.sortField.setText(_("Sort by this field in the browser")) import icons_rc anki-2.0.20+dfsg/aqt/forms/browser.py0000644000175000017500000004112412244725510017224 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/browser.ui' # # Created: Tue Nov 26 04:55:52 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(750, 400) Dialog.setMinimumSize(QtCore.QSize(750, 400)) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/find.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) Dialog.setWindowIcon(icon) self.centralwidget = QtGui.QWidget(Dialog) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.centralwidget) self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setMargin(0) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.splitter_2 = QtGui.QSplitter(self.centralwidget) self.splitter_2.setOrientation(QtCore.Qt.Horizontal) self.splitter_2.setObjectName(_fromUtf8("splitter_2")) self.tree = QtGui.QTreeWidget(self.splitter_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tree.sizePolicy().hasHeightForWidth()) self.tree.setSizePolicy(sizePolicy) self.tree.setFrameShape(QtGui.QFrame.NoFrame) self.tree.setObjectName(_fromUtf8("tree")) self.tree.headerItem().setText(0, _fromUtf8("1")) self.tree.header().setVisible(False) self.splitter = QtGui.QSplitter(self.splitter_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(4) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.splitter.sizePolicy().hasHeightForWidth()) self.splitter.setSizePolicy(sizePolicy) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setObjectName(_fromUtf8("splitter")) self.widget = QtGui.QWidget(self.splitter) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(3) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth()) self.widget.setSizePolicy(sizePolicy) self.widget.setObjectName(_fromUtf8("widget")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.widget) self.verticalLayout_2.setSpacing(0) self.verticalLayout_2.setMargin(0) self.verticalLayout_2.setMargin(0) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setContentsMargins(0, 0, 0, -1) self.gridLayout.setHorizontalSpacing(6) self.gridLayout.setVerticalSpacing(0) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.searchEdit = QtGui.QComboBox(self.widget) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(9) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.searchEdit.sizePolicy().hasHeightForWidth()) self.searchEdit.setSizePolicy(sizePolicy) self.searchEdit.setEditable(True) self.searchEdit.setInsertPolicy(QtGui.QComboBox.NoInsert) self.searchEdit.setObjectName(_fromUtf8("searchEdit")) self.gridLayout.addWidget(self.searchEdit, 0, 0, 1, 1) self.searchButton = QtGui.QPushButton(self.widget) self.searchButton.setObjectName(_fromUtf8("searchButton")) self.gridLayout.addWidget(self.searchButton, 0, 1, 1, 1) self.previewButton = QtGui.QPushButton(self.widget) self.previewButton.setCheckable(True) self.previewButton.setObjectName(_fromUtf8("previewButton")) self.gridLayout.addWidget(self.previewButton, 0, 2, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout) self.tableView = QtGui.QTableView(self.widget) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(9) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.tableView.sizePolicy().hasHeightForWidth()) self.tableView.setSizePolicy(sizePolicy) self.tableView.setMinimumSize(QtCore.QSize(0, 150)) self.tableView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.tableView.setFrameShape(QtGui.QFrame.NoFrame) self.tableView.setFrameShadow(QtGui.QFrame.Plain) self.tableView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) self.tableView.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.tableView.setTabKeyNavigation(False) self.tableView.setAlternatingRowColors(True) self.tableView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.tableView.setObjectName(_fromUtf8("tableView")) self.tableView.horizontalHeader().setCascadingSectionResizes(False) self.tableView.horizontalHeader().setHighlightSections(False) self.tableView.horizontalHeader().setMinimumSectionSize(20) self.tableView.horizontalHeader().setSortIndicatorShown(True) self.verticalLayout_2.addWidget(self.tableView) self.verticalLayoutWidget = QtGui.QWidget(self.splitter) self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget")) self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setSpacing(0) self.verticalLayout.setContentsMargins(0, 1, 0, 0) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout2 = QtGui.QHBoxLayout() self.horizontalLayout2.setSpacing(0) self.horizontalLayout2.setMargin(0) self.horizontalLayout2.setObjectName(_fromUtf8("horizontalLayout2")) self.fieldsArea = QtGui.QWidget(self.verticalLayoutWidget) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.fieldsArea.sizePolicy().hasHeightForWidth()) self.fieldsArea.setSizePolicy(sizePolicy) self.fieldsArea.setMinimumSize(QtCore.QSize(50, 200)) self.fieldsArea.setObjectName(_fromUtf8("fieldsArea")) self.horizontalLayout2.addWidget(self.fieldsArea) self.verticalLayout.addLayout(self.horizontalLayout2) self.verticalLayout_3.addWidget(self.splitter_2) Dialog.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(Dialog) self.menubar.setGeometry(QtCore.QRect(0, 0, 750, 22)) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuEdit = QtGui.QMenu(self.menubar) self.menuEdit.setObjectName(_fromUtf8("menuEdit")) self.menuJump = QtGui.QMenu(self.menubar) self.menuJump.setObjectName(_fromUtf8("menuJump")) self.menu_Help = QtGui.QMenu(self.menubar) self.menu_Help.setObjectName(_fromUtf8("menu_Help")) Dialog.setMenuBar(self.menubar) self.actionReschedule = QtGui.QAction(Dialog) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/view-pim-calendar.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionReschedule.setIcon(icon1) self.actionReschedule.setObjectName(_fromUtf8("actionReschedule")) self.actionSelectAll = QtGui.QAction(Dialog) self.actionSelectAll.setObjectName(_fromUtf8("actionSelectAll")) self.actionUndo = QtGui.QAction(Dialog) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/edit-undo.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionUndo.setIcon(icon2) self.actionUndo.setObjectName(_fromUtf8("actionUndo")) self.actionInvertSelection = QtGui.QAction(Dialog) self.actionInvertSelection.setObjectName(_fromUtf8("actionInvertSelection")) self.actionFind = QtGui.QAction(Dialog) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/document-preview.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionFind.setIcon(icon3) self.actionFind.setObjectName(_fromUtf8("actionFind")) self.actionNote = QtGui.QAction(Dialog) icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/Anki_Fact.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionNote.setIcon(icon4) self.actionNote.setObjectName(_fromUtf8("actionNote")) self.actionNextCard = QtGui.QAction(Dialog) icon5 = QtGui.QIcon() icon5.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/go-next.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionNextCard.setIcon(icon5) self.actionNextCard.setObjectName(_fromUtf8("actionNextCard")) self.actionPreviousCard = QtGui.QAction(Dialog) icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/go-previous.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionPreviousCard.setIcon(icon6) self.actionPreviousCard.setObjectName(_fromUtf8("actionPreviousCard")) self.actionGuide = QtGui.QAction(Dialog) icon7 = QtGui.QIcon() icon7.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/help.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionGuide.setIcon(icon7) self.actionGuide.setObjectName(_fromUtf8("actionGuide")) self.actionChangeModel = QtGui.QAction(Dialog) icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/system-software-update.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionChangeModel.setIcon(icon8) self.actionChangeModel.setObjectName(_fromUtf8("actionChangeModel")) self.actionSelectNotes = QtGui.QAction(Dialog) self.actionSelectNotes.setObjectName(_fromUtf8("actionSelectNotes")) self.actionFindReplace = QtGui.QAction(Dialog) icon9 = QtGui.QIcon() icon9.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/edit-find-replace.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionFindReplace.setIcon(icon9) self.actionFindReplace.setObjectName(_fromUtf8("actionFindReplace")) self.actionCram = QtGui.QAction(Dialog) self.actionCram.setIcon(icon1) self.actionCram.setObjectName(_fromUtf8("actionCram")) self.actionTags = QtGui.QAction(Dialog) icon10 = QtGui.QIcon() icon10.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/anki-tag.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionTags.setIcon(icon10) self.actionTags.setObjectName(_fromUtf8("actionTags")) self.actionCardList = QtGui.QAction(Dialog) icon11 = QtGui.QIcon() icon11.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/generate_07.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionCardList.setIcon(icon11) self.actionCardList.setObjectName(_fromUtf8("actionCardList")) self.actionFindDuplicates = QtGui.QAction(Dialog) icon12 = QtGui.QIcon() icon12.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/edit-find 2.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionFindDuplicates.setIcon(icon12) self.actionFindDuplicates.setObjectName(_fromUtf8("actionFindDuplicates")) self.actionReposition = QtGui.QAction(Dialog) icon13 = QtGui.QIcon() icon13.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/view-sort-ascending.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionReposition.setIcon(icon13) self.actionReposition.setObjectName(_fromUtf8("actionReposition")) self.actionFirstCard = QtGui.QAction(Dialog) icon14 = QtGui.QIcon() icon14.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/arrow-up.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionFirstCard.setIcon(icon14) self.actionFirstCard.setObjectName(_fromUtf8("actionFirstCard")) self.actionLastCard = QtGui.QAction(Dialog) icon15 = QtGui.QIcon() icon15.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/arrow-down.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionLastCard.setIcon(icon15) self.actionLastCard.setObjectName(_fromUtf8("actionLastCard")) self.actionClose = QtGui.QAction(Dialog) self.actionClose.setObjectName(_fromUtf8("actionClose")) self.menuEdit.addAction(self.actionUndo) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionReschedule) self.menuEdit.addAction(self.actionReposition) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionChangeModel) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionSelectAll) self.menuEdit.addAction(self.actionSelectNotes) self.menuEdit.addAction(self.actionInvertSelection) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionFindDuplicates) self.menuEdit.addAction(self.actionFindReplace) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionClose) self.menuJump.addAction(self.actionFind) self.menuJump.addAction(self.actionTags) self.menuJump.addAction(self.actionNote) self.menuJump.addAction(self.actionCardList) self.menuJump.addSeparator() self.menuJump.addAction(self.actionFirstCard) self.menuJump.addAction(self.actionPreviousCard) self.menuJump.addAction(self.actionNextCard) self.menuJump.addAction(self.actionLastCard) self.menu_Help.addAction(self.actionGuide) self.menubar.addAction(self.menuEdit.menuAction()) self.menubar.addAction(self.menuJump.menuAction()) self.menubar.addAction(self.menu_Help.menuAction()) self.retranslateUi(Dialog) QtCore.QObject.connect(self.actionSelectAll, QtCore.SIGNAL(_fromUtf8("triggered()")), self.tableView.selectAll) QtCore.QObject.connect(self.actionClose, QtCore.SIGNAL(_fromUtf8("activated()")), Dialog.close) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Browser")) self.searchButton.setText(_("Search")) self.previewButton.setText(_("Preview")) self.previewButton.setShortcut(_("Ctrl+Shift+P")) self.menuEdit.setTitle(_("&Edit")) self.menuJump.setTitle(_("&Go")) self.menu_Help.setTitle(_("&Help")) self.actionReschedule.setText(_("&Reschedule...")) self.actionSelectAll.setText(_("Select &All")) self.actionSelectAll.setShortcut(_("Ctrl+A")) self.actionUndo.setText(_("&Undo")) self.actionUndo.setShortcut(_("Ctrl+Z")) self.actionInvertSelection.setText(_("&Invert Selection")) self.actionFind.setText(_("&Find")) self.actionFind.setShortcut(_("Ctrl+F")) self.actionNote.setText(_("N&ote")) self.actionNote.setShortcut(_("Ctrl+Shift+F")) self.actionNextCard.setText(_("&Next Card")) self.actionNextCard.setShortcut(_("Ctrl+N")) self.actionPreviousCard.setText(_("&Previous Card")) self.actionPreviousCard.setShortcut(_("Ctrl+P")) self.actionGuide.setText(_("&Guide")) self.actionGuide.setShortcut(_("F1")) self.actionChangeModel.setText(_("Change Note Type...")) self.actionChangeModel.setShortcut(_("Ctrl+Shift+M")) self.actionSelectNotes.setText(_("Select &Notes")) self.actionSelectNotes.setShortcut(_("Ctrl+Shift+A")) self.actionFindReplace.setText(_("Find and Re&place...")) self.actionFindReplace.setShortcut(_("Ctrl+Alt+F")) self.actionCram.setText(_("&Cram...")) self.actionTags.setText(_("Fil&ters")) self.actionTags.setShortcut(_("Ctrl+Shift+R")) self.actionCardList.setText(_("Card List")) self.actionCardList.setShortcut(_("Ctrl+Shift+L")) self.actionFindDuplicates.setText(_("Find &Duplicates...")) self.actionReposition.setText(_("Reposition...")) self.actionFirstCard.setText(_("First Card")) self.actionFirstCard.setShortcut(_("Home")) self.actionLastCard.setText(_("Last Card")) self.actionLastCard.setShortcut(_("End")) self.actionClose.setText(_("Close")) self.actionClose.setShortcut(_("Ctrl+W")) import icons_rc anki-2.0.20+dfsg/aqt/forms/stats.py0000644000175000017500000000743012167474726016717 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/stats.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(607, 556) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setSpacing(0) self.verticalLayout.setMargin(0) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.web = QtWebKit.QWebView(Dialog) self.web.setUrl(QtCore.QUrl(_fromUtf8("about:blank"))) self.web.setObjectName(_fromUtf8("web")) self.verticalLayout.addWidget(self.web) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setSpacing(8) self.horizontalLayout_3.setMargin(6) self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) self.groupBox_2 = QtGui.QGroupBox(Dialog) self.groupBox_2.setTitle(_fromUtf8("")) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.groupBox_2) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.groups = QtGui.QRadioButton(self.groupBox_2) self.groups.setChecked(True) self.groups.setObjectName(_fromUtf8("groups")) self.horizontalLayout_2.addWidget(self.groups) self.all = QtGui.QRadioButton(self.groupBox_2) self.all.setObjectName(_fromUtf8("all")) self.horizontalLayout_2.addWidget(self.all) self.horizontalLayout_3.addWidget(self.groupBox_2) self.groupBox = QtGui.QGroupBox(Dialog) self.groupBox.setTitle(_fromUtf8("")) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.horizontalLayout = QtGui.QHBoxLayout(self.groupBox) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.month = QtGui.QRadioButton(self.groupBox) self.month.setChecked(True) self.month.setObjectName(_fromUtf8("month")) self.horizontalLayout.addWidget(self.month) self.year = QtGui.QRadioButton(self.groupBox) self.year.setObjectName(_fromUtf8("year")) self.horizontalLayout.addWidget(self.year) self.life = QtGui.QRadioButton(self.groupBox) self.life.setObjectName(_fromUtf8("life")) self.horizontalLayout.addWidget(self.life) self.horizontalLayout_3.addWidget(self.groupBox) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.horizontalLayout_3.addWidget(self.buttonBox) self.verticalLayout.addLayout(self.horizontalLayout_3) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Statistics")) self.groups.setText(_("deck")) self.all.setText(_("collection")) self.month.setText(_("1 month")) self.year.setText(_("1 year")) self.life.setText(_("deck life")) from PyQt4 import QtWebKit anki-2.0.20+dfsg/aqt/forms/setlang.py0000644000175000017500000000316212167474726017214 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/setlang.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(400, 300) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) self.lang = QtGui.QListWidget(Dialog) self.lang.setObjectName(_fromUtf8("lang")) self.verticalLayout.addWidget(self.lang) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Anki")) self.label.setText(_("Interface language:")) anki-2.0.20+dfsg/aqt/forms/addcards.py0000644000175000017500000000560712167474724017330 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/addcards.ui' # # Created: Thu Jul 11 18:24:36 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(453, 366) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/list-add.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) Dialog.setWindowIcon(icon) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setSpacing(3) self.verticalLayout.setContentsMargins(12, 6, 12, 12) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setSpacing(6) self.horizontalLayout.setContentsMargins(-1, -1, -1, 0) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.modelArea = QtGui.QWidget(Dialog) self.modelArea.setMinimumSize(QtCore.QSize(0, 10)) self.modelArea.setObjectName(_fromUtf8("modelArea")) self.horizontalLayout.addWidget(self.modelArea) self.deckArea = QtGui.QWidget(Dialog) self.deckArea.setObjectName(_fromUtf8("deckArea")) self.horizontalLayout.addWidget(self.deckArea) self.verticalLayout.addLayout(self.horizontalLayout) self.line = QtGui.QFrame(Dialog) self.line.setFrameShape(QtGui.QFrame.HLine) self.line.setFrameShadow(QtGui.QFrame.Sunken) self.line.setObjectName(_fromUtf8("line")) self.verticalLayout.addWidget(self.line) self.fieldsArea = QtGui.QWidget(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(10) sizePolicy.setHeightForWidth(self.fieldsArea.sizePolicy().hasHeightForWidth()) self.fieldsArea.setSizePolicy(sizePolicy) self.fieldsArea.setAutoFillBackground(True) self.fieldsArea.setObjectName(_fromUtf8("fieldsArea")) self.verticalLayout.addWidget(self.fieldsArea) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.NoButton) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Add")) anki-2.0.20+dfsg/aqt/forms/about.py0000644000175000017500000000351312221205033016637 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/about.ui' # # Created: Fri Sep 27 13:31:23 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_About(object): def setupUi(self, About): About.setObjectName(_fromUtf8("About")) About.resize(410, 664) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(About.sizePolicy().hasHeightForWidth()) About.setSizePolicy(sizePolicy) self.vboxlayout = QtGui.QVBoxLayout(About) self.vboxlayout.setMargin(0) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.label = QtWebKit.QWebView(About) self.label.setUrl(QtCore.QUrl(_fromUtf8("about:blank"))) self.label.setObjectName(_fromUtf8("label")) self.vboxlayout.addWidget(self.label) self.buttonBox = QtGui.QDialogButtonBox(About) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.vboxlayout.addWidget(self.buttonBox) self.retranslateUi(About) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), About.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), About.reject) QtCore.QMetaObject.connectSlotsByName(About) def retranslateUi(self, About): About.setWindowTitle(_("About Anki")) from PyQt4 import QtWebKit import icons_rc anki-2.0.20+dfsg/aqt/forms/addfield.py0000644000175000017500000000717512167474724017321 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/addfield.ui' # # Created: Thu Jul 11 18:24:36 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(434, 186) self.horizontalLayout = QtGui.QHBoxLayout(Dialog) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.radioQ = QtGui.QRadioButton(Dialog) self.radioQ.setChecked(True) self.radioQ.setObjectName(_fromUtf8("radioQ")) self.gridLayout.addWidget(self.radioQ, 3, 1, 1, 1) self.size = QtGui.QSpinBox(Dialog) self.size.setMinimum(6) self.size.setMaximum(200) self.size.setObjectName(_fromUtf8("size")) self.gridLayout.addWidget(self.size, 2, 1, 1, 1) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) self.font = QtGui.QFontComboBox(Dialog) self.font.setObjectName(_fromUtf8("font")) self.gridLayout.addWidget(self.font, 1, 1, 1, 1) self.label_3 = QtGui.QLabel(Dialog) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) self.fields = QtGui.QComboBox(Dialog) self.fields.setObjectName(_fromUtf8("fields")) self.gridLayout.addWidget(self.fields, 0, 1, 1, 1) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem, 5, 1, 1, 1) self.radioA = QtGui.QRadioButton(Dialog) self.radioA.setObjectName(_fromUtf8("radioA")) self.gridLayout.addWidget(self.radioA, 4, 1, 1, 1) self.label_4 = QtGui.QLabel(Dialog) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1) self.horizontalLayout.addLayout(self.gridLayout) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Vertical) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.horizontalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.fields, self.font) Dialog.setTabOrder(self.font, self.size) Dialog.setTabOrder(self.size, self.radioQ) Dialog.setTabOrder(self.radioQ, self.radioA) Dialog.setTabOrder(self.radioA, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Add Field")) self.radioQ.setText(_("Front")) self.label.setText(_("Field:")) self.label_2.setText(_("Font:")) self.label_3.setText(_("Size:")) self.radioA.setText(_("Back")) self.label_4.setText(_("Add to:")) anki-2.0.20+dfsg/aqt/forms/studydeck.py0000644000175000017500000000374612167474726017566 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/studydeck.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(400, 300) self.verticalLayout = QtGui.QVBoxLayout(Dialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout.addWidget(self.label) self.filter = QtGui.QLineEdit(Dialog) self.filter.setObjectName(_fromUtf8("filter")) self.horizontalLayout.addWidget(self.filter) self.verticalLayout.addLayout(self.horizontalLayout) self.list = QtGui.QListWidget(Dialog) self.list.setObjectName(_fromUtf8("list")) self.verticalLayout.addWidget(self.list) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Help) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Study Deck")) self.label.setText(_("Filter:")) anki-2.0.20+dfsg/aqt/forms/reschedule.py0000644000175000017500000000740712167474726017710 0ustar andreasandreas# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'designer/reschedule.ui' # # Created: Thu Jul 11 18:24:38 2013 # by: PyQt4 UI code generator 4.9.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(325, 144) self.verticalLayout_2 = QtGui.QVBoxLayout(Dialog) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.asNew = QtGui.QRadioButton(Dialog) self.asNew.setChecked(True) self.asNew.setObjectName(_fromUtf8("asNew")) self.verticalLayout_2.addWidget(self.asNew) self.asRev = QtGui.QRadioButton(Dialog) self.asRev.setObjectName(_fromUtf8("asRev")) self.verticalLayout_2.addWidget(self.asRev) self.rangebox = QtGui.QWidget(Dialog) self.rangebox.setEnabled(False) self.rangebox.setObjectName(_fromUtf8("rangebox")) self.verticalLayout = QtGui.QVBoxLayout(self.rangebox) self.verticalLayout.setContentsMargins(20, 0, 0, 0) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setMargin(0) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label_3 = QtGui.QLabel(self.rangebox) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout.addWidget(self.label_3, 0, 1, 1, 1) self.min = QtGui.QSpinBox(self.rangebox) self.min.setMaximum(9999) self.min.setObjectName(_fromUtf8("min")) self.gridLayout.addWidget(self.min, 0, 0, 1, 1) self.max = QtGui.QSpinBox(self.rangebox) self.max.setMaximum(9999) self.max.setObjectName(_fromUtf8("max")) self.gridLayout.addWidget(self.max, 0, 2, 1, 1) self.label_4 = QtGui.QLabel(self.rangebox) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridLayout.addWidget(self.label_4, 0, 3, 1, 1) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 0, 4, 1, 1) self.verticalLayout.addLayout(self.gridLayout) self.verticalLayout_2.addWidget(self.rangebox) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem1) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout_2.addWidget(self.buttonBox) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QObject.connect(self.asRev, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.rangebox.setEnabled) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.asNew, self.asRev) Dialog.setTabOrder(self.asRev, self.min) Dialog.setTabOrder(self.min, self.max) Dialog.setTabOrder(self.max, self.buttonBox) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Reschedule")) self.asNew.setText(_("Place at end of new card queue")) self.asRev.setText(_("Place in review queue with interval between:")) self.label_3.setText(_("~")) self.label_4.setText(_("days")) anki-2.0.20+dfsg/aqt/deckconf.py0000644000175000017500000002432412230110425016156 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from operator import itemgetter from anki.consts import NEW_CARDS_RANDOM from aqt.qt import * import aqt from aqt.utils import showInfo, showWarning, openHelp, getOnlyText, askUser, \ tooltip class DeckConf(QDialog): def __init__(self, mw, deck): QDialog.__init__(self, mw) self.mw = mw self.deck = deck self.childDids = [ d[1] for d in self.mw.col.decks.children(self.deck['id'])] self._origNewOrder = None self.form = aqt.forms.dconf.Ui_Dialog() self.form.setupUi(self) self.mw.checkpoint(_("Options")) self.setupCombos() self.setupConfs() self.setWindowModality(Qt.WindowModal) self.connect(self.form.buttonBox, SIGNAL("helpRequested()"), lambda: openHelp("deckoptions")) self.connect(self.form.confOpts, SIGNAL("clicked()"), self.confOpts) self.form.confOpts.setText(u"▾") self.connect(self.form.buttonBox.button(QDialogButtonBox.RestoreDefaults), SIGNAL("clicked()"), self.onRestore) self.setWindowTitle(_("Options for %s") % self.deck['name']) # qt doesn't size properly with altered fonts otherwise self.show() self.adjustSize() self.exec_() def setupCombos(self): import anki.consts as cs f = self.form f.newOrder.addItems(cs.newCardOrderLabels().values()) self.connect(f.newOrder, SIGNAL("currentIndexChanged(int)"), self.onNewOrderChanged) # Conf list ###################################################################### def setupConfs(self): self.connect(self.form.dconf, SIGNAL("currentIndexChanged(int)"), self.onConfChange) self.conf = None self.loadConfs() def loadConfs(self): current = self.deck['conf'] self.confList = self.mw.col.decks.allConf() self.confList.sort(key=itemgetter('name')) startOn = 0 self.ignoreConfChange = True self.form.dconf.clear() for idx, conf in enumerate(self.confList): self.form.dconf.addItem(conf['name']) if str(conf['id']) == str(current): startOn = idx self.ignoreConfChange = False self.form.dconf.setCurrentIndex(startOn) if self._origNewOrder is None: self._origNewOrder = self.confList[startOn]['new']['order'] self.onConfChange(startOn) def confOpts(self): m = QMenu(self.mw) a = m.addAction(_("Add")) a.connect(a, SIGNAL("triggered()"), self.addGroup) a = m.addAction(_("Delete")) a.connect(a, SIGNAL("triggered()"), self.remGroup) a = m.addAction(_("Rename")) a.connect(a, SIGNAL("triggered()"), self.renameGroup) a = m.addAction(_("Set for all subdecks")) a.connect(a, SIGNAL("triggered()"), self.setChildren) if not self.childDids: a.setEnabled(False) m.exec_(QCursor.pos()) def onConfChange(self, idx): if self.ignoreConfChange: return if self.conf: self.saveConf() conf = self.confList[idx] self.deck['conf'] = conf['id'] self.loadConf() cnt = 0 for d in self.mw.col.decks.all(): if d['dyn']: continue if d['conf'] == conf['id']: cnt += 1 if cnt > 1: txt = _("Your changes will affect multiple decks. If you wish to " "change only the current deck, please add a new options group first.") else: txt = "" self.form.count.setText(txt) def addGroup(self): name = getOnlyText(_("New options group name:")) if not name: return # first, save currently entered data to current conf self.saveConf() # then clone the conf id = self.mw.col.decks.confId(name, cloneFrom=self.conf) # set the deck to the new conf self.deck['conf'] = id # then reload the conf list self.loadConfs() def remGroup(self): if self.conf['id'] == 1: showInfo(_("The default configuration can't be removed."), self) else: self.mw.col.decks.remConf(self.conf['id']) self.deck['conf'] = 1 self.loadConfs() def renameGroup(self): old = self.conf['name'] name = getOnlyText(_("New name:"), default=old) if not name or name == old: return self.conf['name'] = name self.loadConfs() def setChildren(self): if not askUser( _("Set all decks below %s to this option group?") % self.deck['name']): return for did in self.childDids: deck = self.mw.col.decks.get(did) if deck['dyn']: continue deck['conf'] = self.deck['conf'] self.mw.col.decks.save(deck) tooltip(ngettext("%d deck updated.", "%d decks updated.", \ len(self.childDids)) % len(self.childDids)) # Loading ################################################## def listToUser(self, l): return " ".join([str(x) for x in l]) def parentLimText(self, type="new"): # top level? if "::" not in self.deck['name']: return "" lim = -1 for d in self.mw.col.decks.parents(self.deck['id']): c = self.mw.col.decks.confForDid(d['id']) x = c[type]['perDay'] if lim == -1: lim = x else: lim = min(x, lim) return _("(parent limit: %d)") % lim def loadConf(self): self.conf = self.mw.col.decks.confForDid(self.deck['id']) # new c = self.conf['new'] f = self.form f.lrnSteps.setText(self.listToUser(c['delays'])) f.lrnGradInt.setValue(c['ints'][0]) f.lrnEasyInt.setValue(c['ints'][1]) f.lrnEasyInt.setValue(c['ints'][1]) f.lrnFactor.setValue(c['initialFactor']/10.0) f.newOrder.setCurrentIndex(c['order']) f.newPerDay.setValue(c['perDay']) f.bury.setChecked(c.get("bury", True)) f.newplim.setText(self.parentLimText('new')) # rev c = self.conf['rev'] f.revPerDay.setValue(c['perDay']) f.easyBonus.setValue(c['ease4']*100) f.fi1.setValue(c['ivlFct']*100) f.maxIvl.setValue(c['maxIvl']) f.revplim.setText(self.parentLimText('rev')) f.buryRev.setChecked(c.get("bury", True)) # lapse c = self.conf['lapse'] f.lapSteps.setText(self.listToUser(c['delays'])) f.lapMult.setValue(c['mult']*100) f.lapMinInt.setValue(c['minInt']) f.leechThreshold.setValue(c['leechFails']) f.leechAction.setCurrentIndex(c['leechAction']) # general c = self.conf f.maxTaken.setValue(c['maxTaken']) f.showTimer.setChecked(c.get('timer', 0)) f.autoplaySounds.setChecked(c['autoplay']) f.replayQuestion.setChecked(c.get('replayq', True)) # description f.desc.setPlainText(self.deck['desc']) def onRestore(self): self.mw.progress.start() self.mw.col.decks.restoreToDefault(self.conf) self.mw.progress.finish() self.loadConf() # New order ################################################## def onNewOrderChanged(self, new): old = self.conf['new']['order'] if old == new: return self.conf['new']['order'] = new self.mw.progress.start() self.mw.col.sched.resortConf(self.conf) self.mw.progress.finish() # Saving ################################################## def updateList(self, conf, key, w, minSize=1): items = unicode(w.text()).split(" ") ret = [] for i in items: if not i: continue try: i = float(i) assert i > 0 if i == int(i): i = int(i) ret.append(i) except: # invalid, don't update showWarning(_("Steps must be numbers.")) return if len(ret) < minSize: showWarning(_("At least one step is required.")) return conf[key] = ret def saveConf(self): # new c = self.conf['new'] f = self.form self.updateList(c, 'delays', f.lrnSteps) c['ints'][0] = f.lrnGradInt.value() c['ints'][1] = f.lrnEasyInt.value() c['initialFactor'] = f.lrnFactor.value()*10 c['order'] = f.newOrder.currentIndex() c['perDay'] = f.newPerDay.value() c['bury'] = f.bury.isChecked() if self._origNewOrder != c['order']: # order of current deck has changed, so have to resort if c['order'] == NEW_CARDS_RANDOM: self.mw.col.sched.randomizeCards(self.deck['id']) else: self.mw.col.sched.orderCards(self.deck['id']) # rev c = self.conf['rev'] c['perDay'] = f.revPerDay.value() c['ease4'] = f.easyBonus.value()/100.0 c['ivlFct'] = f.fi1.value()/100.0 c['maxIvl'] = f.maxIvl.value() c['bury'] = f.buryRev.isChecked() # lapse c = self.conf['lapse'] self.updateList(c, 'delays', f.lapSteps, minSize=0) c['mult'] = f.lapMult.value()/100.0 c['minInt'] = f.lapMinInt.value() c['leechFails'] = f.leechThreshold.value() c['leechAction'] = f.leechAction.currentIndex() # general c = self.conf c['maxTaken'] = f.maxTaken.value() c['timer'] = f.showTimer.isChecked() and 1 or 0 c['autoplay'] = f.autoplaySounds.isChecked() c['replayq'] = f.replayQuestion.isChecked() # description self.deck['desc'] = f.desc.toPlainText() self.mw.col.decks.save(self.deck) self.mw.col.decks.save(self.conf) def reject(self): self.accept() def accept(self): self.saveConf() self.mw.reset() QDialog.accept(self) anki-2.0.20+dfsg/aqt/tagedit.py0000644000175000017500000000536212221204444016031 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import re class TagEdit(QLineEdit): # 0 = tags, 1 = decks def __init__(self, parent, type=0): QLineEdit.__init__(self, parent) self.col = None self.model = QStringListModel() self.type = type if type == 0: self.completer = TagCompleter(self.model, parent, self) else: self.completer = QCompleter(self.model, parent) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.setCompleter(self.completer) def setCol(self, col): "Set the current col, updating list of available tags." self.col = col if self.type == 0: l = sorted(self.col.tags.all()) else: l = sorted(self.col.decks.allNames()) self.model.setStringList(l) def focusInEvent(self, evt): QLineEdit.focusInEvent(self, evt) self.showCompleter() def keyPressEvent(self, evt): if evt.key() in (Qt.Key_Enter, Qt.Key_Return): self.hideCompleter() QWidget.keyPressEvent(self, evt) return QLineEdit.keyPressEvent(self, evt) if not evt.text(): # if it's a modifier, don't show return if evt.key() not in ( Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Space, Qt.Key_Tab, Qt.Key_Backspace, Qt.Key_Delete): self.showCompleter() def showCompleter(self): self.completer.setCompletionPrefix(self.text()) self.completer.complete() def focusOutEvent(self, evt): QLineEdit.focusOutEvent(self, evt) self.emit(SIGNAL("lostFocus")) self.completer.popup().hide() def hideCompleter(self): self.completer.popup().hide() class TagCompleter(QCompleter): def __init__(self, model, parent, edit, *args): QCompleter.__init__(self, model, parent) self.tags = [] self.edit = edit self.cursor = None def splitPath(self, str): str = unicode(str).strip() str = re.sub(" +", " ", str) self.tags = self.edit.col.tags.split(str) self.tags.append(u"") p = self.edit.cursorPosition() self.cursor = str.count(" ", 0, p) return [self.tags[self.cursor]] def pathFromIndex(self, idx): if self.cursor is None: return self.edit.text() ret = QCompleter.pathFromIndex(self, idx) self.tags[self.cursor] = unicode(ret) try: self.tags.remove(u"") except ValueError: pass return " ".join(self.tags) anki-2.0.20+dfsg/aqt/customstudy.py0000644000175000017500000001354012221204444017010 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import aqt from aqt.utils import showInfo, showWarning from anki.consts import * RADIO_NEW = 1 RADIO_REV = 2 RADIO_FORGOT = 3 RADIO_AHEAD = 4 RADIO_PREVIEW = 5 RADIO_CRAM = 6 TYPE_NEW = 0 TYPE_DUE = 1 TYPE_ALL = 2 class CustomStudy(QDialog): def __init__(self, mw): QDialog.__init__(self, mw) self.mw = mw self.deck = self.mw.col.decks.current() self.form = f = aqt.forms.customstudy.Ui_Dialog() f.setupUi(self) self.setWindowModality(Qt.WindowModal) self.setupSignals() f.radio1.click() self.exec_() def setupSignals(self): f = self.form; c = self.connect; s = SIGNAL("clicked()") c(f.radio1, s, lambda: self.onRadioChange(1)) c(f.radio2, s, lambda: self.onRadioChange(2)) c(f.radio3, s, lambda: self.onRadioChange(3)) c(f.radio4, s, lambda: self.onRadioChange(4)) c(f.radio5, s, lambda: self.onRadioChange(5)) c(f.radio6, s, lambda: self.onRadioChange(6)) def onRadioChange(self, idx): f = self.form; sp = f.spin smin = 1; smax = 9999; sval = 1 post = _("cards") tit = "" spShow = True typeShow = False ok = _("OK") def plus(num): if num == 1000: num = "1000+" return ""+str(num)+"" if idx == RADIO_NEW: new = self.mw.col.sched.totalNewForCurrentDeck() self.deck['newToday'] tit = _("New cards in deck: %s") % plus(new) pre = _("Increase today's new card limit by") sval = min(new, self.deck.get('extendNew', 10)) smax = new elif idx == RADIO_REV: rev = self.mw.col.sched.totalRevForCurrentDeck() tit = _("Reviews due in deck: %s") % plus(rev) pre = _("Increase today's review limit by") sval = min(rev, self.deck.get('extendRev', 10)) elif idx == RADIO_FORGOT: pre = _("Review cards forgotten in last") post = _("days") smax = 30 elif idx == RADIO_AHEAD: pre = _("Review ahead by") post = _("days") elif idx == RADIO_PREVIEW: pre = _("Preview new cards added in the last") post = _("days") sval = 1 elif idx == RADIO_CRAM: pre = _("Select") post = _("cards from the deck") #tit = _("After pressing OK, you can choose which tags to include.") ok = _("Choose Tags") sval = 100 typeShow = True sp.setVisible(spShow) f.cardType.setVisible(typeShow) f.title.setText(tit) f.title.setVisible(not not tit) f.spin.setMinimum(smin) f.spin.setMaximum(smax) f.spin.setValue(sval) f.preSpin.setText(pre) f.postSpin.setText(post) f.buttonBox.button(QDialogButtonBox.Ok).setText(ok) self.radioIdx = idx def accept(self): f = self.form; i = self.radioIdx; spin = f.spin.value() if i == RADIO_NEW: self.deck['extendNew'] = spin self.mw.col.decks.save(self.deck) self.mw.col.sched.extendLimits(spin, 0) self.mw.reset() return QDialog.accept(self) elif i == RADIO_REV: self.deck['extendRev'] = spin self.mw.col.decks.save(self.deck) self.mw.col.sched.extendLimits(0, spin) self.mw.reset() return QDialog.accept(self) elif i == RADIO_CRAM: tags = self._getTags() # the rest create a filtered deck cur = self.mw.col.decks.byName(_("Custom Study Session")) if cur: if not cur['dyn']: showInfo("Please rename the existing Custom Study deck first.") return QDialog.accept(self) else: # safe to empty self.mw.col.sched.emptyDyn(cur['id']) # reuse; don't delete as it may have children dyn = cur self.mw.col.decks.select(cur['id']) else: did = self.mw.col.decks.newDyn(_("Custom Study Session")) dyn = self.mw.col.decks.get(did) # and then set various options if i == RADIO_FORGOT: dyn['delays'] = [1] dyn['terms'][0] = ['rated:%d:1' % spin, 9999, DYN_RANDOM] dyn['resched'] = False elif i == RADIO_AHEAD: dyn['delays'] = None dyn['terms'][0] = ['prop:due<=%d' % spin, 9999, DYN_DUE] dyn['resched'] = True elif i == RADIO_PREVIEW: dyn['delays'] = None dyn['terms'][0] = ['is:new added:%s'%spin, 9999, DYN_OLDEST] dyn['resched'] = False elif i == RADIO_CRAM: dyn['delays'] = None type = f.cardType.currentRow() if type == TYPE_NEW: terms = "is:new " ord = DYN_ADDED dyn['resched'] = True elif type == TYPE_DUE: terms = "is:due " ord = DYN_DUE dyn['resched'] = True else: terms = "" ord = DYN_RANDOM dyn['resched'] = False dyn['terms'][0] = [(terms+tags).strip(), spin, ord] # add deck limit dyn['terms'][0][0] = "deck:\"%s\" %s " % (self.deck['name'], dyn['terms'][0][0]) # generate cards if not self.mw.col.sched.rebuildDyn(): return showWarning(_("No cards matched the criteria you provided.")) self.mw.moveToState("overview") QDialog.accept(self) def _getTags(self): from aqt.taglimit import TagLimit t = TagLimit(self.mw, self) return t.tags anki-2.0.20+dfsg/aqt/clayout.py0000644000175000017500000003714512242266544016110 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import re from aqt.qt import * from anki.consts import * import aqt from anki.sound import playFromText, clearAudioQueue from aqt.utils import saveGeom, restoreGeom, getBase, mungeQA,\ showInfo, askUser, getOnlyText, \ showWarning, openHelp from anki.utils import isMac, isWin, joinFields from aqt.webview import AnkiWebView import anki.js class CardLayout(QDialog): def __init__(self, mw, note, ord=0, parent=None, addMode=False): QDialog.__init__(self, parent or mw, Qt.Window) self.mw = aqt.mw self.parent = parent or mw self.note = note self.ord = ord self.col = self.mw.col self.mm = self.mw.col.models self.model = note.model() self.mw.checkpoint(_("Card Types")) self.addMode = addMode if addMode: # save it to DB temporarily self.emptyFields = [] for name, val in note.items(): if val.strip(): continue self.emptyFields.append(name) note[name] = "(%s)" % name note.flush() self.setupTabs() self.setupButtons() self.setWindowTitle(_("Card Types for %s") % self.model['name']) v1 = QVBoxLayout() v1.addWidget(self.tabs) v1.addLayout(self.buttons) self.setLayout(v1) self.redraw() restoreGeom(self, "CardLayout") self.exec_() def redraw(self): self.cards = self.col.previewCards(self.note, 2) self.redrawing = True self.updateTabs() self.redrawing = False idx = self.ord if idx >= len(self.cards): idx = len(self.cards) - 1 self.selectCard(idx) def setupTabs(self): c = self.connect cloze = self.model['type'] == MODEL_CLOZE self.tabs = QTabWidget() self.tabs.setTabsClosable(not cloze) self.tabs.setUsesScrollButtons(True) if not cloze: add = QPushButton("+") add.setFixedWidth(30) add.setToolTip(_("Add new card")) c(add, SIGNAL("clicked()"), self.onAddCard) self.tabs.setCornerWidget(add) c(self.tabs, SIGNAL("currentChanged(int)"), self.onCardSelected) c(self.tabs, SIGNAL("tabCloseRequested(int)"), self.onRemoveTab) def updateTabs(self): self.forms = [] self.tabs.clear() for t in self.model['tmpls']: self.addTab(t) def addTab(self, t): c = self.connect w = QWidget() l = QHBoxLayout() l.setMargin(0) l.setSpacing(3) left = QWidget() # template area tform = aqt.forms.template.Ui_Form() tform.setupUi(left) tform.label1.setText(u" →") tform.label2.setText(u" →") tform.labelc1.setText(u" ↗") tform.labelc2.setText(u" ↘") if self.style().objectName() == "gtk+": # gtk+ requires margins in inner layout tform.tlayout1.setContentsMargins(0, 11, 0, 0) tform.tlayout2.setContentsMargins(0, 11, 0, 0) tform.tlayout3.setContentsMargins(0, 11, 0, 0) if len(self.cards) > 1: tform.groupBox_3.setTitle(_( "Styling (shared between cards)")) c(tform.front, SIGNAL("textChanged()"), self.saveCard) c(tform.css, SIGNAL("textChanged()"), self.saveCard) c(tform.back, SIGNAL("textChanged()"), self.saveCard) l.addWidget(left, 5) # preview area right = QWidget() pform = aqt.forms.preview.Ui_Form() pform.setupUi(right) if self.style().objectName() == "gtk+": # gtk+ requires margins in inner layout pform.frontPrevBox.setContentsMargins(0, 11, 0, 0) pform.backPrevBox.setContentsMargins(0, 11, 0, 0) # for cloze notes, show that it's one of n cards if self.model['type'] == MODEL_CLOZE: cnt = len(self.mm.availOrds( self.model, joinFields(self.note.fields))) for g in pform.groupBox, pform.groupBox_2: g.setTitle(g.title() + _(" (1 of %d)") % max(cnt, 1)) pform.frontWeb = AnkiWebView() pform.frontPrevBox.addWidget(pform.frontWeb) pform.backWeb = AnkiWebView() pform.backPrevBox.addWidget(pform.backWeb) for wig in pform.frontWeb, pform.backWeb: wig.page().setLinkDelegationPolicy( QWebPage.DelegateExternalLinks) l.addWidget(right, 5) w.setLayout(l) self.forms.append({'tform': tform, 'pform': pform}) self.tabs.addTab(w, t['name']) def onRemoveTab(self, idx): if len(self.model['tmpls']) < 2: return showInfo(_("At least one card type is required.")) cards = self.mm.tmplUseCount(self.model, idx) cards = ngettext("%d card", "%d cards", cards) % cards msg = (_("Delete the '%(a)s' card type, and its %(b)s?") % dict(a=self.model['tmpls'][idx]['name'], b=cards)) if not askUser(msg): return if not self.mm.remTemplate(self.model, self.cards[idx].template()): return showWarning(_("""\ Removing this card type would cause one or more notes to be deleted. \ Please create a new card type first.""")) self.redraw() # Buttons ########################################################################## def setupButtons(self): c = self.connect l = self.buttons = QHBoxLayout() help = QPushButton(_("Help")) help.setAutoDefault(False) l.addWidget(help) c(help, SIGNAL("clicked()"), self.onHelp) l.addStretch() addField = QPushButton(_("Add Field")) addField.setAutoDefault(False) l.addWidget(addField) c(addField, SIGNAL("clicked()"), self.onAddField) if self.model['type'] != MODEL_CLOZE: flip = QPushButton(_("Flip")) flip.setAutoDefault(False) l.addWidget(flip) c(flip, SIGNAL("clicked()"), self.onFlip) more = QPushButton(_("More") + u" ▾") more.setAutoDefault(False) l.addWidget(more) c(more, SIGNAL("clicked()"), lambda: self.onMore(more)) l.addStretch() close = QPushButton(_("Close")) close.setAutoDefault(False) l.addWidget(close) c(close, SIGNAL("clicked()"), self.accept) # Cards ########################################################################## def selectCard(self, idx): if self.tabs.currentIndex() == idx: # trigger a re-read self.onCardSelected(idx) else: self.tabs.setCurrentIndex(idx) def onCardSelected(self, idx): if self.redrawing: return self.card = self.cards[idx] self.ord = idx self.tab = self.forms[idx] self.tabs.setCurrentIndex(idx) self.playedAudio = {} self.readCard() self.renderPreview() def readCard(self): t = self.card.template() self.redrawing = True self.tab['tform'].front.setPlainText(t['qfmt']) self.tab['tform'].css.setPlainText(self.model['css']) self.tab['tform'].back.setPlainText(t['afmt']) self.redrawing = False def saveCard(self): if self.redrawing: return text = self.tab['tform'].front.toPlainText() self.card.template()['qfmt'] = text text = self.tab['tform'].css.toPlainText() self.card.model()['css'] = text text = self.tab['tform'].back.toPlainText() self.card.template()['afmt'] = text self.renderPreview() # Preview ########################################################################## def renderPreview(self): c = self.card ti = self.maybeTextInput base = getBase(self.mw.col) self.tab['pform'].frontWeb.stdHtml( ti(mungeQA(self.mw.col, c.q(reload=True))), self.mw.reviewer._styles(), bodyClass="card card%d" % (c.ord+1), head=base, js=anki.js.browserSel) self.tab['pform'].backWeb.stdHtml( ti(mungeQA(self.mw.col, c.a()), type='a'), self.mw.reviewer._styles(), bodyClass="card card%d" % (c.ord+1), head=base, js=anki.js.browserSel) clearAudioQueue() if c.id not in self.playedAudio: playFromText(c.q()) playFromText(c.a()) self.playedAudio[c.id] = True def maybeTextInput(self, txt, type='q'): if "[[type:" not in txt: return txt origLen = len(txt) txt = txt.replace("
", "") hadHR = origLen != len(txt) def answerRepl(match): res = self.mw.reviewer.correct(u"exomple", u"an example") if hadHR: res = "
" + res return res if type == 'q': repl = "" repl = "
%s
" % repl else: repl = answerRepl return re.sub("\[\[type:.+?\]\]", repl, txt) # Card operations ###################################################################### def onRename(self): name = getOnlyText(_("New name:"), default=self.card.template()['name']) if not name: return if name in [c.template()['name'] for c in self.cards if c.template()['ord'] != self.ord]: return showWarning(_("That name is already used.")) self.card.template()['name'] = name self.tabs.setTabText(self.tabs.currentIndex(), name) def onReorder(self): n = len(self.cards) cur = self.card.template()['ord']+1 pos = getOnlyText( _("Enter new card position (1...%s):") % n, default=str(cur)) if not pos: return try: pos = int(pos) except ValueError: return if pos < 1 or pos > n: return if pos == cur: return pos -= 1 self.mm.moveTemplate(self.model, self.card.template(), pos) self.ord = pos self.redraw() def _newCardName(self): n = len(self.cards) + 1 while 1: name = _("Card %d") % n if name not in [c.template()['name'] for c in self.cards]: break n += 1 return name def onAddCard(self): name = self._newCardName() t = self.mm.newTemplate(name) old = self.card.template() t['qfmt'] = "%s
\n%s" % (_("Edit to customize"), old['qfmt']) t['afmt'] = old['afmt'] self.mm.addTemplate(self.model, t) self.ord = len(self.cards) self.redraw() def onFlip(self): old = self.card.template() self._flipQA(old, old) self.redraw() def _flipQA(self, src, dst): m = re.match("(?s)(.+)
(.+)", src['afmt']) if not m: showInfo(_("""\ Anki couldn't find the line between the question and answer. Please \ adjust the template manually to switch the question and answer.""")) return dst['afmt'] = "{{FrontSide}}\n\n
\n\n%s" % src['qfmt'] dst['qfmt'] = m.group(2).strip() return True def onMore(self, button): m = QMenu(self) a = m.addAction(_("Rename")) a.connect(a, SIGNAL("triggered()"), self.onRename) if self.model['type'] != MODEL_CLOZE: a = m.addAction(_("Reposition")) a.connect(a, SIGNAL("triggered()"), self.onReorder) t = self.card.template() if t['did']: s = _(" (on)") else: s = _(" (off)") a = m.addAction(_("Deck Override") + s) a.connect(a, SIGNAL("triggered()"), self.onTargetDeck) a = m.addAction(_("Browser Appearance")) a.connect(a, SIGNAL("triggered()"), self.onBrowserDisplay) m.exec_(button.mapToGlobal(QPoint(0,0))) def onBrowserDisplay(self): d = QDialog() f = aqt.forms.browserdisp.Ui_Dialog() f.setupUi(d) t = self.card.template() f.qfmt.setText(t.get('bqfmt', "")) f.afmt.setText(t.get('bafmt', "")) f.font.setCurrentFont(QFont(t.get('bfont', "Arial"))) f.fontSize.setValue(t.get('bsize', 12)) d.connect(f.buttonBox, SIGNAL("accepted()"), lambda: self.onBrowserDisplayOk(f)) d.exec_() def onBrowserDisplayOk(self, f): t = self.card.template() t['bqfmt'] = f.qfmt.text().strip() t['bafmt'] = f.afmt.text().strip() t['bfont'] = f.font.currentFont().family() t['bsize'] = f.fontSize.value() def onTargetDeck(self): from aqt.tagedit import TagEdit t = self.card.template() d = QDialog(self) d.setWindowTitle("Anki") d.setMinimumWidth(400) l = QVBoxLayout() lab = QLabel(_("""\ Enter deck to place new %s cards in, or leave blank:""") % self.card.template()['name']) lab.setWordWrap(True) l.addWidget(lab) te = TagEdit(d, type=1) te.setCol(self.col) l.addWidget(te) if t['did']: te.setText(self.col.decks.get(t['did'])['name']) te.selectAll() bb = QDialogButtonBox(QDialogButtonBox.Close) self.connect(bb, SIGNAL("rejected()"), d, SLOT("close()")) l.addWidget(bb) d.setLayout(l) d.exec_() if not te.text().strip(): t['did'] = None else: t['did'] = self.col.decks.id(te.text()) def onAddField(self): diag = QDialog(self) form = aqt.forms.addfield.Ui_Dialog() form.setupUi(diag) fields = [f['name'] for f in self.model['flds']] form.fields.addItems(fields) form.font.setCurrentFont(QFont("Arial")) form.size.setValue(20) diag.show() # Work around a Qt bug, # https://bugreports.qt-project.org/browse/QTBUG-1894 if isMac or isWin: # No problems on Macs or Windows. form.fields.showPopup() else: # Delay showing the pop-up. self.mw.progress.timer(200, form.fields.showPopup, False) if not diag.exec_(): return if form.radioQ.isChecked(): obj = self.tab['tform'].front else: obj = self.tab['tform'].back self._addField(obj, fields[form.fields.currentIndex()], form.font.currentFont().family(), form.size.value()) def _addField(self, widg, field, font, size): t = widg.toPlainText() t +="\n
{{%s}}
\n" % ( font, size, field) widg.setPlainText(t) self.saveCard() # Closing & Help ###################################################################### def accept(self): self.reject() def reject(self): clearAudioQueue() if self.addMode: # remove the filler fields we added for name in self.emptyFields: self.note[name] = "" self.mw.col.db.execute("delete from notes where id = ?", self.note.id) self.mm.save(self.model, templates=True) self.mw.reset() saveGeom(self, "CardLayout") return QDialog.reject(self) def onHelp(self): openHelp("templates") anki-2.0.20+dfsg/aqt/preferences.py0000644000175000017500000001242412250251762016715 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import datetime, time from aqt.qt import * from aqt.utils import openFolder, showWarning, getText, openHelp, showInfo import aqt class Preferences(QDialog): def __init__(self, mw): if not mw.col: showInfo(_("Please open a profile first.")) return QDialog.__init__(self, mw, Qt.Window) self.mw = mw self.prof = self.mw.pm.profile self.form = aqt.forms.preferences.Ui_Preferences() self.form.setupUi(self) self.connect(self.form.buttonBox, SIGNAL("helpRequested()"), lambda: openHelp("profileprefs")) self.setupCollection() self.setupNetwork() self.setupBackup() self.setupOptions() self.show() def accept(self): self.updateCollection() self.updateNetwork() self.updateBackup() self.updateOptions() self.mw.pm.save() self.mw.reset() self.done(0) def reject(self): self.accept() # Collection options ###################################################################### def setupCollection(self): import anki.consts as c f = self.form qc = self.mw.col.conf self.startDate = datetime.datetime.fromtimestamp(self.mw.col.crt) f.dayOffset.setValue(self.startDate.hour) f.lrnCutoff.setValue(qc['collapseTime']/60.0) f.timeLimit.setValue(qc['timeLim']/60.0) f.showEstimates.setChecked(qc['estTimes']) f.showProgress.setChecked(qc['dueCounts']) f.newSpread.addItems(c.newCardSchedulingLabels().values()) f.newSpread.setCurrentIndex(qc['newSpread']) f.useCurrent.setCurrentIndex(int(not qc.get("addToCur", True))) def updateCollection(self): f = self.form d = self.mw.col qc = d.conf qc['dueCounts'] = f.showProgress.isChecked() qc['estTimes'] = f.showEstimates.isChecked() qc['newSpread'] = f.newSpread.currentIndex() qc['timeLim'] = f.timeLimit.value()*60 qc['collapseTime'] = f.lrnCutoff.value()*60 qc['addToCur'] = not f.useCurrent.currentIndex() hrs = f.dayOffset.value() old = self.startDate date = datetime.datetime( old.year, old.month, old.day, hrs) d.crt = int(time.mktime(date.timetuple())) d.setMod() # Network ###################################################################### def setupNetwork(self): self.form.syncOnProgramOpen.setChecked( self.prof['autoSync']) self.form.syncMedia.setChecked( self.prof['syncMedia']) if not self.prof['syncKey']: self._hideAuth() else: self.form.syncUser.setText(self.prof.get('syncUser', "")) self.connect(self.form.syncDeauth, SIGNAL("clicked()"), self.onSyncDeauth) def _hideAuth(self): self.form.syncDeauth.setVisible(False) self.form.syncUser.setText("") self.form.syncLabel.setText(_("""\ Synchronization
Not currently enabled; click the sync button in the main window to enable.""")) def onSyncDeauth(self): self.prof['syncKey'] = None self._hideAuth() def updateNetwork(self): self.prof['autoSync'] = self.form.syncOnProgramOpen.isChecked() self.prof['syncMedia'] = self.form.syncMedia.isChecked() if self.form.fullSync.isChecked(): self.mw.hideSchemaMsg = True self.mw.col.modSchema() self.mw.col.setMod() self.mw.hideSchemaMsg = False # Backup ###################################################################### def setupBackup(self): self.form.numBackups.setValue(self.prof['numBackups']) self.form.compressBackups.setChecked(self.prof.get("compressBackups", True)) self.connect(self.form.openBackupFolder, SIGNAL("linkActivated(QString)"), self.onOpenBackup) def onOpenBackup(self): openFolder(self.mw.pm.backupFolder()) def updateBackup(self): self.prof['numBackups'] = self.form.numBackups.value() self.prof['compressBackups'] = self.form.compressBackups.isChecked() # Basic & Advanced Options ###################################################################### def setupOptions(self): self.form.stripHTML.setChecked(self.prof['stripHTML']) self.form.pastePNG.setChecked(self.prof.get("pastePNG", False)) self.connect( self.form.profilePass, SIGNAL("clicked()"), self.onProfilePass) def updateOptions(self): self.prof['stripHTML'] = self.form.stripHTML.isChecked() self.prof['pastePNG'] = self.form.pastePNG.isChecked() def onProfilePass(self): pw, ret = getText(_("""\ Lock account with password, or leave blank:""")) if not ret: return if not pw: self.prof['key'] = None return pw2, ret = getText(_("Confirm password:")) if not ret: return if pw != pw2: showWarning(_("Passwords didn't match")) self.prof['key'] = self.mw.pm._pwhash(pw) anki-2.0.20+dfsg/aqt/editor.py0000644000175000017500000012153112245343460015703 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import re import os import urllib2 import ctypes import urllib from anki.lang import _ from aqt.qt import * from anki.utils import stripHTML, isWin, isMac, namedtmp, json, stripHTMLMedia import anki.sound from anki.hooks import runHook, runFilter from aqt.sound import getAudio from aqt.webview import AnkiWebView from aqt.utils import shortcut, showInfo, showWarning, getBase, getFile, \ openHelp, tooltip import aqt import anki.js from BeautifulSoup import BeautifulSoup pics = ("jpg", "jpeg", "png", "tif", "tiff", "gif", "svg") audio = ("wav", "mp3", "ogg", "flac", "mp4", "swf", "mov", "mpeg", "mkv") _html = """ %s
""" # caller is responsible for resetting note on reset class Editor(object): def __init__(self, mw, widget, parentWindow, addMode=False): self.mw = mw self.widget = widget self.parentWindow = parentWindow self.note = None self.stealFocus = True self.addMode = addMode self._loaded = False self.currentField = 0 # current card, for card layout self.card = None self.setupOuter() self.setupButtons() self.setupWeb() self.setupTags() self.setupKeyboard() # Initial setup ############################################################ def setupOuter(self): l = QVBoxLayout() l.setMargin(0) l.setSpacing(0) self.widget.setLayout(l) self.outerLayout = l def setupWeb(self): self.web = EditorWebView(self.widget, self) self.web.allowDrops = True self.web.setBridge(self.bridge) self.outerLayout.addWidget(self.web, 1) # pick up the window colour p = self.web.palette() p.setBrush(QPalette.Base, Qt.transparent) self.web.page().setPalette(p) self.web.setAttribute(Qt.WA_OpaquePaintEvent, False) # Top buttons ###################################################################### def _addButton(self, name, func, key=None, tip=None, size=True, text="", check=False, native=False, canDisable=True): b = QPushButton(text) if check: b.connect(b, SIGNAL("clicked(bool)"), func) else: b.connect(b, SIGNAL("clicked()"), func) if size: b.setFixedHeight(20) b.setFixedWidth(20) if not native: if self.plastiqueStyle: b.setStyle(self.plastiqueStyle) b.setFocusPolicy(Qt.NoFocus) else: b.setAutoDefault(False) if not text: b.setIcon(QIcon(":/icons/%s.png" % name)) if key: b.setShortcut(QKeySequence(key)) if tip: b.setToolTip(shortcut(tip)) if check: b.setCheckable(True) self.iconsBox.addWidget(b) if canDisable: self._buttons[name] = b return b def setupButtons(self): self._buttons = {} # button styles for mac if not isMac: self.plastiqueStyle = QStyleFactory.create("plastique") if not self.plastiqueStyle: # plastique was removed in qt5 self.plastiqueStyle = QStyleFactory.create("fusion") self.widget.setStyle(self.plastiqueStyle) else: self.plastiqueStyle = None # icons self.iconsBox = QHBoxLayout() if not isMac: self.iconsBox.setMargin(6) self.iconsBox.setSpacing(0) else: self.iconsBox.setMargin(0) self.iconsBox.setSpacing(14) self.outerLayout.addLayout(self.iconsBox) b = self._addButton b("fields", self.onFields, "", shortcut(_("Customize Fields")), size=False, text=_("Fields..."), native=True, canDisable=False) self.iconsBox.addItem(QSpacerItem(6,1, QSizePolicy.Fixed)) b("layout", self.onCardLayout, _("Ctrl+L"), shortcut(_("Customize Cards (Ctrl+L)")), size=False, text=_("Cards..."), native=True, canDisable=False) # align to right self.iconsBox.addItem(QSpacerItem(20,1, QSizePolicy.Expanding)) b("text_bold", self.toggleBold, _("Ctrl+B"), _("Bold text (Ctrl+B)"), check=True) b("text_italic", self.toggleItalic, _("Ctrl+I"), _("Italic text (Ctrl+I)"), check=True) b("text_under", self.toggleUnderline, _("Ctrl+U"), _("Underline text (Ctrl+U)"), check=True) b("text_super", self.toggleSuper, _("Ctrl+Shift+="), _("Superscript (Ctrl+Shift+=)"), check=True) b("text_sub", self.toggleSub, _("Ctrl+="), _("Subscript (Ctrl+=)"), check=True) b("text_clear", self.removeFormat, _("Ctrl+R"), _("Remove formatting (Ctrl+R)")) but = b("foreground", self.onForeground, _("F7"), text=" ") but.setToolTip(_("Set foreground colour (F7)")) self.setupForegroundButton(but) but = b("change_colour", self.onChangeCol, _("F8"), _("Change colour (F8)"), text=u"▾") but.setFixedWidth(12) but = b("cloze", self.onCloze, _("Ctrl+Shift+C"), _("Cloze deletion (Ctrl+Shift+C)"), text="[...]") but.setFixedWidth(24) s = self.clozeShortcut2 = QShortcut( QKeySequence(_("Ctrl+Alt+Shift+C")), self.parentWindow) s.connect(s, SIGNAL("activated()"), self.onCloze) # fixme: better image names b("mail-attachment", self.onAddMedia, _("F3"), _("Attach pictures/audio/video (F3)")) b("media-record", self.onRecSound, _("F5"), _("Record audio (F5)")) b("adv", self.onAdvanced, text=u"▾") s = QShortcut(QKeySequence("Ctrl+T, T"), self.widget) s.connect(s, SIGNAL("activated()"), self.insertLatex) s = QShortcut(QKeySequence("Ctrl+T, E"), self.widget) s.connect(s, SIGNAL("activated()"), self.insertLatexEqn) s = QShortcut(QKeySequence("Ctrl+T, M"), self.widget) s.connect(s, SIGNAL("activated()"), self.insertLatexMathEnv) s = QShortcut(QKeySequence("Ctrl+Shift+X"), self.widget) s.connect(s, SIGNAL("activated()"), self.onHtmlEdit) # tags s = QShortcut(QKeySequence("Ctrl+Shift+T"), self.widget) s.connect(s, SIGNAL("activated()"), lambda: self.tags.setFocus()) runHook("setupEditorButtons", self) def enableButtons(self, val=True): for b in self._buttons.values(): b.setEnabled(val) def disableButtons(self): self.enableButtons(False) def onFields(self): from aqt.fields import FieldDialog self.saveNow() FieldDialog(self.mw, self.note, parent=self.parentWindow) def onCardLayout(self): from aqt.clayout import CardLayout self.saveNow() if self.card: ord = self.card.ord else: ord = 0 # passing parentWindow leads to crash on windows at the moment if isWin: parent=None else: parent=self.parentWindow CardLayout(self.mw, self.note, ord=ord, parent=parent, addMode=self.addMode) self.loadNote() if isWin: self.parentWindow.activateWindow() # JS->Python bridge ###################################################################### def bridge(self, str): if not self.note or not runHook: # shutdown return # focus lost or key/button pressed? if str.startswith("blur") or str.startswith("key"): (type, txt) = str.split(":", 1) txt = self.mungeHTML(txt) # misbehaving apps may include a null byte in the text txt = txt.replace("\x00", "") # reverse the url quoting we added to get images to display txt = unicode(urllib2.unquote( txt.encode("utf8")), "utf8", "replace") self.note.fields[self.currentField] = txt if not self.addMode: self.note.flush() self.mw.requireReset() if type == "blur": self.disableButtons() # run any filters if runFilter( "editFocusLost", False, self.note, self.currentField): # something updated the note; schedule reload def onUpdate(): self.stealFocus = True self.loadNote() self.checkValid() self.mw.progress.timer(100, onUpdate, False) else: self.checkValid() else: runHook("editTimer", self.note) self.checkValid() # focused into field? elif str.startswith("focus"): (type, num) = str.split(":", 1) self.enableButtons() self.currentField = int(num) runHook("editFocusGained", self.note, self.currentField) # state buttons changed? elif str.startswith("state"): (cmd, txt) = str.split(":", 1) r = json.loads(txt) self._buttons['text_bold'].setChecked(r['bold']) self._buttons['text_italic'].setChecked(r['italic']) self._buttons['text_under'].setChecked(r['under']) self._buttons['text_super'].setChecked(r['super']) self._buttons['text_sub'].setChecked(r['sub']) elif str.startswith("dupes"): self.showDupes() else: print str def mungeHTML(self, txt): if txt == "
": txt = "" return self._filterHTML(txt, localize=False) # Setting/unsetting the current note ###################################################################### def _loadFinished(self, w): self._loaded = True if self.note: self.loadNote() def setNote(self, note, hide=True, focus=False): "Make NOTE the current note." self.note = note self.currentField = 0 self.disableButtons() if focus: self.stealFocus = True # change timer if self.note: self.web.setHtml(_html % ( getBase(self.mw.col), anki.js.jquery, _("Show Duplicates")), loadCB=self._loadFinished) self.updateTags() self.updateKeyboard() else: self.hideCompleters() if hide: self.widget.hide() def loadNote(self): if not self.note: return if self.stealFocus: field = self.currentField else: field = -1 if not self._loaded: # will be loaded when page is ready return data = [] for fld, val in self.note.items(): data.append((fld, self.mw.col.media.escapeImages(val))) self.web.eval("setFields(%s, %d);" % ( json.dumps(data), field)) self.web.eval("setFonts(%s);" % ( json.dumps(self.fonts()))) self.checkValid() self.widget.show() if self.stealFocus: self.web.setFocus() self.stealFocus = False def focus(self): self.web.setFocus() def fonts(self): return [(f['font'], f['size'], f['rtl']) for f in self.note.model()['flds']] def saveNow(self): "Must call this before adding cards, closing dialog, etc." if not self.note: return self.saveTags() if self.mw.app.focusWidget() != self.web: # if no fields are focused, there's nothing to save return # move focus out of fields and save tags self.parentWindow.setFocus() # and process events so any focus-lost hooks fire self.mw.app.processEvents() def checkValid(self): cols = [] err = None for f in self.note.fields: cols.append("#fff") err = self.note.dupeOrEmpty() if err == 2: cols[0] = "#fcc" self.web.eval("showDupes();") else: self.web.eval("hideDupes();") self.web.eval("setBackgrounds(%s);" % json.dumps(cols)) def showDupes(self): contents = stripHTMLMedia(self.note.fields[0]) browser = aqt.dialogs.open("Browser", self.mw) browser.form.searchEdit.lineEdit().setText( '"dupe:%s,%s"' % (self.note.model()['id'], contents)) browser.onSearch() def fieldsAreBlank(self): if not self.note: return True m = self.note.model() for c, f in enumerate(self.note.fields): if f and not m['flds'][c]['sticky']: return False return True # HTML editing ###################################################################### def onHtmlEdit(self): self.saveNow() d = QDialog(self.widget) form = aqt.forms.edithtml.Ui_Dialog() form.setupUi(d) d.connect(form.buttonBox, SIGNAL("helpRequested()"), lambda: openHelp("editor")) form.textEdit.setPlainText(self.note.fields[self.currentField]) form.textEdit.moveCursor(QTextCursor.End) d.exec_() html = form.textEdit.toPlainText() # filter html through beautifulsoup so we can strip out things like a # leading html = unicode(BeautifulSoup(html)) self.note.fields[self.currentField] = html self.loadNote() # focus field so it's saved self.web.setFocus() self.web.eval("focusField(%d);" % self.currentField) # Tag handling ###################################################################### def setupTags(self): import aqt.tagedit g = QGroupBox(self.widget) g.setFlat(True) tb = QGridLayout() tb.setSpacing(12) tb.setMargin(6) # tags l = QLabel(_("Tags")) tb.addWidget(l, 1, 0) self.tags = aqt.tagedit.TagEdit(self.widget) self.tags.connect(self.tags, SIGNAL("lostFocus"), self.saveTags) self.tags.setToolTip(shortcut(_("Jump to tags with Ctrl+Shift+T"))) tb.addWidget(self.tags, 1, 1) g.setLayout(tb) self.outerLayout.addWidget(g) def updateTags(self): if self.tags.col != self.mw.col: self.tags.setCol(self.mw.col) if not self.tags.text() or not self.addMode: self.tags.setText(self.note.stringTags().strip()) def saveTags(self): if not self.note: return self.note.tags = self.mw.col.tags.canonify( self.mw.col.tags.split(self.tags.text())) self.tags.setText(self.mw.col.tags.join(self.note.tags).strip()) if not self.addMode: self.note.flush() runHook("tagsUpdated", self.note) def saveAddModeVars(self): if self.addMode: # save tags to model m = self.note.model() m['tags'] = self.note.tags self.mw.col.models.save(m) def hideCompleters(self): self.tags.hideCompleter() # Format buttons ###################################################################### def toggleBold(self, bool): self.web.eval("setFormat('bold');") def toggleItalic(self, bool): self.web.eval("setFormat('italic');") def toggleUnderline(self, bool): self.web.eval("setFormat('underline');") def toggleSuper(self, bool): self.web.eval("setFormat('superscript');") def toggleSub(self, bool): self.web.eval("setFormat('subscript');") def removeFormat(self): self.web.eval("setFormat('removeFormat');") def onCloze(self): # check that the model is set up for cloze deletion if '{{cloze:' not in self.note.model()['tmpls'][0]['qfmt']: if self.addMode: tooltip(_("Warning, cloze deletions will not work until " "you switch the type at the top to Cloze.")) else: showInfo(_("""\ To make a cloze deletion on an existing note, you need to change it \ to a cloze type first, via Edit>Change Note Type.""")) return # find the highest existing cloze highest = 0 for name, val in self.note.items(): m = re.findall("\{\{c(\d+)::", val) if m: highest = max(highest, sorted([int(x) for x in m])[-1]) # reuse last? if not self.mw.app.keyboardModifiers() & Qt.AltModifier: highest += 1 # must start at 1 highest = max(1, highest) self.web.eval("wrap('{{c%d::', '}}');" % highest) # Foreground colour ###################################################################### def setupForegroundButton(self, but): self.foregroundFrame = QFrame() self.foregroundFrame.setAutoFillBackground(True) self.foregroundFrame.setFocusPolicy(Qt.NoFocus) self.fcolour = self.mw.pm.profile.get("lastColour", "#00f") self.onColourChanged() hbox = QHBoxLayout() hbox.addWidget(self.foregroundFrame) hbox.setMargin(5) but.setLayout(hbox) # use last colour def onForeground(self): self._wrapWithColour(self.fcolour) # choose new colour def onChangeCol(self): new = QColorDialog.getColor(QColor(self.fcolour), None) # native dialog doesn't refocus us for some reason self.parentWindow.activateWindow() if new.isValid(): self.fcolour = new.name() self.onColourChanged() self._wrapWithColour(self.fcolour) def _updateForegroundButton(self): self.foregroundFrame.setPalette(QPalette(QColor(self.fcolour))) def onColourChanged(self): self._updateForegroundButton() self.mw.pm.profile['lastColour'] = self.fcolour def _wrapWithColour(self, colour): self.web.eval("setFormat('forecolor', '%s')" % colour) # Audio/video/images ###################################################################### def onAddMedia(self): key = (_("Media") + " (*.jpg *.png *.gif *.tiff *.svg *.tif *.jpeg "+ "*.mp3 *.ogg *.wav *.avi *.ogv *.mpg *.mpeg *.mov *.mp4 " + "*.mkv *.ogx *.ogv *.oga *.flv *.swf *.flac)") def accept(file): self.addMedia(file, canDelete=True) file = getFile(self.widget, _("Add Media"), accept, key, key="media") self.parentWindow.activateWindow() def addMedia(self, path, canDelete=False): html = self._addMedia(path, canDelete) self.web.eval("setFormat('inserthtml', %s);" % json.dumps(html)) def _addMedia(self, path, canDelete=False): "Add to media folder and return local img or sound tag." # copy to media folder fname = self.mw.col.media.addFile(path) # remove original? if canDelete and self.mw.pm.profile['deleteMedia']: if os.path.abspath(fname) != os.path.abspath(path): try: os.unlink(path) except: pass # return a local html link return self.fnameToLink(fname) def onRecSound(self): try: file = getAudio(self.widget) except Exception, e: showWarning(_( "Couldn't record audio. Have you installed lame and sox?") + "\n\n" + repr(str(e))) return self.addMedia(file) # Media downloads ###################################################################### def urlToLink(self, url): fname = self.urlToFile(url) if not fname: return "" return self.fnameToLink(fname) def fnameToLink(self, fname): ext = fname.split(".")[-1].lower() if ext in pics: name = urllib.quote(fname.encode("utf8")) return '' % name else: anki.sound.play(fname) return '[sound:%s]' % fname def urlToFile(self, url): l = url.lower() for suffix in pics+audio: if l.endswith(suffix): return self._retrieveURL(url) # not a supported type return def isURL(self, s): s = s.lower() return (s.startswith("http://") or s.startswith("https://") or s.startswith("ftp://") or s.startswith("file://")) def _retrieveURL(self, url): "Download file into media folder and return local filename or None." # urllib doesn't understand percent-escaped utf8, but requires things like # '#' to be escaped. we don't try to unquote the incoming URL, because # we should only be receiving file:// urls from url mime, which is unquoted if url.lower().startswith("file://"): url = url.replace("%", "%25") url = url.replace("#", "%23") # fetch it into a temporary folder self.mw.progress.start( immediate=True, parent=self.parentWindow) try: req = urllib2.Request(url, None, { 'User-Agent': 'Mozilla/5.0 (compatible; Anki)'}) filecontents = urllib2.urlopen(req).read() except urllib2.URLError, e: showWarning(_("An error occurred while opening %s") % e) return finally: self.mw.progress.finish() path = unicode(urllib2.unquote(url.encode("utf8")), "utf8") return self.mw.col.media.writeData(path, filecontents) # HTML filtering ###################################################################### def _filterHTML(self, html, localize=False): doc = BeautifulSoup(html) # remove implicit regular font style from outermost element if doc.span: try: attrs = doc.span['style'].split(";") except (KeyError, TypeError): attrs = [] if attrs: new = [] for attr in attrs: sattr = attr.strip() if sattr and sattr not in ("font-style: normal", "font-weight: normal"): new.append(sattr) doc.span['style'] = ";".join(new) # filter out implicit formatting from webkit for tag in doc("span", "Apple-style-span"): preserve = "" for item in tag['style'].split(";"): try: k, v = item.split(":") except ValueError: continue if k.strip() == "color" and not v.strip() == "rgb(0, 0, 0)": preserve += "color:%s;" % v if k.strip() in ("font-weight", "font-style"): preserve += item + ";" if preserve: # preserve colour attribute, delete implicit class tag['style'] = preserve del tag['class'] else: # strip completely tag.replaceWithChildren() for tag in doc("font", "Apple-style-span"): # strip all but colour attr from implicit font tags if 'color' in dict(tag.attrs): for attr in tag.attrs: if attr != "color": del tag[attr] # and apple class del tag['class'] else: # remove completely tag.replaceWithChildren() # now images for tag in doc("img"): # turn file:/// links into relative ones try: if tag['src'].lower().startswith("file://"): tag['src'] = os.path.basename(tag['src']) if localize and self.isURL(tag['src']): # convert remote image links to local ones fname = self.urlToFile(tag['src']) if fname: tag['src'] = fname except KeyError: # for some bizarre reason, mnemosyne removes src elements # from missing media pass # strip all other attributes, including implicit max-width for attr, val in tag.attrs: if attr != "src": del tag[attr] # strip superfluous elements for elem in "html", "head", "body", "meta": for tag in doc(elem): tag.replaceWithChildren() html = unicode(doc) return html # Advanced menu ###################################################################### def onAdvanced(self): m = QMenu(self.mw) a = m.addAction(_("LaTeX")) a.setShortcut(QKeySequence("Ctrl+T, T")) a.connect(a, SIGNAL("triggered()"), self.insertLatex) a = m.addAction(_("LaTeX equation")) a.setShortcut(QKeySequence("Ctrl+T, E")) a.connect(a, SIGNAL("triggered()"), self.insertLatexEqn) a = m.addAction(_("LaTeX math env.")) a.setShortcut(QKeySequence("Ctrl+T, M")) a.connect(a, SIGNAL("triggered()"), self.insertLatexMathEnv) a = m.addAction(_("Edit HTML")) a.setShortcut(QKeySequence("Ctrl+Shift+X")) a.connect(a, SIGNAL("triggered()"), self.onHtmlEdit) m.exec_(QCursor.pos()) # LaTeX ###################################################################### def insertLatex(self): self.web.eval("wrap('[latex]', '[/latex]');") def insertLatexEqn(self): self.web.eval("wrap('[$]', '[/$]');") def insertLatexMathEnv(self): self.web.eval("wrap('[$$]', '[/$$]');") # Keyboard layout ###################################################################### def setupKeyboard(self): if isWin and self.mw.pm.profile['preserveKeyboard']: a = ctypes.windll.user32.ActivateKeyboardLayout a.restype = ctypes.c_void_p a.argtypes = [ctypes.c_void_p, ctypes.c_uint] g = ctypes.windll.user32.GetKeyboardLayout g.restype = ctypes.c_void_p g.argtypes = [ctypes.c_uint] else: a = g = None self.activateKeyboard = a self.getKeyboard = g def updateKeyboard(self): self.keyboardLayouts = {} def saveKeyboard(self): if not self.getKeyboard: return self.keyboardLayouts[self.currentField] = self.getKeyboard(0) def restoreKeyboard(self): if not self.getKeyboard: return if self.currentField in self.keyboardLayouts: self.activateKeyboard(self.keyboardLayouts[self.currentField], 0) # Pasting, drag & drop, and keyboard layouts ###################################################################### class EditorWebView(AnkiWebView): def __init__(self, parent, editor): AnkiWebView.__init__(self) self.editor = editor self.strip = self.editor.mw.pm.profile['stripHTML'] def keyPressEvent(self, evt): if evt.matches(QKeySequence.Paste): self.onPaste() return evt.accept() elif evt.matches(QKeySequence.Copy): self.onCopy() return evt.accept() elif evt.matches(QKeySequence.Cut): self.onCut() return evt.accept() QWebView.keyPressEvent(self, evt) def onCut(self): self.triggerPageAction(QWebPage.Cut) self._flagAnkiText() def onCopy(self): self.triggerPageAction(QWebPage.Copy) self._flagAnkiText() def onPaste(self): mime = self.mungeClip() self.triggerPageAction(QWebPage.Paste) self.restoreClip() def mouseReleaseEvent(self, evt): if not isMac and not isWin and evt.button() == Qt.MidButton: # middle click on x11; munge the clipboard before standard # handling mime = self.mungeClip(mode=QClipboard.Selection) AnkiWebView.mouseReleaseEvent(self, evt) self.restoreClip(mode=QClipboard.Selection) else: AnkiWebView.mouseReleaseEvent(self, evt) def focusInEvent(self, evt): window = False if evt.reason() in (Qt.ActiveWindowFocusReason, Qt.PopupFocusReason): # editor area got focus again; need to tell js not to adjust cursor self.eval("mouseDown++;") window = True AnkiWebView.focusInEvent(self, evt) if evt.reason() == Qt.TabFocusReason: self.eval("focusField(0);") elif evt.reason() == Qt.BacktabFocusReason: n = len(self.editor.note.fields) - 1 self.eval("focusField(%d);" % n) elif window: self.eval("mouseDown--;") def dropEvent(self, evt): oldmime = evt.mimeData() # coming from this program? if evt.source(): if oldmime.hasHtml(): mime = QMimeData() mime.setHtml(self.editor._filterHTML(oldmime.html())) else: # old qt on linux won't give us html when dragging an image; # in that case just do the default action (which is to ignore # the drag) return AnkiWebView.dropEvent(self, evt) else: mime = self._processMime(oldmime) # create a new event with the new mime data and run it new = QDropEvent(evt.pos(), evt.possibleActions(), mime, evt.mouseButtons(), evt.keyboardModifiers()) evt.accept() QWebView.dropEvent(self, new) # tell the drop target to take focus so the drop contents are saved self.eval("dropTarget.focus();") self.setFocus() def mungeClip(self, mode=QClipboard.Clipboard): clip = self.editor.mw.app.clipboard() mime = clip.mimeData(mode=mode) self.saveClip(mode=mode) mime = self._processMime(mime) clip.setMimeData(mime, mode=mode) return mime def restoreClip(self, mode=QClipboard.Clipboard): clip = self.editor.mw.app.clipboard() clip.setMimeData(self.savedClip, mode=mode) def saveClip(self, mode): # we don't own the clipboard object, so we need to copy it or we'll crash mime = self.editor.mw.app.clipboard().mimeData(mode=mode) n = QMimeData() if mime.hasText(): n.setText(mime.text()) if mime.hasHtml(): n.setHtml(mime.html()) if mime.hasUrls(): n.setUrls(mime.urls()) if mime.hasImage(): n.setImageData(mime.imageData()) self.savedClip = n def _processMime(self, mime): # print "html=%s image=%s urls=%s txt=%s" % ( # mime.hasHtml(), mime.hasImage(), mime.hasUrls(), mime.hasText()) # print "html", mime.html() # print "urls", mime.urls() # print "text", mime.text() if mime.hasHtml(): return self._processHtml(mime) elif mime.hasUrls(): return self._processUrls(mime) elif mime.hasText(): return self._processText(mime) elif mime.hasImage(): return self._processImage(mime) else: # nothing return QMimeData() # when user is dragging a file from a file manager on any platform, the # url type should be set, and it is not URL-encoded. on a mac no text type # is returned, and on windows the text type is not returned in cases like # "foo's bar.jpg" def _processUrls(self, mime): url = mime.urls()[0].toString() # chrome likes to give us the URL twice with a \n url = url.splitlines()[0] mime = QMimeData() link = self.editor.urlToLink(url) if link: mime.setHtml(link) else: mime.setText(url) return mime # if the user has used 'copy link location' in the browser, the clipboard # will contain the URL as text, and no URLs or HTML. the URL will already # be URL-encoded, and shouldn't be a file:// url unless they're browsing # locally, which we don't support def _processText(self, mime): txt = unicode(mime.text()) html = None # if the user is pasting an image or sound link, convert it to local if self.editor.isURL(txt): txt = txt.split("\r\n")[0] html = self.editor.urlToLink(txt) new = QMimeData() if html: new.setHtml(html) else: new.setText(txt) return new def _processHtml(self, mime): html = mime.html() newMime = QMimeData() if self.strip and not html.startswith(""): # special case for google images: if after stripping there's no text # and there are image links, we'll paste those as html instead if not stripHTML(html).strip(): newHtml = "" mid = self.editor.note.mid for url in self.editor.mw.col.media.filesInStr( mid, html, includeRemote=True): newHtml += self.editor.urlToLink(url) if not newHtml and mime.hasImage(): return self._processImage(mime) newMime.setHtml(newHtml) else: # use .text() if available so newlines are preserved; otherwise strip if mime.hasText(): return self._processText(mime) else: newMime.setText(stripHTML(mime.text())) else: if html.startswith(""): html = html[11:] # no html stripping html = self.editor._filterHTML(html, localize=True) newMime.setHtml(html) return newMime def _processImage(self, mime): im = QImage(mime.imageData()) uname = namedtmp("paste-%d" % im.cacheKey()) if self.editor.mw.pm.profile.get("pastePNG", False): ext = ".png" im.save(uname+ext, None, 50) else: ext = ".jpg" im.save(uname+ext, None, 80) # invalid image? if not os.path.exists(uname+ext): return QMimeData() mime = QMimeData() mime.setHtml(self.editor._addMedia(uname+ext)) return mime def _flagAnkiText(self): # add a comment in the clipboard html so we can tell text is copied # from us and doesn't need to be stripped clip = self.editor.mw.app.clipboard() mime = clip.mimeData() if not mime.hasHtml(): return html = mime.html() mime.setHtml("" + mime.html()) def contextMenuEvent(self, evt): m = QMenu(self) a = m.addAction(_("Cut")) a.connect(a, SIGNAL("triggered()"), self.onCut) a = m.addAction(_("Copy")) a.connect(a, SIGNAL("triggered()"), self.onCopy) a = m.addAction(_("Paste")) a.connect(a, SIGNAL("triggered()"), self.onPaste) runHook("EditorWebView.contextMenuEvent", self, m) m.popup(QCursor.pos()) anki-2.0.20+dfsg/aqt/editcurrent.py0000644000175000017500000000417012221204444016734 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import aqt.editor from aqt.utils import saveGeom, restoreGeom from anki.hooks import addHook, remHook from anki.utils import isMac class EditCurrent(QDialog): def __init__(self, mw): if isMac: # use a separate window on os x so we can a clean menu QDialog.__init__(self, None, Qt.Window) else: QDialog.__init__(self, mw) QDialog.__init__(self, None, Qt.Window) self.mw = mw self.form = aqt.forms.editcurrent.Ui_Dialog() self.form.setupUi(self) self.setWindowTitle(_("Edit Current")) self.setMinimumHeight(400) self.setMinimumWidth(500) self.connect(self, SIGNAL("rejected()"), self.onSave) self.editor = aqt.editor.Editor(self.mw, self.form.fieldsArea, self) self.editor.setNote(self.mw.reviewer.card.note()) restoreGeom(self, "editcurrent") addHook("reset", self.onReset) self.mw.requireReset() self.show() # reset focus after open self.editor.web.setFocus() def onReset(self): # lazy approach for now: throw away edits try: n = self.mw.reviewer.card.note() n.load() except: # card's been deleted remHook("reset", self.onReset) self.editor.setNote(None) self.mw.reset() aqt.dialogs.close("EditCurrent") self.close() return self.editor.setNote(n) def onSave(self): remHook("reset", self.onReset) self.editor.saveNow() r = self.mw.reviewer try: r.card.load() except: # card was removed by clayout pass else: self.mw.reviewer.cardQueue.append(self.mw.reviewer.card) self.mw.moveToState("review") saveGeom(self, "editcurrent") aqt.dialogs.close("EditCurrent") def canClose(self): return True anki-2.0.20+dfsg/aqt/sound.py0000644000175000017500000000216312065175361015547 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import time from anki.sound import Recorder from aqt.utils import saveGeom, restoreGeom def getAudio(parent, encode=True): "Record and return filename" # record first r = Recorder() mb = QMessageBox(parent) restoreGeom(mb, "audioRecorder") mb.setWindowTitle("Anki") mb.setIconPixmap(QPixmap(":/icons/media-record.png")) but = QPushButton(_(" Stop")) but.setIcon(QIcon(":/icons/media-playback-stop.png")) #but.setIconSize(QSize(32, 32)) mb.addButton(but, QMessageBox.RejectRole) t = time.time() r.start() QApplication.instance().processEvents() while not mb.clickedButton(): txt =_("Recording...
Time: %0.1f") mb.setText(txt % (time.time() - t)) mb.show() QApplication.instance().processEvents() saveGeom(mb, "audioRecorder") # ensure at least a second captured while time.time() - t < 1: time.sleep(0.1) r.stop() # process r.postprocess(encode) return r.file() anki-2.0.20+dfsg/aqt/downloader.py0000644000175000017500000000545512225675305016565 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import time, re, traceback from aqt.qt import * from anki.sync import httpCon from aqt.utils import showWarning from anki.hooks import addHook, remHook import aqt.sync # monkey-patches httplib2 def download(mw, code): "Download addon/deck from AnkiWeb. On success caller must stop progress diag." # check code is valid try: code = int(code) except ValueError: showWarning(_("Invalid code.")) return # create downloading thread thread = Downloader(code) def onRecv(): try: mw.progress.update(label="%dKB downloaded" % (thread.recvTotal/1024)) except NameError: # some users report the following error on long downloads # NameError: free variable 'mw' referenced before assignment in enclosing scope # unsure why this is happening, but guard against throwing the # error pass mw.connect(thread, SIGNAL("recv"), onRecv) thread.start() mw.progress.start(immediate=True) while not thread.isFinished(): mw.app.processEvents() thread.wait(100) if not thread.error: # success return thread.data, thread.fname else: mw.progress.finish() showWarning(_("Download failed: %s") % thread.error) class Downloader(QThread): def __init__(self, code): QThread.__init__(self) self.code = code self.error = None def run(self): # setup progress handler self.byteUpdate = time.time() self.recvTotal = 0 def canPost(): if (time.time() - self.byteUpdate) > 0.1: self.byteUpdate = time.time() return True def recvEvent(bytes): self.recvTotal += bytes if canPost(): self.emit(SIGNAL("recv")) addHook("httpRecv", recvEvent) con = httpCon() try: resp, cont = con.request( aqt.appShared + "download/%d" % self.code) except Exception, e: exc = traceback.format_exc() try: self.error = unicode(e[0], "utf8", "ignore") except: self.error = unicode(exc, "utf8", "ignore") return finally: remHook("httpRecv", recvEvent) if resp['status'] == '200': self.error = None self.fname = re.match("attachment; filename=(.+)", resp['content-disposition']).group(1) self.data = cont elif resp['status'] == '403': self.error = _("Invalid code.") else: self.error = _("Error downloading: %s") % resp['status'] anki-2.0.20+dfsg/aqt/reviewer.py0000644000175000017500000006135012231406414016241 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from __future__ import division import difflib import re import cgi import unicodedata as ucd import HTMLParser from anki.lang import _, ngettext from aqt.qt import * from anki.utils import stripHTML, isMac, json from anki.hooks import addHook, runHook from anki.sound import playFromText, clearAudioQueue, play from aqt.utils import mungeQA, getBase, openLink, tooltip, askUserDialog from aqt.sound import getAudio import aqt class Reviewer(object): "Manage reviews. Maintains a separate state." def __init__(self, mw): self.mw = mw self.web = mw.web self.card = None self.cardQueue = [] self.hadCardQueue = False self._answeredIds = [] self._recordedAudio = None self.typeCorrect = None # web init happens before this is set self.state = None self.bottom = aqt.toolbar.BottomBar(mw, mw.bottomWeb) # qshortcut so we don't autorepeat self.delShortcut = QShortcut(QKeySequence("Delete"), self.mw) self.delShortcut.setAutoRepeat(False) self.mw.connect(self.delShortcut, SIGNAL("activated()"), self.onDelete) addHook("leech", self.onLeech) def show(self): self.mw.col.reset() self.mw.keyHandler = self._keyHandler self.web.setLinkHandler(self._linkHandler) self.web.setKeyHandler(self._catchEsc) if isMac: self.bottom.web.setFixedHeight(46) else: self.bottom.web.setFixedHeight(52+self.mw.fontHeightDelta*4) self.bottom.web.setLinkHandler(self._linkHandler) self._reps = None self.nextCard() def lastCard(self): if self._answeredIds: if not self.card or self._answeredIds[-1] != self.card.id: try: return self.mw.col.getCard(self._answeredIds[-1]) except TypeError: # id was deleted return def cleanup(self): runHook("reviewCleanup") # Fetching a card ########################################################################## def nextCard(self): elapsed = self.mw.col.timeboxReached() if elapsed: part1 = ngettext("%d card studied in", "%d cards studied in", elapsed[1]) % elapsed[1] mins = int(round(elapsed[0]/60)) part2 = ngettext("%s minute.", "%s minutes.", mins) % mins fin = _("Finish") diag = askUserDialog("%s %s" % (part1, part2), [_("Continue"), fin]) diag.setIcon(QMessageBox.Information) if diag.run() == fin: return self.mw.moveToState("deckBrowser") self.mw.col.startTimebox() if self.cardQueue: # undone/edited cards to show c = self.cardQueue.pop() c.startTimer() self.hadCardQueue = True else: if self.hadCardQueue: # the undone/edited cards may be sitting in the regular queue; # need to reset self.mw.col.reset() self.hadCardQueue = False c = self.mw.col.sched.getCard() self.card = c clearAudioQueue() if not c: self.mw.moveToState("overview") return if self._reps is None or self._reps % 100 == 0: # we recycle the webview periodically so webkit can free memory self._initWeb() else: self._showQuestion() # Audio ########################################################################## def replayAudio(self): clearAudioQueue() c = self.card if self.state == "question": playFromText(c.q()) elif self.state == "answer": txt = "" if self._replayq(c): txt = c.q() txt += c.a() playFromText(txt) # Initializing the webview ########################################################################## _revHtml = """
""" def _initWeb(self): self._reps = 0 self._bottomReady = False base = getBase(self.mw.col) # main window self.web.stdHtml(self._revHtml, self._styles(), loadCB=lambda x: self._showQuestion(), head=base) # show answer / ease buttons self.bottom.web.show() self.bottom.web.stdHtml( self._bottomHTML(), self.bottom._css + self._bottomCSS, loadCB=lambda x: self._showAnswerButton()) # Showing the question ########################################################################## def _mungeQA(self, buf): return self.typeAnsFilter(mungeQA(self.mw.col, buf)) def _showQuestion(self): self._reps += 1 self.state = "question" self.typedAnswer = None c = self.card # grab the question and play audio if c.isEmpty(): q = _("""\ The front of this card is empty. Please run Tools>Empty Cards.""") else: q = c.q() if self.autoplay(c): playFromText(q) # render & update bottom q = self._mungeQA(q) klass = "card card%d" % (c.ord+1) self.web.eval("_updateQA(%s, false, '%s');" % (json.dumps(q), klass)) self._toggleStar() if self._bottomReady: self._showAnswerButton() # if we have a type answer field, focus main web if self.typeCorrect: self.mw.web.setFocus() # user hook runHook('showQuestion') def autoplay(self, card): return self.mw.col.decks.confForDid( card.odid or card.did)['autoplay'] def _replayq(self, card): return self.mw.col.decks.confForDid( self.card.odid or self.card.did).get('replayq', True) def _toggleStar(self): self.web.eval("_toggleStar(%s);" % json.dumps( self.card.note().hasTag("marked"))) # Showing the answer ########################################################################## def _showAnswer(self): if self.mw.state != "review": # showing resetRequired screen; ignore space return self.state = "answer" c = self.card a = c.a() # play audio? if self.autoplay(c): playFromText(a) # render and update bottom a = self._mungeQA(a) self.web.eval("_updateQA(%s, true);" % json.dumps(a)) self._showEaseButtons() # user hook runHook('showAnswer') # Answering a card ############################################################ def _answerCard(self, ease): "Reschedule card and show next." if self.mw.state != "review": # showing resetRequired screen; ignore key return if self.state != "answer": return if self.mw.col.sched.answerButtons(self.card) < ease: return self.mw.col.sched.answerCard(self.card, ease) self._answeredIds.append(self.card.id) self.mw.autosave() self.nextCard() # Handlers ############################################################ def _catchEsc(self, evt): if evt.key() == Qt.Key_Escape: self.web.eval("$('#typeans').blur();") return True def _showAnswerHack(self): # on Empty Cards""") else: warn = _("Type answer: unknown field %s") % fld return re.sub(self.typeAnsPat, warn, buf) else: # empty field, remove type answer pattern return re.sub(self.typeAnsPat, "", buf) return re.sub(self.typeAnsPat, """
""" % (self.typeFont, self.typeSize), buf) def typeAnsAnswerFilter(self, buf): # tell webview to call us back with the input content self.web.eval("_getTypedText();") if not self.typeCorrect: return re.sub(self.typeAnsPat, "", buf) origSize = len(buf) buf = buf.replace("
", "") hadHR = len(buf) != origSize # munge correct value parser = HTMLParser.HTMLParser() cor = stripHTML(self.mw.col.media.strip(self.typeCorrect)) # ensure we don't chomp multiple whitespace cor = cor.replace(" ", " ") cor = parser.unescape(cor) cor = cor.replace(u"\xa0", " ") given = self.typedAnswer # compare with typed answer res = self.correct(given, cor, showBad=False) # and update the type answer area def repl(match): # can't pass a string in directly, and can't use re.escape as it # escapes too much s = """ %s""" % ( self.typeFont, self.typeSize, res) if hadHR: # a hack to ensure the q/a separator falls before the answer # comparison when user is using {{FrontSide}} s = "
" + s return s return re.sub(self.typeAnsPat, repl, buf) def _contentForCloze(self, txt, idx): matches = re.findall("\{\{c%s::(.+?)\}\}"%idx, txt) if not matches: return None def noHint(txt): if "::" in txt: return txt.split("::")[0] return txt matches = [noHint(txt) for txt in matches] if len(matches) > 1: txt = ", ".join(matches) else: txt = matches[0] return txt def tokenizeComparison(self, given, correct): # compare in NFC form so accents appear correct given = ucd.normalize("NFC", given) correct = ucd.normalize("NFC", correct) try: s = difflib.SequenceMatcher(None, given, correct, autojunk=False) except: # autojunk was added in python 2.7.1 s = difflib.SequenceMatcher(None, given, correct) givenElems = [] correctElems = [] givenPoint = 0 correctPoint = 0 offby = 0 def logBad(old, new, str, array): if old != new: array.append((False, str[old:new])) def logGood(start, cnt, str, array): if cnt: array.append((True, str[start:start+cnt])) for x, y, cnt in s.get_matching_blocks(): # if anything was missed in correct, pad given if cnt and y-offby > x: givenElems.append((False, "-"*(y-x-offby))) offby = y-x # log any proceeding bad elems logBad(givenPoint, x, given, givenElems) logBad(correctPoint, y, correct, correctElems) givenPoint = x+cnt correctPoint = y+cnt # log the match logGood(x, cnt, given, givenElems) logGood(y, cnt, correct, correctElems) return givenElems, correctElems def correct(self, given, correct, showBad=True): "Diff-corrects the typed-in answer." givenElems, correctElems = self.tokenizeComparison(given, correct) def good(s): return ""+cgi.escape(s)+"" def bad(s): return ""+cgi.escape(s)+"" def missed(s): return ""+cgi.escape(s)+"" if given == correct: res = good(given) else: res = "" for ok, txt in givenElems: if ok: res += good(txt) else: res += bad(txt) res += "

" for ok, txt in correctElems: if ok: res += good(txt) else: res += missed(txt) res = "
" + res + "
" return res # Bottom bar ########################################################################## _bottomCSS = """ body { background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#ddd)); border-bottom: 0; border-top: 1px solid #aaa; margin: 0; padding: 0px; padding-left: 5px; padding-right: 5px; } button { min-width: 60px; white-space: nowrap; } .hitem { margin-top: 2px; } .stat { padding-top: 5px; } .stat2 { padding-top: 3px; font-weight: normal; } .stattxt { padding-left: 5px; padding-right: 5px; white-space: nowrap; } .nobold { font-weight: normal; display: inline-block; padding-top: 4px; } .spacer { height: 18px; } .spacer2 { height: 16px; } """ def _bottomHTML(self): return """


""" % dict(rem=self._remaining(), edit=_("Edit"), editkey=_("Shortcut key: %s") % "E", more=_("More"), time=self.card.timeTaken() // 1000) def _showAnswerButton(self): self._bottomReady = True if not self.typeCorrect: self.bottom.web.setFocus() middle = ''' %s
''' % ( self._remaining(), _("Shortcut key: %s") % _("Space"), _("Show Answer")) # wrap it in a table so it has the same top margin as the ease buttons middle = "
%s
" % middle if self.card.shouldShowTimer(): maxTime = self.card.timeLimit() / 1000 else: maxTime = 0 self.bottom.web.eval("showQuestion(%s,%d);" % ( json.dumps(middle), maxTime)) def _showEaseButtons(self): self.bottom.web.setFocus() middle = self._answerButtons() self.bottom.web.eval("showAnswer(%s);" % json.dumps(middle)) def _remaining(self): if not self.mw.col.conf['dueCounts']: return "" if self.hadCardQueue: # if it's come from the undo queue, don't count it separately counts = list(self.mw.col.sched.counts()) else: counts = list(self.mw.col.sched.counts(self.card)) idx = self.mw.col.sched.countIdx(self.card) counts[idx] = "%s" % (counts[idx]) space = " + " ctxt = '%s' % counts[0] ctxt += space + '%s' % counts[1] ctxt += space + '%s' % counts[2] return ctxt def _defaultEase(self): if self.mw.col.sched.answerButtons(self.card) == 4: return 3 else: return 2 def _answerButtonList(self): l = ((1, _("Again")),) cnt = self.mw.col.sched.answerButtons(self.card) if cnt == 2: return l + ((2, _("Good")),) elif cnt == 3: return l + ((2, _("Good")), (3, _("Easy"))) else: return l + ((2, _("Hard")), (3, _("Good")), (4, _("Easy"))) def _answerButtons(self): times = [] default = self._defaultEase() def but(i, label): if i == default: extra = "id=defease" else: extra = "" due = self._buttonTime(i) return ''' %s''' % (due, extra, _("Shortcut key: %s") % i, i, label) buf = "
" for ease, label in self._answerButtonList(): buf += but(ease, label) buf += "
" script = """ """ return buf + script def _buttonTime(self, i): if not self.mw.col.conf['estTimes']: return "
" txt = self.mw.col.sched.nextIvlStr(self.card, i, True) or " " return '%s
' % txt # Leeches ########################################################################## def onLeech(self, card): # for now s = _("Card was a leech.") if card.queue < 0: s += " " + _("It has been suspended.") tooltip(s) # Context menu ########################################################################## # note the shortcuts listed here also need to be defined above def showContextMenu(self): opts = [ [_("Mark Note"), "*", self.onMark], [_("Bury Card"), "-", self.onBuryCard], [_("Bury Note"), "=", self.onBuryNote], [_("Suspend Card"), "@", self.onSuspendCard], [_("Suspend Note"), "!", self.onSuspend], [_("Delete Note"), "Delete", self.onDelete], [_("Options"), "O", self.onOptions], None, [_("Replay Audio"), "R", self.replayAudio], [_("Record Own Voice"), "Shift+V", self.onRecordVoice], [_("Replay Own Voice"), "V", self.onReplayRecorded], ] m = QMenu(self.mw) for row in opts: if not row: m.addSeparator() continue label, scut, func = row a = m.addAction(label) a.setShortcut(QKeySequence(scut)) a.connect(a, SIGNAL("triggered()"), func) runHook("Reviewer.contextMenuEvent",self,m) m.exec_(QCursor.pos()) def onOptions(self): self.mw.onDeckConf(self.mw.col.decks.get( self.card.odid or self.card.did)) def onMark(self): f = self.card.note() if f.hasTag("marked"): f.delTag("marked") else: f.addTag("marked") f.flush() self._toggleStar() def onSuspend(self): self.mw.checkpoint(_("Suspend")) self.mw.col.sched.suspendCards( [c.id for c in self.card.note().cards()]) tooltip(_("Note suspended.")) self.mw.reset() def onSuspendCard(self): self.mw.checkpoint(_("Suspend")) self.mw.col.sched.suspendCards([self.card.id]) tooltip(_("Card suspended.")) self.mw.reset() def onDelete(self): # need to check state because the shortcut is global to the main # window if self.mw.state != "review" or not self.card: return self.mw.checkpoint(_("Delete")) cnt = len(self.card.note().cards()) self.mw.col.remNotes([self.card.note().id]) self.mw.reset() tooltip(ngettext( "Note and its %d card deleted.", "Note and its %d cards deleted.", cnt) % cnt) def onBuryCard(self): self.mw.checkpoint(_("Bury")) self.mw.col.sched.buryCards([self.card.id]) self.mw.reset() tooltip(_("Card buried.")) def onBuryNote(self): self.mw.checkpoint(_("Bury")) self.mw.col.sched.buryNote(self.card.nid) self.mw.reset() tooltip(_("Note buried.")) def onRecordVoice(self): self._recordedAudio = getAudio(self.mw, encode=False) self.onReplayRecorded() def onReplayRecorded(self): if not self._recordedAudio: return tooltip(_("You haven't recorded your voice yet.")) clearAudioQueue() play(self._recordedAudio) anki-2.0.20+dfsg/aqt/addons.py0000644000175000017500000001212512221204444015653 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import sys, os, traceback from cStringIO import StringIO from aqt.qt import * from aqt.utils import showInfo, openFolder, isWin, openLink, \ askUser from zipfile import ZipFile import aqt.forms import aqt from aqt.downloader import download # in the future, it would be nice to save the addon id and unzippped file list # to the config so that we can clear up all files and check for updates class AddonManager(object): def __init__(self, mw): self.mw = mw f = self.mw.form; s = SIGNAL("triggered()") self.mw.connect(f.actionOpenPluginFolder, s, self.onOpenAddonFolder) self.mw.connect(f.actionDownloadSharedPlugin, s, self.onGetAddons) self._menus = [] if isWin: self.clearAddonCache() sys.path.insert(0, self.addonsFolder()) if not self.mw.safeMode: self.loadAddons() def files(self): return [f for f in os.listdir(self.addonsFolder()) if f.endswith(".py")] def loadAddons(self): for file in self.files(): try: __import__(file.replace(".py", "")) except: traceback.print_exc() self.rebuildAddonsMenu() # Menus ###################################################################### def onOpenAddonFolder(self, path=None): if path is None: path = self.addonsFolder() openFolder(path) def rebuildAddonsMenu(self): for m in self._menus: self.mw.form.menuPlugins.removeAction(m.menuAction()) for file in self.files(): m = self.mw.form.menuPlugins.addMenu( os.path.splitext(file)[0]) self._menus.append(m) a = QAction(_("Edit..."), self.mw) p = os.path.join(self.addonsFolder(), file) self.mw.connect(a, SIGNAL("triggered()"), lambda p=p: self.onEdit(p)) m.addAction(a) a = QAction(_("Delete..."), self.mw) self.mw.connect(a, SIGNAL("triggered()"), lambda p=p: self.onRem(p)) m.addAction(a) def onEdit(self, path): d = QDialog(self.mw) frm = aqt.forms.editaddon.Ui_Dialog() frm.setupUi(d) d.setWindowTitle(os.path.basename(path)) frm.text.setPlainText(unicode(open(path).read(), "utf8")) d.connect(frm.buttonBox, SIGNAL("accepted()"), lambda: self.onAcceptEdit(path, frm)) d.exec_() def onAcceptEdit(self, path, frm): open(path, "w").write(frm.text.toPlainText().encode("utf8")) showInfo(_("Edits saved. Please restart Anki.")) def onRem(self, path): if not askUser(_("Delete %s?") % os.path.basename(path)): return os.unlink(path) self.rebuildAddonsMenu() showInfo(_("Deleted. Please restart Anki.")) # Tools ###################################################################### def addonsFolder(self): dir = self.mw.pm.addonFolder() if isWin: dir = dir.encode(sys.getfilesystemencoding()) return dir def clearAddonCache(self): "Clear .pyc files which may cause crashes if Python version updated." dir = self.addonsFolder() for curdir, dirs, files in os.walk(dir): for f in files: if not f.endswith(".pyc"): continue os.unlink(os.path.join(curdir, f)) def registerAddon(self, name, updateId): # not currently used return # Installing add-ons ###################################################################### def onGetAddons(self): GetAddons(self.mw) def install(self, data, fname): if fname.endswith(".py"): # .py files go directly into the addon folder path = os.path.join(self.addonsFolder(), fname) open(path, "w").write(data) return # .zip file z = ZipFile(StringIO(data)) base = self.addonsFolder() for n in z.namelist(): if n.endswith("/"): # folder; ignore continue # write z.extract(n, base) class GetAddons(QDialog): def __init__(self, mw): QDialog.__init__(self, mw) self.mw = mw self.form = aqt.forms.getaddons.Ui_Dialog() self.form.setupUi(self) b = self.form.buttonBox.addButton( _("Browse"), QDialogButtonBox.ActionRole) self.connect(b, SIGNAL("clicked()"), self.onBrowse) self.exec_() def onBrowse(self): openLink(aqt.appShared + "addons/") def accept(self): QDialog.accept(self) # create downloader thread ret = download(self.mw, self.form.code.text()) if not ret: return data, fname = ret self.mw.addonManager.install(data, fname) self.mw.progress.finish() showInfo(_("Download successful. Please restart Anki.")) anki-2.0.20+dfsg/aqt/__init__.py0000644000175000017500000001740612247532323016161 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import getpass import os import sys import optparse import tempfile import __builtin__ import locale import gettext from aqt.qt import * import anki.lang from anki.consts import HELP_SITE from anki.lang import langDir from anki.utils import isMac from anki import version as _version appVersion=_version appWebsite="http://ankisrs.net/" appChanges="http://ankisrs.net/docs/changes.html" appDonate="http://ankisrs.net/support/" appShared="https://ankiweb.net/shared/" appUpdate="https://ankiweb.net/update/desktop" appHelpSite=HELP_SITE mw = None # set on init moduleDir = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0] try: import aqt.forms except ImportError, e: if "forms" in str(e): print "If you're running from git, did you run build_ui.sh?" print raise from anki.utils import checksum # Dialog manager - manages modeless windows ########################################################################## class DialogManager(object): def __init__(self): from aqt import addcards, browser, editcurrent self._dialogs = { "AddCards": [addcards.AddCards, None], "Browser": [browser.Browser, None], "EditCurrent": [editcurrent.EditCurrent, None], } def open(self, name, *args): (creator, instance) = self._dialogs[name] if instance: instance.setWindowState(Qt.WindowActive) instance.activateWindow() instance.raise_() return instance else: instance = creator(*args) self._dialogs[name][1] = instance return instance def close(self, name): self._dialogs[name] = [self._dialogs[name][0], None] def closeAll(self): "True if all closed successfully." for (n, (creator, instance)) in self._dialogs.items(): if instance: if not instance.canClose(): return False instance.forceClose = True instance.close() self.close(n) return True dialogs = DialogManager() # Language handling ########################################################################## # Qt requires its translator to be installed before any GUI widgets are # loaded, and we need the Qt language to match the gettext language or # translated shortcuts will not work. _gtrans = None _qtrans = None def setupLang(pm, app, force=None): global _gtrans, _qtrans try: locale.setlocale(locale.LC_ALL, '') except: pass lang = force or pm.meta["defaultLang"] dir = langDir() # gettext _gtrans = gettext.translation( 'anki', dir, languages=[lang], fallback=True) __builtin__.__dict__['_'] = _gtrans.ugettext __builtin__.__dict__['ngettext'] = _gtrans.ungettext anki.lang.setLang(lang, local=False) if lang in ("he","ar","fa"): app.setLayoutDirection(Qt.RightToLeft) else: app.setLayoutDirection(Qt.LeftToRight) # qt _qtrans = QTranslator() if _qtrans.load("qt_" + lang, dir): app.installTranslator(_qtrans) # App initialisation ########################################################################## class AnkiApp(QApplication): # Single instance support on Win32/Linux ################################################## KEY = "anki"+checksum(getpass.getuser()) TMOUT = 5000 def __init__(self, argv): QApplication.__init__(self, argv) self._argv = argv def secondInstance(self): # we accept only one command line argument. if it's missing, send # a blank screen to just raise the existing window opts, args = parseArgs(self._argv) buf = "raise" if args and args[0]: buf = os.path.abspath(args[0]) if self.sendMsg(buf): print "Already running; reusing existing instance." return True else: # send failed, so we're the first instance or the # previous instance died QLocalServer.removeServer(self.KEY) self._srv = QLocalServer(self) self.connect(self._srv, SIGNAL("newConnection()"), self.onRecv) self._srv.listen(self.KEY) return False def sendMsg(self, txt): sock = QLocalSocket(self) sock.connectToServer(self.KEY, QIODevice.WriteOnly) if not sock.waitForConnected(self.TMOUT): # first instance or previous instance dead return False sock.write(txt) if not sock.waitForBytesWritten(self.TMOUT): raise Exception("existing instance not emptying") sock.disconnectFromServer() return True def onRecv(self): sock = self._srv.nextPendingConnection() if not sock.waitForReadyRead(self.TMOUT): sys.stderr.write(sock.errorString()) return buf = sock.readAll() buf = unicode(buf, sys.getfilesystemencoding(), "ignore") self.emit(SIGNAL("appMsg"), buf) sock.disconnectFromServer() # OS X file/url handler ################################################## def event(self, evt): if evt.type() == QEvent.FileOpen: self.emit(SIGNAL("appMsg"), evt.file() or "raise") return True return QApplication.event(self, evt) def parseArgs(argv): "Returns (opts, args)." # py2app fails to strip this in some instances, then anki dies # as there's no such profile if isMac and len(argv) > 1 and argv[1].startswith("-psn"): argv = [argv[0]] parser = optparse.OptionParser(version="%prog " + appVersion) parser.usage = "%prog [OPTIONS] [file to import]" parser.add_option("-b", "--base", help="path to base folder") parser.add_option("-p", "--profile", help="profile name to load") parser.add_option("-l", "--lang", help="interface language (en, de, etc)") return parser.parse_args(argv[1:]) def run(): global mw # parse args opts, args = parseArgs(sys.argv) opts.base = unicode(opts.base or "", sys.getfilesystemencoding()) opts.profile = unicode(opts.profile or "", sys.getfilesystemencoding()) # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, 'frozen', None): rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) if isMac: QFont.insertSubstitution(".Lucida Grande UI", "Lucida Grande") # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # qt version must be up to date if qtmajor <= 4 and qtminor <= 6: QMessageBox.warning( None, "Error", "Your Qt version is known to be buggy. Until you " "upgrade to a newer Qt, you may experience issues such as images " "failing to show up during review.") # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_() if __name__ == "__main__": run() anki-2.0.20+dfsg/aqt/errors.py0000644000175000017500000000570212231415626015731 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import sys import cgi from anki.lang import _ from aqt.qt import * from aqt.utils import showText, showWarning class ErrorHandler(QObject): "Catch stderr and write into buffer." ivl = 100 def __init__(self, mw): QObject.__init__(self, mw) self.mw = mw self.timer = None self.connect(self, SIGNAL("errorTimer"), self._setTimer) self.pool = "" sys.stderr = self def write(self, data): # make sure we have unicode if not isinstance(data, unicode): data = unicode(data, "utf8", "replace") # dump to stdout sys.stdout.write(data.encode("utf-8")) # save in buffer self.pool += data # and update timer self.setTimer() def setTimer(self): # we can't create a timer from a different thread, so we post a # message to the object on the main thread self.emit(SIGNAL("errorTimer")) def _setTimer(self): if not self.timer: self.timer = QTimer(self.mw) self.mw.connect(self.timer, SIGNAL("timeout()"), self.onTimeout) self.timer.setInterval(self.ivl) self.timer.setSingleShot(True) self.timer.start() def tempFolderMsg(self): return _("""\ The permissions on your system's temporary folder are incorrect, and Anki is \ not able to correct them automatically. Please search for 'temp folder' in the \ Anki manual for more information.""") def onTimeout(self): error = cgi.escape(self.pool) self.pool = "" self.mw.progress.clear() if "abortSchemaMod" in error: return if "Pyaudio not" in error: return showWarning(_("Please install PyAudio")) if "install mplayer" in error: return showWarning(_("Please install mplayer")) if "no default output" in error: return showWarning(_("Please connect a microphone, and ensure " "other programs are not using the audio device.")) if "invalidTempFolder" in error: return showWarning(self.tempFolderMsg()) stdText = _("""\ An error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:""") pluginText = _("""\ An error occurred in an add-on.
Please post on the add-on forum:
%s
""") pluginText %= "https://groups.google.com/forum/#!forum/anki-addons" if "addon" in error: txt = pluginText else: txt = stdText # show dialog txt = txt + "

" + error + "
" showText(txt, type="html") anki-2.0.20+dfsg/aqt/webview.py0000644000175000017500000001114012221204444016047 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import sys from anki.hooks import runHook from aqt.qt import * from aqt.utils import openLink from anki.utils import isMac, isWin import anki.js # Bridge for Qt<->JS ########################################################################## class Bridge(QObject): @pyqtSlot(str, result=str) def run(self, str): return unicode(self._bridge(unicode(str))) @pyqtSlot(str) def link(self, str): self._linkHandler(unicode(str)) def setBridge(self, func): self._bridge = func def setLinkHandler(self, func): self._linkHandler = func # Page for debug messages ########################################################################## class AnkiWebPage(QWebPage): def __init__(self, jsErr): QWebPage.__init__(self) self._jsErr = jsErr def javaScriptConsoleMessage(self, msg, line, srcID): self._jsErr(msg, line, srcID) # Main web view ########################################################################## class AnkiWebView(QWebView): def __init__(self): QWebView.__init__(self) self.setRenderHints( QPainter.TextAntialiasing | QPainter.SmoothPixmapTransform | QPainter.HighQualityAntialiasing) self.setObjectName("mainText") self._bridge = Bridge() self._page = AnkiWebPage(self._jsErr) self._loadFinishedCB = None self.setPage(self._page) self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.setLinkHandler() self.setKeyHandler() self.connect(self, SIGNAL("linkClicked(QUrl)"), self._linkHandler) self.connect(self, SIGNAL("loadFinished(bool)"), self._loadFinished) self.allowDrops = False # reset each time new html is set; used to detect if still in same state self.key = None def keyPressEvent(self, evt): if evt.matches(QKeySequence.Copy): self.triggerPageAction(QWebPage.Copy) evt.accept() # work around a bug with windows qt where shift triggers buttons if isWin and evt.modifiers() & Qt.ShiftModifier and not evt.text(): evt.accept() return QWebView.keyPressEvent(self, evt) def keyReleaseEvent(self, evt): if self._keyHandler: if self._keyHandler(evt): evt.accept() return QWebView.keyReleaseEvent(self, evt) def contextMenuEvent(self, evt): # lazy: only run in reviewer import aqt if aqt.mw.state != "review": return m = QMenu(self) a = m.addAction(_("Copy")) a.connect(a, SIGNAL("triggered()"), lambda: self.triggerPageAction(QWebPage.Copy)) runHook("AnkiWebView.contextMenuEvent", self, m) m.popup(QCursor.pos()) def dropEvent(self, evt): pass def setLinkHandler(self, handler=None): if handler: self.linkHandler = handler else: self.linkHandler = self._openLinksExternally self._bridge.setLinkHandler(self.linkHandler) def setKeyHandler(self, handler=None): # handler should return true if event should be swallowed self._keyHandler = handler def setHtml(self, html, loadCB=None): self.key = None self._loadFinishedCB = loadCB QWebView.setHtml(self, html) def stdHtml(self, body, css="", bodyClass="", loadCB=None, js=None, head=""): if isMac: button = "font-weight: bold; height: 24px;" else: button = "font-weight: normal;" self.setHtml(""" %s %s""" % ( button, css, js or anki.js.jquery+anki.js.browserSel, head, bodyClass, body), loadCB) def setBridge(self, bridge): self._bridge.setBridge(bridge) def eval(self, js): self.page().mainFrame().evaluateJavaScript(js) def _openLinksExternally(self, url): openLink(url) def _jsErr(self, msg, line, srcID): sys.stdout.write( (_("JS error on line %(a)d: %(b)s") % dict(a=line, b=msg+"\n")).encode("utf8")) def _linkHandler(self, url): self.linkHandler(url.toString()) def _loadFinished(self): self.page().mainFrame().addToJavaScriptWindowObject("py", self._bridge) if self._loadFinishedCB: self._loadFinishedCB(self) self._loadFinishedCB = None anki-2.0.20+dfsg/aqt/deckbrowser.py0000644000175000017500000002717412221204444016727 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * from aqt.utils import askUser, getOnlyText, openLink, showWarning, shortcut, \ openHelp from anki.utils import isMac, ids2str, fmtTimeSpan import anki.js from anki.errors import DeckRenameError import aqt from anki.sound import clearAudioQueue class DeckBrowser(object): def __init__(self, mw): self.mw = mw self.web = mw.web self.bottom = aqt.toolbar.BottomBar(mw, mw.bottomWeb) def show(self): clearAudioQueue() self.web.setLinkHandler(self._linkHandler) self.web.setKeyHandler(None) self.mw.keyHandler = self._keyHandler self._renderPage() def refresh(self): self._renderPage() # Event handlers ########################################################################## def _linkHandler(self, url): if ":" in url: (cmd, arg) = url.split(":") else: cmd = url if cmd == "open": self._selDeck(arg) elif cmd == "opts": self._showOptions(arg) elif cmd == "shared": self._onShared() elif cmd == "import": self.mw.onImport() elif cmd == "lots": openHelp("using-decks-appropriately") elif cmd == "hidelots": self.mw.pm.profile['hideDeckLotsMsg'] = True self.refresh() elif cmd == "create": deck = getOnlyText(_("Name for deck:")) if deck: self.mw.col.decks.id(deck) self.refresh() elif cmd == "drag": draggedDeckDid, ontoDeckDid = arg.split(',') self._dragDeckOnto(draggedDeckDid, ontoDeckDid) elif cmd == "collapse": self._collapse(arg) def _keyHandler(self, evt): # currently does nothing key = unicode(evt.text()) def _selDeck(self, did): self.mw.col.decks.select(did) self.mw.onOverview() # HTML generation ########################################################################## _dragIndicatorBorderWidth = "1px" _css = """ a.deck { color: #000; text-decoration: none; min-width: 5em; display:inline-block; } a.deck:hover { text-decoration: underline; } tr.deck td { border-bottom: %(width)s solid #e7e7e7; } tr.top-level-drag-row td { border-bottom: %(width)s solid transparent; } td { white-space: nowrap; } tr.drag-hover td { border-bottom: %(width)s solid #aaa; } body { margin: 1em; -webkit-user-select: none; } .current { background-color: #e7e7e7; } .decktd { min-width: 15em; } .count { width: 6em; text-align: right; } .collapse { color: #000; text-decoration:none; display:inline-block; width: 1em; } .filtered { color: #00a !important; } """ % dict(width=_dragIndicatorBorderWidth) _body = """
%(tree)s

%(stats)s %(countwarn)s
""" def _renderPage(self, reuse=False): css = self.mw.sharedCSS + self._css if not reuse: self._dueTree = self.mw.col.sched.deckDueTree() tree = self._renderDeckTree(self._dueTree) stats = self._renderStats() op = self._oldPos() self.web.stdHtml(self._body%dict( tree=tree, stats=stats, countwarn=self._countWarn()), css=css, js=anki.js.jquery+anki.js.ui, loadCB=lambda ok:\ self.web.page().mainFrame().setScrollPosition(op)) self.web.key = "deckBrowser" self._drawButtons() def _oldPos(self): if self.web.key == "deckBrowser": return self.web.page().mainFrame().scrollPosition() else: return QPoint(0,0) def _renderStats(self): cards, thetime = self.mw.col.db.first(""" select count(), sum(time)/1000 from revlog where id > ?""", (self.mw.col.sched.dayCutoff-86400)*1000) cards = cards or 0 thetime = thetime or 0 msgp1 = ngettext("%d card", "%d cards", cards) % cards buf = _("Studied %(a)s in %(b)s today.") % dict(a=msgp1, b=fmtTimeSpan(thetime, unit=1)) return buf def _countWarn(self): if (self.mw.col.decks.count() < 25 or self.mw.pm.profile.get("hideDeckLotsMsg")): return "" return "
"+( _("You have a lot of decks. Please see %(a)s. %(b)s") % dict( a=("%s" % _("this page")), b=("
(%s)" % (_("hide"))+ "%s%s %s""" % ( _("Deck"), _("Due"), _("New")) buf += self._topLevelDragRow() else: buf = "" for node in nodes: buf += self._deckRow(node, depth, len(nodes)) if depth == 0: buf += self._topLevelDragRow() return buf def _deckRow(self, node, depth, cnt): name, did, due, lrn, new, children = node deck = self.mw.col.decks.get(did) if did == 1 and cnt > 1 and not children: # if the default deck is empty, hide it if not self.mw.col.db.scalar("select 1 from cards where did = 1"): return "" # parent toggled for collapsing for parent in self.mw.col.decks.parents(did): if parent['collapsed']: buff = "" return buff prefix = "-" if self.mw.col.decks.get(did)['collapsed']: prefix = "+" due += lrn def indent(): return " "*6*depth if did == self.mw.col.conf['curDeck']: klass = 'deck current' else: klass = 'deck' buf = "" % (klass, did) # deck link if children: collapse = "%s" % (did, prefix) else: collapse = "" if deck['dyn']: extraclass = "filtered" else: extraclass = "" buf += """ %s%s%s"""% ( indent(), collapse, extraclass, did, name) # due counts def nonzeroColour(cnt, colour): if not cnt: colour = "#e0e0e0" if cnt >= 1000: cnt = "1000+" return "%s" % (colour, cnt) buf += "%s%s" % ( nonzeroColour(due, "#007700"), nonzeroColour(new, "#000099")) # options buf += "%s" % self.mw.button( link="opts:%d"%did, name="▾") # children buf += self._renderDeckTree(children, depth+1) return buf def _topLevelDragRow(self): return " " def _dueImg(self, due, new): if due: i = "clock-icon" elif new: i = "plus-circle" else: i = "none" return '' % i # Options ########################################################################## def _showOptions(self, did): m = QMenu(self.mw) a = m.addAction(_("Rename")) a.connect(a, SIGNAL("triggered()"), lambda did=did: self._rename(did)) a = m.addAction(_("Options")) a.connect(a, SIGNAL("triggered()"), lambda did=did: self._options(did)) a = m.addAction(_("Delete")) a.connect(a, SIGNAL("triggered()"), lambda did=did: self._delete(did)) m.exec_(QCursor.pos()) def _rename(self, did): self.mw.checkpoint(_("Rename Deck")) deck = self.mw.col.decks.get(did) oldName = deck['name'] newName = getOnlyText(_("New deck name:"), default=oldName) newName = newName.replace('"', "") if not newName or newName == oldName: return try: self.mw.col.decks.rename(deck, newName) except DeckRenameError, e: return showWarning(e.description) self.show() def _options(self, did): # select the deck first, because the dyn deck conf assumes the deck # we're editing is the current one self.mw.col.decks.select(did) self.mw.onDeckConf() def _collapse(self, did): self.mw.col.decks.collapse(did) self._renderPage(reuse=True) def _dragDeckOnto(self, draggedDeckDid, ontoDeckDid): try: self.mw.col.decks.renameForDragAndDrop(draggedDeckDid, ontoDeckDid) except DeckRenameError, e: return showWarning(e.description) self.show() def _delete(self, did): if str(did) == '1': return showWarning(_("The default deck can't be deleted.")) self.mw.checkpoint(_("Delete Deck")) deck = self.mw.col.decks.get(did) if not deck['dyn']: dids = [did] + [r[1] for r in self.mw.col.decks.children(did)] cnt = self.mw.col.db.scalar( "select count() from cards where did in {0} or " "odid in {0}".format(ids2str(dids))) if cnt: extra = ngettext(" It has %d card.", " It has %d cards.", cnt) % cnt else: extra = None if deck['dyn'] or not extra or askUser( (_("Are you sure you wish to delete %s?") % deck['name']) + extra): self.mw.progress.start(immediate=True) self.mw.col.decks.rem(did, True) self.mw.progress.finish() self.show() # Top buttons ###################################################################### def _drawButtons(self): links = [ ["", "shared", _("Get Shared")], ["", "create", _("Create Deck")], ["Ctrl+I", "import", _("Import File")], ] buf = "" for b in links: if b[0]: b[0] = _("Shortcut key: %s") % shortcut(b[0]) buf += """ """ % tuple(b) self.bottom.draw(buf) if isMac: size = 28 else: size = 36 + self.mw.fontHeightDelta*3 self.bottom.web.setFixedHeight(size) self.bottom.web.setLinkHandler(self._linkHandler) def _onShared(self): openLink(aqt.appShared+"decks/") anki-2.0.20+dfsg/aqt/upgrade.py0000644000175000017500000002514612230634610016043 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import os, cPickle, ctypes, shutil from aqt.qt import * from anki.utils import isMac, isWin from anki import Collection from anki.importing import Anki1Importer from aqt.utils import showWarning import aqt class Upgrader(object): def __init__(self, mw): self.mw = mw def maybeUpgrade(self): p = self._oldConfigPath() # does an old config file exist? if not p or not os.path.exists(p): return # load old settings and copy over try: self._loadConf(p) except: showWarning(_("""\ Anki wasn't able to load your old config file. Please use File>Import \ to import your decks from previous Anki versions.""")) return if not self._copySettings(): return # and show the wizard self._showWizard() # Settings ###################################################################### def _oldConfigPath(self): if isWin: try: os.environ['HOME'] = os.environ['APPDATA'] except: # system with %APPDATA% not defined return None p = "~/.anki/config.db" elif isMac: p = "~/Library/Application Support/Anki/config.db" else: p = "~/.anki/config.db" return os.path.expanduser(p) def _loadConf(self, path): self.conf = cPickle.load(open(path)) def _copySettings(self): p = self.mw.pm.profile for k in ( "recentColours", "stripHTML", "editFontFamily", "editFontSize", "editLineSize", "deleteMedia", "preserveKeyboard", "numBackups", "proxyHost", "proxyPass", "proxyPort", "proxyUser"): try: p[k] = self.conf[k] except: showWarning(_("""\ Anki 2.0 only supports automatic upgrading from Anki 1.2. To load old \ decks, please open them in Anki 1.2 to upgrade them, and then import them \ into Anki 2.0.""")) return return True # Wizard ###################################################################### def _showWizard(self): if not self.conf['recentDeckPaths']: # if there are no decks to upgrade, don't show wizard return class Wizard(QWizard): def reject(self): pass self.wizard = w = Wizard() w.addPage(self._welcomePage()) w.addPage(self._decksPage()) w.addPage(self._mediaPage()) w.addPage(self._readyPage()) w.addPage(self._upgradePage()) w.addPage(self._finishedPage()) w.setWindowTitle(_("Upgrade Wizard")) w.setWizardStyle(QWizard.ModernStyle) w.setOptions(QWizard.NoCancelButton) w.exec_() def _labelPage(self, title, txt): p = QWizardPage() p.setTitle(title) l = QLabel(txt) l.setTextFormat(Qt.RichText) l.setTextInteractionFlags(Qt.TextSelectableByMouse) l.setWordWrap(True) v = QVBoxLayout() v.addWidget(l) p.setLayout(v) return p def _welcomePage(self): return self._labelPage(_("Welcome"), _("""\ This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. """)) def _decksPage(self): return self._labelPage(_("Your Decks"), _("""\ Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.""")) def _mediaPage(self): return self._labelPage(_("Sounds & Images"), _("""\ When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.""")) def _readyPage(self): class ReadyPage(QWizardPage): def initializePage(self): self.setTitle(_("Ready to Upgrade")) self.setCommitPage(True) l = QLabel(_("""\ When you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.""")) l.setTextFormat(Qt.RichText) l.setTextInteractionFlags(Qt.TextSelectableByMouse) l.setWordWrap(True) v = QVBoxLayout() v.addWidget(l) self.setLayout(v) return ReadyPage() def _upgradePage(self): decks = self.conf['recentDeckPaths'] colpath = self.mw.pm.collectionPath() upgrader = self class UpgradePage(QWizardPage): def isComplete(self): return False def initializePage(self): # can't use openLink; gui not ready for tooltips QDesktopServices.openUrl(QUrl(aqt.appChanges)) self.setCommitPage(True) self.setTitle(_("Upgrading")) self.label = l = QLabel() l.setTextInteractionFlags(Qt.TextSelectableByMouse) l.setWordWrap(True) v = QVBoxLayout() v.addWidget(l) prog = QProgressBar() prog.setMaximum(0) v.addWidget(prog) l2 = QLabel(_("Please be patient; this can take a while.")) l2.setTextInteractionFlags(Qt.TextSelectableByMouse) l2.setWordWrap(True) v.addWidget(l2) self.setLayout(v) # run the upgrade in a different thread self.thread = UpgradeThread(decks, colpath, upgrader.conf) self.thread.start() # and periodically update the GUI self.timer = QTimer(self) self.timer.connect(self.timer, SIGNAL("timeout()"), self.onTimer) self.timer.start(1000) self.onTimer() def onTimer(self): prog = self.thread.progress() if not prog: self.timer.stop() upgrader.log = self.thread.log upgrader.wizard.next() self.label.setText(prog) return UpgradePage() def _finishedPage(self): upgrader = self class FinishedPage(QWizardPage): def initializePage(self): buf = "" for file in upgrader.log: buf += "%s" % file[0] buf += "

  • " + "
  • ".join(file[1]) + "

" self.setTitle(_("Upgrade Complete")) l = QLabel(_("""\ The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

""") % buf) l.setTextFormat(Qt.RichText) l.setTextInteractionFlags(Qt.TextSelectableByMouse) l.setWordWrap(True) l.setMaximumWidth(400) a = QScrollArea() a.setWidget(l) v = QVBoxLayout() v.addWidget(a) self.setLayout(v) return FinishedPage() class UpgradeThread(QThread): def __init__(self, paths, colpath, oldprefs): QThread.__init__(self) self.paths = paths self.max = len(paths) self.current = 1 self.finished = False self.colpath = colpath self.oldprefs = oldprefs self.name = "" self.log = [] def run(self): # open profile deck self.col = Collection(self.colpath) # loop through paths while True: path = self.paths.pop() self.name = os.path.basename(path) self.upgrade(path) # abort if finished if not self.paths: break self.current += 1 self.col.close() self.finished = True def progress(self): if self.finished: return return _("Upgrading deck %(a)s of %(b)s...\n%(c)s") % \ dict(a=self.current, b=self.max, c=self.name) def upgrade(self, path): log = self._upgrade(path) self.log.append((self.name, log)) def _upgrade(self, path): if not os.path.exists(path): return [_("File was missing.")] imp = Anki1Importer(self.col, path) # try to copy over dropbox media first try: self.maybeCopyFromCustomFolder(path) except Exception, e: imp.log.append(repr(str(e))) # then run the import try: imp.run() except Exception, e: if repr(str(e)) == "invalidFile": # already logged pass else: imp.log.append(repr(str(e))) self.col.save() return imp.log def maybeCopyFromCustomFolder(self, path): folder = os.path.basename(path).replace(".anki", ".media") loc = self.oldprefs.get("mediaLocation") if not loc: # no prefix; user had media next to deck return elif loc == "dropbox": # dropbox no longer exports the folder location; try default if isWin: dll = ctypes.windll.shell32 buf = ctypes.create_string_buffer(300) dll.SHGetSpecialFolderPathA(None, buf, 0x0005, False) loc = os.path.join(buf.value, 'Dropbox') else: loc = os.path.expanduser("~/Dropbox") loc = os.path.join(loc, "Public", "Anki") # no media folder in custom location? mfolder = os.path.join(loc, folder) if not os.path.exists(mfolder): return # folder exists; copy data next to the deck. leave a copy in the # custom location so users can revert easily. mdir = self.col.media.dir() for f in os.listdir(mfolder): src = os.path.join(mfolder, f) dst = os.path.join(mdir, f) if not os.path.exists(dst): shutil.copyfile(src, dst) anki-2.0.20+dfsg/aqt/profiles.py0000644000175000017500000002215112245063615016237 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # Profile handling ########################################################################## # - Saves in pickles rather than json to easily store Qt window state. # - Saves in sqlite rather than a flat file so the config can't be corrupted import os import random import cPickle import locale import re from aqt.qt import * from anki.db import DB from anki.utils import isMac, isWin, intTime, checksum from anki.lang import langs from aqt.utils import showWarning from aqt import appHelpSite import aqt.forms from send2trash import send2trash metaConf = dict( ver=0, updates=True, created=intTime(), id=random.randrange(0, 2**63), lastMsg=-1, suppressUpdate=False, firstRun=True, defaultLang=None, disabledAddons=[], ) profileConf = dict( # profile key=None, mainWindowGeom=None, mainWindowState=None, numBackups=30, lastOptimize=intTime(), # editing fullSearch=False, searchHistory=[], lastColour="#00f", stripHTML=True, pastePNG=False, # not exposed in gui deleteMedia=False, preserveKeyboard=True, # syncing syncKey=None, syncMedia=True, autoSync=True, # importing allowHTML=False, importMode=1, ) class ProfileManager(object): def __init__(self, base=None, profile=None): self.name = None # instantiate base folder if base: self.base = os.path.abspath(base) else: self.base = self._defaultBase() self.ensureBaseExists() # load metadata self.firstRun = self._loadMeta() # did the user request a profile to start up with? if profile: try: self.load(profile) except TypeError: raise Exception("Provided profile does not exist.") # Base creation ###################################################################### def ensureBaseExists(self): try: self._ensureExists(self.base) except: # can't translate, as lang not initialized QMessageBox.critical( None, "Error", """\ Anki can't write to the harddisk. Please see the \ documentation for information on using a flash drive.""") raise # Profile load/save ###################################################################### def profiles(self): return sorted( unicode(x, "utf8") for x in self.db.list("select name from profiles") if x != "_global") def load(self, name, passwd=None): prof = cPickle.loads( self.db.scalar("select data from profiles where name = ?", name.encode("utf8"))) if prof['key'] and prof['key'] != self._pwhash(passwd): self.name = None return False if name != "_global": self.name = name self.profile = prof return True def save(self): sql = "update profiles set data = ? where name = ?" self.db.execute(sql, cPickle.dumps(self.profile), self.name.encode("utf8")) self.db.execute(sql, cPickle.dumps(self.meta), "_global") self.db.commit() def create(self, name): prof = profileConf.copy() self.db.execute("insert into profiles values (?, ?)", name.encode("utf8"), cPickle.dumps(prof)) self.db.commit() def remove(self, name): p = self.profileFolder() if os.path.exists(p): send2trash(p) self.db.execute("delete from profiles where name = ?", name.encode("utf8")) self.db.commit() def rename(self, name): oldName = self.name oldFolder = self.profileFolder() self.name = name newFolder = self.profileFolder(create=False) if os.path.exists(newFolder): showWarning(_("Folder already exists.")) self.name = oldName return # update name self.db.execute("update profiles set name = ? where name = ?", name.encode("utf8"), oldName.encode("utf-8")) # rename folder os.rename(oldFolder, newFolder) self.db.commit() # Folder handling ###################################################################### def profileFolder(self, create=True): path = os.path.join(self.base, self.name) if create: self._ensureExists(path) return path def addonFolder(self): return self._ensureExists(os.path.join(self.base, "addons")) def backupFolder(self): return self._ensureExists( os.path.join(self.profileFolder(), "backups")) def collectionPath(self): return os.path.join(self.profileFolder(), "collection.anki2") # Helpers ###################################################################### def _ensureExists(self, path): if not os.path.exists(path): os.makedirs(path) return path def _defaultBase(self): if isWin: if qtmajor >= 5: loc = QStandardPaths.writeableLocation(QStandardPaths.DocumentsLocation) else: loc = QDesktopServices.storageLocation(QDesktopServices.DocumentsLocation) return os.path.join(loc, "Anki") elif isMac: return os.path.expanduser("~/Documents/Anki") else: return os.path.expanduser("~/Anki") def _loadMeta(self): path = os.path.join(self.base, "prefs.db") new = not os.path.exists(path) def recover(): # if we can't load profile, start with a new one os.rename(path, path+".broken") QMessageBox.warning( None, "Preferences Corrupt", """\ Anki's prefs.db file was corrupt and has been recreated. If you were using multiple \ profiles, please add them back using the same names to recover your cards.""") try: self.db = DB(path, text=str) self.db.execute(""" create table if not exists profiles (name text primary key, data text not null);""") except: recover() return self._loadMeta() if not new: # load previously created try: self.meta = cPickle.loads( self.db.scalar( "select data from profiles where name = '_global'")) return except: recover() return self._loadMeta() # create a default global profile self.meta = metaConf.copy() self.db.execute("insert or replace into profiles values ('_global', ?)", cPickle.dumps(metaConf)) self._setDefaultLang() return True def ensureProfile(self): "Create a new profile if none exists." if self.firstRun: self.create(_("User 1")) p = os.path.join(self.base, "README.txt") open(p, "w").write((_("""\ This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s """) % (appHelpSite + "#startupopts")).encode("utf8")) def _pwhash(self, passwd): return checksum(unicode(self.meta['id'])+unicode(passwd)) # Default language ###################################################################### # On first run, allow the user to choose the default language def _setDefaultLang(self): # the dialog expects _ to be defined, but we're running before # setupLang() has been called. so we create a dummy op for now import __builtin__ __builtin__.__dict__['_'] = lambda x: x # create dialog class NoCloseDiag(QDialog): def reject(self): pass d = self.langDiag = NoCloseDiag() f = self.langForm = aqt.forms.setlang.Ui_Dialog() f.setupUi(d) d.connect(d, SIGNAL("accepted()"), self._onLangSelected) d.connect(d, SIGNAL("rejected()"), lambda: True) # default to the system language try: (lang, enc) = locale.getdefaultlocale() except: # fails on osx lang = "en" if lang and lang not in ("pt_BR", "zh_CN", "zh_TW"): lang = re.sub("(.*)_.*", "\\1", lang) # find index idx = None en = None for c, (name, code) in enumerate(langs): if code == "en": en = c if code == lang: idx = c # if the system language isn't available, revert to english if idx is None: idx = en # update list f.lang.addItems([x[0] for x in langs]) f.lang.setCurrentRow(idx) d.exec_() def _onLangSelected(self): f = self.langForm code = langs[f.lang.currentRow()][1] self.meta['defaultLang'] = code sql = "update profiles set data = ? where name = ?" self.db.execute(sql, cPickle.dumps(self.meta), "_global") self.db.commit() anki-2.0.20+dfsg/aqt/taglimit.py0000644000175000017500000000666212043003167016227 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html import aqt from aqt.qt import * from aqt.utils import saveGeom, restoreGeom class TagLimit(QDialog): def __init__(self, mw, parent): QDialog.__init__(self, parent, Qt.Window) self.mw = mw self.parent = parent self.deck = self.parent.deck self.dialog = aqt.forms.taglimit.Ui_Dialog() self.dialog.setupUi(self) self.rebuildTagList() restoreGeom(self, "tagLimit") self.exec_() def rebuildTagList(self): usertags = self.mw.col.tags.all() yes = self.deck.get("activeTags", []) no = self.deck.get("inactiveTags", []) yesHash = {} noHash = {} for y in yes: yesHash[y] = True for n in no: noHash[n] = True groupedTags = [] usertags.sort() icon = QIcon(":/icons/Anki_Fact.png") groupedTags.append([icon, usertags]) self.tags = [] for (icon, tags) in groupedTags: for t in tags: self.tags.append(t) item = QListWidgetItem(icon, t.replace("_", " ")) self.dialog.activeList.addItem(item) if t in yesHash: mode = QItemSelectionModel.Select self.dialog.activeCheck.setChecked(True) else: mode = QItemSelectionModel.Deselect idx = self.dialog.activeList.indexFromItem(item) self.dialog.activeList.selectionModel().select(idx, mode) # inactive item = QListWidgetItem(icon, t.replace("_", " ")) self.dialog.inactiveList.addItem(item) if t in noHash: mode = QItemSelectionModel.Select else: mode = QItemSelectionModel.Deselect idx = self.dialog.inactiveList.indexFromItem(item) self.dialog.inactiveList.selectionModel().select(idx, mode) def reject(self): self.tags = "" QDialog.reject(self) def accept(self): self.hide() n = 0 # gather yes/no tags yes = [] no = [] for c in range(self.dialog.activeList.count()): # active if self.dialog.activeCheck.isChecked(): item = self.dialog.activeList.item(c) idx = self.dialog.activeList.indexFromItem(item) if self.dialog.activeList.selectionModel().isSelected(idx): yes.append(self.tags[c]) # inactive item = self.dialog.inactiveList.item(c) idx = self.dialog.inactiveList.indexFromItem(item) if self.dialog.inactiveList.selectionModel().isSelected(idx): no.append(self.tags[c]) # save in the deck for future invocations self.deck['activeTags'] = yes self.deck['inactiveTags'] = no self.mw.col.decks.save(self.deck) # build query string self.tags = "" if yes: arr = [] for req in yes: arr.append("tag:'%s'" % req) self.tags += "(" + " or ".join(arr) + ")" if no: arr = [] for req in no: arr.append("-tag:'%s'" % req) self.tags += " " + " ".join(arr) saveGeom(self, "tagLimit") QDialog.accept(self) anki-2.0.20+dfsg/aqt/toolbar.py0000644000175000017500000001035712221204444016052 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * class Toolbar(object): def __init__(self, mw, web): self.mw = mw self.web = web self.web.page().mainFrame().setScrollBarPolicy( Qt.Vertical, Qt.ScrollBarAlwaysOff) self.web.setLinkHandler(self._linkHandler) self.link_handlers = { "decks": self._deckLinkHandler, "study": self._studyLinkHandler, "add": self._addLinkHandler, "browse": self._browseLinkHandler, "stats": self._statsLinkHandler, "sync": self._syncLinkHandler, } def draw(self): self.web.stdHtml(self._body % ( # may want a context menu here in the future ' '*20, self._centerLinks(), self._rightIcons()), self._css) # Available links ###################################################################### def _rightIconsList(self): return [ ["stats", "qrc:/icons/view-statistics.png", _("Show statistics. Shortcut key: %s") % "Shift+S"], ["sync", "qrc:/icons/view-refresh.png", _("Synchronize with AnkiWeb. Shortcut key: %s") % "Y"], ] def _centerLinks(self): links = [ ["decks", _("Decks"), _("Shortcut key: %s") % "D"], ["add", _("Add"), _("Shortcut key: %s") % "A"], ["browse", _("Browse"), _("Shortcut key: %s") % "B"], ] return self._linkHTML(links) def _linkHTML(self, links): buf = "" for ln, name, title in links: buf += '%s' % ( title, ln, name) buf += " "*3 return buf def _rightIcons(self): buf = "" for ln, icon, title in self._rightIconsList(): buf += '' % ( title, ln, icon) return buf # Link handling ###################################################################### def _linkHandler(self, link): # first set focus back to main window, or we're left with an ugly # focus ring around the clicked item self.mw.web.setFocus() if link in self.link_handlers: self.link_handlers[link]() def _deckLinkHandler(self): self.mw.moveToState("deckBrowser") def _studyLinkHandler(self): # if overview already shown, switch to review if self.mw.state == "overview": self.mw.col.startTimebox() self.mw.moveToState("review") else: self.mw.onOverview() def _addLinkHandler(self): self.mw.onAddCard() def _browseLinkHandler(self): self.mw.onBrowse() def _statsLinkHandler(self): self.mw.onStats() def _syncLinkHandler(self): self.mw.onSync() # HTML & CSS ###################################################################### _body = """ """ _css = """ #header { margin:0; margin-top: 4px; font-weight: bold; } html { height: 100%; background: -webkit-gradient(linear, left top, left bottom, from(#ddd), to(#fff)); margin:0; padding:0; } body { margin:0; padding:0; position:absolute; top:0;left:0;right:0;bottom:0; -webkit-user-select: none; border-bottom: 1px solid #aaa; } * { -webkit-user-drag: none; } .hitem { padding-right: 6px; text-decoration: none; color: #000; } .hitem:hover { text-decoration: underline; } """ class BottomBar(Toolbar): _css = Toolbar._css + """ #header { background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#ddd)); border-bottom: 0; border-top: 1px solid #aaa; margin-bottom: 6px; margin-top: 0; } """ _centerBody = """

""" def draw(self, buf): self.web.show() self.web.stdHtml( self._centerBody % buf, self._css) anki-2.0.20+dfsg/aqt/exporting.py0000644000175000017500000001016712221204444016426 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import os import re from aqt.qt import * import aqt from aqt.utils import getSaveFile, tooltip, showWarning, askUser, \ checkInvalidFilename from anki.exporting import exporters class ExportDialog(QDialog): def __init__(self, mw): QDialog.__init__(self, mw, Qt.Window) self.mw = mw self.col = mw.col self.frm = aqt.forms.exporting.Ui_ExportDialog() self.frm.setupUi(self) self.exporter = None self.setup() self.exec_() def setup(self): self.frm.format.insertItems(0, list(zip(*exporters())[0])) self.connect(self.frm.format, SIGNAL("activated(int)"), self.exporterChanged) self.exporterChanged(0) self.decks = [_("All Decks")] + sorted(self.col.decks.allNames()) self.frm.deck.addItems(self.decks) # save button b = QPushButton(_("Export...")) self.frm.buttonBox.addButton(b, QDialogButtonBox.AcceptRole) def exporterChanged(self, idx): self.exporter = exporters()[idx][1](self.col) self.isApkg = hasattr(self.exporter, "includeSched") self.hideTags = hasattr(self.exporter, "hideTags") self.frm.includeSched.setVisible(self.isApkg) self.frm.includeMedia.setVisible(self.isApkg) self.frm.includeTags.setVisible( not self.isApkg and not self.hideTags) def accept(self): self.exporter.includeSched = ( self.frm.includeSched.isChecked()) self.exporter.includeMedia = ( self.frm.includeMedia.isChecked()) self.exporter.includeTags = ( self.frm.includeTags.isChecked()) if not self.frm.deck.currentIndex(): self.exporter.did = None else: name = self.decks[self.frm.deck.currentIndex()] self.exporter.did = self.col.decks.id(name) if (self.isApkg and self.exporter.includeSched and not self.exporter.did): verbatim = True # it's a verbatim apkg export, so place on desktop instead of # choosing file file = os.path.join(QDesktopServices.storageLocation( QDesktopServices.DesktopLocation), "collection.apkg") if os.path.exists(file): if not askUser( _("%s already exists on your desktop. Overwrite it?")% "collection.apkg"): return else: verbatim = False # Get deck name and remove invalid filename characters deck_name = self.decks[self.frm.deck.currentIndex()] deck_name = re.sub('[\\\\/?<>:*|"^]', '_', deck_name) filename = os.path.join(aqt.mw.pm.base, u'{0}{1}'.format(deck_name, self.exporter.ext)) while 1: file = getSaveFile(self, _("Export"), "export", self.exporter.key, self.exporter.ext, fname=filename) if not file: return if checkInvalidFilename(os.path.basename(file), dirsep=False): continue break self.hide() if file: self.mw.progress.start(immediate=True) try: f = open(file, "wb") f.close() except (OSError, IOError), e: showWarning(_("Couldn't save file: %s") % unicode(e)) else: os.unlink(file) self.exporter.exportInto(file) if verbatim: msg = _("A file called collection.apkg was saved on your desktop.") period = 5000 else: period = 3000 msg = ngettext("%d card exported.", "%d cards exported.", \ self.exporter.count) % self.exporter.count tooltip(msg, period=period) finally: self.mw.progress.finish() QDialog.accept(self) anki-2.0.20+dfsg/aqt/fields.py0000644000175000017500000001307212065175361015666 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * from anki.consts import * import aqt from aqt.utils import showWarning, openHelp, getOnlyText, askUser class FieldDialog(QDialog): def __init__(self, mw, note, ord=0, parent=None): QDialog.__init__(self, parent or mw) #, Qt.Window) self.mw = aqt.mw self.parent = parent or mw self.note = note self.col = self.mw.col self.mm = self.mw.col.models self.model = note.model() self.mw.checkpoint(_("Fields")) self.form = aqt.forms.fields.Ui_Dialog() self.form.setupUi(self) self.setWindowTitle(_("Fields for %s") % self.model['name']) self.form.buttonBox.button(QDialogButtonBox.Help).setAutoDefault(False) self.form.buttonBox.button(QDialogButtonBox.Close).setAutoDefault(False) self.currentIdx = None self.oldSortField = self.model['sortf'] self.fillFields() self.setupSignals() self.form.fieldList.setCurrentRow(0) self.exec_() ########################################################################## def fillFields(self): self.currentIdx = None self.form.fieldList.clear() for f in self.model['flds']: self.form.fieldList.addItem(f['name']) def setupSignals(self): c = self.connect s = SIGNAL f = self.form c(f.fieldList, s("currentRowChanged(int)"), self.onRowChange) c(f.fieldAdd, s("clicked()"), self.onAdd) c(f.fieldDelete, s("clicked()"), self.onDelete) c(f.fieldRename, s("clicked()"), self.onRename) c(f.fieldPosition, s("clicked()"), self.onPosition) c(f.sortField, s("clicked()"), self.onSortField) c(f.buttonBox, s("helpRequested()"), self.onHelp) def onRowChange(self, idx): if idx == -1: return self.saveField() self.loadField(idx) def _uniqueName(self, prompt, ignoreOrd=None, old=""): txt = getOnlyText(prompt, default=old) if not txt: return for f in self.model['flds']: if ignoreOrd is not None and f['ord'] == ignoreOrd: continue if f['name'] == txt: showWarning(_("That field name is already used.")) return return txt def onRename(self): idx = self.currentIdx f = self.model['flds'][idx] name = self._uniqueName(_("New name:"), self.currentIdx, f['name']) if not name: return self.mm.renameField(self.model, f, name) self.saveField() self.fillFields() self.form.fieldList.setCurrentRow(idx) def onAdd(self): name = self._uniqueName(_("Field name:")) if not name: return self.saveField() self.mw.progress.start() f = self.mm.newField(name) self.mm.addField(self.model, f) self.mw.progress.finish() self.fillFields() self.form.fieldList.setCurrentRow(len(self.model['flds'])-1) def onDelete(self): if len(self.model['flds']) < 2: return showWarning(_("Notes require at least one field.")) c = self.mm.useCount(self.model) c = ngettext("%d note", "%d notes", c) % c if not askUser(_("Delete field from %s?") % c): return f = self.model['flds'][self.form.fieldList.currentRow()] self.mw.progress.start() self.mm.remField(self.model, f) self.mw.progress.finish() self.fillFields() self.form.fieldList.setCurrentRow(0) def onPosition(self, delta=-1): idx = self.currentIdx l = len(self.model['flds']) txt = getOnlyText(_("New position (1...%d):") % l, default=str(idx+1)) if not txt: return try: pos = int(txt) except ValueError: return if not 0 < pos <= l: return self.saveField() f = self.model['flds'][self.currentIdx] self.mw.progress.start() self.mm.moveField(self.model, f, pos-1) self.mw.progress.finish() self.fillFields() self.form.fieldList.setCurrentRow(pos-1) def onSortField(self): # don't allow user to disable; it makes no sense self.form.sortField.setChecked(True) self.model['sortf'] = self.form.fieldList.currentRow() def loadField(self, idx): self.currentIdx = idx fld = self.model['flds'][idx] f = self.form f.fontFamily.setCurrentFont(QFont(fld['font'])) f.fontSize.setValue(fld['size']) f.sticky.setChecked(fld['sticky']) f.sortField.setChecked(self.model['sortf'] == fld['ord']) f.rtl.setChecked(fld['rtl']) def saveField(self): # not initialized yet? if self.currentIdx is None: return idx = self.currentIdx fld = self.model['flds'][idx] f = self.form fld['font'] = f.fontFamily.currentFont().family() fld['size'] = f.fontSize.value() fld['sticky'] = f.sticky.isChecked() fld['rtl'] = f.rtl.isChecked() def reject(self): self.saveField() if self.oldSortField != self.model['sortf']: self.mw.progress.start() self.mw.col.updateFieldCache(self.mm.nids(self.model)) self.mw.progress.finish() self.mm.save(self.model) self.mw.reset() QDialog.reject(self) def accept(self): self.reject() def onHelp(self): openHelp("fields") anki-2.0.20+dfsg/aqt/browser.py0000644000175000017500000017100712247137300016077 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import sre_constants import cgi import time import re from operator import itemgetter from anki.lang import ngettext from aqt.qt import * import anki import aqt.forms from anki.utils import fmtTimeSpan, ids2str, stripHTMLMedia, isWin, intTime, isMac from aqt.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter, \ saveHeader, restoreHeader, saveState, restoreState, applyStyles, getTag, \ showInfo, askUser, tooltip, openHelp, showWarning, shortcut, getBase, mungeQA from anki.hooks import runHook, addHook, remHook from aqt.webview import AnkiWebView from aqt.toolbar import Toolbar from anki.consts import * from anki.sound import playFromText, clearAudioQueue COLOUR_SUSPENDED = "#FFFFB2" COLOUR_MARKED = "#D9B2E9" # fixme: need to refresh after undo # Data model ########################################################################## class DataModel(QAbstractTableModel): def __init__(self, browser): QAbstractTableModel.__init__(self) self.browser = browser self.col = browser.col self.sortKey = None self.activeCols = self.col.conf.get( "activeCols", ["noteFld", "template", "cardDue", "deck"]) self.cards = [] self.cardObjs = {} def getCard(self, index): id = self.cards[index.row()] if not id in self.cardObjs: self.cardObjs[id] = self.col.getCard(id) return self.cardObjs[id] def refreshNote(self, note): refresh = False for c in note.cards(): if c.id in self.cardObjs: del self.cardObjs[c.id] refresh = True if refresh: self.emit(SIGNAL("layoutChanged()")) # Model interface ###################################################################### def rowCount(self, index): return len(self.cards) def columnCount(self, index): return len(self.activeCols) def data(self, index, role): if not index.isValid(): return if role == Qt.FontRole: if self.activeCols[index.column()] not in ( "question", "answer", "noteFld"): return f = QFont() row = index.row() c = self.getCard(index) t = c.template() f.setFamily(t.get("bfont", self.browser.mw.fontFamily)) f.setPixelSize(t.get("bsize", self.browser.mw.fontHeight)) return f elif role == Qt.TextAlignmentRole: align = Qt.AlignVCenter if self.activeCols[index.column()] not in ("question", "answer", "template", "deck", "noteFld", "note"): align |= Qt.AlignHCenter return align elif role == Qt.DisplayRole or role == Qt.EditRole: return self.columnData(index) else: return def headerData(self, section, orientation, role): if orientation == Qt.Vertical: return elif role == Qt.DisplayRole and section < len(self.activeCols): type = self.columnType(section) for stype, name in self.browser.columns: if type == stype: txt = name break return txt else: return def flags(self, index): return Qt.ItemFlag(Qt.ItemIsEnabled | Qt.ItemIsSelectable) # Filtering ###################################################################### def search(self, txt, reset=True): if reset: self.beginReset() t = time.time() # the db progress handler may cause a refresh, so we need to zero out # old data first self.cards = [] self.cards = self.col.findCards(txt, order=True) #self.browser.mw.pm.profile['fullSearch']) #print "fetch cards in %dms" % ((time.time() - t)*1000) if reset: self.endReset() def reset(self): self.beginReset() self.endReset() def beginReset(self): self.browser.editor.saveNow() self.browser.editor.setNote(None, hide=False) self.browser.mw.progress.start() self.saveSelection() self.beginResetModel() self.cardObjs = {} def endReset(self): t = time.time() self.endResetModel() self.restoreSelection() self.browser.mw.progress.finish() def reverse(self): self.beginReset() self.cards.reverse() self.endReset() def saveSelection(self): cards = self.browser.selectedCards() self.selectedCards = dict([(id, True) for id in cards]) if getattr(self.browser, 'card', None): self.focusedCard = self.browser.card.id else: self.focusedCard = None def restoreSelection(self): if not self.cards: return sm = self.browser.form.tableView.selectionModel() sm.clear() # restore selection items = QItemSelection() count = 0 firstIdx = None focusedIdx = None for row, id in enumerate(self.cards): # if the id matches the focused card, note the index if self.focusedCard == id: focusedIdx = self.index(row, 0) items.select(focusedIdx, focusedIdx) self.focusedCard = None # if the card was previously selected, select again if id in self.selectedCards: count += 1 idx = self.index(row, 0) items.select(idx, idx) # note down the first card of the selection, in case we don't # have a focused card if not firstIdx: firstIdx = idx # focus previously focused or first in selection idx = focusedIdx or firstIdx tv = self.browser.form.tableView if idx: tv.selectRow(idx.row()) tv.scrollTo(idx, tv.PositionAtCenter) if count < 500: # discard large selections; they're too slow sm.select(items, QItemSelectionModel.SelectCurrent | QItemSelectionModel.Rows) else: tv.selectRow(0) # Column data ###################################################################### def columnType(self, column): return self.activeCols[column] def columnData(self, index): row = index.row() col = index.column() type = self.columnType(col) c = self.getCard(index) if type == "question": return self.question(c) elif type == "answer": return self.answer(c) elif type == "noteFld": f = c.note() return self.formatQA(f.fields[self.col.models.sortIdx(f.model())]) elif type == "template": t = c.template()['name'] if c.model()['type'] == MODEL_CLOZE: t += " %d" % (c.ord+1) return t elif type == "cardDue": # catch invalid dates try: t = self.nextDue(c, index) except: t = "" if c.queue < 0: t = "(" + t + ")" return t elif type == "noteCrt": return time.strftime("%Y-%m-%d", time.localtime(c.note().id/1000)) elif type == "noteMod": return time.strftime("%Y-%m-%d", time.localtime(c.note().mod)) elif type == "cardMod": return time.strftime("%Y-%m-%d", time.localtime(c.mod)) elif type == "cardReps": return str(c.reps) elif type == "cardLapses": return str(c.lapses) elif type == "noteTags": return " ".join(c.note().tags) elif type == "note": return c.model()['name'] elif type == "cardIvl": if c.type == 0: return _("(new)") elif c.type == 1: return _("(learning)") return fmtTimeSpan(c.ivl*86400) elif type == "cardEase": if c.type == 0: return _("(new)") return "%d%%" % (c.factor/10) elif type == "deck": if c.odid: # in a cram deck return "%s (%s)" % ( self.browser.mw.col.decks.name(c.did), self.browser.mw.col.decks.name(c.odid)) # normal deck return self.browser.mw.col.decks.name(c.did) def question(self, c): return self.formatQA(c.q(browser=True)) def answer(self, c): if c.template().get('bafmt'): # they have provided a template, use it verbatim c.q(browser=True) return self.formatQA(c.a()) # need to strip question from answer q = self.question(c) a = self.formatQA(c.a()) if a.startswith(q): return a[len(q):].strip() return a def formatQA(self, txt): s = txt.replace("
", u" ") s = s.replace("
", u" ") s = s.replace("
", u" ") s = s.replace("\n", u" ") s = re.sub("\[sound:[^]]+\]", "", s) s = re.sub("\[\[type:[^]]+\]\]", "", s) s = stripHTMLMedia(s) s = s.strip() return s def nextDue(self, c, index): if c.odid: return _("(filtered)") elif c.queue == 1: date = c.due elif c.queue == 0 or c.type == 0: return str(c.due) elif c.queue in (2,3) or (c.type == 2 and c.queue < 0): date = time.time() + ((c.due - self.col.sched.today)*86400) else: return "" return time.strftime("%Y-%m-%d", time.localtime(date)) # Line painter ###################################################################### class StatusDelegate(QItemDelegate): def __init__(self, browser, model): QItemDelegate.__init__(self, browser) self.browser = browser self.model = model def paint(self, painter, option, index): self.browser.mw.progress.blockUpdates = True try: c = self.model.getCard(index) except: # in the the middle of a reset; return nothing so this row is not # rendered until we have a chance to reset the model return finally: self.browser.mw.progress.blockUpdates = True col = None if c.note().hasTag("Marked"): col = COLOUR_MARKED elif c.queue == -1: col = COLOUR_SUSPENDED if col: brush = QBrush(QColor(col)) painter.save() painter.fillRect(option.rect, brush) painter.restore() return QItemDelegate.paint(self, painter, option, index) # Browser window ###################################################################### # fixme: respond to reset+edit hooks class Browser(QMainWindow): def __init__(self, mw): QMainWindow.__init__(self, None, Qt.Window) applyStyles(self) self.mw = mw self.col = self.mw.col self.lastFilter = "" self._previewWindow = None self.form = aqt.forms.browser.Ui_Dialog() self.form.setupUi(self) restoreGeom(self, "editor", 0) restoreState(self, "editor") restoreSplitter(self.form.splitter_2, "editor2") restoreSplitter(self.form.splitter, "editor3") self.form.splitter_2.setChildrenCollapsible(False) self.form.splitter.setChildrenCollapsible(False) self.card = None self.setupToolbar() self.setupColumns() self.setupTable() self.setupMenus() self.setupSearch() self.setupTree() self.setupHeaders() self.setupHooks() self.setupEditor() self.updateFont() self.onUndoState(self.mw.form.actionUndo.isEnabled()) self.form.searchEdit.setFocus() self.form.searchEdit.lineEdit().setText("is:current") self.form.searchEdit.lineEdit().selectAll() self.onSearch() self.show() def setupToolbar(self): self.toolbarWeb = AnkiWebView() self.toolbarWeb.setFixedHeight(32 + self.mw.fontHeightDelta) self.toolbar = BrowserToolbar(self.mw, self.toolbarWeb, self) self.form.verticalLayout_3.insertWidget(0, self.toolbarWeb) self.toolbar.draw() def setupMenus(self): # actions c = self.connect; f = self.form; s = SIGNAL("triggered()") if not isMac: f.actionClose.setVisible(False) c(f.actionReposition, s, self.reposition) c(f.actionReschedule, s, self.reschedule) c(f.actionCram, s, self.cram) c(f.actionChangeModel, s, self.onChangeModel) # edit c(f.actionUndo, s, self.mw.onUndo) c(f.previewButton, SIGNAL("clicked()"), self.onTogglePreview) f.previewButton.setToolTip(_("Preview Selected Card (%s)") % shortcut(_("Ctrl+Shift+P"))) c(f.actionInvertSelection, s, self.invertSelection) c(f.actionSelectNotes, s, self.selectNotes) c(f.actionFindReplace, s, self.onFindReplace) c(f.actionFindDuplicates, s, self.onFindDupes) # jumps c(f.actionPreviousCard, s, self.onPreviousCard) c(f.actionNextCard, s, self.onNextCard) c(f.actionFirstCard, s, self.onFirstCard) c(f.actionLastCard, s, self.onLastCard) c(f.actionFind, s, self.onFind) c(f.actionNote, s, self.onNote) c(f.actionTags, s, self.onTags) c(f.actionCardList, s, self.onCardList) # help c(f.actionGuide, s, self.onHelp) # keyboard shortcut for shift+home/end self.pgUpCut = QShortcut(QKeySequence("Shift+Home"), self) c(self.pgUpCut, SIGNAL("activated()"), self.onFirstCard) self.pgDownCut = QShortcut(QKeySequence("Shift+End"), self) c(self.pgDownCut, SIGNAL("activated()"), self.onLastCard) # card info self.infoCut = QShortcut(QKeySequence("Ctrl+Shift+I"), self) c(self.infoCut, SIGNAL("activated()"), self.showCardInfo) # set deck self.changeDeckCut = QShortcut(QKeySequence("Ctrl+D"), self) c(self.changeDeckCut, SIGNAL("activated()"), self.setDeck) # add/remove tags self.tagCut1 = QShortcut(QKeySequence("Ctrl+Shift+T"), self) c(self.tagCut1, SIGNAL("activated()"), self.addTags) self.tagCut2 = QShortcut(QKeySequence("Ctrl+Alt+T"), self) c(self.tagCut2, SIGNAL("activated()"), self.deleteTags) self.tagCut3 = QShortcut(QKeySequence("Ctrl+K"), self) c(self.tagCut3, SIGNAL("activated()"), self.onMark) # deletion self.delCut1 = QShortcut(QKeySequence("Delete"), self) self.delCut1.setAutoRepeat(False) c(self.delCut1, SIGNAL("activated()"), self.deleteNotes) if isMac: self.delCut2 = QShortcut(QKeySequence("Backspace"), self) self.delCut2.setAutoRepeat(False) c(self.delCut2, SIGNAL("activated()"), self.deleteNotes) # add-on hook runHook('browser.setupMenus', self) self.mw.maybeHideAccelerators(self) def updateFont(self): # we can't choose different line heights efficiently, so we need # to pick a line height big enough for any card template curmax = 16 for m in self.col.models.all(): for t in m['tmpls']: bsize = t.get("bsize", 0) if bsize > curmax: curmax = bsize self.form.tableView.verticalHeader().setDefaultSectionSize( curmax + 6) def closeEvent(self, evt): saveSplitter(self.form.splitter_2, "editor2") saveSplitter(self.form.splitter, "editor3") self.editor.saveNow() self.editor.setNote(None) saveGeom(self, "editor") saveState(self, "editor") saveHeader(self.form.tableView.horizontalHeader(), "editor") self.col.conf['activeCols'] = self.model.activeCols self.col.setMod() self.hide() aqt.dialogs.close("Browser") self.teardownHooks() self.mw.maybeReset() evt.accept() def canClose(self): return True def keyPressEvent(self, evt): "Show answer on RET or register answer." if evt.key() == Qt.Key_Escape: self.close() elif self.mw.app.focusWidget() == self.form.tree: if evt.key() in (Qt.Key_Return, Qt.Key_Enter): item = self.form.tree.currentItem() self.onTreeClick(item, 0) def setupColumns(self): self.columns = [ ('question', _("Question")), ('answer', _("Answer")), ('template', _("Card")), ('deck', _("Deck")), ('noteFld', _("Sort Field")), ('noteCrt', _("Created")), ('noteMod', _("Edited")), ('cardMod', _("Changed")), ('cardDue', _("Due")), ('cardIvl', _("Interval")), ('cardEase', _("Ease")), ('cardReps', _("Reviews")), ('cardLapses', _("Lapses")), ('noteTags', _("Tags")), ('note', _("Note")), ] self.columns.sort(key=itemgetter(1)) # Searching ###################################################################### def setupSearch(self): self.filterTimer = None self.connect(self.form.searchButton, SIGNAL("clicked()"), self.onSearch) self.connect(self.form.searchEdit.lineEdit(), SIGNAL("returnPressed()"), self.onSearch) self.setTabOrder(self.form.searchEdit, self.form.tableView) self.form.searchEdit.setCompleter(None) self.form.searchEdit.addItems(self.mw.pm.profile['searchHistory']) def onSearch(self, reset=True): "Careful: if reset is true, the current note is saved." txt = unicode(self.form.searchEdit.lineEdit().text()).strip() prompt = _("") sh = self.mw.pm.profile['searchHistory'] # update search history if txt in sh: sh.remove(txt) sh.insert(0, txt) sh = sh[:30] self.form.searchEdit.clear() self.form.searchEdit.addItems(sh) self.mw.pm.profile['searchHistory'] = sh if self.mw.state == "review" and "is:current" in txt: # search for current card, but set search to easily display whole # deck if reset: self.model.beginReset() self.model.focusedCard = self.mw.reviewer.card.id self.model.search("nid:%d"%self.mw.reviewer.card.nid, False) if reset: self.model.endReset() self.form.searchEdit.lineEdit().setText(prompt) self.form.searchEdit.lineEdit().selectAll() return elif "is:current" in txt: self.form.searchEdit.lineEdit().setText(prompt) self.form.searchEdit.lineEdit().selectAll() elif txt == prompt: self.form.searchEdit.lineEdit().setText("deck:current ") txt = "deck:current " self.model.search(txt, reset) if not self.model.cards: # no row change will fire self.onRowChanged(None, None) elif self.mw.state == "review": self.focusCid(self.mw.reviewer.card.id) def updateTitle(self): selected = len(self.form.tableView.selectionModel().selectedRows()) cur = len(self.model.cards) self.setWindowTitle(ngettext("Browser (%(cur)d card shown; %(sel)s)", "Browser (%(cur)d cards shown; %(sel)s)", cur) % { "cur": cur, "sel": ngettext("%d selected", "%d selected", selected) % selected }) return selected def onReset(self): self.editor.setNote(None) self.onSearch() # Table view & editor ###################################################################### def setupTable(self): self.model = DataModel(self) self.form.tableView.setSortingEnabled(True) self.form.tableView.setModel(self.model) self.form.tableView.selectionModel() self.form.tableView.setItemDelegate(StatusDelegate(self, self.model)) self.connect(self.form.tableView.selectionModel(), SIGNAL("selectionChanged(QItemSelection,QItemSelection)"), self.onRowChanged) def setupEditor(self): self.editor = aqt.editor.Editor( self.mw, self.form.fieldsArea, self) self.editor.stealFocus = False def onRowChanged(self, current, previous): "Update current note and hide/show editor." update = self.updateTitle() show = self.model.cards and update == 1 self.form.splitter.widget(1).setVisible(not not show) if not show: self.editor.setNote(None) self.singleCard = False else: self.card = self.model.getCard( self.form.tableView.selectionModel().currentIndex()) self.editor.setNote(self.card.note(reload=True)) self.editor.card = self.card self.singleCard = True self._renderPreview(True) self.toolbar.draw() def refreshCurrentCard(self, note): self.model.refreshNote(note) self._renderPreview(False) def refreshCurrentCardFilter(self, flag, note, fidx): self.refreshCurrentCard(note) return flag def currentRow(self): idx = self.form.tableView.selectionModel().currentIndex() return idx.row() # Headers & sorting ###################################################################### def setupHeaders(self): vh = self.form.tableView.verticalHeader() hh = self.form.tableView.horizontalHeader() if not isWin: vh.hide() hh.show() restoreHeader(hh, "editor") hh.setHighlightSections(False) hh.setMinimumSectionSize(50) hh.setMovable(True) self.setColumnSizes() hh.setContextMenuPolicy(Qt.CustomContextMenu) hh.connect(hh, SIGNAL("customContextMenuRequested(QPoint)"), self.onHeaderContext) self.setSortIndicator() hh.connect(hh, SIGNAL("sortIndicatorChanged(int, Qt::SortOrder)"), self.onSortChanged) hh.connect(hh, SIGNAL("sectionMoved(int,int,int)"), self.onColumnMoved) def onSortChanged(self, idx, ord): type = self.model.activeCols[idx] noSort = ("question", "answer", "template", "deck", "note", "noteTags") if type in noSort: if type == "template": # fixme: change to 'card:1' to be clearer in future dev round showInfo(_("""\ This column can't be sorted on, but you can search for individual card types, \ such as 'card:Card 1'.""")) elif type == "deck": showInfo(_("""\ This column can't be sorted on, but you can search for specific decks \ by clicking on one on the left.""")) else: showInfo(_("Sorting on this column is not supported. Please " "choose another.")) type = self.col.conf['sortType'] if self.col.conf['sortType'] != type: self.col.conf['sortType'] = type # default to descending for non-text fields if type == "noteFld": ord = not ord self.col.conf['sortBackwards'] = ord self.onSearch() else: if self.col.conf['sortBackwards'] != ord: self.col.conf['sortBackwards'] = ord self.model.reverse() self.setSortIndicator() def setSortIndicator(self): hh = self.form.tableView.horizontalHeader() type = self.col.conf['sortType'] if type not in self.model.activeCols: hh.setSortIndicatorShown(False) return idx = self.model.activeCols.index(type) if self.col.conf['sortBackwards']: ord = Qt.DescendingOrder else: ord = Qt.AscendingOrder hh.blockSignals(True) hh.setSortIndicator(idx, ord) hh.blockSignals(False) hh.setSortIndicatorShown(True) def onHeaderContext(self, pos): gpos = self.form.tableView.mapToGlobal(pos) m = QMenu() for type, name in self.columns: a = m.addAction(name) a.setCheckable(True) a.setChecked(type in self.model.activeCols) a.connect(a, SIGNAL("toggled(bool)"), lambda b, t=type: self.toggleField(t)) m.exec_(gpos) def toggleField(self, type): self.model.beginReset() if type in self.model.activeCols: if len(self.model.activeCols) < 2: return showInfo(_("You must have at least one column.")) self.model.activeCols.remove(type) adding=False else: self.model.activeCols.append(type) adding=True # sorted field may have been hidden self.setSortIndicator() self.setColumnSizes() self.model.endReset() # if we added a column, scroll to it if adding: row = self.currentRow() idx = self.model.index(row, len(self.model.activeCols) - 1) self.form.tableView.scrollTo(idx) def setColumnSizes(self): hh = self.form.tableView.horizontalHeader() for i in range(len(self.model.activeCols)): if hh.visualIndex(i) == len(self.model.activeCols) - 1: hh.setResizeMode(i, QHeaderView.Stretch) else: hh.setResizeMode(i, QHeaderView.Interactive) # this must be set post-resize or it doesn't work hh.setCascadingSectionResizes(False) def onColumnMoved(self, a, b, c): self.setColumnSizes() # Filter tree ###################################################################### class CallbackItem(QTreeWidgetItem): def __init__(self, root, name, onclick): QTreeWidgetItem.__init__(self, root, [name]) self.onclick = onclick def setupTree(self): self.connect( self.form.tree, SIGNAL("itemClicked(QTreeWidgetItem*,int)"), self.onTreeClick) p = QPalette() p.setColor(QPalette.Base, QColor("#d6dde0")) self.form.tree.setPalette(p) self.buildTree() def buildTree(self): self.form.tree.clear() root = self.form.tree self._systemTagTree(root) self._decksTree(root) self._modelTree(root) self._userTagTree(root) self.form.tree.expandAll() self.form.tree.setItemsExpandable(False) self.form.tree.setIndentation(15) def onTreeClick(self, item, col): if getattr(item, 'onclick', None): item.onclick() def setFilter(self, *args): if len(args) == 1: txt = args[0] else: txt = "" items = [] for c, a in enumerate(args): if c % 2 == 0: txt += a + ":" else: txt += a if " " in txt or "(" in txt or ")" in txt: txt = '"%s"' % txt items.append(txt) txt = "" txt = " ".join(items) if self.mw.app.keyboardModifiers() & Qt.AltModifier: txt = "-"+txt if self.mw.app.keyboardModifiers() & Qt.ControlModifier: cur = unicode(self.form.searchEdit.lineEdit().text()) if cur: txt = cur + " " + txt elif self.mw.app.keyboardModifiers() & Qt.ShiftModifier: cur = unicode(self.form.searchEdit.lineEdit().text()) if cur: txt = cur + " or " + txt self.form.searchEdit.lineEdit().setText(txt) self.onSearch() def _systemTagTree(self, root): tags = ( (_("Whole Collection"), "ankibw", ""), (_("Current Deck"), "deck16", "deck:current"), (_("Added Today"), "view-pim-calendar.png", "added:1"), (_("Studied Today"), "view-pim-calendar.png", "rated:1"), (_("Again Today"), "view-pim-calendar.png", "rated:1:1"), (_("New"), "plus16.png", "is:new"), (_("Learning"), "stock_new_template_red.png", "is:learn"), (_("Review"), "clock16.png", "is:review"), (_("Due"), "clock16.png", "is:due"), (_("Marked"), "star16.png", "tag:marked"), (_("Suspended"), "media-playback-pause.png", "is:suspended"), (_("Leech"), "emblem-important.png", "tag:leech")) for name, icon, cmd in tags: item = self.CallbackItem( root, name, lambda c=cmd: self.setFilter(c)) item.setIcon(0, QIcon(":/icons/" + icon)) return root def _userTagTree(self, root): for t in sorted(self.col.tags.all()): if t.lower() == "marked" or t.lower() == "leech": continue item = self.CallbackItem( root, t, lambda t=t: self.setFilter("tag", t)) item.setIcon(0, QIcon(":/icons/anki-tag.png")) def _decksTree(self, root): grps = self.col.sched.deckDueTree() def fillGroups(root, grps, head=""): for g in grps: item = self.CallbackItem( root, g[0], lambda g=g: self.setFilter( "deck", head+g[0])) item.setIcon(0, QIcon(":/icons/deck16.png")) newhead = head + g[0]+"::" fillGroups(item, g[5], newhead) fillGroups(root, grps) def _modelTree(self, root): for m in sorted(self.col.models.all(), key=itemgetter("name")): mitem = self.CallbackItem( root, m['name'], lambda m=m: self.setFilter("mid", str(m['id']))) mitem.setIcon(0, QIcon(":/icons/product_design.png")) # for t in m['tmpls']: # titem = self.CallbackItem( # t['name'], lambda m=m, t=t: self.setFilter( # "model", m['name'], "card", t['name'])) # titem.setIcon(0, QIcon(":/icons/stock_new_template.png")) # mitem.addChild(titem) # Info ###################################################################### def showCardInfo(self): if not self.card: return info, cs = self._cardInfoData() reps = self._revlogData(cs) d = QDialog(self) l = QVBoxLayout() l.setMargin(0) w = AnkiWebView() l.addWidget(w) w.stdHtml(info + "

" + reps) bb = QDialogButtonBox(QDialogButtonBox.Close) l.addWidget(bb) bb.connect(bb, SIGNAL("rejected()"), d, SLOT("reject()")) d.setLayout(l) d.setWindowModality(Qt.WindowModal) d.resize(500, 400) restoreGeom(d, "revlog") d.exec_() saveGeom(d, "revlog") def _cardInfoData(self): from anki.stats import CardStats cs = CardStats(self.col, self.card) rep = cs.report() m = self.card.model() rep = """

%s
""" % rep return rep, cs def _revlogData(self, cs): entries = self.mw.col.db.all( "select id/1000.0, ease, ivl, factor, time/1000.0, type " "from revlog where cid = ?", self.card.id) if not entries: return "" s = "" % _("Date") s += ("" * 5) % ( _("Type"), _("Rating"), _("Interval"), _("Ease"), _("Time")) cnt = 0 for (date, ease, ivl, factor, taken, type) in reversed(entries): cnt += 1 s += "" % time.strftime(_("%Y-%m-%d @ %H:%M"), time.localtime(date)) tstr = [_("Learn"), _("Review"), _("Relearn"), _("Filtered"), _("Resched")][type] import anki.stats as st fmt = "%s" if type == 0: tstr = fmt % (st.colLearn, tstr) elif type == 1: tstr = fmt % (st.colMature, tstr) elif type == 2: tstr = fmt % (st.colRelearn, tstr) elif type == 3: tstr = fmt % (st.colCram, tstr) else: tstr = fmt % ("#000", tstr) if ease == 1: ease = fmt % (st.colRelearn, ease) if ivl == 0: ivl = _("0d") elif ivl > 0: ivl = fmtTimeSpan(ivl*86400, short=True) else: ivl = cs.time(-ivl) s += ("" * 5) % ( tstr, ease, ivl, "%d%%" % (factor/10) if factor else "", cs.time(taken)) + "" s += "
%s%s
%s%s
" if cnt < self.card.reps: s += _("""\ Note: Some of the history is missing. For more information, \ please see the browser documentation.""") return s # Menu helpers ###################################################################### def selectedCards(self): return [self.model.cards[idx.row()] for idx in self.form.tableView.selectionModel().selectedRows()] def selectedNotes(self): return self.col.db.list(""" select distinct nid from cards where id in %s""" % ids2str( [self.model.cards[idx.row()] for idx in self.form.tableView.selectionModel().selectedRows()])) def selectedNotesAsCards(self): return self.col.db.list( "select id from cards where nid in (%s)" % ",".join([str(s) for s in self.selectedNotes()])) def oneModelNotes(self): sf = self.selectedNotes() if not sf: return mods = self.col.db.scalar(""" select count(distinct mid) from notes where id in %s""" % ids2str(sf)) if mods > 1: showInfo(_("Please select cards from only one note type.")) return return sf def onHelp(self): openHelp("browser") # Misc menu options ###################################################################### def onChangeModel(self): nids = self.oneModelNotes() if nids: ChangeModel(self, nids) def cram(self): return showInfo("not yet implemented") self.close() self.mw.onCram(self.selectedCards()) # Preview ###################################################################### def onTogglePreview(self): if self._previewWindow: self._closePreview() else: self._openPreview() def _openPreview(self): c = self.connect self._previewState = "question" self._previewWindow = QDialog(None, Qt.Window) self._previewWindow.setWindowTitle(_("Preview")) c(self._previewWindow, SIGNAL("finished(int)"), self._onPreviewFinished) vbox = QVBoxLayout() vbox.setMargin(0) self._previewWeb = AnkiWebView() self._previewWeb.setFocusPolicy(Qt.NoFocus) vbox.addWidget(self._previewWeb) bbox = QDialogButtonBox() self._previewPrev = bbox.addButton("<", QDialogButtonBox.ActionRole) self._previewPrev.setAutoDefault(False) self._previewPrev.setShortcut(QKeySequence("Left")) self._previewNext = bbox.addButton(">", QDialogButtonBox.ActionRole) self._previewNext.setAutoDefault(False) self._previewNext.setShortcut(QKeySequence("Right")) c(self._previewPrev, SIGNAL("clicked()"), self._onPreviewPrev) c(self._previewNext, SIGNAL("clicked()"), self._onPreviewNext) vbox.addWidget(bbox) self._previewWindow.setLayout(vbox) restoreGeom(self._previewWindow, "preview") self._previewWindow.show() self._renderPreview(True) def _onPreviewFinished(self, ok): saveGeom(self._previewWindow, "preview") self.mw.progress.timer(100, self._onClosePreview, False) self.form.previewButton.setChecked(False) def _onPreviewPrev(self): if self._previewState == "question": self._previewState = "answer" self._renderPreview() else: self.onPreviousCard() self._updatePreviewButtons() def _onPreviewNext(self): if self._previewState == "question": self._previewState = "answer" self._renderPreview() else: self.onNextCard() self._updatePreviewButtons() def _updatePreviewButtons(self): if not self._previewWindow: return canBack = self.currentRow() > 0 or self._previewState == "question" self._previewPrev.setEnabled(not not (self.singleCard and canBack)) canForward = self.currentRow() < self.model.rowCount(None) - 1 or \ self._previewState == "question" self._previewNext.setEnabled(not not (self.singleCard and canForward)) def _closePreview(self): if self._previewWindow: self._previewWindow.close() self._onClosePreview() def _onClosePreview(self): self._previewWindow = self._previewPrev = self._previewNext = None def _renderPreview(self, cardChanged=False): if not self._previewWindow: return c = self.card if not c: txt = _("(please select 1 card)") self._previewWeb.stdHtml(txt) self._updatePreviewButtons() return self._updatePreviewButtons() if cardChanged: self._previewState = "question" # need to force reload even if answer txt = c.q(reload=True) if self._previewState == "answer": txt = c.a() txt = re.sub("\[\[type:[^]]+\]\]", "", txt) ti = lambda x: x base = getBase(self.mw.col) self._previewWeb.stdHtml( ti(mungeQA(self.col, txt)), self.mw.reviewer._styles(), bodyClass="card card%d" % (c.ord+1), head=base, js=anki.js.browserSel) clearAudioQueue() if self.mw.reviewer.autoplay(c): playFromText(txt) # Card deletion ###################################################################### def deleteNotes(self): nids = self.selectedNotes() if not nids: return self.mw.checkpoint(_("Delete Notes")) self.model.beginReset() oldRow = self.form.tableView.selectionModel().currentIndex().row() self.col.remNotes(nids) self.onSearch(reset=False) if len(self.model.cards): new = min(oldRow, len(self.model.cards) - 1) self.model.focusedCard = self.model.cards[new] self.model.endReset() self.mw.requireReset() tooltip(_("%s deleted.") % (ngettext("%d note", "%d notes", len(nids)) % len(nids))) # Deck change ###################################################################### def setDeck(self): from aqt.studydeck import StudyDeck cids = self.selectedCards() if not cids: return did = self.mw.col.db.scalar( "select did from cards where id = ?", cids[0]) current=self.mw.col.decks.get(did)['name'] ret = StudyDeck( self.mw, current=current, accept=_("Move Cards"), title=_("Change Deck"), help="browse", parent=self) if not ret.name: return did = self.col.decks.id(ret.name) deck = self.col.decks.get(did) if deck['dyn']: showWarning(_("Cards can't be manually moved into a filtered deck.")) return self.model.beginReset() self.mw.checkpoint(_("Change Deck")) mod = intTime() usn = self.col.usn() # normal cards scids = ids2str(cids) # remove any cards from filtered deck first self.col.sched.remFromDyn(cids) # then move into new deck self.col.db.execute(""" update cards set usn=?, mod=?, did=? where id in """ + scids, usn, mod, did) self.model.endReset() self.mw.requireReset() # Tags ###################################################################### def addTags(self, tags=None, label=None, prompt=None, func=None): if prompt is None: prompt = _("Enter tags to add:") if tags is None: (tags, r) = getTag(self, self.col, prompt) else: r = True if not r: return if func is None: func = self.col.tags.bulkAdd if label is None: label = _("Add Tags") if label: self.mw.checkpoint(label) self.model.beginReset() func(self.selectedNotes(), tags) self.model.endReset() self.mw.requireReset() def deleteTags(self, tags=None, label=None): if label is None: label = _("Delete Tags") self.addTags(tags, label, _("Enter tags to delete:"), func=self.col.tags.bulkRem) # Suspending and marking ###################################################################### def isSuspended(self): return not not (self.card and self.card.queue == -1) def onSuspend(self, sus=None): if sus is None: sus = not self.isSuspended() # focus lost hook may not have chance to fire self.editor.saveNow() c = self.selectedCards() if sus: self.col.sched.suspendCards(c) else: self.col.sched.unsuspendCards(c) self.model.reset() self.mw.requireReset() def isMarked(self): return not not (self.card and self.card.note().hasTag("Marked")) def onMark(self, mark=None): if mark is None: mark = not self.isMarked() if mark: self.addTags(tags="marked", label=False) else: self.deleteTags(tags="marked", label=False) # Repositioning ###################################################################### def reposition(self): cids = self.selectedCards() cids2 = self.col.db.list( "select id from cards where type = 0 and id in " + ids2str(cids)) if not cids2: return showInfo(_("Only new cards can be repositioned.")) d = QDialog(self) d.setWindowModality(Qt.WindowModal) frm = aqt.forms.reposition.Ui_Dialog() frm.setupUi(d) (pmin, pmax) = self.col.db.first( "select min(due), max(due) from cards where type=0") txt = _("Queue top: %d") % pmin txt += "\n" + _("Queue bottom: %d") % pmax frm.label.setText(txt) if not d.exec_(): return self.model.beginReset() self.mw.checkpoint(_("Reposition")) self.col.sched.sortCards( cids, start=frm.start.value(), step=frm.step.value(), shuffle=frm.randomize.isChecked(), shift=frm.shift.isChecked()) self.onSearch(reset=False) self.mw.requireReset() self.model.endReset() # Rescheduling ###################################################################### def reschedule(self): d = QDialog(self) d.setWindowModality(Qt.WindowModal) frm = aqt.forms.reschedule.Ui_Dialog() frm.setupUi(d) if not d.exec_(): return self.model.beginReset() self.mw.checkpoint(_("Reschedule")) if frm.asNew.isChecked(): self.col.sched.forgetCards(self.selectedCards()) else: fmin = frm.min.value() fmax = frm.max.value() fmax = max(fmin, fmax) self.col.sched.reschedCards( self.selectedCards(), fmin, fmax) self.onSearch(reset=False) self.mw.requireReset() self.model.endReset() # Edit: selection ###################################################################### def selectNotes(self): nids = self.selectedNotes() self.form.searchEdit.lineEdit().setText("nid:"+",".join([str(x) for x in nids])) # clear the selection so we don't waste energy preserving it tv = self.form.tableView tv.selectionModel().clear() self.onSearch() tv.selectAll() def invertSelection(self): sm = self.form.tableView.selectionModel() items = sm.selection() self.form.tableView.selectAll() sm.select(items, QItemSelectionModel.Deselect | QItemSelectionModel.Rows) # Edit: undo ###################################################################### def setupHooks(self): addHook("undoState", self.onUndoState) addHook("reset", self.onReset) addHook("editTimer", self.refreshCurrentCard) addHook("editFocusLost", self.refreshCurrentCardFilter) for t in "newTag", "newModel", "newDeck": addHook(t, self.buildTree) def teardownHooks(self): remHook("reset", self.onReset) remHook("editTimer", self.refreshCurrentCard) remHook("editFocusLost", self.refreshCurrentCardFilter) remHook("undoState", self.onUndoState) for t in "newTag", "newModel", "newDeck": remHook(t, self.buildTree) def onUndoState(self, on): self.form.actionUndo.setEnabled(on) if on: self.form.actionUndo.setText(self.mw.form.actionUndo.text()) # Edit: replacing ###################################################################### def onFindReplace(self): sf = self.selectedNotes() if not sf: return import anki.find fields = sorted(anki.find.fieldNames(self.col, downcase=False)) d = QDialog(self) frm = aqt.forms.findreplace.Ui_Dialog() frm.setupUi(d) d.setWindowModality(Qt.WindowModal) frm.field.addItems([_("All Fields")] + fields) self.connect(frm.buttonBox, SIGNAL("helpRequested()"), self.onFindReplaceHelp) if not d.exec_(): return if frm.field.currentIndex() == 0: field = None else: field = fields[frm.field.currentIndex()-1] self.mw.checkpoint(_("Find and Replace")) self.mw.progress.start() self.model.beginReset() try: changed = self.col.findReplace(sf, unicode(frm.find.text()), unicode(frm.replace.text()), frm.re.isChecked(), field, frm.ignoreCase.isChecked()) except sre_constants.error: showInfo(_("Invalid regular expression."), parent=self) return else: self.onSearch() self.mw.requireReset() finally: self.model.endReset() self.mw.progress.finish() showInfo(ngettext( "%(a)d of %(b)d note updated", "%(a)d of %(b)d notes updated", len(sf)) % { 'a': changed, 'b': len(sf), }) def onFindReplaceHelp(self): openHelp("findreplace") # Edit: finding dupes ###################################################################### def onFindDupes(self): d = QDialog(self) frm = aqt.forms.finddupes.Ui_Dialog() frm.setupUi(d) restoreGeom(d, "findDupes") fields = sorted(anki.find.fieldNames(self.col, downcase=False)) frm.fields.addItems(fields) self._dupesButton = None # links frm.webView.page().setLinkDelegationPolicy( QWebPage.DelegateAllLinks) self.connect(frm.webView, SIGNAL("linkClicked(QUrl)"), self.dupeLinkClicked) def onFin(code): saveGeom(d, "findDupes") self.connect(d, SIGNAL("finished(int)"), onFin) def onClick(): field = fields[frm.fields.currentIndex()] self.duplicatesReport(frm.webView, field, frm.search.text(), frm) search = frm.buttonBox.addButton( _("Search"), QDialogButtonBox.ActionRole) self.connect(search, SIGNAL("clicked()"), onClick) d.show() def duplicatesReport(self, web, fname, search, frm): self.mw.progress.start() res = self.mw.col.findDupes(fname, search) if not self._dupesButton: self._dupesButton = b = frm.buttonBox.addButton( _("Tag Duplicates"), QDialogButtonBox.ActionRole) self.connect(b, SIGNAL("clicked()"), lambda: self._onTagDupes(res)) t = "" groups = len(res) notes = sum(len(r[1]) for r in res) part1 = ngettext("%d group", "%d groups", groups) % groups part2 = ngettext("%d note", "%d notes", notes) % notes t += _("Found %(a)s across %(b)s.") % dict(a=part1, b=part2) t += "

    " for val, nids in res: t += '
  1. %s: %s' % ( "nid:" + ",".join(str(id) for id in nids), ngettext("%d note", "%d notes", len(nids)) % len(nids), cgi.escape(val)) t += "
" t += "" web.setHtml(t) self.mw.progress.finish() def _onTagDupes(self, res): if not res: return self.model.beginReset() self.mw.checkpoint(_("Tag Duplicates")) nids = set() for s, nidlist in res: nids.update(nidlist) self.col.tags.bulkAdd(nids, _("duplicate")) self.mw.progress.finish() self.model.endReset() self.mw.requireReset() tooltip(_("Notes tagged.")) def dupeLinkClicked(self, link): self.form.searchEdit.lineEdit().setText(link.toString()) self.onSearch() self.onNote() # Jumping ###################################################################### def _moveCur(self, dir=None, idx=None): if not self.model.cards: return self.editor.saveNow() tv = self.form.tableView if idx is None: idx = tv.moveCursor(dir, self.mw.app.keyboardModifiers()) tv.selectionModel().clear() tv.setCurrentIndex(idx) def onPreviousCard(self): f = self.editor.currentField self._moveCur(QAbstractItemView.MoveUp) self.editor.web.setFocus() self.editor.web.eval("focusField(%d)" % f) def onNextCard(self): f = self.editor.currentField self._moveCur(QAbstractItemView.MoveDown) self.editor.web.setFocus() self.editor.web.eval("focusField(%d)" % f) def onFirstCard(self): sm = self.form.tableView.selectionModel() idx = sm.currentIndex() self._moveCur(None, self.model.index(0, 0)) if not self.mw.app.keyboardModifiers() & Qt.ShiftModifier: return idx2 = sm.currentIndex() item = QItemSelection(idx2, idx) sm.select(item, QItemSelectionModel.SelectCurrent| QItemSelectionModel.Rows) def onLastCard(self): sm = self.form.tableView.selectionModel() idx = sm.currentIndex() self._moveCur( None, self.model.index(len(self.model.cards) - 1, 0)) if not self.mw.app.keyboardModifiers() & Qt.ShiftModifier: return idx2 = sm.currentIndex() item = QItemSelection(idx, idx2) sm.select(item, QItemSelectionModel.SelectCurrent| QItemSelectionModel.Rows) def onFind(self): self.form.searchEdit.setFocus() self.form.searchEdit.lineEdit().selectAll() def onNote(self): self.editor.focus() self.editor.web.setFocus() self.editor.web.eval("focusField(0);") def onTags(self): self.form.tree.setFocus() def onCardList(self): self.form.tableView.setFocus() def focusCid(self, cid): try: row = self.model.cards.index(cid) except: return self.form.tableView.selectRow(row) # Change model dialog ###################################################################### class ChangeModel(QDialog): def __init__(self, browser, nids): QDialog.__init__(self, browser) self.browser = browser self.nids = nids self.oldModel = browser.card.note().model() self.form = aqt.forms.changemodel.Ui_Dialog() self.form.setupUi(self) self.setWindowModality(Qt.WindowModal) self.setup() restoreGeom(self, "changeModel") addHook("reset", self.onReset) addHook("currentModelChanged", self.onReset) self.exec_() def setup(self): # maps self.flayout = QHBoxLayout() self.flayout.setMargin(0) self.fwidg = None self.form.fieldMap.setLayout(self.flayout) self.tlayout = QHBoxLayout() self.tlayout.setMargin(0) self.twidg = None self.form.templateMap.setLayout(self.tlayout) if self.style().objectName() == "gtk+": # gtk+ requires margins in inner layout self.form.verticalLayout_2.setContentsMargins(0, 11, 0, 0) self.form.verticalLayout_3.setContentsMargins(0, 11, 0, 0) # model chooser import aqt.modelchooser self.oldModel = self.browser.col.models.get( self.browser.col.db.scalar( "select mid from notes where id = ?", self.nids[0])) self.form.oldModelLabel.setText(self.oldModel['name']) self.modelChooser = aqt.modelchooser.ModelChooser( self.browser.mw, self.form.modelChooserWidget, label=False) self.modelChooser.models.setFocus() self.connect(self.form.buttonBox, SIGNAL("helpRequested()"), self.onHelp) self.modelChanged(self.browser.mw.col.models.current()) self.pauseUpdate = False def onReset(self): self.modelChanged(self.browser.col.models.current()) def modelChanged(self, model): self.targetModel = model self.rebuildTemplateMap() self.rebuildFieldMap() def rebuildTemplateMap(self, key=None, attr=None): if not key: key = "t" attr = "tmpls" map = getattr(self, key + "widg") lay = getattr(self, key + "layout") src = self.oldModel[attr] dst = self.targetModel[attr] if map: lay.removeWidget(map) map.deleteLater() setattr(self, key + "MapWidget", None) map = QWidget() l = QGridLayout() combos = [] targets = [x['name'] for x in dst] + [_("Nothing")] indices = {} for i, x in enumerate(src): l.addWidget(QLabel(_("Change %s to:") % x['name']), i, 0) cb = QComboBox() cb.addItems(targets) idx = min(i, len(targets)-1) cb.setCurrentIndex(idx) indices[cb] = idx self.connect(cb, SIGNAL("currentIndexChanged(int)"), lambda i, cb=cb, key=key: self.onComboChanged(i, cb, key)) combos.append(cb) l.addWidget(cb, i, 1) map.setLayout(l) lay.addWidget(map) setattr(self, key + "widg", map) setattr(self, key + "layout", lay) setattr(self, key + "combos", combos) setattr(self, key + "indices", indices) def rebuildFieldMap(self): return self.rebuildTemplateMap(key="f", attr="flds") def onComboChanged(self, i, cb, key): indices = getattr(self, key + "indices") if self.pauseUpdate: indices[cb] = i return combos = getattr(self, key + "combos") if i == cb.count() - 1: # set to 'nothing' return # find another combo with same index for c in combos: if c == cb: continue if c.currentIndex() == i: self.pauseUpdate = True c.setCurrentIndex(indices[cb]) self.pauseUpdate = False break indices[cb] = i def getTemplateMap(self, old=None, combos=None, new=None): if not old: old = self.oldModel['tmpls'] combos = self.tcombos new = self.targetModel['tmpls'] map = {} for i, f in enumerate(old): idx = combos[i].currentIndex() if idx == len(new): # ignore map[f['ord']] = None else: f2 = new[idx] map[f['ord']] = f2['ord'] return map def getFieldMap(self): return self.getTemplateMap( old=self.oldModel['flds'], combos=self.fcombos, new=self.targetModel['flds']) def cleanup(self): remHook("reset", self.onReset) remHook("currentModelChanged", self.onReset) self.modelChooser.cleanup() saveGeom(self, "changeModel") def reject(self): self.cleanup() return QDialog.reject(self) def accept(self): # check maps fmap = self.getFieldMap() cmap = self.getTemplateMap() if any(True for c in cmap.values() if c is None): if not askUser(_("""\ Any cards mapped to nothing will be deleted. \ If a note has no remaining cards, it will be lost. \ Are you sure you want to continue?""")): return QDialog.accept(self) self.browser.mw.checkpoint(_("Change Note Type")) b = self.browser b.mw.progress.start() b.model.beginReset() mm = b.mw.col.models mm.change(self.oldModel, self.nids, self.targetModel, fmap, cmap) b.onSearch(reset=False) b.model.endReset() b.mw.progress.finish() b.mw.reset() self.cleanup() def onHelp(self): openHelp("browsermisc") # Toolbar ###################################################################### class BrowserToolbar(Toolbar): def __init__(self, mw, web, browser): self.browser = browser Toolbar.__init__(self, mw, web) def draw(self): mark = self.browser.isMarked() pause = self.browser.isSuspended() def borderImg(link, icon, on, title, tooltip=None): if on: fmt = '''\ \ %s''' else: fmt = '''\ %s''' return fmt % (tooltip or title, link, icon, title) right = "
" right += borderImg("add", "add16", False, _("Add")) right += borderImg("info", "info", False, _("Info"), shortcut(_("Card Info (Ctrl+Shift+I)"))) right += borderImg("mark", "star16", mark, _("Mark"), shortcut(_("Mark Note (Ctrl+K)"))) right += borderImg("pause", "pause16", pause, _("Suspend")) right += borderImg("setDeck", "deck16", False, _("Change Deck"), shortcut(_("Move To Deck (Ctrl+D)"))) right += borderImg("addtag", "addtag16", False, _("Add Tags"), shortcut(_("Bulk Add Tags (Ctrl+Shift+T)"))) right += borderImg("deletetag", "deletetag16", False, _("Remove Tags"), shortcut(_( "Bulk Remove Tags (Ctrl+Alt+T)"))) right += borderImg("delete", "delete16", False, _("Delete")) right += "
" self.web.page().currentFrame().setScrollBarPolicy( Qt.Horizontal, Qt.ScrollBarAlwaysOff) self.web.stdHtml(self._body % ( "", #", #self._centerLinks(), right, ""), self._css + """ #header { font-weight: normal; } a { margin-right: 1em; } .hitem { overflow: hidden; white-space: nowrap;} """) # Link handling ###################################################################### def _linkHandler(self, l): if l == "anki": self.showMenu() elif l == "add": self.browser.mw.onAddCard() elif l == "delete": self.browser.deleteNotes() elif l == "setDeck": self.browser.setDeck() # icons elif l == "info": self.browser.showCardInfo() elif l == "mark": self.browser.onMark() elif l == "pause": self.browser.onSuspend() elif l == "addtag": self.browser.addTags() elif l == "deletetag": self.browser.deleteTags() anki-2.0.20+dfsg/aqt/update.py0000644000175000017500000000416512244632451015702 0ustar andreasandreas# Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import urllib import urllib2 import time from aqt.qt import * import aqt from aqt.utils import openLink from anki.utils import json, platDesc from aqt.utils import showText class LatestVersionFinder(QThread): def __init__(self, main): QThread.__init__(self) self.main = main self.config = main.pm.meta def _data(self): d = {"ver": aqt.appVersion, "os": platDesc(), "id": self.config['id'], "lm": self.config['lastMsg'], "crt": self.config['created']} return d def run(self): if not self.config['updates']: return d = self._data() d['proto'] = 1 d = urllib.urlencode(d) try: f = urllib2.urlopen(aqt.appUpdate, d) resp = f.read() if not resp: return resp = json.loads(resp) except: # behind proxy, corrupt message, etc return if resp['msg']: self.emit(SIGNAL("newMsg"), resp) if resp['ver']: self.emit(SIGNAL("newVerAvail"), resp['ver']) diff = resp['time'] - time.time() if abs(diff) > 300: self.emit(SIGNAL("clockIsOff"), diff) def askAndUpdate(mw, ver): baseStr = ( _('''

Anki Updated

Anki %s has been released.

''') % ver) msg = QMessageBox(mw) msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) msg.setIcon(QMessageBox.Information) msg.setText(baseStr + _("Would you like to download it now?")) button = QPushButton(_("Ignore this update")) msg.addButton(button, QMessageBox.RejectRole) msg.setDefaultButton(QMessageBox.Yes) ret = msg.exec_() if msg.clickedButton() == button: # ignore this update mw.pm.meta['suppressUpdate'] = ver elif ret == QMessageBox.Yes: openLink(aqt.appWebsite) def showMessages(mw, data): showText(data['msg'], parent=mw, type="html") mw.pm.meta['lastMsg'] = data['msgId'] anki-2.0.20+dfsg/aqt/overview.py0000644000175000017500000001452512225675305016273 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.utils import openLink, shortcut, tooltip from anki.utils import isMac import aqt from anki.sound import clearAudioQueue class Overview(object): "Deck overview." def __init__(self, mw): self.mw = mw self.web = mw.web self.bottom = aqt.toolbar.BottomBar(mw, mw.bottomWeb) def show(self): clearAudioQueue() self.web.setLinkHandler(self._linkHandler) self.web.setKeyHandler(None) self.mw.keyHandler = self._keyHandler self.mw.web.setFocus() self.refresh() def refresh(self): self.mw.col.reset() self._renderPage() self._renderBottom() # Handlers ############################################################ def _linkHandler(self, url): if url == "study": self.mw.col.startTimebox() self.mw.moveToState("review") if self.mw.state == "overview": tooltip(_("No cards are due yet.")) elif url == "anki": print "anki menu" elif url == "opts": self.mw.onDeckConf() elif url == "cram": deck = self.mw.col.decks.current() self.mw.onCram("'deck:%s'" % deck['name']) elif url == "refresh": self.mw.col.sched.rebuildDyn() self.mw.reset() elif url == "empty": self.mw.col.sched.emptyDyn(self.mw.col.decks.selected()) self.mw.reset() elif url == "decks": self.mw.moveToState("deckBrowser") elif url == "review": openLink(aqt.appShared+"info/%s?v=%s"%(self.sid, self.sidVer)) elif url == "studymore": self.onStudyMore() elif url == "unbury": self.mw.col.sched.unburyCardsForDeck() self.mw.reset() elif url.lower().startswith("http"): openLink(url) def _keyHandler(self, evt): cram = self.mw.col.decks.current()['dyn'] key = unicode(evt.text()) if key == "o": self.mw.onDeckConf() if key == "r" and cram: self.mw.col.sched.rebuildDyn() self.mw.reset() if key == "e" and cram: self.mw.col.sched.emptyDyn(self.mw.col.decks.selected()) self.mw.reset() if key == "c" and not cram: self.onStudyMore() if key == "u": self.mw.col.sched.unburyCardsForDeck() self.mw.reset() # HTML ############################################################ def _renderPage(self): but = self.mw.button deck = self.mw.col.decks.current() self.sid = deck.get("sharedFrom") if self.sid: self.sidVer = deck.get("ver", None) shareLink = 'Reviews and Updates' else: shareLink = "" self.web.stdHtml(self._body % dict( deck=deck['name'], shareLink=shareLink, desc=self._desc(deck), table=self._table() ), self.mw.sharedCSS + self._css) def _desc(self, deck): if deck['dyn']: desc = _("""\ This is a special deck for studying outside of the normal schedule.""") desc += " " + _("""\ Cards will be automatically returned to their original decks after you review \ them.""") desc += " " + _("""\ Deleting this deck from the deck list will return all remaining cards \ to their original deck.""") else: desc = deck.get("desc", "") if not desc: return "

" if deck['dyn']: dyn = "dyn" else: dyn = "" return '

%s
' % ( dyn, desc) def _table(self): counts = list(self.mw.col.sched.counts()) finished = not sum(counts) for n in range(len(counts)): if counts[n] == 1000: counts[n] = "1000+" but = self.mw.button if finished: return '
%s
' % ( self.mw.col.sched.finishedMsg()) else: return '''
%s:%s
%s:%s
%s:%s
%s
''' % ( _("New"), counts[0], _("Learning"), counts[1], _("To Review"), counts[2], but("study", _("Study Now"), id="study")) _body = """

%(deck)s

%(shareLink)s %(desc)s %(table)s
""" _css = """ .smallLink { font-size: 10px; } h3 { margin-bottom: 0; } .descfont { padding: 1em; color: #333; } .description { white-space: pre-wrap; } #fulldesc { display:none; } .descmid { width: 70%; margin: 0 auto 0; text-align: left; } .dyn { text-align: center; } """ # Bottom area ###################################################################### def _renderBottom(self): links = [ ["O", "opts", _("Options")], ] if self.mw.col.decks.current()['dyn']: links.append(["R", "refresh", _("Rebuild")]) links.append(["E", "empty", _("Empty")]) else: links.append(["C", "studymore", _("Custom Study")]) #links.append(["F", "cram", _("Filter/Cram")]) if self.mw.col.sched.haveBuried(): links.append(["U", "unbury", _("Unbury")]) buf = "" for b in links: if b[0]: b[0] = _("Shortcut key: %s") % shortcut(b[0]) buf += """ """ % tuple(b) self.bottom.draw(buf) if isMac: size = 28 else: size = 36 + self.mw.fontHeightDelta*3 self.bottom.web.setFixedHeight(size) self.bottom.web.setLinkHandler(self._linkHandler) # Studying more ###################################################################### def onStudyMore(self): import aqt.customstudy aqt.customstudy.CustomStudy(self.mw) anki-2.0.20+dfsg/aqt/stats.py0000644000175000017500000000576412221204444015554 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import os, time from aqt.utils import saveGeom, restoreGeom, maybeHideClose, showInfo, addCloseShortcut import aqt # Deck Stats ###################################################################### class DeckStats(QDialog): def __init__(self, mw): QDialog.__init__(self, mw, Qt.Window) self.mw = mw self.name = "deckStats" self.period = 0 self.form = aqt.forms.stats.Ui_Dialog() self.oldPos = None self.wholeCollection = False self.setMinimumWidth(700) f = self.form f.setupUi(self) restoreGeom(self, self.name) b = f.buttonBox.addButton(_("Save Image"), QDialogButtonBox.ActionRole) b.connect(b, SIGNAL("clicked()"), self.browser) b.setAutoDefault(False) c = self.connect s = SIGNAL("clicked()") c(f.groups, s, lambda: self.changeScope("deck")) f.groups.setShortcut("g") c(f.all, s, lambda: self.changeScope("collection")) c(f.month, s, lambda: self.changePeriod(0)) c(f.year, s, lambda: self.changePeriod(1)) c(f.life, s, lambda: self.changePeriod(2)) c(f.web, SIGNAL("loadFinished(bool)"), self.loadFin) maybeHideClose(self.form.buttonBox) addCloseShortcut(self) self.refresh() self.exec_() def reject(self): saveGeom(self, self.name) QDialog.reject(self) def browser(self): name = time.strftime("-%Y-%m-%d@%H-%M-%S.png", time.localtime(time.time())) name = "anki-"+_("stats")+name desktopPath = QDesktopServices.storageLocation(QDesktopServices.DesktopLocation) if not os.path.exists(desktopPath): os.mkdir(desktopPath) path = os.path.join(desktopPath, name) p = self.form.web.page() oldsize = p.viewportSize() p.setViewportSize(p.mainFrame().contentsSize()) image = QImage(p.viewportSize(), QImage.Format_ARGB32) painter = QPainter(image) p.mainFrame().render(painter) painter.end() image.save(path, "png") p.setViewportSize(oldsize) showInfo(_("An image was saved to your desktop.")) def changePeriod(self, n): self.period = n self.refresh() def changeScope(self, type): self.wholeCollection = type == "collection" self.refresh() def loadFin(self, b): self.form.web.page().mainFrame().setScrollPosition(self.oldPos) def refresh(self): self.mw.progress.start(immediate=True) self.oldPos = self.form.web.page().mainFrame().scrollPosition() stats = self.mw.col.stats() stats.wholeCollection = self.wholeCollection self.report = stats.report(type=self.period) self.form.web.setHtml(self.report) self.mw.progress.finish() anki-2.0.20+dfsg/aqt/addcards.py0000644000175000017500000001535612221204444016161 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from anki.lang import _ from aqt.qt import * import aqt.forms from aqt.utils import saveGeom, restoreGeom, showWarning, askUser, shortcut, \ tooltip, openHelp, addCloseShortcut from anki.sound import clearAudioQueue from anki.hooks import addHook, remHook, runHook from anki.utils import stripHTMLMedia, isMac import aqt.editor, aqt.modelchooser, aqt.deckchooser class AddCards(QDialog): def __init__(self, mw): QDialog.__init__(self, None, Qt.Window) self.mw = mw self.form = aqt.forms.addcards.Ui_Dialog() self.form.setupUi(self) self.setWindowTitle(_("Add")) self.setMinimumHeight(300) self.setMinimumWidth(400) self.setupChoosers() self.setupEditor() self.setupButtons() self.onReset() self.history = [] self.forceClose = False restoreGeom(self, "add") addHook('reset', self.onReset) addHook('currentModelChanged', self.onReset) addCloseShortcut(self) self.show() self.setupNewNote() def setupEditor(self): self.editor = aqt.editor.Editor( self.mw, self.form.fieldsArea, self, True) def setupChoosers(self): self.modelChooser = aqt.modelchooser.ModelChooser( self.mw, self.form.modelArea) self.deckChooser = aqt.deckchooser.DeckChooser( self.mw, self.form.deckArea) def helpRequested(self): openHelp("addingnotes") def setupButtons(self): bb = self.form.buttonBox ar = QDialogButtonBox.ActionRole # add self.addButton = bb.addButton(_("Add"), ar) self.addButton.setShortcut(QKeySequence("Ctrl+Return")) self.addButton.setToolTip(shortcut(_("Add (shortcut: ctrl+enter)"))) self.connect(self.addButton, SIGNAL("clicked()"), self.addCards) # close self.closeButton = QPushButton(_("Close")) self.closeButton.setAutoDefault(False) bb.addButton(self.closeButton, QDialogButtonBox.RejectRole) # help self.helpButton = QPushButton(_("Help")) self.helpButton.setAutoDefault(False) bb.addButton(self.helpButton, QDialogButtonBox.HelpRole) self.connect(self.helpButton, SIGNAL("clicked()"), self.helpRequested) # history b = bb.addButton( _("History")+ u" ▾", ar) if isMac: sc = "Ctrl+Shift+H" else: sc = "Ctrl+H" b.setShortcut(QKeySequence(sc)) b.setToolTip(_("Shortcut: %s") % shortcut(sc)) self.connect(b, SIGNAL("clicked()"), self.onHistory) b.setEnabled(False) self.historyButton = b def setupNewNote(self, set=True): f = self.mw.col.newNote() if set: self.editor.setNote(f, focus=True) return f def onReset(self, model=None, keep=False): oldNote = self.editor.note note = self.setupNewNote(set=False) flds = note.model()['flds'] # copy fields from old note if oldNote: if not keep: self.removeTempNote(oldNote) for n in range(len(note.fields)): try: if not keep or flds[n]['sticky']: note.fields[n] = oldNote.fields[n] else: note.fields[n] = "" except IndexError: break self.editor.currentField = 0 self.editor.setNote(note, focus=True) def removeTempNote(self, note): if not note or not note.id: return # we don't have to worry about cards; just the note self.mw.col._remNotes([note.id]) def addHistory(self, note): txt = stripHTMLMedia(",".join(note.fields))[:30] self.history.insert(0, (note.id, txt)) self.history = self.history[:15] self.historyButton.setEnabled(True) def onHistory(self): m = QMenu(self) for nid, txt in self.history: a = m.addAction(_("Edit %s") % txt) a.connect(a, SIGNAL("triggered()"), lambda nid=nid: self.editHistory(nid)) runHook("AddCards.onHistory", self, m) m.exec_(self.historyButton.mapToGlobal(QPoint(0,0))) def editHistory(self, nid): browser = aqt.dialogs.open("Browser", self.mw) browser.form.searchEdit.lineEdit().setText("nid:%d" % nid) browser.onSearch() def addNote(self, note): note.model()['did'] = self.deckChooser.selectedId() ret = note.dupeOrEmpty() if ret == 1: showWarning(_( "The first field is empty."), help="AddItems#AddError") return if '{{cloze:' in note.model()['tmpls'][0]['qfmt']: if not self.mw.col.models._availClozeOrds( note.model(), note.joinedFields(), False): if not askUser(_("You have a cloze deletion note type " "but have not made any cloze deletions. Proceed?")): return cards = self.mw.col.addNote(note) if not cards: showWarning(_("""\ The input you have provided would make an empty \ question on all cards."""), help="AddItems") return self.addHistory(note) self.mw.requireReset() return note def addCards(self): self.editor.saveNow() self.editor.saveAddModeVars() note = self.editor.note note = self.addNote(note) if not note: return tooltip(_("Added"), period=500) # stop anything playing clearAudioQueue() self.onReset(keep=True) self.mw.col.autosave() def keyPressEvent(self, evt): "Show answer on RET or register answer." if (evt.key() in (Qt.Key_Enter, Qt.Key_Return) and self.editor.tags.hasFocus()): evt.accept() return return QDialog.keyPressEvent(self, evt) def reject(self): if not self.canClose(): return remHook('reset', self.onReset) remHook('currentModelChanged', self.onReset) clearAudioQueue() self.removeTempNote(self.editor.note) self.editor.setNote(None) self.modelChooser.cleanup() self.deckChooser.cleanup() self.mw.maybeReset() saveGeom(self, "add") aqt.dialogs.close("AddCards") QDialog.reject(self) def canClose(self): if (self.forceClose or self.editor.fieldsAreBlank() or askUser(_("Close and lose current input?"))): return True return False anki-2.0.20+dfsg/aqt/about.py0000644000175000017500000000526512230632354015531 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import aqt.forms from aqt import appVersion from aqt.utils import openLink def show(parent): dialog = QDialog(parent) abt = aqt.forms.about.Ui_About() abt.setupUi(dialog) abt.label.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) def onLink(url): openLink(url.toString()) parent.connect(abt.label, SIGNAL("linkClicked(QUrl)"), onLink) abouttext = "
" abouttext += '

' + _("Anki is a friendly, intelligent spaced learning \ system. It's free and open source.") abouttext += "

"+_("Anki is licensed under the AGPL3 license. Please see " "the license file in the source distribution for more information.") abouttext += '

' + _("Version %s") % appVersion + '
' abouttext += ("Qt %s PyQt %s
") % (QT_VERSION_STR, PYQT_VERSION_STR) abouttext += (_("Visit website") % aqt.appWebsite) + \ "" abouttext += '

' + _("Written by Damien Elmes, with patches, translation,\ testing and design from:

%(cont)s") % {'cont': u"""Aaron Harsh, Ádám Szegi, Alex Fraser, Andreas Klauer, Andrew Wright, Bernhard Ibertsberger, Charlene Barina, Christian Krause, Christian Rusche, David Smith, Dave Druelinger, Dotan Cohen, Emilio Wuerges, Emmanuel Jarri, Frank Harper, Gregor Skumavc, H. Mijail, Ian Lewis, Immanuel Asmus, Iroiro, Jarvik7, Jin Eun-Deok, Jo Nakashima, Johanna Lindh, Kieran Clancy, LaC, Laurent Steffan, Luca Ban, Luciano Esposito, Marco Giancotti, Marcus Rubeus, Mari Egami, Michael Jürges, Mark Wilbur, Matthew Duggan, Matthew Holtz, Meelis Vasser, Michael Keppler, Michael Montague, Michael Penkov, Michal Čadil, Morteza Salehi, Nathanael Law, Nick Cook, Niklas Laxström, Nguyễn Hào Khôi, Norbert Nagold, Ole Guldberg, Pcsl88, Petr Michalec, Piotr Kubowicz, Richard Colley, Roland Sieker, Samson Melamed, Stefaan De Pooter, Silja Ijas, Snezana Lukic, Susanna Björverud, Sylvain Durand, Tacutu, Timm Preetz, Timo Paulssen, Ursus, Victor Suba, Volodymyr Goncharenko, Xtru %s 黃文龍 """% _(" and")} abouttext += '

' + _("""\ The icons were obtained from various sources; please see the Anki source for credits.""") abouttext += '

' + _("If you have contributed and are not on this list, \ please get in touch.") abouttext += '

' + _("A big thanks to all the people who have provided \ suggestions, bug reports and donations.") abt.label.setHtml(abouttext) dialog.adjustSize() dialog.show() dialog.exec_() anki-2.0.20+dfsg/aqt/studydeck.py0000644000175000017500000001152712225675305016423 0ustar andreasandreas# Copyright: Damien Elmes # -*- coding: utf-8 -*- # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * import aqt from aqt.utils import showInfo, openHelp, getOnlyText, shortcut, restoreGeom, saveGeom from anki.hooks import addHook, remHook class StudyDeck(QDialog): def __init__(self, mw, names=None, accept=None, title=None, help="studydeck", current=None, cancel=True, parent=None, dyn=False, buttons=[], geomKey="default"): QDialog.__init__(self, parent or mw) self.mw = mw self.form = aqt.forms.studydeck.Ui_Dialog() self.form.setupUi(self) self.form.filter.installEventFilter(self) self.cancel = cancel addHook('reset', self.onReset) self.geomKey = "studyDeck-"+geomKey restoreGeom(self, self.geomKey) if not cancel: self.form.buttonBox.removeButton( self.form.buttonBox.button(QDialogButtonBox.Cancel)) if buttons: for b in buttons: self.form.buttonBox.addButton(b, QDialogButtonBox.ActionRole) else: b = QPushButton(_("Add")) b.setShortcut(QKeySequence("Ctrl+N")) b.setToolTip(shortcut(_("Add New Deck (Ctrl+N)"))) self.form.buttonBox.addButton(b, QDialogButtonBox.ActionRole) b.connect(b, SIGNAL("clicked()"), self.onAddDeck) if title: self.setWindowTitle(title) if not names: names = sorted(self.mw.col.decks.allNames(dyn=dyn)) self.nameFunc = None self.origNames = names else: self.nameFunc = names self.origNames = names() self.name = None self.ok = self.form.buttonBox.addButton( accept or _("Study"), QDialogButtonBox.AcceptRole) self.setWindowModality(Qt.WindowModal) self.connect(self.form.buttonBox, SIGNAL("helpRequested()"), lambda: openHelp(help)) self.connect(self.form.filter, SIGNAL("textEdited(QString)"), self.redraw) self.connect(self.form.list, SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self.accept) self.show() # redraw after show so position at center correct self.redraw("", current) self.exec_() def eventFilter(self, obj, evt): if evt.type() == QEvent.KeyPress: if evt.key() == Qt.Key_Up: c = self.form.list.count() row = self.form.list.currentRow() - 1 if row < 0: row = c - 1 self.form.list.setCurrentRow(row) return True elif evt.key() == Qt.Key_Down: c = self.form.list.count() row = self.form.list.currentRow() + 1 if row == c: row = 0 self.form.list.setCurrentRow(row) return True return False def redraw(self, filt, focus=None): self.filt = filt self.focus = focus self.names = [n for n in self.origNames if self._matches(n, filt)] l = self.form.list l.clear() l.addItems(self.names) if focus in self.names: idx = self.names.index(focus) else: idx = 0 l.setCurrentRow(idx) l.scrollToItem(l.item(idx), QAbstractItemView.PositionAtCenter) def _matches(self, name, filt): name = name.lower() filt = filt.lower() if not filt: return True for word in filt.split(" "): if word not in name: return False return True def onReset(self): # model updated? if self.nameFunc: self.origNames = self.nameFunc() self.redraw(self.filt, self.focus) def accept(self): saveGeom(self, self.geomKey) remHook('reset', self.onReset) row = self.form.list.currentRow() if row < 0: showInfo(_("Please select something.")) return self.name = self.names[self.form.list.currentRow()] QDialog.accept(self) def reject(self): remHook('reset', self.onReset) if not self.cancel: return self.accept() QDialog.reject(self) def onAddDeck(self): row = self.form.list.currentRow() if row < 0: default = self.form.filter.text() else: default = self.names[self.form.list.currentRow()] n = getOnlyText(_("New deck name:"), default=default) if n: self.mw.col.decks.id(n) self.name = n # make sure we clean up reset hook when manually exiting remHook('reset', self.onReset) QDialog.accept(self) anki-2.0.20+dfsg/aqt/modelchooser.py0000644000175000017500000000525612225675305017111 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * from anki.hooks import addHook, remHook, runHook from aqt.utils import shortcut import aqt class ModelChooser(QHBoxLayout): def __init__(self, mw, widget, label=True): QHBoxLayout.__init__(self) self.widget = widget self.mw = mw self.deck = mw.col self.label = label self.setMargin(0) self.setSpacing(8) self.setupModels() addHook('reset', self.onReset) self.widget.setLayout(self) def setupModels(self): if self.label: self.modelLabel = QLabel(_("Type")) self.addWidget(self.modelLabel) # models box self.models = QPushButton() #self.models.setStyleSheet("* { text-align: left; }") self.models.setToolTip(shortcut(_("Change Note Type (Ctrl+N)"))) s = QShortcut(QKeySequence(_("Ctrl+N")), self.widget) s.connect(s, SIGNAL("activated()"), self.onModelChange) self.models.setAutoDefault(False) self.addWidget(self.models) self.connect(self.models, SIGNAL("clicked()"), self.onModelChange) # layout sizePolicy = QSizePolicy( QSizePolicy.Policy(7), QSizePolicy.Policy(0)) self.models.setSizePolicy(sizePolicy) self.updateModels() def cleanup(self): remHook('reset', self.onReset) def onReset(self): self.updateModels() def show(self): self.widget.show() def hide(self): self.widget.hide() def onEdit(self): import aqt.models aqt.models.Models(self.mw, self.widget) def onModelChange(self): from aqt.studydeck import StudyDeck current = self.deck.models.current()['name'] # edit button edit = QPushButton(_("Manage")) self.connect(edit, SIGNAL("clicked()"), self.onEdit) def nameFunc(): return sorted(self.deck.models.allNames()) ret = StudyDeck( self.mw, names=nameFunc, accept=_("Choose"), title=_("Choose Note Type"), help="_notes", current=current, parent=self.widget, buttons=[edit], cancel=True, geomKey="selectModel") if not ret.name: return m = self.deck.models.byName(ret.name) self.deck.conf['curModel'] = m['id'] cdeck = self.deck.decks.current() cdeck['mid'] = m['id'] self.deck.decks.save(cdeck) runHook("currentModelChanged") self.mw.reset() def updateModels(self): self.models.setText(self.deck.models.current()['name']) anki-2.0.20+dfsg/locale/0000755000175000017500000000000012256150154014510 5ustar andreasandreasanki-2.0.20+dfsg/locale/ro/0000755000175000017500000000000012256137063015134 5ustar andreasandreasanki-2.0.20+dfsg/locale/ro/LC_MESSAGES/0000755000175000017500000000000012065014111016703 5ustar andreasandreasanki-2.0.20+dfsg/locale/ro/LC_MESSAGES/anki.mo0000644000175000017500000011401312252567246020206 0ustar andreasandreasH\$00 001"1+1 -1718J1111"1$1$2&+2R2"q2222$2 23030H3y33&3 33(334,)4V4*i44,4 44(45"5&5*5/535 75A5J5]5f5 l5w5}555 555 55 555566%686?60E6 v66 6 666666`7b7e7j7r7y7~7777T777,7()8R8!q88f89 (959 G9 T9_9o999e9:7: ::5;XH;Y;8; 4< @<K<O< j< t<~< < << <<<< <$< = == -= 7=%B=Kh==N=">#;>_>d> {>>R>w>7f? ?w?E"@h@o@~@#@@ @@(A,A 4AAA UAbA{AA A AAAAAAB B"B*B=BMBSBqBvB2C9C>CFCMCTC mC wC CCCCC C3CDSDnDwD~D D DDDDD"DE&E CEOE VEbE sE EEEEEE-EF F(F:F5LF FFF8F5FP G7^GGG GGGGG GGHHHH$H+H2H9H@HGH NH [H hH uH H H H HHHH H HHH II (I5IJIdI}IIII I I II I/I!J'J`>&aCea/aEab!=b7_b:b;b)c'8c=`c cc<c c d<$daddCdd?e$AeHfe ee:effff f$f (f 3f?f Vf `f kfxffffff f fff!f gg.g=gMgcgkg8rg g g g gggghhhhhhhhhhhi^idifiG|i9i'i"&jIj|ajjjk k %k1kAk\kukkl6l lmPmXhmomI1n{n nn"n nnn o o,o=o Qo ^o jovo$oooooo9ob7pp_p$q49qnqsqqqqq#rHr s-sZs t)t =tIt#et tt>tu uu+u=uTucuiu ~uuuu$uu vv.v6vHv Xv'fv vvHwPwUw]wdwkwwwwwwwwx:xMxXdx xx xxxxy/yGy-^yy+yyy yyy zz#zBz/Yzz6z zz1z {4!{V{ h{r{Dz{5{c{DY|!||||||} }}&}-}4};}B}I}P}W}^}e} l} y} } } } } } }}}}} }}~$~4~I~]~!}~~~~,~  -FM4_8  )7GYj}63΀%$( MZ$b Aف 8C]v   ÂԂ ;DM^ g*҃ ۃ&% ;GNW jv~ӄ  ". AMci p{х օ" 3;B@F؆@Yn LJЇ - BNTc kx %J %;Ugz ĉˉ ԉ-AGN R^y Ȋڊ%,.Fu { )؋   )5!Df8̌Ԍ$ %2DUt ȍ ܍$ &- JVg%w-,ˎ)"A+m}"Ώ"%6J"Y | 06Scl%q5+͑,(&>OG ԓ[<D   ,7VZ c9q •"֕`$Z%ږ ,68=DSZbfŗ̗ ϗڗ d>%~C,p   v q pu<GYT [0$_?2~YP\EUAB?$S7r,0Eks(*8  `H8+8}9 6FE/(=gt.:n"9T '={6Ax@G1<y/@}BLy&Ztz!ob3DGhD:W6&|eI"!^-BL3ZmJ[/X 2HwNV]^k,4)-(z?.c0|1lW #bM+%UuFA7oc'g]4JXM"d@NQhO521aQ<5=P Is.&S>*l;%;O9_i$j#5K Fm'Re) D>+ -;af*qV`4fxC#w3n!HrvjC):R{Ki \ 7 Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2.0 DeckAnki Deck PackageAnki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAre you sure you wish to delete %s?At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser AppearanceBrowser OptionsBuildBulk Remove Tags (Ctrl+Alt+T)BuryBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted.Deleted. Please restart Anki.DescriptionDialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...EndEnter tags to add:Enter tags to delete:Error during startup: %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields...Fil&tersFile was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFlipFolder already exists.Font:FooterForecastFormFrontFront PreviewFront TemplateGeneralGet SharedGoodHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHoursIf you have contributed and are not on this list, please get in touch.If you studied every dayIgnore caseIgnore this updateImportImport FileImport failed. Import optionsIn media folder but not used by any cards:Include scheduling informationInclude tagsIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid password.Invalid regular expression.Italic text (Ctrl+I)KeepLaTeXLaTeX equationLapsesLast CardLatest ReviewLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeftLongest intervalLowest easeManage Note Types...Map to %sMap to TagsMarkMarkedMaximum intervalMinimum intervalMinutesMoreMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New position (1...%d):No cards are due yet.No mature cards were studied today.No unused or missing files found.NoteNote TypeNote TypesNote suspended.NothingOKOnly new cards can be repositioned.OpenOptionsOptions...Password:PercentagePlease select a deck.PreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...RandomRecord audio (F5)Recording...
Time: %0.1fRemove TagsRenameRename DeckRepositionReposition New CardsReposition...RescheduleReverse text direction (RTL)Review CountReview TimeReviewsReviews due in deck: %sRightSave ImageSearchSearch within formatting (slow)SelectSelect &AllShow AnswerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderSize:Some settings will take effect after you restart Anki.Sort FieldSpaceStarting easeStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudy DeckStudy Deck...Study NowSupermemo XML export (*.xml)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing...TagsTextThe default deck can't be deleted.The division of cards in your deck(s).The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The time taken to answer the questions.There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.This file exists. Are you sure you want to overwrite it?To ReviewTo study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeUndo %sUnseenUsed on cards but missing from media folder:Version %sWelcomeWhole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour Decks[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifehelphidehourshours past midnightmapped to %smapped to Tagsminsminutesmoreviewssecondsthis pagewwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-09-04 08:31+0000 Last-Translator: Nicolae Turcan Language-Team: Romanian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 == 0) && (n != 0))) ? 2: 1)); X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: ro Stop (1 din %d) (oprit) (pornit) Are %d card. Are %d carduri. Are %d carduri.%% corecte%(a)0.1f %(b)s/zi%(a)d din %(b)d note actualizate%(a)d din %(b)d note actualize%(a)d din %(b)d note actualize%(a)dkB încărcare, %(b)dkB descărcare%(tot)s %(unit)s%d card%d carduri%d carduri%d card șters.%d carduri șterse.%d carduri șterse.%d card export at.%d carduri exportate.%d carduri exportate.%d card important.%d carduri importate.%d carduri importate.%d card studiat în%d carduri studiate în%d carduri studiate în%d card/minut%d carduri/minut%d carduri/minut%d pachet actualizat.%d pachete actualizate.%d pachete actualizate.%d grup%d grupuri%d grupuri%d notiță%d notițe%d notițe%d notă adăugată%d note adăugate%d note adăugate%d notă importată.%d note importate.%d note importate.%d notă actualizată%d note actualizate%d note actualize%d repetiție%d repetiții%d repetiții%d selectată%d selectate%d selectate%s deja există pe spațiul tău de lucru. Îl înlocuiești?Copie a %s%s zi%s zile%s de zile%s zi%s zile%s de zile%s șterse.%s oră%s ore%s de ore%s oră%s ore%s de ore%s minut%s minute%s de minute%s minut.%s minute.%s minute.%s minut%s minute%s de minute%s lună%s luni%s de luni%s lună%s luni%s de luni%s secundă%s secunde%s de secunde%s secundă%s secunde%s de secunde%s de șters:%s an%s ani%s de ani%s an%s ani%s de ani%sd%sh%sm%smo%ss%sy&Despre...&SuplimenteVerifică baza de dateTo&ceală&Editează&Exportă...&Fișier&Caută&Mergi&Ghid&Ghid…A&jutor&Importă&Importă...&Inversează selecțiaCartea ur&mătoareDeschide dosarul cu suplimente...&Preferințe...Cartea a&nterioară&Re-planifică&Suport Anki…Schimbă profilul ...Unel&teR&efă'%(row)s' are %(num1)d câmpuri, din %(num2)d prevăzute(%s corecte)(sfârșit)(filtrate)(învățare)(nou)(limita părintelui: %d)(te rog să selectezi 1 card)…Fișierele .anki2 nu sunt făcute pentru import. Dacă încercați să restaurați dintr-o copie de siguranță, vă rog să consultați secțiunea 'Backups' a manualului de utilizator./0d1 101 lună1 an10AM10PM3AM4AM4PMS-a primit eroarea de pauză de intrare 504. Te rog să dezactivezi temporar antivirusul tău.: și%d card%d carduri%d carduriDeschide dosar copii de siguranțăAccesează website-ul%(pct)d%% (%(x)s din %(y)s)%Y-%m-%d @ %H:%M Backup
Anki va crea o copie de rezervă a colecției de fiecare dată când este închisă sau sincronizată.Format export:Caută:Mărime font:Font:În:Include:Dimensiunea liniei:Înlocuiește cu:SincronizareSincronizare
În acest moment sincronizarea nu este activată; apasă pe butonul de sincronizare din fereastra principală.

Cont obligatoriu

Un cont gratuit este necesar pentru a păstra sincronizată colecția. Te rog, înscrie-te pentru un cont, apoi introdu detaliile tale.

Anki actualizat

Anki %s a fost lansat.

Mulțumiri tuturor celor care au contribuit cu sugestii, rapoarte de erori și donații.Ușurința unui card este mărimea următorului interval în care ați răspuns "bine" la o repetiție.Un fișier numit collection.apkg a fost salvat pe spațiul dvs. de lucru.Nereușite: %sDespre AnkiAdaugăAdaugă (scurtătură: ctrl+enter)Adaugă câmpAdaugă fişierul multimediaAdăugă pachet nou (Ctrl+N)Adaugă tip de notăAdaugă versoAdaugă eticheteAdaugă un card nouAdaugă în:Adaugă: %sAdăugat(e)Adăugate astăziAdaugă duplicat cu primul câmp: %sDin nouRepetate astăziNumărate din nou: %sToate pacheteleToate câmpurileToate cardurile într-o ordine aleatoare (modul toceală)Toate cartelele, notele şi fișierele multimedia pentru acest profil vor fi şterse. Eşti sigur?Permite HTML în câmpuriA apărut o eroare într-o extensie.
Te rog să o postezi pe forumul de extensii:
%s
A apărut o eroare la deschiderea %sO imagine a fost salvată pe suprafața ta de lucru.AnkiPachet Anki 1.2 (*.anki)Pachet Anki 2.0Grup de pachete AnkiAnki este un sistem de învățare spațiată, inteligent și ușor de folosit. Este liber și are surse publice.Anki nu a fost capabil să se încarce vechiul fişierul de configurare. Te rog să folosești Fișier> Importă pentru a importa pachetele tale de la versiunile anterioare Anki.ID-ul AnkiWeb sau parola au fost incorecte, te rog să încerci din nou.ID-ul AnkiWebAnkiWeb a întâmpinat o eroare. Te rog să încerci din nou în câteva minute, iar dacă problema persistă, te rog să trimiți un raport al erorii.AnkiWeb este prea ocupat în acest moment. Te rog să încerci din nou în câteva minute.RăspunsButoane de răspunsRăspunsuriSigur vrei să ștergi % s?Cel puțin o etapă este necesară.Adăuga imagini/audio/video (F3)Redare automată audioSincronizare automată la deschiderea / închiderea profiluluiMedieMedia de timpTimp mediu de răspunsUșurință medieMedia zilelor studiateInterval mediuVersoPrevizualizare versoȘablon versoSalvări de siguranțăDe bazăDe bază (și cu card întors)De bază (opțional cu card întors)Text îngroșat (Ctrl+B)RăsfoireRăsfoire && Instalare…BrowserAfișări browserOptiuni browserConstruieşteȘterge grupul de etichete (Ctrl+Alt+T)ÎngroapăAnki detectează caracterul dintre câmpuri, cum ar fi taburi, virgule, etc. Dacă Anki nu detectează corect caracterul, îl puteți specifica aici. Folosiți \t pentru tab.AnulareCardCard %dCard 1Card 2Informații card (Ctrl+Shift+I)Listă carduriTip cardTipuri de carduriTipuri de card pentru %sCard suspendat.Cardul a fost un parazit.CarduriTipuri de carduriCardurile nu pot fi mutate manual într-un pachet filtrat.Carduri în Plain TextCardurile vor fi automat returnate în pachetul lor original după ce le vei fi repetat.Carduri…CentratModificăSchimbă %s în:Modifică pachetSchimbă tipul noteiSchimbă tipul notei (Ctrl+N)Schimbă tipul notei…Schimbă culoarea (F8)Schimbă pachetul în funcție de tipul noteiSchimbatVerifică fișierele din dosarul multimediaSe verifică…AlegeAlege pachetAlege tipul noteiAlege eticheteleClonează: %sÎnchideÎnchid și pierd ce ați introdus?Test cu cuvinte lipsăȘtergere test cu cuvinte lipsă (Ctrl+Shift+C)Cod:Colecția este coruptă. Te rog să verifici manualul.Două puncteVirgulăConfigurează limba interfeței și alte opțiuniConfirmați parola:Felicitări! Ai terminat acest pachet pentru moment.Se conectează...ContinuăCopiazaRăspunsuri corecte pentru cardurile mature: %(a)d/%(b)d (%(c).1f%%)Corecte: %(pct)0.2f%%
(%(good)d of %(tot)d)Nu s-a putut conecta la AnkiWeb. Te rog să verifici conexiunea la rețea și să încerci din nou.Nu s-a putut efectua înregistrarea audio. Ai instalat lame şi sox?Nu s-a putut salva fişierul: % sTocealăCreează pachetCreează pachet filtrat…CreatăCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulateCumulate %sRăspunsuri cumulateCarduri cumulatePachetul curentTipul notei curente:Studiu personalizatSesiunea de studiu personalizatPași personalizați (în minute)Personalizare carduri (Ctrl+L)Personalizare câmpuriTăiereBază de date reconstruită și optimizată.DataZile studiateDezautorizeazăConsolă pentru depanarePachetÎnlocuire pachetPachetul va fi importat dacă un profil este deschisPacheteIntervale de scădereImplicitAmână până când repetițiile sunt afișate din nou.ȘtergeȘterge %s?Șterge carduriŞtergere pachetȘterge goaleȘterge notițaȘterge notițeleȘterge eticheteȘterge nefolositeȘtergi câmpul de la %s?Ștergi tipul de card '%(a)s' împreună cu %(b)s lui?Ștergi acest tip de notă și toate cardurile lui?Ștergi acest tip de notă nefolosit?Ștergi fișierele media nefolosite?Ștergere...Şters.Șters. Te rog să repornești Anki.DescriereDialogElimină câmpDescărcarea a eşuat:% sDescarcă de la AnkiWebDescărcarea s-a efectuat cu succes. Te rog să repornești Anki.Descărcare de la AnkiWeb...ProgramateDoar cardurile programateProgramate pentru mâineIeși&reUșurințăUșorBonus ușorInterval ușorEditeazăEditează %sEditează curentEditează HTMLModificare...ModificatEditare fontModificările au fost salvate. Te rog să repornești Anki.GoleșteCarduri goale…TerminăScrieți etichetele de adăugat:Scrieți etichetele de șters:Eroare în timpul pornirii aplicației: %sExportăExportă...ExtraFF1F3F5F7F8Câmpul %d al fișierului este:Transformare câmpuriNume câmp:Câmp:CâmpuriCâmpuri pentru %sCâmpuri...Fil&treFişierul lipseşte.FiltruFiltru:FiltratePachet filtrat %dGăsește &dubluri...Găsește dubluriCaută și î&nlocuieșteCaută și înlocuieșteSfârșitPrimul cardPrima recapitulareInverseazăDosarul există deja.Font:SubsolPreviziuneFormularFațăPrevizualizare fațăȘablon fațăGeneralitățiObține partajateBineEditor HTMLDificilAveți instalate latex și dvipng?AntetAjutorCea mai mare ușurințăIstoricAcasăOreDacă ați contribuit dar nu sunteți pe listă, contactați-ne.Dacă ai studiat în fiecare ziIgnoră majusculeleIgnoră această actualizareImportăImportă fișierImport eșuat. Opțiuni la importareSe află în dosarul media, dar nu sunt folosite de nicio carte:Include planificareaInclude eticheteCreștere intervaleInformațiiInstalare suplimenteLimba interfeței:IntervalModificator intervalIntervaleCod invalid.Parolă incorectă.Expresie regulată eronată.Text italic (Ctrl+I)PăstreazăLaTeXEcuație LaTeXRateuriUltimul cardUltimele repetițiiÎnvățateLimita de sus pentru cele învățateÎnvățate: %(a)s, Repetate: %(b)s, Reînvățate: %(c)s, Filtrate: %(d)sÎnvățateParazitStângaCel mai lung intervalCea mai mică ușurințăTipuri de note…Transformă în %sTransformă în eticheteMarcheazăMarcateInterval maximInterval minimMinuteMai multMută carduriMută în pachet (Ctrl+D)Mută carduri în pachet:N&otăNumele există.Nume pentru pachet:Nume:RețeaNoiCarduri noiCarduri noi în pachet: %sDoar carduri noiCarduri noi/ziNume nou pentru pachet:Interval nouNume nou:Tip de notă nou:Poziție nouă (1...%d):Niciun card nu este programat încă.Niciun card matur nu a fost studiat astăzi.Nu s-au găsit fișiere nefolosite sau lipsă.NotăTip notăTipuri notăNotă suspendată.NimicOKDoar cardurile noi pot fi repoziționate.DeschideOpțiuniOpțiuni…Parolă:ProcentajTe rog să selectezi un pachet.PreferințePrevizualizarePrevizualizare card selectat (%s)Previzualizare carduri noiPrevizualizare carduri noi adăugate în ultima/ultimeleSe procesează...AleatorÎnregistrează audio (F5)Se înregistrează...
Timp: %0.1fȘterge eticheteRedenumeșteRedenumire pachetRepoziționeazăRepoziționează cardurile noiRepoziționează…Re-planificăDirecție inversată a textuluiNumăr repetițiiTimpul repetărilorRepetițiiRepetiții programate în pachet: %sDreaptaSalvează imagineCautăCaută în formatări (lent)SelecteazăSelecte&ază totArată răspunsArată cardurile noi după repetițiiArată cărțile noi înaintea recapitulăriiArată cărțile noi în ordinea adăugăriiArată cărțile noi în ordine aleatoareMărime:Unele configurări vor intra în vigoare după ce reporniți AnkiSortează câmpSpațiuStart ușurințăPas:Pași (în minute)Pașii trebuie să fie numere.Curăță HTML la lipirea textuluiStudiate astăzi: %(a)s în %(b)s.Studiate astăziStudiază pachetStudiază pachet…Studiază acumXML exportat din Supermemo (*.xml)SuspendăSuspendă cardSuspendă notăSuspendateSincronizarea fişierelor audio şi a imaginilorSe sincronizează multimedia...Sincronizarea a eşuat: %sSincronixarea a eşuat; conectarea la server a eşuat.Sincronizare...EticheteTextPachetul implicit nu poate fi şters.Împărțirea cardurilor în pachetul/pachetele tale.Numărul de întrebări la care ai răspunsNumărul de repetiții programate în viitorDe câte ori ați apăsat fiecare buton.Timpul de care a fost nevoie pentru a răspunde întrebărilorMai există carduri noi valabile, dar a fost atinsă limita zilnică. În Opțiuni, poți mări limita, dar te rog să ții cont de faptul că, introducând mai multe carduri noi, volumul de muncă al repetițiilor pe termen scurt va deveni mai mare.Fișierul există. Sunteți sigur(ă) că vreți să îl suprascrieți?De revăzutPentru a studia peste programul normal, fă clic pe butonul de mai jos Studiu personalizat.AstăziA fost atinsă limita repetițiilor pentru astăzi, dar încă există carduri care așteaptă să fie repetate. Pentru o memorare optimă, ia în considerare creșterea limitei zilnice în opțiuni.TotalTimp totalTotal carduriTotal noteȘirul este expresie regulatăTipRefă %sNevizualizateFolosite în carduri, dar care lipsesc din dosarul media:Versiunea %sBun venitÎntreaga colecțieDoriți să îl descărcați acum?Scris de Damien Elmes, cu îmbunătățiri, traduceri, testare și design din partea:

%(cont)sNu ți-ai înregistrat încă vocea.Trebuie să ai cel puțin o coloană.TinereTinere + învățatePachetele dumneavoastră[fără pachet]copii de rezervăcarduricarduri din pachetcarduri selectate decolecțiezzilepachetviață pachetajutorascundeoreore trecute de miezul nopțiitransformat în %stransformat în eticheteminuteminutemorepetițiisecundeaceastă paginăwîntreaga colecție~anki-2.0.20+dfsg/locale/bn/0000755000175000017500000000000012256137063015113 5ustar andreasandreasanki-2.0.20+dfsg/locale/bn/LC_MESSAGES/0000755000175000017500000000000012065014110016661 5ustar andreasandreasanki-2.0.20+dfsg/locale/bn/LC_MESSAGES/anki.mo0000644000175000017500000000554212252567245020172 0ustar andreasandreas.= (= CNTZ^d lw    &*>OU^djs|2%4Z$s1   )4K_)v&/  % @ O S U W )a & %     ) 9 O b ;l .     / E X "(, )+ $#& ! %.* '-%%d selected%d selected%s copy%s minute%s minutes%s second%s seconds&Edit&Export...&File&Find&Go&Help&Import&Import...&Invert Selection&Next Card&Preferences...&Previous Card&Tools&Undo(new).../:AddAdd FieldAdd TagsAgainAll FieldsAnswersAverageBackBasicCardsCenterDefaultDueError executing %s.Error running %sExtraForecastFrontHoursIntervalLearningLeftProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:38+0000 Last-Translator: Damien Elmes Language-Team: Bengali MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:43+0000 X-Generator: Launchpad (build 16869) Language: bn %%d টি নির্বাচিত%s অনুলিপি%s মিনিট%sমিনিট%s সেকেন্ড%s সেকেন্ড&সম্পাদনা&রপ্তানি...ফা&ইল&অনুসন্ধানযা&ও&সহায়িকা&আমদানি&আমদানি...নির্বাচন &উল্টো&পরবর্তী কার্ড&পছন্দসমূহ...পূর্ব&বর্তী কার্ড&টুলসবাতিল &করো(নতুন).../:যোগক্ষেত্র যোগ করোট্যাগ যোগ করুনআবারসবকটি ক্ষেত্রউত্তরগড়পেছনে যাওসাধারণকার্ডকেন্দ্রডিফল্টদেয়%s চালাতে সমস্যা হয়েছে।%s চালুকরণে ত্রুটিঅতিরিক্তপূর্বাভাসসম্মুখঘণ্টাব্যবধানশিক্ষাবামanki-2.0.20+dfsg/locale/en_GB/0000755000175000017500000000000012256137063015466 5ustar andreasandreasanki-2.0.20+dfsg/locale/en_GB/LC_MESSAGES/0000755000175000017500000000000012065014110017234 5ustar andreasandreasanki-2.0.20+dfsg/locale/en_GB/LC_MESSAGES/anki.mo0000644000175000017500000020650612252567245020550 0ustar andreasandreasV|5xGyG GGG"GG GGG8G%H>HOH"`H$H$H&HH"I6IIIZI$wI III0IJ#J&2J YJeJ(vJJJ,JJ* K6K,KK xKK(KKKKKKK KKKKL LLL%L)L 0L:L@L HLSL eLpLLLLLLLL0L M%M +M 6MAMGMZMqMuMNNN NNN N%N)N-NT1NNN,N(NN!O5OfMOO OO O OPP#P8PeOPP7_Q QQ5QXQYCR8RkR BS NSYS]S xS SS S SS SSSS S$ST T+T ;T ET%PTKvTTNT"&UIU#`VVVV WWEXWXRXv.YwY7Z UZwaZEZ@[`[g[v[R~[[T\#o\#\\ \\(]9] A]N] b]o]]] ] ]]]]]^^^/^L7^^^^^^^ ^ ^)_'+_S_```#`*`1`9` R` \` f`q` ```` `3``S a`aiapa wa aaaaa"abb&b EbQb Xbdb ub bbbbbb-bc cc(-cVc5hc ccc8c5cP)d7zddd dddde ee$e+e2e9e@eGeNeUe\ece je we e e e e e eeee e eff $f1f DfQffffffff f f ff f/ g=gCgXg%`gg g g g g g g g gg,h(4h]h{h hFhNhP0i>iPijj]8j j8jj jjk)kDk`kdk skkkk k kkk k kkkk k!kl#l)2l0\lll4l!llm'm=mVmjm{m mmmmmmmmm m mmm mm nn, nMn_nfnnnwnnnnnn n nnN oXoloqooooEpNpSpnppp ppppp ppp qq$qBqIq Nq[qcqhqyq.qFqqr .r4:rorr r1rrrrs*sEs tt uu"=u"`u uuuuuuu u v v)5v_vqvvw(w=w[wzwwwww w wwww<w+x4x :xGxWx\x ex+pxxx xxx x xx x yy#y*y;yOyUyfynyyy y yyyy yy zzz z&zU!Fw*(1D,I/y'it#de{8ؖC(r &au /M Û!ϛ'<C[`h}.&ڜ &+=,U U $86o(Js"WS0S$"̢ Ң ޢ{e^f5ŤU Zdlr  èȨͨӨ%(08 >HJ[]: ALS"Y| ~8"!$D$i&"Ԭ $8 ]~0ܭ& &(7`u,*̮, 9G(X ɯ ϯگ   &1IYhw0 ٰ 26ıƱɱαֱݱTHJ,`(!ղfv  óӳew7! Yc5vfY8ms  &15 P Zd z   $̷   %(KNN"!#8\ax p~/Rvw}7 -w9E@8?NRV,#G#k ( & :G`q v L\o )'+  * 4 >I [hx 3S8AH O ]iz"& ) 0< M Yci-(.5@ v85P7R   &-4; B O \ i v    )>Xq  /0%8^ e p } ,( 5S hFrNP>YP] n8z ):> MZ`e j u  !) 06g}4!0DU \flnqtwz}   ,'9@HQbv N2FKbho(-HZt z  $# (5=BS.YF 4I\ c1o*  "": ]~ )9K5TY_n~ < !16 ?+Jv   )/@Hb|    %3 B OYh+#! BG O Y<d ]a~! , #ke jx  ! 7AX^| ,#)VI8E6Mj,-+8=v # 7@ Q_dk{ #i>   " * 51@ r}  -.\d|  VN ^h,-GH   "@^*}'!>678n !?$* : HSYl  7Jg * 'dF  (( B cX+" &,S0m+>U F_*(1,,Ia'Qty#dec8C(ri au/iM !'$+CHPe.l& &%,=j q|U$8W)2\"mWS0<$m"  {N^O5U  C M U [ o                   !  ' 1 3 D  7.^(}'Z)2 q+UTD4`CV=X9 J :d=k"Jb#$+Wo!VS,~Sn~n&B+PQ>yF1ElY  ;ht~`r6l,"YFWB`O [a)88 !dgM/z U:3Z0I f=_])LL *\h_xK<Y\Dw>V;/Fv.OzfeRQUo|EeX&p1-B+84yvWE&<G t %p:.CH3OK|*ti?/R$9zP$80'j^g 'p!H6Zm  G;]d(_G>eCo3%x MrP yF\0jTI'@{I3cN7{xq1#j?IH4ND"N*uv6HwBJw75%5AAu9]D;L<*K:m k{)@^(EO$VSs%}il gA4-?C[?a[KiNLu!b|bT"TRksJ(QM0fc=9,52&675hqSnm#-a.XR/c1G2}>2#AQ  sU-@<r,PM@  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaCompress backups (slower)Configure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-12-09 20:41+0000 Last-Translator: Anthony Harrington Language-Team: English (United Kingdom) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) Language: Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you are trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronised.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronisation
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronised. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports, translations and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while synching media. Please use Tools>Check Media, then synchronise again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licenced under the AGPL3 licence. Please see the licence file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CentreChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaCompress backups (slower)Configure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customise Cards (Ctrl+L)Customise FieldsCutDatabase rebuilt and optimised.DateDays studiedDeauthoriseDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogueDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customiseEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database and, if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the contents of the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimising...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomise orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:RescheduleRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed for a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronise audio and images tooSynchronise with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; no internet connection.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name has already been used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronise your collection. If you have reviews or other changes waiting on another device that haven't been synchronised here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronised along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~anki-2.0.20+dfsg/locale/zh_TW/0000755000175000017500000000000012065014111015531 5ustar andreasandreasanki-2.0.20+dfsg/locale/zh_TW/LC_MESSAGES/0000755000175000017500000000000012065014111017316 5ustar andreasandreasanki-2.0.20+dfsg/locale/zh_TW/LC_MESSAGES/anki.mo0000644000175000017500000020316712252567246020632 0ustar andreasandreasP5GG G+G2G"8G[G ]GgGzG8GGGG"H$#H$HH&mHH"HHHH$I N(kNN!NNfNTO jOwO O OOOOOeOUP7P 7QAQ5TQXQYQ8=R vR RRR R RR R RR RSSS S$(SMS SS_S oS yS%SKSSN T"ZT}T#UUUU VVyWWRXvbXwX7QY YwYE Z@SZZZZRZ[[#[#[[ \+\(D\m\ u\\ \\\\ \ \\\\]4]G]N]c]Lk]]]]]]^ !^ +^)5^'_^^C_J_O_W_^_e_m_ _ _ __ ____ _3_,`S@```` ` ````a"a:aBa&Ra yaa aa a aaaaab- b;bAb(Gbpb5b bbb8b5 cPCc7ccc cc ddd "d-d>dEdLdSdZdadhdodvd}d d d d d d d d dddd e ee-e >eKe ^ekeeeeeee e e ff f/'fWf]frf%zff f f f f f f f f g,!g(Ngwgg gFgNgPJh>hPh+i4i]Ri i8ii i jj)4j^jzj~j jjjj j jjj j jjjk k!k7k=k)Lk0vkkk4k!kl+lAlWlplll lllllllll l lll mm 'm1m,:mgmymmmmmmmmm m m n#n(n?nEnLnno o%o7oQo Woeoto|oo ooo oo$oop pppp0p.6pFeppp p4p&q9q @q1Lq~qqqq*qq ss ss"s"t :t[tptutttt t t)ttu#u:uOumuuuuuu u uuuu<v=vFv LvYvivnv wv+vvv vvv v w w ww.w5wa i1t  ΃  ,K-b ˄҄ V+ ,LaG| Ć  '9Vt*'܇!&@,6m8 ݈!? JZ` p ~։    !+FNm ͊ ڊ *0A!Tdv ۋ *(/X rX+"3&V}0+ȍ>U3F*Ў(1$V,IA'{t#d(e8#C(r  .8au/MØ ə ՙ!'&NUmrz.&Ś &=O,g Uś$#8H(\"WS0e$"ޠ {w^x5ע U lv~  ˦զڦߦ*/7:BJ PZ\mo ) 7 AK]_h{(ש  2Mc w ֪ 0 %/5 I Vbv ë ׫ $*9J^ u  ά ٬ "7H\m| 4 ޭ -ByF®Ǯ ̮֮ݮJ>B[+v!TO ftͰްZM3!N6Zp,Q~  ̳ٳ  % 2 ? J T'a ! Ѵ ޴&E"XW{ӵ, bYVkr¹15 ghs;ܺ;T [e?lc!;Zm3׼ ޼ *7 > KX _i#Žܽ5"8N Uv $Ⱦ'Ŀ ˿տ޿  &3E[k{ *<  .;Ni! !   - :GN nx *! " /93@4tM5- ? LYry     * 7 DQX_f m w   > E R_o v' % 5 B O\o<0$! ?"I"l("'  f-6 "3LS f s ~    &'N U-bAB#3Ws   # <I Yc jw $ (;Rbiy ]d!k %, HV,Z #B,Hg9w  9  ; H0Ud  $'=e' ' ERk{ 1 AJN  04DT[b u   #B I Vc    5Q gt!$;`g p }4Tc@08tu|  $6[ cp!w -!-9Hg1T7HY(r'$-;B~ !  (BI\ov }  ' 6C]Y   $-R b9o $#H$^ !  I4~7UkE  .!Df*! .E81~9 '-M ]gw  * =!Jls  #*Ndw] !18M]*dG%A!Z|-GD*6o!"?[;(kG`3'6#]xm fKN(/ !7Sfv } -/  "%)O`.z Z0*76bSHX|rN)>hx  c#dBg q~ 3:AELP Waeu7,\"w~%Z', zq% UN>.`=7X3D 8b7iJb!"+Qm!P,x}Mh|n${@)PO<w@+ElY9hn}Z0f&S@W<^I[a#82^gG-xS41X*G`; _W)FL(Vb]vI<W\Du8T5)Ft(OdcLKOo{?_R p++<%24yvUC 6Er n4(AF-IEz$ti?)P3tJ6*!jXe 'jB6Tk A;] d"YG8eCi3r KrJ spDZ.dNC!:|zI-]H1uxo/#h=CB . LB"N*up0HqBDw55#/?;s9[>~5F:$K:mky#: ^&?M$VQm%{gja;2'9=U9_}YEcHJo\v`T RLesH(QM0fyM  c=7*/0&4 13fkSlg-[.VR/~a1A2|>,AK  qOP '@6l&NG>  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: PACKAGE VERSION1 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-10-26 03:37+0000 Last-Translator: wlhunag Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) 停止 (%d分之 1) (關閉) (開啟) 有 %d 張卡片%% 正確%(a)0.1f %(b)s/天%(a)0.1f 秒 (%(b)s)在%(b)d 筆筆記中更新了 %(a)d 筆上傳%(a)dkB,下載%(b)dkB%(tot)s %(unit)s%d 張卡片刪除了%d 張卡片匯出%d 張卡片匯入 %d 張卡片學習%d張卡片:花費每分鐘%d 張卡片已更新 %d 牌組%d 種組合%d 筆筆記已新增 %d 筆筆記匯入了 %d 筆筆記更新了 %d 筆資料%d 張複習卡選了 %d 張%s 已存在於您的桌面。是否覆蓋它?%s 複本%s天%s 日%s 已刪除%s個小時%s 時%s分鐘%s 分鐘%s 分%s個月%s 月%s秒鐘%s 秒刪除 %s :%s年%s 年%s天%s小時%s分%s 個月%s秒%s年關於Anki(&A)附加元件(&A)檢查資料庫(&C)填鴨式學習(&C)...編輯(&E)匯出(&E)檔案(&F)尋找(&F)前往(&G)用戶指南(&G)用戶指南(&G)說明(&H)匯入(&I)匯入(&I)反向選擇(&I)下一張卡片(&N)開啟附加元件檔案夾...(&O)偏好設定(&P)上一張卡片(&P)重新排程(&R)資助Anki(&S)切換個人檔案(&S)工具(&T)復原(&U)'%(row)s' 行有 %(num1)d 個欄位, 預期 %(num2)d(%s 正確)(結束)(已篩選)(學習中)(新卡片)(母牌組限制: %d)(請選擇一張牌)....anki2 檔案並不是用來匯入用的。如果您想要從備份中回復,請察看用戶手冊中'Backups'一章。/0天1 10一個月一年10AM10PM3AM4AM4PM遇到錯誤:504 gateway timeout。 請暫時關閉您的防毒軟體。: 以及%d 張卡片開啟備份資料夾造訪網站%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%M備份
Anki在您每次關閉或是同步時,都會備份您的收藏。匯出格式搜尋字型大小:字型:位於:包括線條粗細:取代為同步處理同步處理
現在尚未啟用;請按一下主視窗的同步鈕來啟用。

需要有帳號

要讓您的收藏同步需要一個免費的帳號,請註冊一個帳號,並且在下方輸入資料。

Anki 已更新

Anki %s 已經發佈

<忽略><非 unicode 文字><在此處輸入文字以搜尋,或按下 Enter 鍵來顯示目前的牌組>謹向所有曾提供建議、回報錯誤與贊助資金的各位致以莫大的感謝。一張卡片的難易度是當你在複習時回答「中等」時,卡片下次出現的時間間隔。檔案 collection.apkg 已存到您的桌面已終止: %s關於Anki新增新增 (快速鍵: ctrl+enter)新增欄位新增媒體新增牌組 (Ctrl+N)新增筆記類型新增反向的資料新增標籤新增卡片新增至:新增: %s已新增今日新增新增了重複的第一個欄位: %s再一次今日按「再一次」的按了幾次「再一次」: %s全部牌組全部欄位隨機出現所有卡片(填鴨模式)確定要刪除該個人檔案的所有卡片、筆記、媒體檔?允許在欄位中使用HTML語法附加元件出現錯誤
請到附加元件的論壇上回報此問題:
%s
打開 %s 時發生錯誤發生錯誤,可能是個無害的bug,
也可能是您的牌組有問題。

若要排除是您牌組的問題,請執行 「工具」>「檢查資料庫」

假如問題依然沒有解決,請複製以下 訊息,並回報錯誤:圖片已儲存到您的桌面AnkiAnki 1.2 牌組 (*.anki)Anki 2以新的格式儲存你的牌組,這個精靈將會自動 轉換你的牌組至新格式。升級前會先備份你的牌組, 如果你需要還原成舊版本的Anki,你的牌組依然可以使用。Anki 2.0 牌組Anki 2.0 只支援自動升級自 Anki 1.2,如果要讀取舊的牌組,請用Anki 1.2 開啟並且升級它們,再匯入至 Anki 2.0。Anki牌組包Anki 找不到問題和答案之間的水平線,請手動調整樣板以交換問題和答案。Anki 是個好用的智慧型間隔式學習系統,是開放原始碼的自由軟體。Anki 採用AGPL-3.0 授權條款。更多資訊請見軟體原始碼的授權檔案。Anki 無法讀取您舊的設定檔,請按一下「檔案」>「匯入」,以匯入您的舊版 Anki 牌組。AnkiWeb ID或者密碼錯誤;請再試一次。AnkiWeb ID:AnkiWeb 發生錯誤,請幾分鐘後再試一次,如果問題依舊存在,請提交錯誤報告。AnkiWeb 現在相當忙碌,請幾分鐘後再試一次。AnkiWeb 正在進行維護,請幾分鐘後重試一次。答案答題鈕答案防毒軟體或防火牆導致 Anki 無法連至網際網路。空白卡片會被刪除,而筆記如果沒有在卡片上也會遺失。您確定要繼續嗎?出現兩次: %s您確定您要刪除 %s?需要至少一個卡片類型至少要有一步插入圖片/聲音/影像 (F3)自動播放聲音檔在開啟或關閉個人檔案時自動進行同步平均平均時間平均答題時間平均難易度只算學習天數的平均平均間隔背面背面預覽背面樣板備份基本型基本型(含反向的卡片)基本型(可選用反向的卡片)粗體字 (Ctrl+B)瀏覽瀏覽與安裝(&I)...卡片瀏覽器卡片瀏覽器 (顯示 %(cur)d 張卡片; %(sel)s)卡片瀏覽器外觀卡片瀏覽器選項建立批次新增標籤(Ctrl+Shift+T)批次移除標籤(Ctrl+Alt+T)暫時隱藏暫時隱藏卡片暫時隱藏筆記今日暫時隱藏相關的新卡片暫時隱藏相關複習卡直到隔天Anki 會自動偵測欄位間的間隔字元,像是定位字元(tab)或是逗點。 假如 Anki 偵測錯誤的話,您可以在此輸入。 用 \t 以代表 tab。取消卡片卡片 %d卡片 1卡片 2卡片ID卡片資訊 (Ctrl+Shift+I)卡片清單卡片類別卡片類型%s的卡片類型已暫時隱藏卡片擱置卡片了這是榨時卡卡片卡片類型卡片無法手動移到篩選過的牌組純文字的卡片卡片在您複習完以後會自動回歸原本的牌組。卡片...中變更改變 %s 到:改變牌組改變筆記類型改變筆記類型(Ctrl+N)改變筆記類型...改變顏色 (F8)依照筆記類型來更改牌組已改變檢查媒體檔(&M)檢查多媒體資料夾的檔案檢查中...選擇選擇牌組選擇「筆記類型」選取標籤複製: %s關閉關閉並放棄目前的輸入?克漏題克漏字 (Ctrl+Shift+C)代碼:收藏已損毀,請查看用戶手冊。冒號逗號設定介面語言與選項確認密碼:恭喜!您完成本牌組了。連線中...下一步複製熟練卡片的正確答案 %(a)d/%(b)d (%(c).1f%%)正確: %(pct)0.2f%%
(%(good)d of %(tot)d)無法連接上 AnkiWeb。請檢查您的網路連線,然後再試一次。無法錄音喔,您是否有安裝 lame 和 sox ?無法存檔:%s填鴨模式建立牌組建立篩選過的牌組建立Ctrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+Z累計累計 %s累計題數累計卡片目前的牌組目前的筆記類型:自訂學習自訂學程自訂步數(以分鐘為單位)自訂卡片 (Ctrl+L)自訂欄位剪下已重整資料庫並最佳化日期學習天數解除授權除錯指令列牌組覆寫牌組牌組將在個人檔案開啟後匯入牌組間隔由大至小排列預設延遲至複習卡再度出現刪除是否刪除 %s?刪除卡片刪除牌組刪除空卡片刪除筆記刪除筆記刪除標籤刪除未使用的要刪除%s的欄位嗎?刪除 「%(a)s」 卡片類型,以及其 %(b)s 張卡片?刪除此筆記類型,及其中所有卡片?刪除此未使用的筆記類型?要刪除未使用的媒體嗎?刪除...刪除 %d 張遺失筆記的卡片刪除 %d 張遺失樣板的卡片刪除 %d 筆遺失筆記類型的資料刪除 %d 筆缺少卡片的筆記刪除%d 有錯誤欄位數量的筆記已刪除已刪除,請重新啟動Anki如果在牌組列表中刪除這個牌組,其他剩下的卡片也會回歸它們原本的牌組。敘述學習畫面上所顯示的敘述 (僅當前牌組):對話視窗捨棄欄位下載失敗: %s從AnkiWeb下載下載成功,請重新啟動Anki從 AnkiWeb 下載中...到期僅到期的卡片明日到期結束(&x)難易度簡單簡單卡片的間隔倍率簡單卡片晉階的間隔編輯編輯 %s編輯目前的卡片編輯HTML隨您編輯編輯...已編輯編輯字型已儲存修改,請重新啟動 Anki清空空白卡片空的卡片數量: %(c)s 欄位: %(f)s 找到空白卡片,請執行 「工具」>「空白卡片」。清空第一個欄位: %sEnd您想將新的 %s 卡片放在哪個牌組(此欄位可留白):輸入新的卡片順序(1...%s):輸入要添加的標籤:輸入要刪除的標籤:下載錯誤: %s開啟時發生錯誤: %s執行 %s 發生錯誤執行 %s 時發生錯誤匯出匯出...註記FF1F3F5F7F8檔案的第 %d 個欄位:欄位對應欄位名稱:欄位:欄位%s 的欄位%s 分隔各欄位欄位...篩選器(&T)檔案無效,請使用備份回復檔案已遺失篩選器篩選器:已篩選篩選過的牌組 %d尋找重複項目(&D)...尋找重複項目搜尋並取代(&P)...搜尋並取代完成第一張卡片首次復習日期符合第一個欄位: %s反轉資料夾已存在字型:頁腳基於安全性理由,卡片上不可出現〔%s〕。但您仍可將指令放在其他的套件中,並將其匯入LaTeX 標頭中。預測表單前向 & 可選用的反向卡片前向 & 反向卡片在 %(b)s 中找到 %(a)s 。正面正面預覽正面樣板一般生成檔案: %s建立日期: %s取得共享的牌組中等晉階成複習卡的間隔HTML編輯器難您的LaTeX和dvipng已經安裝好了嗎?頭部說明最簡單歷史Home每小時的分析小時未顯示少於30次複習的時段如果您有貢獻但是未列於清單中,請跟我們聯絡。如果您每天學習的話忽略答題時間,若超過忽略大小寫忽略那些第一個欄位與現有筆記吻合的行數忽略更新匯入匯入檔案即使第一個欄位與現有筆記相同,也要匯入匯入失敗. 匯入失敗,除錯資訊: 匯入選項匯入完成在媒體資料夾但未被任何卡片使用:為了確保您的收藏能在不同裝置中運作,Anki 要求您電腦的內部時鐘設定正確。即使系統顯示的當地時間是對的,內部時鐘還是有可能有錯。 請在電腦上的時間設定中確定下列幾點: - 上午 / 下午 - 時間飄移(Clock drift) - 年月日 - 時區 - 日光節約 與正確時間的差異: %s包含媒體包含排程資訊包含標籤增加今日新卡片的數量上限增加今日新卡片的數量上限:增加今日複習卡的上限增加今日複習卡的數量上限:間隔由小至大排列資訊安裝附加元件介面語言:間隔間隔調節器間隔無效的代碼檔案錯誤,請使用備份回復。密碼錯誤無效的正規表達式已長久擱置斜體字 (Ctrl+I)JS error on line %(a)d: %(b)s跳至標籤(Ctrl+Shift+T)保留LaTeXLaTeX 公式LaTeX 數學環境忘記最後一張卡片最近的複習最後加入的先新學習的卡超前進度學習:%(a)s 複習:%(b)s 重複學習:%(c)s 已篩選:%(d)s學習中榨時針對榨時卡的動作成為榨時卡片的門檻為左對齊上限為讀取中...使用密碼鎖定您的帳號,否則留白。最長的間隔尋找欄位:最難管理管理筆記類型對應到 %s對應到標籤標記標記筆記標記筆記(Ctrl+K)標記熟練最長間隔為每天最大複習量媒體至少間隔分鐘新卡與複習卡混合Mnemosyne 2.0 的牌組 (*.db)其他最常忘記移動卡片移動到其他牌組 (Ctrl+D)卡片移動到牌組:筆記(&O)已經有這個名字了牌組名稱:名字:網路新卡片新卡片牌組中新的卡片:%s僅新卡片每天的新卡片數量輸入新的牌組名稱:設定新的間隔為新名稱:新的筆記類型:新選項組的名稱:新的順序(1...%d):次日始於凌晨卡片都尚未到期。沒有卡片符合您的標準沒有空的卡片今天沒有學習熟練的卡片找不到未使用或遺失的檔案筆記記事ID筆記類型筆記類型已刪除一筆筆記以及相關的 %d 張卡片。筆記已暫時隱藏筆記已長久擱置注意:媒體並不會被備份,保險起見,請定期備份 Anki 資料夾。注意:有些歷史紀錄遺失了。請查看卡片瀏覽器說明文件以獲得更多資訊。純文字的筆記筆記至少要有一個欄位記事加上了標籤無確定舊卡先出現下次同步時,進行單方面的強制變更某些筆記沒有產生任何卡片,因此未被匯入。這可能是由於有些欄位是空白的,或是您沒有將文字檔中的內容對應至正確的欄位。僅新卡片能調整順序同一時間內僅容許一個裝置來存取 AnkiWeb,如果之前的同步失敗,請幾分鐘後再試一次。開啟最佳化中...可選用的限制條件:選項%s 的選項選項組:選項...順序依新增順序依到期順序覆寫背面樣板:覆寫字型:覆寫正面樣板:打包的 Anki 牌組 (*.apkg *.zip)密碼:密碼錯誤貼上把剪貼簿圖像存為PNG格式Pauker 1.8 課程 (*.pau.gz)百分比期間: %s排到新卡片佇列之後移到下列期間的複習卡片佇列中:請先新增另一個筆記類型請耐心等待,這可能要一段時間。請連接麥克風,並且確保沒有其他程式佔用音效裝置。請編輯此筆記,加上一些克漏字。(%s)請確定已開啟個人檔案,而且 Anki 不在忙碌中,然後再試一次。請安裝PyAudio請安裝mplayer請先打開個人檔案請執行「工具」>「空白卡片」請選擇一個牌組請僅從一種筆記類型選出卡片請選擇一個牌組請把 Anki 升級到最新版本。請點擊 檔案>匯入 來匯入這個檔案請拜訪 AnkiWeb,升級您的牌組之後再試一次。位置偏好設定預覽預覽選取的卡片(%s)預習新的卡片預習這幾天新增的卡片:處理中...個人檔案密碼...個人檔案:個人檔案需要 Proxy 的授權。問題佇列底端: %d佇列頂端: %d離開隨機隨機順序評等已準備好升級重建錄下自己的聲音錄音 (F5)錄音中...
時間: %0.1f依相對過期程度重複學習新增時,記住上次輸入的內容移除標籤移除格式 (Ctrl+R)移除此卡片類型也同時會刪除幾個筆記,因此請先新建一個卡片類型。重新命名重新命名牌組重播聲音重播自己的聲音移動順序調整新卡片順序移動順序...需要其中一個以上的標籤:重新排程的重新排程依據我在本牌組的回答狀況來重新排程卡片繼續文字反向(RTL)回復至 「%s」 狀態以前複習複習的次數複習的時間提早複習提早複習複習幾天以內忘記的卡片:複習忘記的卡片當日每小時的複習成功率。複習卡牌組中到期的複習卡: %s右對齊儲存圖像範圍: %s搜尋搜尋(含格式,較慢)選擇全選(&A)選擇筆記(&N)選出要排除的標籤:此檔案並非 UTF-8 格式,請參考說明書的〔匯入〕部分。選擇性學習分號找不到伺服器。有可能是您的連線中斷了,或是 Anki 被防毒軟體或防火牆擋住,所以無法連線到網路。要將 %s 裡所有的牌組都設定為此選項組?設定所有子牌組設定前景顏色 (F7)已按下Shift 鍵,略過自動同步,略過載入附加元件。移動現有卡片的順序快速鍵: %s快捷鍵:%s顯示 %s顯示答案顯示重複項目顯示回答計時器先顯示新卡再顯示複習卡在複習前先學習新卡片按創建順序學習新卡片按隨機順序學習新卡片在答案按鈕上顯示下次複習時間複習時顯示剩餘卡片數量顯示統計。快速鍵:%s大小:有些相關的卡片或埋藏的卡片被延遲到下一個階段。部分設定在重新啟動 Anki 後才會生效.忽略了某些更新,因為筆記類型已經改變:排序欄位依此欄位在卡片瀏覽器中排序無法用此欄位排序,請選另一個。聲音 & 圖片空白鍵起始順序:起始難易度統計間隔值:步(單位是分鐘)步必須是數字。貼上文字時去除HTML標記今天花了 %(b)s 學習 %(a)s今日已學習學習學習牌組快速跳到牌組開始學習依卡片狀態或標籤來學習樣式樣式(適用所有卡片)下標 (Ctrl+=)Supermemo XML 匯出檔 (*.xml)上標 (Ctrl+Shift+=)長久擱置長久擱置卡片長久擱置筆記長久擱置同步聲音與影像與AnkiWeb同步。 快速鍵: %s多媒體同步中...同步失敗: %s同步失敗;網路離線您電腦上的時鐘必須正確設定才能同步。請先設定時鐘然後再試一次。同步中...Tab把重複的卡片加上標籤只附上標籤標籤目標牌組(Ctrl+D)目標欄位:文字Tab字元或分號所分隔的文字檔(*)該牌組已存在已經有這個欄位名稱了已經用過這個名字了AnkiWeb 的連接已逾時,請檢查您的網路並且再試一次。無法刪除預設的設定無法刪除預設牌組您牌組中的卡片分類圖表第一個欄位是空的筆記類型的第一個欄位必須相符。不可使用下列字元: %s本卡片的正面是空的,請執行「工具」->「空白卡片」軟體圖示取自多個來源;製作群詳情請見Anki source。您輸入的內容會清空所有卡片上的問題。您已經回答的題數將來會到期的複習卡數量各按鈕已按鍵次數您的系統暫存資料夾權限錯誤,Anki 無法自動更正此問題。請在Anki 說明書中搜尋"temp folder"以獲得進一步資訊。此檔案並非有效的 .apkg 檔無任何卡片符合此搜尋條件,您要試著修改嗎?此變動會使您下一次同步您的收藏時,需要完整上傳您的資料庫。如果同步的話,您其他的裝置上尚未同步的複習卡片或其他變動的部分將會遺失,您是否要繼續?答題佔用的時間升級完成,您已經準備好使用Anki 2.0

下方為更新記錄:

%s

牌組裡還有其他新的卡片,只是您已經達到今天的進度了。您可以 在選項中增加每日卡片數量上限,但請注意,如果您設定更多新 卡片,那麼您短期複習量的負荷就會隨之增加。至少要有一個個人檔案本欄位無法進行排序,但您可以在個別的卡片類型中搜尋,例如「card:卡片一」。此欄位無法進行排序,不過您可以點一下左側的牌組,以搜尋特定牌組。此檔案看來不是有效的 apkg 檔,如果您是從 AnkiWeb 下載檔案後收到此錯誤訊息,那有可能是下載失敗。請再試一次,如果又發生錯誤,請換另一個網頁瀏覽器再試一次。檔案已經存在了, 請問您要覆蓋檔案嗎?為了方便您備份, Anki 將您所有的 資料都存在此一資料夾中。 如果要更改 Anki 資料夾的位置 請參考: %s 這是專門用來進行額外學習進度的牌組。這是克漏字的{{c1::範}}例。這樣會刪除您原本的收藏,並以現在要匯入的檔案覆蓋之。您確定嗎?此精靈會在升級至 Anki 2.0 的過程中引導您。 請仔細閱讀以下頁面,以確保升級過程順利。 時間計時器設定待複習如果要瀏覽附加元件,請點擊下方的瀏覽按鈕。

當您找到中意的附加元件時,請將其代碼(code)貼在下方。若要將牌組匯入一個有密碼保護的個人檔案,請在匯入前先打開該個人檔案。若要在現有的筆記上做出克漏字,您必須先將其改變成克漏字類型。按一下「編輯」>「改變筆記類型」。若現在要查看那些卡片,請按下方的取消暫時隱藏按鈕。如果要有額外的學習進度,請按下方的「自訂學習」按鈕。今天今天的複習上限已經達到了,但還有卡片尚待複習。 為達最佳記憶效果,可考慮在選項中增加每日複習上限。全部總計時間卡片總數筆記總數以正規表達式處理輸入類型輸入答案:未知的欄位 %s無法匯入唯讀檔案。取消暫時隱藏底線 (Ctrl+U)復原復原 %s未知的檔案格式尚未看過第一個欄位相符時,更新現有筆記更新 %(a)d 張現有的卡片,共 %(b)d 張升級完成升級精靈升級升級牌組 %(a)s 之 %(b)s... %(c)s上傳到AnkiWeb正在上傳到AnkiWeb...有卡片使用但在媒體資料夾找不到:個人檔案 1版本 %s等待編輯完成警告,除非您將上方的類型改成克漏字,不然無法進行克漏字練習。歡迎新增的筆記自動歸類到當前牌組當答案出現時,重播問題與答案的聲音檔當您準備好升級時,請按一下認可按鈕。 進行升級時,您的網頁瀏覽器中會開啟升級指南。 請仔細閱讀,因為上一版本以來已有許多變更。您的牌組升級以後,Anki 會試著從舊的牌組中複製出聲音和圖片。 如果您使用的是自訂的 Dropbox 資料夾或媒體資料夾, 升級時可能無法找到您的媒體。 接下來Anki會產生一份升級過程的報告給您。 如果您注意到有些媒體沒有複製過去,請參考升級指南,以便得到更進一步的資訊。

AnkiWeb 現在支援直接的媒體同步,不須任何特別設定, 您的媒體就能與卡片一起同步至 AnkiWeb。所有的收藏您想要現在下載嗎?本軟體作者是 Damien Elmes ,下列人士協助改善軟體功能、參與翻譯、進行測試及設計:

%(cont)s您有克漏字筆記類型,但還沒有任何克漏字,確定要繼續?您有許多牌組,請看 %(a)s. %(b)s您尚未錄音您至少需要有一個欄位年輕卡年輕+學習中您的牌組此變動會影響許多牌組,若您只想更動當前的牌組,請先新增一個選項組。您的收藏檔案似乎已經損壞,也許是因為在 Anki 執行時或是您的收藏正在儲存至網路空間時,複製或移動此檔所致。請參考說明書以便了解如何從自動備份中復原檔案。您的收藏狀態不一致,請執行「工具」>「檢查資料庫」,然後再同步一次。您的收藏或媒體檔太過龐大,所以無法進行同步。您的收藏已成功上傳至AnkiWeb。 如果您也使用其他裝置,請現在進行同步,並選擇下載您剛剛從電腦上傳的您的收藏。以後您的複習卡片和新增的卡片都會自動合併。您本地的牌組與 AnkiWeb 牌組之間的差異無法合併,因此需要以某一方的牌組來覆寫另一方的牌組。 如果您選的是下載, Anki 會從 AnkiWeb 下載您的收藏,而您電腦上次同步以後的變動將會遺失。 如果您選的是上傳, Anki 會上傳您的收藏至 AnkiWeb,而您的AnkiWeb 或其他裝置上次同步以後的變動將會遺失。 當所有的裝置都同步以後,新增的卡片和複習的卡片都能自動合併。沒有牌組備份卡片張牌組中的卡片張卡片,選擇方式為收藏日天牌組全部時間重複說明隱藏小時點忘記對應到%s對應到 標籤分鐘分鐘月複習秒統計本頁面周所有的收藏~anki-2.0.20+dfsg/locale/no/0000755000175000017500000000000012256137063015130 5ustar andreasandreasanki-2.0.20+dfsg/locale/no/LC_MESSAGES/0000755000175000017500000000000012065014111016677 5ustar andreasandreasanki-2.0.20+dfsg/locale/no/LC_MESSAGES/anki.mo0000644000175000017500000000126212252567246020203 0ustar andreasandreas$,8x9Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2012-12-21 16:25+0900 PO-Revision-Date: 2011-03-29 15:05+0000 Last-Translator: FULL NAME Language-Team: Norwegian Language: no MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #-#-#-#-# no.po (anki) #-#-#-#-# Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-11-19 04:43+0000 X-Generator: Launchpad (build 16278) #-#-#-#-# no.po (anki) #-#-#-#-# Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-11-19 04:42+0000 X-Generator: Launchpad (build 16278) anki-2.0.20+dfsg/locale/he/0000755000175000017500000000000012256137063015110 5ustar andreasandreasanki-2.0.20+dfsg/locale/he/LC_MESSAGES/0000755000175000017500000000000012065014111016657 5ustar andreasandreasanki-2.0.20+dfsg/locale/he/LC_MESSAGES/anki.mo0000644000175000017500000003352612252567245020172 0ustar andreasandreas,  8 3F[lptx|   ->QX0^("f:   e,7 X -8<W `mu}    #R72jqRy   /<MU[`# <FM T&b(  " )5 <JPUZ_r   -4< AMRYF^*  (5"Ux}   !   $ 0>P l x  6= t 8 !3 ;"FWi {H M a w | 9"D"U"aW"""""#&#B#\#r#v#z#~## # # # # # # # # # ##$$>$O$`${$$ $$;$$%!%0%3% C%Q%W%]%c%i%2o%"%%w%U&s&&&&&&&m&Bl''^'(1(.:(i(}( ( ( ((((()6)G)P)W) ?* J*gW*0*+* +'+7+T+j++ +++ ,",,, , ,1, --.8--g- ------ -- ---. . .#.,. 1.<.\. |...*... .. //3/E/ ]/h/q/ x// //K// 00(0KB0900A0E1 d1$o111 1111 1111C2S2 \2g2 x2 2 22222)2 &3 13>3G3*V33?32304E74}444 44 4?4(515:A5 |5 5,5e5%6;6 77-7M7z: CfYGa+'F{co$BndO Jpq*seW(bI t|Q8Mi)hry1Z=H!A0#\uwR }Ujv~g`>9VNl EP-4@LTmD3[?,]2^/7_%&<xX6k;"5 K.S Stop (1 of %d)%%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%d selected%d selected%s copy%s day%s days%s hour%s hours%s minute%s minutes%s month%s months%s second%s seconds%s year%s years%sd%sh%sm%ss%sy&About...&Add-ons&Cram...&Edit&File&Find&Go&Guide...&Help&Import&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(end)(new)(please select 1 card)0d1 month1 year10AM10PM3AM4AM4PMOpen backup folderVisit website%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.About AnkiAddAdd (shortcut: ctrl+enter)Add TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAll DecksAll FieldsAn image was saved to your desktop.AnkiAnki is a friendly, intelligent spaced learning system. It's free and open source.AnkiWeb ID or password was incorrect; please try again.AnswerAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Attach pictures/audio/video (F3)Automatically play audioAverageAverage TimeAverage answer timeAverage easeAverage intervalBackupsBasicBuryBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCard Info (Ctrl+Shift+I)Card ListCenterChangeChange %s to:Check the files in the media directoryCloseClose and lose current input?Configure interface language and optionsConnecting...CreatedCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZDecksDeleteDelete TagsDialogDiscard fieldE&xitEaseEasyEditEnter tags to add:Enter tags to delete:ExportExport...F1Field %d of file is:Field mappingFieldsFil&tersFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst ReviewFooterGeneralGoodHTML EditorHardHeaderHelpIf you have contributed and are not on this list, please get in touch.Ignore this updateImportImport failed. Import optionsIn media folder but not used by any cards:Include scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byInfoInvalid regular expression.KeepLaTeXLeechLeftMap to %sMap to TagsMarkedMoreNetworkNew CardsNo unused or missing files found.NothingOpenOptionsPassword:PreferencesProcessing...Record audio (F5)Recording...
Time: %0.1fRemove TagsRescheduleReverse text direction (RTL)ReviewReviewsRightSelect &AllSet for all subdecksShow AnswerShow new cards before reviewsShow new cards in order addedShow new cards in random orderSome settings will take effect after you restart Anki.Studied TodaySupermemo XML export (*.xml)SuspendSuspendedSyncing Media...TagsThis file exists. Are you sure you want to overwrite it?TodayTotal TimeTreat input as regular expressionUndo %sVersion %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.daysmapped to %smapped to TagsminsProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-07-17 17:06+0000 Last-Translator: Efrat Segel Language-Team: Hebrew MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: he עצור (1 מתוך %d)%%(a)d מתוך %(b)d הערה מעודכן‏%(a)d מתוך %(b)d הערות מעודכנות‏%d נבחר%d נבחרועותק של %s%s יום%s ימים%s שעה%s שעות%s דקה%s דקות%s חודש%s חודשים%s שניה%s שניות%s שנה%s שנים%sd%sh%sm%ss%syאודות&תוספות&העמס...&עריכה&קובץ&חיפוש&עבור&מדריך&עזרה&ייבוא&הפוך בחירה&קלף הבא&פתח תקיית תוספות&העדפות...&קלף קודם&קבע מועד חדש...&תמוך באנקי...‏&החלף חשבון...&כלים&בטל'%(row)s' ישנם %(num1)d שדות, מצופים %(num2)d(סוף)(חדש)(אנא בחר כרטיס אחד)0dחודש אחדשנה אחת10:0022:0003:0004:0016:00פתח תקיית גיבוילבקר באתר%Y-%m-%d @ %H:%Mגיבויים
אנקי יגבה את האוסף שלך כל פעם שהוא נפתח או מסונכרן.‏תבנית ייצוא:חפש:גודל גופן:גופן:בתוך:גודל קו:החלף עם:סנכרוןסנכרון
לא מופעל כרגע, לחץ על כפתור "סנכרן" כדי להפעיל.‏

אנקי התעדכן

אנקי %s יצא לאור.

<להתעלם>תודה גדולה לכל מי שסיפק הצעות, תיקוני באגים ותרומות.אודות אנקיהוסףהוספה (קיצור מקשים: ctrl+enter)הוסף תגיותהוספת כרטיס חדשהוסף ל:הוסף: %sנוספוהתווסף היוםשובשוב היוםכל החפיסותכל השדותתמונה נשמרה בשולחן העבודה שלךאנקיאנקי היא מערכת ידידותית ואינטליגנטית ללימוד מרווח. היא חינמית ומבוססת על קוד פתוח.שם משתמש או סיסמה של AnkiWeb לא נכונים; אנא נסה/י שובתשובהתשובותתוכנת אנטיווירוס או חומת אש מונעת מאנקי להתחבר לאינטרנט.הוסף תמונות/אודיו/וידאו (F3)נגן אודיו באופן אוטומטיממוצעזמן מוצעזמן תשובה ממוצעקלות ממוצעתמרווח ממוצעגיבוייםבסיסיקבורכברירת מחדל, אנקי יאבחן את התו שבין השדות, לדוגמא טאב, פסיק, וכו'. באם התו אובחן לא נכון, ניתן להזין אותו כאן. הקלד \t כדי לייצג טאב.ביטולפרטי כרטיס (Ctrl+Shift+I)רשימת קלפיםיישר למרכזשינוישנה %s ל:בדיקת הקבצים בתיקיית המדיהסגירהסגירה תוך השלכת השינויים?הגדרת שפה ואפשרויות ממשקמתחבר...נוצרCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+Zחפיסותמחקמחק תגיותשיחשתק שדהיצי&אהקלותקלעריכההזן תגיות להוספה:הזן תגיות למחיקה:ייצואייצוא...‏F1שדה %d של הקובץ הינו:מיפוי שדותשדותמס&נניםמצא &כפולים...מצא כפוליםחפש וה&חלף...חפש והחלףסקירה ראשונהתחתיתכלליטובעורך HTMLקשהכותרתעזרהאם תרמת ממאמציך ואינך ברשימה, אנא צור קשר.התעלם מעדכון זה.יבואיבוא נכשל. אפשרויות יבואבתיקיית המדיה, אך לא בשימוש על־ידי אף קלף:כלול מידע על מועדים קבועים מראשכלול תגיותהגדל את מגבלת הכרטיסים החדשים להיוםהגדל את מגבלת הכרטיסים החדשים להיום ב-פרטיםביטוי רגולרי לא תקף.השארLaTeXעלוקהשמאלמיפוי ל-%sמיפוי לתגיותמסומןעודרשתקלפים חדשיםקבצים חסרים או שאינם בשימוש לא נמצאו.כלוםפתיחהאפשרויותססמה:העדפותמבצע...הקלט קול (F5)מקליט...
משך: %0.1fהסר תגיותקביעת מועד חדשיישור טקסט מימין לשמאלסקירהסקירותימיןבחר &הכלהחל עבור כל תתי-החפיסותהצג תשובההצג קלפים חדשים לפני סקירות חוזרותהצג קלפים חדשים בסדר הוספתםהצג קלפים חדשים בסדר אקראימספר הגדרות יחולו רק לאחר איתחול אנקי.נלמדו היוםיצוא Supermemo XML (*.xml)השההמושההמסנכרן מדיה...תגיותקובץ זה קיים האם ברצונך לשכתב אותו?היוםזמן כוללהתייחס לערך המוזן כביטוי רגולריבטל %sגרסה %sהאם ברצונך להוריד עכשיו?נכתב ע"י דאמיאן אלמס, עם תיקונים, תרגום ועיצוב מאת:

%(cont)sהחפיסות שלךהשינויים שתבצע ישפיעו על מספר חפיסות. אם אתה מעוניין לשנות רק את החפיסה הנוכחית, אנא הוסף קבוצת אפשרויות חדשה קודם.ימיםממופה ל-%sממופה ל-תגיותדקותanki-2.0.20+dfsg/locale/eu/0000755000175000017500000000000012256137063015125 5ustar andreasandreasanki-2.0.20+dfsg/locale/eu/LC_MESSAGES/0000755000175000017500000000000012065014111016674 5ustar andreasandreasanki-2.0.20+dfsg/locale/eu/LC_MESSAGES/anki.mo0000644000175000017500000005524012252567245020204 0ustar andreasandreasQ ,01 8CJ"Ps u8"$)$N&s"$ Bcx0&  (EZ,q*,  , (= f j n r w {             !!.!>!M!\!m!!!0! !! ! !!!!~"""""""""""","("#!:#\#ft## ## $ $($8$J$_$ev$$7% %5%X%YW&8& &&& ' '(' >' L'X' a'n'v'~' '' '' ' 'K'(#((L(Q(h( `)n) **R*w*7n+ +w+E*,p,,R,,]-#x-- --(-. &.3. G. T.b.j.}.......... . . . // ./:/C/ J/V/g///"//&/ /0 00 *040:0X0^0d0(j00 00P07 1A1X1`1g1 n1y11111111111 1 1 1 1 2 2 2+222 92F2Y2s22222 2 222 2 2 3 3 3 *3 63(D3m3 333 3333 34$ 4.4.44 c4q4w4444444 444 4 55 #5-5 A5L5S5[5 b5 o5{5555556*68E6~6 66 6 6 6666666 77"7:7 A7L7T7"e7$7"7 7 77 777788 8888%8-8/8 99 9 ::-: /:9:CM::::':+:+%;!Q;s;+;;;#;)<'/<W<u<7< <<'< =='*=R=f=+|==/==->4>C>'S>{>>>>>>> >>>> > >? ??? ? )? 4?B?\?l????????8? +@ 8@ B@ O@Y@b@f@A A A AA$A)A.A2A6A:ABCT^R(9:G]\,LhM 'sF)!k48$>A&/0 HJ# ~-1[c"(?ED KC2u XVQ7,II-g.7:0b1&eHU32#NJy) !qz<YL?}_Q M@+ ADGd ZP@ix;6*OptO<n4*'+vWa Kj%w;=rEF.SB5$6o{P=8% " Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.About AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.Answer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeBack PreviewBack TemplateBackupsBold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser OptionsBuildCancelCardCard %dCard 1Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard was a leech.Cards TypesCards...ChangeChange DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeClone: %sCloseClose and lose current input?Code:ColonCommaConfigure interface language and optionsConfirm password:Connecting...CopyCouldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+UCtrl+ZCurrent DeckCurrent note type:Custom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDeauthorizeDebug ConsoleDecksDeleteDelete %s?Delete CardsDelete DeckDelete NoteDelete NotesDelete TagsDelete UnusedDelete this note type and all its cards?Delete this unused note type?Delete...Deleted.Deleted. Please restart Anki.DescriptionError executing %s.Error running %sExtraFirst ReviewForecastHave you installed latex and dvipng?HoursHours with less than 30 reviews are not shown.Latest ReviewLearnLearningMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)Name:NetworkNewNew CardsNew cards in deck: %sNew deck name:New intervalNew name:New note type:Note TypeNotes in Plain TextPercentageRandomRelearnReviewReview CountReview TimeReviewsShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderTextThat deck already exists.The number of questions you have answered.This file exists. Are you sure you want to overwrite it?TimeTo ReviewTotalTotal TimeTotal cardsTotal notesTypeUnderline text (Ctrl+U)UndoUndo %sUnknown file format.Upgrade CompleteUpgradingUpload to AnkiWebUploading to AnkiWeb...User 1Version %sWelcomeWhole CollectionWould you like to download it now?You haven't recorded your voice yet.You must have at least one column.Your Decks[no deck]cardscollectionddaysdeckhelphoursminsminutesmoreviewsseconds~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-02-24 22:34+0000 Last-Translator: Damien Elmes Language-Team: Basque MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:43+0000 X-Generator: Launchpad (build 16869) Language: eu Gelditu (%d-(e)tik 1) (itzalita) (piztuta) Karta %d du. %d karta ditu.%% Zuzenak%(a)0.1f %(b)s/egun%(b)d oharretik %(a)d eguneratuta%(b)d oharretik %(a)d eguneratuta%(a)dkB gora, %(b)dkB behera%(tot)s %(unit)sKarta %d%d kartaKarta %d ezabatuta.%d karta ezabatuta.Karta %d esportatuta.%d karta esportatuta.Karta %d inportatuta.%d karta inportatuta.Karta %d ikasita%d karta ikasita%d karta/minutu%d karta/minutuSorta %d eguneratuta.%d sorta eguneratuta.Talde %d%d taldeOhar %d%d oharOhar %d erantsita%d ohar erantsitaOhar %d inportatuta.%d ohar inportatuta.Ohar %d eguneratuta%d ohar eguneratutaBerrikuspen %d%d berrikuspen%d hautatuta%d hautatuta%s badago dagoeneko zure mahaigainean. Hura gainidatzi?%s-ren kopiaEgun %s%s egunegun %s%s egun%s ezabatuta.Ordu %s%s orduOrdu %s%s orduMinutu %s%s minutuMinutu %s.%s minutu.Minutu %s%s minutuHilabete %s%s hilabeteHilabete %s%s hilabeteSegundo %s%s segundoSegundo %s%s segundo%s ezabatzeko:Urte %s%s urteUrte %s%s urte%se%so%sm%sh%ss%su&Honi buruz...&Gehigarriak&Egiaztatu datu-basea...&Buru-belarri ikasi...&Editatu&Esportatu...&Fitxategia&Bilatu&Joan&Gida&Gida...&Laguntza&Inportatu&Inportatu...&Alderantzikatu hautapena&Hurrengo karta&Ireki gehigarrien karpeta...&Hobespenak...&Aurreko karta&Birprogramatu...&Lagundu Ankiri...&Aldatu profila...&Tresnak&Desegin'%(row)s' %(num1)d eremu zituzten, %(num2)d espero ziren(%s zuzenak)(bukaera)(hiragazita)(ikasten)(berria)....anki2 fitxategiak ez daude inportatzeko diseinatuta. Babeskopia batetik leheneratu nahian bazabiltza, begiratu erabiltzaile-eskuliburuaren 'Babeskopia' atalean./0e1 10Hilabete 1Urte 110AM10PM3AM4AM4PM: etakarta %d%d kartaIreki babeskopien karpetaBisitatu webgunea%%%(pct)d (%(y)s-(e)tik %(x)s)%Y-%m-%d @ %H:%MBabeskopiak
Anki-k zure bildumaren babeskopia bat sortuko du ixten edo sinkronizatzen den bakoitzean.Esportatzeko formatua:Bilatu:Letra-tipoaren neurria:Letra-tipoa:Hemen:Erantsi:Lerroaren neurria:Ordezkatu honekin:SinkronizazioaSinkronizazioa
Ez dago unean gaituta; klikatu leiho nagusiko sinkronizatu botoia gaitzeko.

Kontua beharrezkoa da

Doako kontu bat eskatzen da zure bilduma sinkronizatuta mantentzeko. Mesedez Izena eman kontu bat lortzeko, ondoren sartu zure xehetasunak azpian.

Anki eguneratuta

Anki %s argitaratu da.

Eskerrik asko iradokizunak, akatsen txostenak eta dohaintzak egin dituzten guztiei.Karta baten erraztasuna berrikuspen batean "ondo" erantzun arteko hurrengo denbora tartearen luzera da.collection.apkg izeneko fitxategi bat gorde da zure mahaigainean.Anki-ri buruzErantsiErantsi (lasterbidea: ktrl+enter)Erantsi eremuaErantsi euskarriaErantsi bilduma berria (Ktrl+N)Erantsi ohar motaErantsi alderantzizkoaErantsi etiketakErantsi karta berriaErantsi honi:Erantsi: %sErantsitaGaur erantsitaBerriroGaur berriroBerriro zenbaketa: %sBilduma guztiakEremu guztiakProfil honen karta, ohar eta euskarri guztiak ezabatuko dira. Ziur zaude?Onartu HTML eremuetanIrudi bat gorde da zure mahaigainean.AnkiAnki 1.2 Bilduma (*.anki)Anki 2-k zure bildumak formatu berri batekin gordetzen ditu. Morroi honek automatikoki bihurtuko ditu zure bildumak formatu horretara. Zure bildumen babeskopia egingo da bertsio-berritu aurretik, hala, Ankiren aurreko bertsiora itzuli nahi baduzu, zure bildumak erabilgarriak izango dira.Anki 2.0 BildumaAnki 2.0-k bertsio-berritze automatikoak baino ez ditu onartzen Anki 1.2-tik. Bilduma zaharrak zamatzeko, mesedez ireki itzazu Anki 1.2-rekin bertsio-berritzeko, eta ondoren inportatu itzazu Anki 2.0-an.Anki Bilduma paketeaAnkik ezin izan du aurkitu galdera eta erantzunaren arteko lerroa. Mesedez doitu txantiloia eskuz galdera eta erantzuna trukatzeko.Anki ikasketa tartekatuko sistema adimendun eta lagunkoia da. Askea da eta iturburu irekikoa.Anki ez da zure konfig fitxategi zaharra zamatzeko gauza izan. Mesedez erabili "Fitxategia>Inportatu" zure bildumak aurreko Anki bertsiotik inportatzeko.AnkiWeb ID edo pasahitz okerra; mesedez saiatu berriz.AnkiWeb ID:AnkiWeb-ek akats bat aurkitu du. Mesedez saiatu berriz minutu batzuk barru, eta arazoa mantentzen bada, mesedez bidali akats-txosten bat.AnkiWeb lanpetuegi dago une honetan. Mesedez saiatu berriz minutu batzuk barru.Erantzunen botoiakErantzunakBirusen aurkakoa edo suhesi softwarea Anki Internetera konektatzea eragozten ari da.Ezertara mapatu gabeko kartak ezabatu egingo dira. Ohar bati ez bazaizkio kartak gelditzen, galdu egingo da. Ziur zaude jarraitu nahi duzula?Bitan agertu da fitxategian: %sZiur zaude %s ezabatu nahi duzula?Gutxienez urrats bat behar da.Erantsi irudiak/audioa/bideoa (F3)Automatikoki audioa joAutomatikoki sinkronizatu profila ireki/ixterakoanBatez bestekoaBatez besteko denboraErantzuteko batez besteko denboraAtzera aurrebistaAtzera txantiloiaBabeskopiakTestu lodia (Ktrl+B)ArakatuArakatu && Instalatu...ArakatzaileaArakatzailearen aukerakEraikiUtziKarta%d karta1 kartaKartaren informazioa (Ktrl+Shift+I)Karta zerrendaKarta motaKarta motak%s-(r)entzako karta motakKarta izain bat zen.Karta motakKartak...AldatuAldatu karta-sortaAldatu ohar-motaAldatu ohar-mota (Ktrl+N)Aldatu ohar-mota...Aldatu kolorea (F8)Aldatu karta-sorta nota-motaren araberaAldatutaEgiaztatu edukien direktorioko fitxategiakEgiaztatzen...AukeratuAukeratu karta-sortaAukeratu nota-motaKlonatu: %sIrtenIrten eta uneko sarrera galdu?Kodea:Bi puntuKomaKonfiguratu interfazearen hizkuntza eta aukerakBerretsi pasahitza:Konektatzen...KopiatuEzin izan da AnkiWeb-era konektatu. Mesedez egiaztatu zure sareko konexioa eta saiatu berriro.Ezin izan da audioa grabatu. lame eta sox instalatu dituzu?Ezin izan da fitxategia gorde: %sSortutaKtrl+=Ktrl+AKtrl+Alt+FKtrl+Alt+Shift+CKtrl+BKtrl+DKtrl+EKtrl+FKtrl+IKtrl+LKtrl+NKtrl+PKtrl+QKtrl+RKtrl+Shift+=Ktrl+Shift+AKtrl+Shift+CKtrl+Shift+FKtrl+Shift+LKtrl+Shift+MKtrl+Shift+PKtrl+UKtrl+ZUneko karta-sortaUneko ohar-motaPauso pertsonalizatuak (minututan)Pertsonalizatu kartak (Ktrl+L)Pertsonalizatu eremuakEbakiDatu-basea berreraiki eta optimizatuta.DataBaimena kenduArazketa kontsolaKarta-sortakEzabatu%s ezabatu?Ezabatu kartakEzabatu karta-sortaEzabatu oharraEzabatu oharrakEzabatu etiketakEzabatu erabili gabeakEzabatu ohar-mota hau eta bere karta guztiak?Erabili gabeko ohar-mota hau ezabatu?Ezabatu...Ezabatuta.Ezabatuta. Mesedez berrabiarazi Anki.DeskribapenaErrorea %s exekutatzean.Errorea %s martxan jartzeanEstraLehen berrikuspenaIragarpenalatex eta dvipng instalatu dituzu?Orduak30 berrikuspen baino gutxiagoko orduak ez dira erakusten.Azken berrikuspenaIkasiIkastenMinutuNahastu karta berriak eta berrikuspenakMnemosyne 2.0 karta-sorta (*.db)Izena:SareaBerriaKarta berriakBilduman karta berriak: %sBilduma berriaren izena:Bitarte berriaIzen berria:Ohar mota berria:Ohar-motaOharrak testu arrunteanEhunekoaAusazkoaBerrikasiBerrikusiBerrikuspen kopuruaBerrikuspen denboraBerrikuspenakErakutsi karta berriak berrikuspenen ondorenErakutsi karta berriak berrikuspenen aurretikErakutsi karta berriak gehitutako ordeneanErakutsi karta berriak ausazko ordeneanTestuaKarta-sorta hori existitzen da dagoeneko.Erantzundako galdera kopurua.Fitxategia existitzen da. Ziur zaude gainidatzi nahi duzula?DenboraBerrikustekoGuztiraDenbora guztiraKartak guztiraOharrak guztiraMotaAzpimarratu testua (Ktrl+U)Desegin%s deseginFitxategi-formatu ezezaguna.Bertsio-berritzea osatutaBertsio-berritzenKargatu AnkiWeb-eraAnkiWeb-era kargatzen...1 erabiltzailea%s bertsioaOngi etorriBilduma osoaOrain deskargatu nahi duzu?Ez duzu zure ahotsa grabatu oraindik.Gutxienez zutabe bat izan behar duzu.Zure karta-sortak[karta-sortarik ez]kartakbildumaegegunakkarta-sortalaguntzaorduminutuminutuhlberrikuspenaksegundo~anki-2.0.20+dfsg/locale/az/0000755000175000017500000000000012256137063015126 5ustar andreasandreasanki-2.0.20+dfsg/locale/az/LC_MESSAGES/0000755000175000017500000000000012065014110016674 5ustar andreasandreasanki-2.0.20+dfsg/locale/az/LC_MESSAGES/anki.mo0000644000175000017500000000420012252567245020173 0ustar andreasandreas-= #)/39 AL^nu{   %,39   '1AGNS \ gu   $6?CHPT]b it{+&)* ( , "- #!'% $ Stop%%s copy%s day%s days%s hour%s hours&Edit&Export...&File&Find&Go&Help&Import&Import...&Invert Selection&Preferences...&Tools&Undo(new)/:AddAdd MediaAgainAnkiAnswersAverageBackBasicCardsCenterDefaultDueError executing %s.ForecastFrontHoursIntervalLeftMinutesPercentagePositionRandomReviewRightProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:39+0000 Last-Translator: Damien Elmes Language-Team: Azerbaijani MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:43+0000 X-Generator: Launchpad (build 16869) Language: az Dayandır%nüsxə %s%s gün%s gün%s saat%s saat&Düzəltİ&xraç Et....&Fayl&Axtar&Get&Yardım&İdxal Et&İdxal Et...&Seçimi tərs çevir&Seçimlər...&Vasitələr&Geri al(yeni)/:Əlavə etMedia əlavə etYenəAnkiCavablarOrtalamaGeriƏsasKartlarOrtaƏsasTarixinə qədər%s icra xətası.GöndərÖnSaatAralıqSolDəqiqəFaizMövqeTəsadüfiİcmalSaǧanki-2.0.20+dfsg/locale/fi/0000755000175000017500000000000012256137063015112 5ustar andreasandreasanki-2.0.20+dfsg/locale/fi/LC_MESSAGES/0000755000175000017500000000000012065014111016661 5ustar andreasandreasanki-2.0.20+dfsg/locale/fi/LC_MESSAGES/anki.mo0000644000175000017500000022153312252567245020171 0ustar andreasandreasUl5hGiG pG{GG"GG GGG8GH.H?H"PH$sH$H&HH"I&I9IJI$gI III0I JJ&"J IJUJ(fJJJ,JJ*J&K,;K hKvK(KKKKKKK KKKKK K LLLL L*L0L 8LCL UL`LxLLLLLLL0L MM M &M1M7MJMaMeMMMMMN NNNNNT!NvNxN,N(NN!O%Of=OO OO O OOPP(Pe?PP7OQ QQ5QXQY3R8RkR 2S >SISMS hS rS|S S SS SSSS S$S T TT +T 5T%@TKfTTNT"U9U#PVtVyVV WW5XGXRXvYwY7 Z EZwQZEZ@[P[W[f[Rn[[D\#_\#\\ \\(])] 1]>] R]_]x]] ] ]]]]]]^ ^^L'^t^^^^^^ ^ ^)^'_C__` ```!`)` B` L` V`a` s```` `3``S`PaYa`a ga uaaaaa"aaa&b 5bAb HbTb eb qb{bbbbb-bbb(c,c5>c tccc8c5cPc7Pddd ddddd dddeeeee$e+e2e9e @e Me Ze ge te e e eeee e eee ef f'fWiPiii]j lj8xjj jjj)jk6k:k IkVk\kak fk qkkk k kkkk k!kkk)l02lclyl4}l!llllm,m@mQm Xmbmhmjmmmpmsmvmym m mmm mm mm,m#n5nqOq.UqFqqq r4rErXr _r1krrrrr*rs tt tt"u"6u Yuzuuuuuu u u u) v5vGvvvvw1wPwUw[wjwzw w wwww<wx x xx-x2x ;x+Fxrxx xxx x xx xxxxyy%y+yz KzUzdz|zzz+zz#z!{>{C{ K{ U{<`{ {{]{a|z|!| ||||,|}#}k}`~ e~s~~~~ ~~ ~ ~~~~! 2<SYw  ,#)VD8EԀ1He,Ł-ށ+ 88q z# ߂ 2; LZ_fv}Ճ i9 Ä Ԅ߄ "% -18 ju  Dž Ӆ-&T\t z  Ɇ׆VF V`,%G@  Lj ψۈ8V*u'!ȉ@618h !?Ί$ 4 BMSf} Ƌ ̋ ׋  1Da| *Ɍ!d: ƍˍ ( 6WXr+ˎ"&A0[+>UFM*(1,ؑIO'?tgܓ#ȔdeQ8Cw(rWژߘ au/WM՚ۚ| !Ư̈̀'16>S.Z& М&ڜ,+X _jUߝ$8 E( I"ZW}Sա0)$Z" {;^<5ѤUڥ 0:BH\ ny{ Ĩب  13  ,!NPYp['ޫ*,"W"z6*Ԭ,, B2c,8íM+ y/ ̮ڮ*10L}0ǯ.ޯ *0[bgnty ~ ǰ ϰٰ߰  /@ Ygy  ı<˱  )9@Re|i  y!0-#5Tklش  )=Ra}u9 J fVZC~\۸04DZxҹ 0 ?IA] ;aYMn% $!0Rb*s]2F_qzcCP V!.,"- P%q?  (Cbq "+,2E\L+(%-<DQBpx   !4Q X=e"Y *39 @N&j,! /? GUp ?!7 ER%YI<17Fi9  8CLSby  ->OXahw#8Te/m )"( ?IJ  7&/^67# !e+]yo k&vrN ft, 2:C#Jn  4(/0A?rE& Gaz! " 3AJRg { A 0FYho"{7Wi AI&Pw$* CQ%X ~ KM"c*V$< @IM5<?]y2287@x  ' >2q(En&, !):#LpwJ 4: B9N" 2S\c$y" &5P hv   '@Zr#,/9 WdyR "Q" 80i <3  #!EX!v ' !)%K(q2N=iZ" /.^#n:@  !",O8i*&6E LXkt,@Run " 62W#-> ="G%j $% D$Ot z #KP c|nA-H_a*  ,E(Y%,3= BG.lR,S+M^ n{!#8AU^n +%6?O e(p2 #1yC$  1?3FzH7*T8*FjJC 2-M{4>Ts!( p  - r 4  +  X(y# >JrECe)  \ fs-'30@_enJ=#4F0U1  #^$ -KI @Ng\ -g&& vj@ DN "")"2"&B"i"r"u"|""""""""""# ## #)#2# ;#G# K#Y#7-]'|&Z(1 q*USC3`BU<X8 I 9c<j!Jb"#+Vn!UR,}~Rm}n%A*PP=xE0ElY :hs~_5k+!XEWA_N[a(87  cgL.yT92Y/H e<_\)KL )[g^wJ<X\Dv=U:.Fu-OzedQPTo|DdW%p0,A*74yvVD%;F s $o9-BG2NJ{)ti?.Q#8yO#7/&j]f 'o G6YlF;]d'^G=eCn3$w LrO xqE[/iSH&?{I2bM6zxp0#i>HG 3MC"N*uu5HvBIw65$4@@t9\C:K;)K:m kz(?^'DN$VRr%|hk f@3,>BZ> `ZJhMKt a{aT!SQjsI(QM0f~c=8+41&564gpSml"-`.WR/b1F2}>1"AP  rT,@ ;q+OL?  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: ankiqt_fi_FI Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-21 20:47+0000 Last-Translator: Silja Ijas Language-Team: Finnish <> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: fi Pysäytä (1/%d) (pois päältä) (päällä) Siinä on %d kortti. Siinä on %d korttia.%% oikein%(a)0.1f %(b)s/päivä%(a)0.1fs (%(b)s)%(a)d %(b)d:stä muistiinpanosta päivitetty.%(a)d %(b)d:stä muistiinpanosta päivitetty.%(a)dkB lähetetään, %(b)dkB ladataan%(tot)s %(unit)s%d kortti%d korttia%d kortti poistettu.%d korttia poistettu.%d kortti tuotu.%d korttia tuotu.%d kortti tuotu.%d korttia tuotu.%d kortti opiskeltu ajassa%d korttia opiskeltu ajassa%d kortti/minuutissa%d korttia/minuutissa%d pakka päivitetty.%d pakkaa päivitetty.%d ryhmä%d ryhmää%d muistiinpano%d muistiinpanoa%d muistiinpano lisätty%d muistiinpanoa lisätty%d muistiinpano tuotu%d muistiinpanoa tuotu%d muistiinpano päivitetty%d muistiinpanoa päivitetty%d kertaus%d kertausta%d valittu%d valittua%s on jo tallennettuna työpöydälläsi. Korvataanko aiemmin luotu tiedosto?%s (kopio)%s päivä%s päivää%s päivä%s päivää%s poistettu.%s tunti%s tuntia%s tunti%s tuntia%s minuutti%s minuuttia%s minuutti.%s minuuttia.%s minuutti%s minuuttia%s kuukausi%s kuukautta%s kuukausi%s kuukautta%s sekunti%s sekuntia%s sekunti%s sekuntia%s poistettava:%s vuosi%s vuotta%s vuosi%s vuotta%s vrk%s h%s min%s kk%s s%s v&Tietoja...Liitännäiset&Tarkista tietokanta...Op&iskele...&Muokkaa&Vie...&Tiedosto&Etsi&Siirry&Käyttöohje&Käyttöohje...&Ohje&Tuo&Tuo...&Käänteinen valinta&Seuraava kortti&Avaa liitännäiskansio&Asetukset...&Edellinen kortti&Ajasta uudelleen...&Tue Ankia...&Vaihda käyttäjätiliä...T&yökalut&Kumoa'%(row)s':ssa oli %(num1)d kenttää, pitäisi olla %(num2)d(%s oikein)(loppu)(suodatettu)(opiskeltavana)(uusi)(emorajoitus: %d)(valitse 1 kortti)....anki2-tiedostoja ei ole suunniteltu tuontiin. Jos yrität palauttaa varmuuskopiota, katso käyttöohjeesta kohta "Backups"./0d1 101 kuukausi1 vuosi10:0022:0003:0004:0016:00504 yhdyskäytävän aikakatkaisuvirhe vastaanotettu. Kokeile poistaa virustorjuntaohjelmasi käytöstä väliaikaisesti.: ja%d kortin%d korttiaAvaa varmuuskopiokansioKäy verkkosivulla%(pct)d%% (%(x)s/%(y)s)%Y-%m-%d @ %H:%MVarmuuskopiot
Anki luo varmuuskopion kokoelmastasi joka kerta kun se suljetaan tai synkronoidaan.Vientimuoto:EtsiFonttikoko:Fontti:KenttäSisältää:Viivanleveys:KorvausSynkronointiSynkronointi
Synkronointi ei ole päällä. Klikkaa Synkronoi-painiketta pääikkunassa laittaaksesi sen päälle.

Käyttäjätili vaaditaan

Tarvitset ilmaisen käyttäjätilin, että voi pitää kokoelmasi synkronoituna. Perusta käyttäjätili ja syötä sitten tietosi alle.

Anki on päivitetty

Anki %s on julkaistu.

Kiitokset kaikille, jotka ovat lähettäneet ehdotuksia ja lahjoituksia sekä raportoineet virheistä!Kortin helppous on seuraavan kertausvälin pituus kun vastaat "Hyvä" kertauksessa.Tiedosto nimeltä "collection.apkg" tallennettiin työpöydällesi.Median synkronoinnissa ilmeni ongelma. Valitse Työkalut>Tarkista media ja synkronoi sitten uudelleen ratkaistaksesi ongelman.Keskeytetty: %sTietoja AnkistaLisääLisää (pikanäppäinyhdistelmä: Ctrl + enter)Lisää kenttäLisää mediatiedostoLisää uusi pakka (Ctrl + N)Lisää muistiinpanotyyppiLisää kääntöpuoliLisää tunnisteitaLisää uusi korttiLisää kohteeseen:Lisää: %sLisättyLisätty tänäänLisätty ensimmäisen kentän kaksoiskappale: %sUudestaanUudestaan tänäänUudelleen näyttettäväksi pyydettyjen korttien lukumäärä: %sKaikki pakatKaikki kentätKaikki kortin satunnaisessa järjestyksessä (opiskelutila)Kaikki tämän käyttäjätilin kortit, muistiinpanot ja mediatiedostot poistetaan. Oletko varma?Salli HTML kentissäLisäosassa tapahtui virhe.
Kirjoita viesti lisäosafoorumille:
%s
Kohdetta %s avattaessa tapahtui virheTapahtui virhe. Sen saattoi aiheuttaa vaaraton bugi tai
pakassasi saattaa olla ongelma.

Varmistaaksesi, ettei pakassasi ole ongelmia, valitse Työkalut > Tarkista tietokanta.

Jos ongelma ei korjaannu, kopioi seuraava teksti
virheilmoitukseen:Kuva tallennettiin työpöydällesi.AnkiAnki 1.2 -pakka (*.anki)Anki 2 tallentaa pakkasi uudessa tiedostomuodossa. Käyttämällä tätä avustajaa muutat pakkasi automaattisesti uuteen muotoon. Pakoistasi otetaan varmuuskopio ennen päivitystä, joten jos sinun tarvitsee palata takaisin Ankin edelliseen versioon, pakkasi ovat vielä käytettävissä.Anki 2.0 -pakkaAnki 2.0:ssa on tuki automaattiselle versiopäivitykselle Anki 1.2:sta. Ladataksesi vanhempia pakkoja, avaa ne ensin Anki 1.2:ssa päivittääksesi ne ja tuo ne sitten Anki 2.0:aan.Anki-pakkapakkausAnki ei löytänyt kysymyksen ja vastauksen välistä rajaa. Mukauta mallinetta manuaalisesti vaihtaaksesi kysymyksen ja vastauksen välisen rajan.Anki on fiksu ja näppärä intervalliharjoittelun apuväline. Se on lisäksi ilmainen vapaan lähdekoodin ohjelma.Anki on lisenssoitu AGPL3-lisenssillä. Katso lisätietoja lähdejakelun lisenssitiedostosta.Anki ei voinut avata vanhaa konfiguraatiotiedostoasi. Käytä toimintoa Tiedosto > Tuo tuodaksesi pakkasi edellisistä Anki-versioista.AnkiWeb-käyttäjätunnus tai -salasana on väärä. Yritä uudestaan.AnkiWeb-käyttäjätunnus:AnkiWebissä on virhe. Yritä uudestaan muutaman minuutin kuluttua ja jos ongelma jatkuu, lähetä virheraportti.AnkiWebissä on tällä hetkellä paljon liikennettä. Yritä uudestaan muutaman minuutin kuluttua.AnkiWebiä huolletaan. Yritä uudelleen muutaman minuutin kuluttua.VastausVastauspainikkeetVastauksetViruksentorjunta- tai palomuuriohjelma estää Ankia ottamasta yhteyttä internettiin.Kortit, joita ei ole liitetty mihinkään, poistetaan. Jos muistiinpanoon ei liity jäljelle jääviä kortteja, se katoaa. Oletko varma, että haluat jatkaa?Esiintyi kahdesti tiedostossa: %sOletko varma, että haluat poistaa kohteen %s?Vähintään yksi korttityyppi on annettava.Vaaditaan vähintään yksi vaihe.Liitä kuvia/ääntä/video (F3)Toista äänitiedosto automaattisestiSynkronoi automaattisesti kun käyttäjätili avataan/suljetaanKeskiarvoVastausnopeusKeskimääräinen vastausaikaKeskimääräinen helppousOpiskelupäivien keskiarvoKeskimääräinen kertausväliKääntöpuoliKääntöpuolen esikatseluKääntöpuolen mallineVarmuuskopiotPerusasetuksetPerusmalli (ja käännetty kortti)Perusmalli (valinnainen käännetty kortti)Lihavoitu teksti (Ctrl + B)SelaaSelaa && Asenna...SelainSelain (%(cur)d kortti näytetään; %(sel)s)Selain (%(cur)d korttia näytetään; %(sel)s)Selaimen ulkoasuSelainasetuksetKokoaMassalisää tunnisteita (Ctrl + Shift + T)Massapoista tunnisteita (Ctrl + Alt + T)PiilotaPiilota korttiPiilota muistiinpanoPiilota tähän liittyvät uudet kortit seuraavaan päivään saakkaPiilota tähän liittyvät kertaukset seuraavaan päivään saakkaAnki yrittää tunnistaa erotinmerkin automaattisesti. Jos menee pieleen, voit itse syöttää erottimen tähän (pilkku, puolipiste, jne.). Tab on \tPeruutaKorttiKortti %dKortti 1Kortti 2Kortin tunnusKortin tiedot (Ctrl + Shift + I)KorttiluetteloKortin tyyppiKorttityypitKorttityypit kohteessa %sKortti piilotettu.Kortti hyllytetty.Kortti oli resurssisyöppö.KortitKorttityypitKortteja ei voi siirtää manuaalisesti suodatettuun pakkaan.Kortit muotoilemattomana tekstinäKortit palautetaan automaattisesti niiden alkuperäisiin pakkoihin kun olet kerrannut ne.Kortit...KeskitäMuuta%s →Vaihda pakkaaVaihda muistiinpanotyyppiäVaihda muistiinpanotyyppiä (Ctrl + N)Vaihda muistiinpanotyyppiä...Vaihda väriä (F8)Vaihda pakkaa muistiinpanotyypistä riippuenMuutettuTarkista &media...Tarkasta tiedostot mediakansiossaTarkistetaan...ValitseValitse pakkaValitse muistiinpanotyyppiValitse tunnisteetKloonaa: %sSuljeAvoinna olevan kortin tiedot katoavat. Haluatko sulkea ikkunan?AukkotehtäväAukkotehtävä (Ctrl + Shift + C)Koodi:Kokoelma on vioittunut. Katso toimintaohjeita ohjeista.KaksoispistePilkkuKäyttöliittymän kieli ja asetuksetVahvista salasana:Onneksi olkoon! Olet käynyt tämän pakan kertaukset läpi toistaiseksi.Yhdistetään...JatkaKopioiVarmojen korttien oikeat vastaukset: %(a)d/%(b)d (%(c).1f%%)Oikein: %(pct)0.2f%%
(%(good)d/%(tot)d)Ei yhteyttä AnkiWebiin. Tarkista verkkoyhteytesi ja yritä uudestaan.Äänitys ei onnistunut. Oletko asentanut lamen ja soxin?Ei voitu tallentaa tiedostoa: %sOpiskellutLuo pakkaLuo suodatettu pakka...LuomisaikaCtrl + =Ctrl+ACtrl + Alt + FCtrl + Alt + Shift + CCtrl + BCtrl + DCtrl + ECtrl+FCtrl + ICtrl + LCtrl+NCtrl+PCtrl+QCtrl + RCtrl + Shift + =Ctrl + Shift + ACtrl + Shift + CCtrl+Shift+FCtrl + Shift + LCtrl + Shift + MCtrl + Shift + PCtrl + Shift + RCtrl + UCtrl + WCtrl+ZKumulatiivisetKumulatiiviset %sKumulatiiviset vastauksetKumulatiiviset kortitNykyinen pakkaNykyinen muistiinpanotyyppi:Mukautettu opiskeluMukautettu opiskeluistontoMukautettuja vaiheita (minuuteissa)Mukauta kortteja (Ctrl + L)Mukauta kenttiäLeikkaaTietokanta on rakennettu uudelleen ja optimoituPäivämääräOpiskelupäivätPoista valtuutusVianjäljityskonsoliPakkaPakan korvausPakka tuodaan kun käyttäjätili avataanPakatLaskevat kertausvälitOletusarvoViivästykset, joiden jälkeen kerrattavat kortit näytetään uudestaan.PoistaPoista %s?Poista kortitPoista pakkaPoista tyhjätPoista muistiinpanoPoista muistiinpanotPoista tunnisteetPoista käyttämättömätHaluatko varmasti poistaa tämän kentän kohteesta %s?Poistetaanko '%(a)s'-korttityyppi ja sen %(b)s?Poistetaanko tämä muistiinpano ja kaikki sen kortit?Poistetaanko tämä käyttämätön muistiinpanotyyppi?Poistetaanko käyttämätön media?Poista...Poistettu %d kortti, josta puuttui muistiinpanot.Poistettu %d korttia, joista puuttui muistiinpanot.Poistettiin %d kortti, josta puuttui malline.Poistettiin %d korttia, joista puuttui malline.Poistettiin %d muistiinpano, josta puuttui muistiinpanotyyppi.Poistettiin %d muistiinpanoa, joista puuttui muistiinpanotyyppi.Poistettiin %d muistiinpano, jolla ei ole yhtään korttia.Poistettiin %d muistiinpanoa, joilla ei ole yhtään korttia.Poistettu %d muistiinpano, jossa on väärä kenttien määrä.Poistettu %d muistiinpanoa, joissa on väärä kenttien määrä.Poistettu.Poistettu. Käynnistä Anki uudelleen.Tämän pakan poistaminen pakkalistasta palauttaa kaikki jäljellä olevat kortit niiden alkuperäisiin pakkoihin.KuvausOpiskelu-näytöllä näytettävä pakan kuvaus (koskee vain valittua pakkaa):ValintaikkunaHylkää kenttäLataus epäonnistui: %sLataa AnkiWebistäLataus onnistui. Käynnistä Anki uudelleen.Ladataan AnkiWebistä...ErääntyvätVain erääntyneet kortitErääntyy huomenna&LopetaHelppousHelppoVastauksesta "helppo" saatava bonusHelppo kertausväliMuokkaaMuokkaa %sMuokkaa nykyistäMuokkaa HTML:ääMuokkaa mukauttaaksesiMuokkaa...MuokattuMuokkausfonttiMuokkaukset tallennettu. Käynnistä Anki uudelleen.TyhjäTyhjät kortit...Tyhjien korttien numerot: %(c)s Kentät: %(f)s Tyhjiä kortteja löydetty. Valitse Työkalut > Tyhjät kortit.Tyhjä ensimmäinen kenttä: %sLopetusSyötä pakka, johon asetetaan uudet %s korttia tai jätä tyhjäksi:Syötä kortin uusi sijainti (1...%s):Lisättävät tunnisteet:Poistettavat tunnisteet:Virhe latauksessa: %sVirhe käynnistyksessä: %sVirhe suoritettaessa %s.Virhe ajettaessa %sVieVie...ExtraFF1F3F5F7F8Tiedoston %d. kenttä on:KenttäliitoksetKentän nimi:Kenttä:KentätKentät kohteessa %sKenttien erotin: %sKentät...Suoda&ttimetTiedosto on viallinen. Palauta aikaisempi versio varmuuskopiosta.Tiedosto puuttui.SuodatinSuodatin:SuodatettuSuodatettu pakka %dEtsi &kaksoiskappaleetEtsi kaksoiskappaleet&Etsi ja korvaa...Etsi ja korvaaLopetaEnsimmäinen korttiEnsimmäinen kertausEnsimmäinen kenttä täsmää: %sKorjattiin %d kortti, jossa oli virheellisiä ominaisuuksia.Korjattiin %d korttia, joissa oli virheellisiä ominaisuuksia.Korjattu muistiinpanotyyppi: %sKäännä ympäriKansio on jo olemassaFontti:AlatunnisteTurvallisuussyistä "%s" ei ole sallittu korteissa. Voit yhä käyttää sitä sijoittamalla komennon eri pakkaukseen and tuomalla pakkauksen sitten LaTeX-ylätunnisteeseen.EnnusteLomakeEtupuoli ja valinnainen kääntöpuoliEtupuoli & kääntöpuoliLöytyi %(a)s, joissa on %(b)s.EtupuoliEtupuolen esikatseluEtupuolen mallineYleistäLuotu tiedosto: %sLuotu kohteeseen %sHanki jaettu pakkaHyväValmistujaiskertausväliHTML-muokkainVaikeaOletko asentanut LaTeXin ja dvipng:n?YlätunnisteOhjeSuurin helppousHistoriaAloitussivuTuntijakaumaTunnitTunteja, joiden aikana on ollut vähemmän kuin 30 kertausta, ei näytetä.Jos olet tehnyt työtä Ankin hyväksi, mutta et ole listalla, ota yhteyttä.Jos olisit opiskellut joka päiväÄlä huomioi pidempiä vastausaikoja kuinÄlä huomioi kirjasinkokoaÄlä huomioi rivejä, joiden ensimmäinen kenttä vastaa olemassaolevaa muistiinpanoaUnohda tämä päivitysTuoTuo tiedostoTuo vaikka olemassa olevassa muistiinpanossa on sama ensimmäinen kenttäTuonti epäonnistui. Tuonti epäonnistui. Virheidenjäljitystietoa: TuontiasetuksetTuonti valmis.Mediakansiossa mutta ei käytössä yhdessäkään kortissa:Varmistaaksesi, että kokoelmasi toimii oikein laitteiden välillä siirryttäessä, Anki vaatii, että tietokoneesi sisäisen kellon täytyy olla oikeassa ajassa. Sisäinen kello voi olla väärässä vaikka järjestelmäsi näyttäisikin oikeaa paikallista aikaa. Siirry tietokoneesi aika-asetuksiin ja tarkista seuraavat asiat: - Näyttääkö 12 tunnin kello oikeaa vuorokauden aikaa (aamupäivä vai iltapäivä) - Kellon kulun oikea-aikaisuus - Päivä, kuukausi ja vuosi - Aikavyöhyke - Kesä-/talviaika Ero oikeaan aikaan on: %s.Sisältää mediatiedostojaLiitä ajastustiedotLiitä tunnisteet:Kasvata tämän päivän uusien korttien ylärajaaKasvata tämän päivän uusien korttien ylärajaaKasvata tämän päivän kerrattavien korttien ylärajaaKasvata tämän päivän kerrattavien korttien ylärajaKasvavat kertausvälitTiedotAsenna liitännäinenKäyttöliittymän kieli:KertausväliKertausvälimuokkaajaKertausvälitVirheellinen koodiVirheellinen koodaus. Nimeä uudelleen:Viallinen tiedosto. Palauta aikaisempi versio varmuuskopiosta.Virheellinen salasana.Kortista löydettiin virheellinen ominaisuus. Valitse Työkalut>Tarkista tietokanta. Jos ongelma ilmenee uudelleen, pyydä apua tukisivulta.Säännöllinen lauseke on virheellinen.Se on hyllytetty.Kursivoitu teksti (Ctrl + I)JavaScript-virhe rivillä %(a)d: %(b)sSiirry tunnisteisiin painamalla Ctrl+Shift+TPidäLaTeXLaTeX-yhtälöLaTeX matem. ympär.VirheetViimeinen korttiViimeisin kertausViimeisenä lisätty ensimmäisenäOpitutEnnalta opiskeltavien ylärajaOpitut: %(a)s, Kerratut: %(b)s, Uudelleen opitut: %(c)s, Suodatetut: %(d)sOpiskeltavatResurssisyöppöResurssisyöpön toimenpideResurssisyöpön alarajaVasenRajoitaLadataan…Lukitse käyttäjätili salasanalla tai jätä tyhjäksi:Pisin kertausväliEtsi kentästä:Matalin helppousHallintaHallinnoi muistiinpanotyyppejä...Liitä kenttään %sLiitä tunnisteisiinMerkitseMerkitse muistiinpanoMerkitse muistiinpano (Ctrl + K)MerkittyVarmatEnimmäiskertausväliKertausten enimmäismäärä/päiväMediatiedostotVähimmäiskertausväliMinuutitSekoita uudet kortit ja kertauksetMnemosyne 2.0 -pakka (*.db)LisääEniten virheitäSiirrä kortitSiirrä pakkaan (Ctrl + D)Siirrä kortit pakkaan:Muistiinpan&oNimi on olemassa.Pakan nimi:Nimi:VerkkoUudetUudet kortitUusia kortteja pakassa: %sVain uudet kortitUusia kortteja/päiväUuden pakan nimi:Uusi kertausväliUusi nimi:Uusi muistiinpanotyyppi:Uusi valintaryhmän nimi:Uusi sijainti (1...%d):Uusi päivää alkaaEi vielä erääntyneitä kortteja.Yksikään kortti ei vastaa annettuja ehtojaEi tyhjiä kortteja.Yhtään varmaa korttia ei opiskeltu tänään.Käyttämättömiä tai puuttuvia tiedostoja ei löytynytMuistiinpanoMuistiinpanon tunnusMuistiinpanotyyppiMuistiinpanotyypitMuistiinpano ja sen %d kortti poistettu.Muistiinpano ja sen %d korttia poistettu.Muistiinpano haudattu.Muistiinpano hyllytetty.Huomautus: Mediatiedostoista ei ole otettu varmuuskopiota. Ota Anki-kansiostasi säännöllisin väliajoin varmuuskopio, että tiedostosi ovat turvassa.Huomautus: osa historiasta puuttuu. Katso lisätietoja selaimen dokumentaatiosta.Muistiinpanot pelkkänä tekstinäMuistiinpanoissa täytyy olla vähintään yksi kenttä.Merkityt muistiinpanotei mitäänOKVanhin nähty ensinSeuraavassa sykronoinnissa pakota muutokset toiseen suuntaanYhtä tai useampaa muistiinpanoa ei tuotu, koska ne eivät luoneet yhtään korttia. Näin voi tapahtua kun muistiinpanossa on tyhjiä kenttiä tai kun et ole liittänyt tekstitiedoston sisältöä oikeisiin kenttiin.Vain uusien korttien sijaintia pakassa voi muuttaa.Vain yhdellä asiakasohjelmalla kerrallaan on pääsy AnkiWebiin. Jos edellinen synkronointi epäonnistui, yritä uudestaan muutaman minuutin kuluttua.AvaaOptimointi...Valinnainen yläraja:ValinnatValinnat kohteessa %sValintaryhmä:Valinnat...JärjestysJärjestä lisätytJärjestä erääntyvätSyrjäytä kääntöpuolen malline:Syrjäytä fontti:Syrjäytä etupuolen malline:Pakattu Anki-pakka (*.apkg *.zip)Salasana:Salasanat eivät täsmääLiitäLiitä leikepöydän kuvat PNG-muodossaPauker 1.8 oppitunti (*.pau.gz)ProsenttiosuusAjanjakso: %sSijoita uuden korttijonon loppuunAseta kertausjonoon kertausvälillä:Lisää toinen muistiinpanotyyppi ensin.Olethan kärsivällinen, tässä voi mennä hetki.Yhdistä mikrofoni ja varmista, etteivät muut ohjelmat käytä audiolaitetta.Muokkaa tätä muistiinpanoa ja lisää aukkotehtäviä. (%s)Varmista, että käyttäjätili on auki eikä Anki ei käsittele muuta tietoa ja yritä sitten uudestaan.Asenna PyAudioAsenna mplayerAvaa ensin käyttäjätiliValitse Työkalut > Tyhjät kortitValitse pakkaValitse vain yhden muistiinpanotyypin kortteja.Valitse jotain.Päivitä Ankin uusimpaan versioon.Käytä toimintoa Tiedosto>Tuo tämän tiedoston tuontiin.Käy AnkiWebissä, päivitä pakkasi ja yritä sitten uudestaan.SijaintiAsetuksetEsikatseluEsikatsele valittuja kortteja (%s)Esikatsele uusia korttejaEsikatsele uusia kortteja, jotka on lisätty viimeisenäKäsitellään...Käyttäjätilin salasana...Käyttäjätili:KäyttäjätilitVälityspalvelimen todentaminen vaaditaan.KysymysJonon loppu: %dJonon alku: %dLopetaSatunnainenSekoita järjestysLuokitusValmis päivitykseenKoosta uudelleenNauhoita oma ääniteNauhoita ääni (F5)Nauhoitetaan...
Kesto: %0.1fSuhteellinen erääntyneisyysUudelleenopitutMuista viimeisin syötetty tieto lisätessäPoista tunnisteetPoista muotoilut (Ctrl + R)Tämän korttityypin poistaminen aiheuttaa yhden tai useamman muistiinpanon poistamisen. Luo ensin uusi korttityyppi.Nimeä uudelleenNimeä pakka uudelleenToista äänitiedostoToista oma ääniteUuden sijainnin määrittäminenMääritä uusi sijainti pakassa uusille korteilleUuden sijainnin määrittäminen...Vaadi yksi tai useampi näistä tunnisteista:UudelleenajastusAjasta uudelleenAjasta kortit uudestaan perustuen vastauksiini tässä pakassaJatka nytPäinvastainen tekstinsuunta (RTL)Palautettu "%s" edeltävään tilaan.KertausKertausten lukumääräKertausaikaKertaa etukäteenKertaa ennaltaKertaa unohdetut kortit viimeiseltäKertaa unohdettuja korttejaKertausten onnistumisaste tunneittainKertauksetErääntyneet kertaukset pakassa: %sOikeaTallenna kuvaKohde: %sEtsiEtsi muotoiluista (hidas)ValitseValitse &kaikkiValitse &muistiinpanotValitse poissuljettavat tunnisteet:Valittu tiedosto ei ollut UTF-8-muodossa. Katso käyttöohjeen tuonti-osio.Valikoiva opiskeluPuolipistePalvelinta ei löytynyt. Joko yhteytesi on katkennut tai virustorjunta-/palomuuriohjelma estää Ankin yhteyden internetiin.Asetetaanko kaikki %s alapuoliset pakat tähän valintaryhmään?Aseta kaikille alipakoilleAseta etualan väri (F7)Shift-näppäin oli painettuna. Ohitetaan automaattinen synkronointi ja liitännäisten lataus.Vaihda olemassa olevien korttien sijaintiaPikavalintanäppäin: %sOikotie: %sNäytä %sNäytä vastausNäytä kaksoiskappaleetNäytä vastausaikaNäytä uudet kortit kertausten jälkeenNäytä uudet kortit ennen kertauksiaNäytä uudet kortit lisäysjärjestyksessäNäytä uudet kortit satunnaisessa järjestyksessäNäytä seuraava kertausaika vastauspainikkeiden yläpuolellaNäytä jäljellä olevien korttien lukumäärä kertauksen aikanaNäytä tilastot. Pikanäppäinyhdistelmä: %sKoko:Joitakin kertaamiisi kortteihin liittyviä tai piilotettuja kortteja viivästettiin myöhempään istuntoon.Osa asetuksista tulee voimaa vasta Ankin uudelleen käynnistyksen jälkeen.Jotkin päivityksistä jätettiin huomiotta, koska muistiinpanotyyppi on muuttunut:LajittelukenttäLajittele tämän kentän mukaan selaimessaLajittelu tämän sarakkeen mukaan ei ole mahdollista. Valitse toinen sarake.Äänet & kuvatVälilyöntiAloitussijainti:AloitushelppousTilastotVaihe:Vaiheet (minuuteissa)Vaiheiden täytyy olla numeroita.Poista HTML liitettäessä tekstiäOpiskelit tänään %(a)s ja käytit siihen aikaa %(b)s.Opiskeltu tänäänOpiskeleOpiskele pakkaaOpiskele pakkaa...Opiskele nytOpiskele kortin tilan tai tunnisteen mukaanMuotoiluMuotoilu (jaetaan korttien välillä)Alaindeksi (Ctrl+=)Supermemo XML -vienti (*.xml)Yläindeksi (Ctrl+Shift+=)HyllytäHyllytä korttiHyllytä muistiinpanoHyllytetytSynkronoi myös äänitiedostot ja kuvatSynkronoi AnkiWebiin. Pikanäppäinyhdistelmä: %sSynkronoidaan mediatiedostoja...Synkronointi epäonnistui: %sSynkronointi epäonnistui, ei internet yhteyttä.Synkronointi vaatii, että tietokoneesi kello on asetettu oikeaan aikaan. Korjaa kellonaika oikeaksi ja yritä uudestaan.Synkronoidaan...SarkainLisää tunniste kaksoiskappaleisiinLiitä vain tunnisteTunnisteetKohdepakka (Ctrl + D)Kohdekenttä:TekstiSarkaimilla tai puolipisteillä eroteltu teksti (*)Pakka on jo olemassaKentän nimi on jo käytössä.Tämä nimi on jo käytössä.Yhteys AnkiWebiin katkesi. Tarkista verkkoyhteytesi ja yritä uudestaan.Oletusasetuksia ei voi poistaa.Oletuspakkaa ei voi poistaa.Korttien jakautuminen pakkaasi/pakkoihisi.Ensimmäinen kenttä on tyhjä.Muistiinpanotyypin ensimmäinen kenttä on liitettävä.Seuraavaa merkkiä ei voida käyttää: %sTämän kortin etupuoli on tyhjä. Suorita Työkalut > Tyhjät kortit.Käytetyt kuvakkeet on saatu useista eri lähteistä. Katso lisätietoja ja kiitokset
Anki sourcesta.Syöttämäsi tieto lisää tyhjän kysymyksen kaikkiin kortteihin.Vastaamiesi kysymysten määrä.Tulevaisuudessa erääntyvien kertausten määrä.Kunkin painikkeen painalluskertojen määrä.Järjestelmäsi väliaikaistiedostokansion käyttöoikeudet ovat virheelliset eikä Anki saa korjattua niitä automaattisesti. Etsi lisätietoja hakusanalla "temp folder" Ankin käyttöohjeesta.Tarjottu tiedosto ei ole kelvollinen .apkg-tiedosto.Annetut hakuehdot eivät vastanneet yhtään korttia. Haluatko korjata hakuehtojasi?Pyytämäsi muutos vaatii tietokannan täyden lähetyksen AnkiWebiin kun synkronoit kokoelmasi seuraavan kerran. Jos sinulla on kertauksia tai muita muutoksia odottamassa toisessa laitteessa, jota ei ole vielä synkronoitu tänne, nämä synkronoimattomat tiedot katoavat. Haluatko jatkaa?Kysymyksiin vastaamiseen käytetty aika.Päivitys on valmis ja voit aloittaa Anki 2.0:n käytön.

Alla on lokitiedot päivityksestä:

%s

Pakassa on vielä uusia kortteja, mutta päivittäinen yläraja on tullut vastaan. Voit kasvattaa ylärajaa valinnoissa, mutta pidä mielessä että mitä enemmän uusia kortteja alat opiskella sitä suuremmaksi lyhyen aikavälin kertauskuormasi tulee.On luotava vähintään yksi käyttäjätili.Et voi lajitella tämän sarekkeen mukaan, mutta voit etsiä yksittäisiä korttetyyppejä, kuten 'card:Kortti 1'.Et voi lajitella tämän sarekkeen mukaan, mutta voit etsiä tietystä pakasta klikkaamalla haluamaasi pakan nimeä vasemmalta.Tämä tiedosto ei vaikuta olevan kelvollinen .apkg-tiedosto. Jos saat tämän virheen AnkiWebistä ladatusta tiedostosta, voi olla, että latauksesi epännistui. Yritä uudelleen ja jos ongelma jatkuu, yritä uudelleen eri selaimella.Tiedosto on olemassa. Haluatko korvata sen?Tämä kansio sisältää kaikki Anki-tietosi yhdessä sijainnissa että varmuuskopiointi olisi helpompaa. Jos halut Ankin käyttävän eri sijaintia, katso: %s Tämä on erikoispakka, jota käytetään normaalin ajastuksen ulkopuoliseen opiskeluun.Tämä on {{c1::sample}} aukkotehtävä.Olet poistamassa olemassa olevaa kokoelmaasi ja korvaamassa sitä tuotavassa tiedostossa olevalla tiedolla. Oletko varma?Tämä avustaja ohjaa sinut Anki 2.0 -päivitysprosessin läpi. Lue seuraavat sivut huolellisesti sujuvan päivityksen varmistamiseksi. AikaMääritetyn ajan ylärajaKerrattavat

Klikkaa alla olevaa Selaa-painiketta selataksesi liitännäisiä.

Kun löydät haluamasi liitännäisen, liitä sen koodi alle.Voidaksesi tuoda tietoja salasanalla suojattuun käyttäjätiliin, avaa käyttäjätili ennen kun yrität tuontia.Voidaksesi tehdä aukkotehtävän olemassa olevasta muistiinpanosta, sinun täytyy ensin muuttaa se aukkotehtävätyypiksi: Muokkaa>Vaihda muistiinpanotyyppiäNähdäksesi ne nyt, klikkaa alla olevaa Poista piilotus -painetta.Opiskellaksesi normaalin ajastuksen ulkopuolella, klikkaa allaolevaa Mukautettu opiskelu -painiketta.TänäänTämän päivän kertausyläraja on tullut vastaan, mutta jonossa on vielä kerrattavia kortteja. Harkitse päivittäisen ylärajan nostamista valinnoissa muistamisen optimoimiseksi.YhteensäKokonaisaikaKortteja yhteensäMuistiinpanoja yhteensäTulkitse syöte säännöllisenä lausekkeenaTyyppiKirjoita vastaus: tuntematon kenttä %sVain luku -tilassa olevaa tiedostoa ei voida tuoda.Poista piilotusAlleviivattu teksti (Ctrl + U)KumoaKumoa %sTuntematon tiedostotyyppiEi vielä nähdytPäivitä olemassa olevat muistiinpanot kun ensimmäinen kenttä täsmääPäivitettiin %(a)d/%(b)d olemassa olevista muistiinpanoista.Päivitys valmisPäivitysavustajaPäivitetäänPäivitetään pakkaa %(a)s/%(b)s... %(c)sLähetä AnkiWebiinLähetetään AnkiWebiin...Käytetty korteissa mutta puuttuu mediakansiosta:Käyttäjä 1Versio %sOdotetaan että muokkaus valmistuu.Varoitus: aukkotehtävät eivät toimi ennen kun vaihdat tyypin ylhäältä aukkotehtäväksi.TervetuloaKun lisätään, on oletuksena nykyinen pakkaKun vastaus näytetään, toista sekä kysymyksen että vastauksen ääniteKun olet valmis päivittämään, klikkaa Suorita-painiketta jatkaaksesi. Päivitysopas aukeaa selaimeesi kun päivitys etenee. Lue päivitysopas huolellisesti sillä monet asiat ovat muuttuneet sitten edellisen Anki-version.

Kun pakkasi on päivitetty, Anki yrittää kopioida äänet ja kuvat vanhoista pakoista. Jos käytit mukautettua DropBox-kansiota tai mukautettua mediakansiota, päivitysjärjestelmä ei voi välttämättä paikallistaa mediatiedostojasi. Päivitys- raportti esitellään sinulle myöhemin. Jos huomaat, että jokin mediatiedosto ei kopioitunut vaikka sen olisi pitänyt, katso päivitysoppaasta lisäohjeita.

AnkiWeb tukee nyt suoraa mediatiedostojen synkronointia. Se ei vaadi erityisiä asetuksia ja mediatiedostot synkronoidaan korttiesi mukana kun synkronoit ne AnkiWebiin.Koko kokoelmaHaluatko ladata sen nyt?Tekijä: Damien Elmes. Lisäksi seuraavat henkilöt ovat tehneet ohjelmistoon korjauksia sekä antaneet suunnittelu-, käännös- ja testausapua:

%(cont)sSinulla on aukkotehtävätyyppi, mutta et ole tehnyt yhtään aukkotehtävää. Jatketaanko?Sinulla on useita pakkoja. Katso %(a)s. %(b)sEt ole vielä nauhoittanut ääntäsi.Pitää olla vähintään yksi sarake.NuoretNuoret + OpitutSinun pakkasiMuutoksesi vaikuttavat useisiin pakkoihin. Jos haluat muuttaa vain nykyistä pakkaa, lisää ensin uusi valintaryhmä.Kokoelmatiedostosi näyttäisi olevan korruptoitunut. Näin voi tapahtua kun tiedosto kopioidaan tai siirrettän kun Anki on auki tai kun kokoelma on tallennettu verkkolevylle tai pilveen. Katso ohjekirjasta tietoja miten voit palauttaa tiedostosi automaattisesta varmuuskopiosta.Kokoelmasi on epävakaassa tilassa. Valitse Työkalut > Tarkista tietokanta ja synkronoi sitten uudelleen.Kokoelmasi tai media-tiedostosi on liian suuri synkronoitavaksi.Kokoelmasi lähetettiin onnistuneesti AnkiWebiin. Jos käytät mitä tahansa muita laitteita, synkronoi ne nyt ja valitse juuri tältä koneelta lähettämäsi kokoelman lataus. Tämän jälkeen tulevat kertaukset ja lisätyt kortit yhdistetään automaattisesti.Tässä olevat pakkasi ja pakkasi AnkiWebissä eroavat toisistaan sellaisella tavalla, ettei niitä voida yhdistää, joten on välttämätöntä kirjoittaa jommat kummat pakat yli jommilla kummilla pakoilla. Jos valitset lataamisen AnkiWebistä, Anki lataa kokoelman AnkiWebistä ja kaikki mahdolliset edellisen synkronoinnin jälkeen tekemäsi muutokset katoavat. Jos valitset lähetyksen Ankiwebiin, Anki lähettää kokoelmasi AnkiWebiin ja kaikki mahdolliset muutokset, jotka olet tehnyt AnkiWebissä tai toisella laitteellasi edellisen synkronoinnin jälkeen, katoavat. Sen jälkeen kun kaikki laitteet ovat synkronoitu, tulevat kertaukset ja lisätyt kortit voidaan yhdistää automaattisesti.[ei pakkaa]varmuuskopiotakortillakorttia pakastakorttiin, jotka on valittu perusteellakokoelmapvpäiv.pakkapakan elinkaarikaksoiskappaleohjepiilotatuntiatuntia yli keskiyönvirheetliitetty kenttään %sliitetty tunnisteisiinminminuuttiakkkertaustasekuntiatilastottämä sivuvkokoko kokoelma~anki-2.0.20+dfsg/locale/et/0000755000175000017500000000000012256137063015124 5ustar andreasandreasanki-2.0.20+dfsg/locale/et/LC_MESSAGES/0000755000175000017500000000000012065014110016672 5ustar andreasandreasanki-2.0.20+dfsg/locale/et/LC_MESSAGES/anki.mo0000644000175000017500000002122312252567245020175 0ustar andreasandreasl            $ ( , 0 4 > G M S Y ] g m u     0 (  -: L Ydv X  %R* }Q Xbi p&~(  $18 ?K R`fkpu    $05F:   #/6=BJR W a m{   $6Cz 8 !% -"8W[ ':>BFJ NXhou{   8-7e ~  TN^cs| m  $;(/5!Gi(o)   $,;CJPV!u  & *8>HB  )4<BV kuz        $ !3 (U )~ 9  !!! (!F4! {!$!! !&!Y!G"L" T"u"" T)u0I.ka!O,24e:/z Y *W_&7DxEF+sdli| q GBA>fZ}wyMj^31X;{K-]V~"Smt<hCg=`Q689n(LoN\#JU?PRpbr Hc$%v'5@[ Stop%%d selected%d selected%s copy%s day%s days%s hour%s hours%s minute%s minutes%s month%s months%s second%s seconds%s year%s years%sd%sh%sm%ss%sy&About...&Cram...&Edit&File&Find&Go&Guide...&Help&Import&Invert Selection&Next Card&Previous Card&Reschedule...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)dOpen backup folderExport format:Find:Font Size:Font:In:Line Size:Replace With:A big thanks to all the people who have provided suggestions, bug reports and donations.About AnkiAddAdd TagsAdd: %sAddedAgainAll FieldsAnkiAnki is a friendly, intelligent spaced learning system. It's free and open source.Average TimeBasicBuryBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCard ListCenterChangeChange %s to:Check the files in the media directoryCloseClose and lose current input?Configure interface language and optionsConnecting...CreatedCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZDeleteDelete TagsDialogDiscard fieldE&xitEaseEasyEditEnter tags to add:Enter tags to delete:ExportExport...F1Field %d of file is:Field mappingFieldsFil&tersFind and Re&place...Find and ReplaceFirst ReviewGoodHTML EditorHardHelpIf you have contributed and are not on this list, please get in touch.Ignore this updateImportImport failed. Import optionsInclude scheduling informationInclude tagsInvalid regular expression.KeepLapsesLeechLeftMap to %sMap to TagsMarkedMatureMoreNetworkNothingOpenPassword:PreferencesProcessing...Record audio (F5)Recording...
Time: %0.1fRescheduleReviewReviewsRightSearchSelect &AllShow AnswerShow new cards before reviewsShow new cards in order addedShow new cards in random orderSome settings will take effect after you restart Anki.Supermemo XML export (*.xml)SuspendSuspendedSyncing Media...TagsThis file exists. Are you sure you want to overwrite it?Total TimeTreat input as regular expressionUndo %sVersion %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYoungdaysmapped to %smapped to TagsminsProject-Id-Version: ankiqt_ee_EE Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:33+0000 Last-Translator: Damien Elmes Language-Team: Estonian <> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: et Peata%%d valitud%d valitud%s (koopia)%s päev%s päeva%s tund%s tundi%s minut%s minutit%s kuu%s kuud%s sekund%s sekundit%s aasta%s aastat%sd%sh%sm%ss%syTe&ave...&Tuubi pähe...&Muuda&Fail&Otsi&Mine&Juhend...&Abi&ImportMuuda val&ik vastupidiseks&Järgmine kaart&Eelmine kaart&Ajasta uuesti...&Vahendid&Võta tagasi'%(row)s' omasid %(num1)d välja, väljaarvatud %(num2)dAva varukoopia kataloogEkspordi formaat:Otsi:Fondi suurus:Font:Mille hulgast:Joone paksus:Asenda sellega:Suur tänu kõigile, kes on edastanud soovitusi, vigadest teada andnud ja annetanud.Info Anki kohtaLisaLisa märksõnuLisa: %sLisatudUuestiKõik väljadAnkiAnki on sõbralik, intelligentse kordamisajavahega õppimise süsteem. See on tasuta ja avatud lähtekoodiga.Keskmine aegPõhimudelPeata kaardi õppimineAnki tuvastab vaikimisi selle märgi,mida kasutatakse väljade vahe nagu näiteks tabulaatori, koma jne. Kui Anki tuvastab selle märgi valesti, saad selle sisestada siin. Kasuta tabulaatori jaoks kombinatsiooni: \tLoobuKaartide loendKeskelMuudaMuuda %s selleks:Kontrolli faile meedia kataloogisSulgeSluge ja kaota praegu sisestatud andmed?Seadista kasutajaliidese keel ja suvandidÜhendan...TekitatudCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZKustutaKustuta märksõnadDialoogLoobu väljast&VäljuKergusKergeMuudaSisesta lisatavad märksõnad:Sisesta kustutatavad märksõnad:EksportEkspordi...F1Selle faili %d. väli on:Väljade vastendusVäljadFiltrid&Otsi ja asenda...Otsi ja asendaEsimene õppimineHeaHTML redaktorRaskeAbiKui sa oled panustanud ja Sind ei ole nimekirjas, palun võta ühendust.Eira seda uuendustImpordiImport ebaõnnestus. Importimise suvandidPane kaasa ajastamiste andmedPane kaasa märksõnadVigane regulaaravaldis.Hoia allesAjavahemikUnunejaVasakLiida väljadele %sLiida märksõnadegaMärgitudVanaVeelVõrkmitte midagiAvaSalasõna:EelistusedTöötlen...Lindista heli (F5)Lindistan...
Kestvus: %0.1fAjasta uuestiKordaKordamisedParemOtsiMärgi &kõikNäita vastustNäita uusi kaarte enne kordamistNäita uusi kaarte lisamise järjekorrasNäita uusi kaarte suvalises järjekorrasMõned sätted realiseeruvad peale Anki taaskäivitamist.Supermemo XML eksport (*.xml)PeataPeatatudSünkroniseeri meedia...MärksõnadSee fail juba olemas. Kas oled kindel, et soovid selle üle kirjutada?Aeg kokkuKohtle sisendit kui regulaaravaldistVõta tagasi %sVersioon %sKas Sa soovid selle kohe alla laadida?Loonud Damien Elmes, koos paranduste, tõlkijate, testijate and kujundajatega:

%(cont)sNoorpäevadliidetud väljadele %s-galiidetud siltidegaminanki-2.0.20+dfsg/locale/lt/0000755000175000017500000000000012256137063015133 5ustar andreasandreasanki-2.0.20+dfsg/locale/lt/LC_MESSAGES/0000755000175000017500000000000012065014111016702 5ustar andreasandreasanki-2.0.20+dfsg/locale/lt/LC_MESSAGES/anki.mo0000644000175000017500000000523012252567246020205 0ustar andreasandreas*l;(9=AEI MW ]hntx~  0  &,Jh *"# B'c    / 7> v      * * +< h  #$(* %  )"&  !'%%d selected%d selected%s copy%s day%s days%s hour%s hours%s minute%s minutes%s month%s months%s second%s seconds%s year%s years%sd%sh%sm%ss%sy&About...&Edit&Export...&File&Find&Go&Help&Import&Import...&Invert Selection&Next Card'%(row)s' had %(num1)d fields, expected %(num2)dAddedAverage TimeBasicCenterDueFirst ReviewIntervalLeftReviewsRightShow new cards before reviewsShow new cards in order addedShow new cards in random orderSupermemo XML export (*.xml)Total TimeProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:23+0000 Last-Translator: Damien Elmes Language-Team: Lithuanian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: lt %Pasirinkta %dPasirinktos %dPasirinkta %d%s kopijavimas%s diena%s dienos%s dienų%s valanda%s valandos%s valandų%s minutė%s minutės%s minučių%s mėnuo%s mėnesiaimėnesių%s sekundė%s sekundės%s sekundžių%s metai%s metai%s metų%sd%sh%sm%ss%sy&Apie...&Keisti&Eksportuoti...&Failas&Ieškoti&Eiti&Pagalba&Importuoti&Importuoti...Žymėt&i atvirkščiai&Kita kortelė'%(row)s' yra %(num1)d laukai, tikėtasi rasti %(num2)dPridėtaLaiko vidurkisPagrindinisCentreLaukiaPirmąkart pamatytaIntervalasKairėjeKartojimaiDešinėjeParodyti naujas korteles prieš kartojimąParodyti naujas korteles pridėjimo tvarkaParodyti naujas korteles atsitiktine tvarkaSupermemo XML eksportas (*.xml)Laikas iš visoanki-2.0.20+dfsg/locale/nl/0000755000175000017500000000000012256137063015125 5ustar andreasandreasanki-2.0.20+dfsg/locale/nl/LC_MESSAGES/0000755000175000017500000000000012065014111016674 5ustar andreasandreasanki-2.0.20+dfsg/locale/nl/LC_MESSAGES/anki.mo0000644000175000017500000021036012252567246020201 0ustar andreasandreas6I|3DD DDD"DD DD8E;ETEeE"vE$E$E&E F")FLF_FpF$F FFF0G1G9G&HG oG{G(GGG,GH*!HLH,aH HH(HHHHHHH HHIII $I/I5I;I?I FIPIVI ^IiI {IIIIIIIII0I .J;J AJ LJWJ]JpJJJKKK"K*K1K6K;K?KCKTGKKK,K(K L!)LKLfcLL LL L MM'M9MNMeeMM7uN NN5NXOYYO8O O OPP "P ,P6P LP ZPfP oP|PPP P$PP PP P P%PK QlQNQQ#R SS'S T-TTTRbUvUw,V7V VwVE`W@WWWWRXXXX#X#Y>Y ]Y~Y(YY YY YYZ Z %Z 2Z@ZHZNZhZZZZZLZ [[.[4[Q[o[ t[~[:\A\F\N\U\\\ u\ \ \\\\\ \3\]S"]v]]] ] ]]]]]"]^&$^ K^W^ ^^j^ {^ ^^^^^^-^ __(_B_5T_ ___8_5_P`7f``` ````` ``aaa%a,a3a:aAaHaOa Va ca pa }a a a a aaaa a aaa bb 0b=bRblbbbbb b b bb b/b)c/cDc%Lcrc yc c c c c c c cc,c( dIdgd |dFdNdPe>mePeef]$f f8ff fff)g0gLgPg _glgrgwg |g ggg g gggg g!g hh)h0Hhyhh4h!hhhi)iBiVigi nixi~iiiiiii i iii ii ij, j9jKjRjZjcjtjjjjj j jjjjjkkkkkk l ll.l6lIl Yldlil }ll$lll lllll.lFmfmm m4mmm m1n8nHnhnwn*n nn nn"o"3o Vowoooooo o o)op#p?pVpkppppppp p ppq q<qYqbq hquqqq q+qqq qqq r r(r -r7rJrQrXrir}rrrrrr r rrss s)s8s>sFs JsTsjs yss s ssssss+t@t#Pt!ttt t t<t tt] uahuu!uvv v,vJv#w6w ;wIwYwawpw ww w wwww wwx x+x Hx Sx^x,}x#x)xVx8OyEyyyyz6z,Lzyz-z+z8z%{ .{:{B{]{#o{ {{{{{{{ ||||*|1|B|J|[|m||| ||i|B} I} U}b} s}~} }"}} }1} ~~ 1~R~ Y~ f~ r~~~~-~~~  $.5U \ hvV ,ĀG߀ 'H Yf nzׁ*'?!g6 Ƃ!т?3CI Y grx ݃ /7Vi Ä ̈́**!=d_ ąυӅ܅ ( 2 LmX+" &0W0q+U·F$*k(1I;'+tSȊ#d؋e=8ӍCc(rЎCƏˏ ޏaku͐MC8 > I U!a'Β.>O ^&h, Um$u8Ӕ(ח"W Sc0$" 0 6 B{Mə^ʚ)U2  ƞўӞ؞ ݞ &<AILT\ bln8 ?KR+YO$(+<1h1/̢!&EY5y=5#?A_ ! 2&Ip%(" 048<AEIRf  ʦ Ц ܦ% 0 ?Mct 9  $@OS u!/-ݩ %+Qi) < GShq3Ҭ A'ZisĭC8| !Ю.=T c q|%ͯ 0a*c%.Ӳ ôִuXzεI:޶ %NINW gbrո"}&$ǹ#&75S (ͺ -AJP"lŻSͻ!1E8J:Ǽܼ  ½ Ͻ ٽ " *G5}T !0$Lq, ҿ%ܿ"1 M Yg$o> +3/Hx =7n<  # *5FMT[bipw~  #: NZt#%"3 HVZ=l 4  4D]u9E4Yc[ w|SmH 'q \Ei,#(LUm }     5AI3_#G)T/ " < GU[]`cfi!l  5&=D LVh    0IRi{ '! & 4AGY6]G V9 R&*Qn+,0,K0x 2&Yn%!  % = JXpE ( F P]0p 3 Q\aq". L Ygv| !(Jc$z6-3 KWhiz}h$4SY \Ui5  *6FOg"  >R l w4C7-4{b<Tp/9O2kFT: B M([#B *GMe { & #7*@k| % /=Xl"#8 1>!]1 2% Xd  s 09jl( 8 FT] lz#'.- A7-y!O "-.?\  / 9"Y| (%8V q| +)%+)Fjp   )-/]u]4 +B&n=2[5{('?DB,v%'u& >1pJ' r hVp ) -2`{A 23f!{4  .]u6|OUWE<##"  ' 2 : 9  L    #2 7AE Xe}   &:U t8MjDWT  _Xduvw%yz5i3@'}+kpa&T;k*1N:+x'GP_\.Fo-:m76yV=i aD |!>@)0h<`+ReQ"J>EM=1oG?6$(/e3Zv?% g; Et)rJHq#<[)CsFxSw]W0_1l Z\=7b,|-.01+(. <5KRU^ ."F( @B}r^IlTf S b]-#3;X4 unKDC9epq6`PL|P#LqE[h2NX>87Huf/V sc*$Qn pZ /~KB8MOnY0!{2%&9hm4^*fJI6t4x,4%Uy/Ai "!)O\N~{jdm59BWojw3"-,]`!Vc YH#OQk*5}gAGI'RC2 s[&zAL',g $(b?Y2$z{ld~rac  S v Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.Underline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-06-17 03:41+0000 Last-Translator: Mario Huys Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: nl Stop (1 van %d) (uit) (aan) Het bevat %d kaart. Het bevat %d kaarten.%% Juist%(a)0.1f %(b)s/dag%(a)d van %(b)d aantekening bijgewerkt%(a)d van %(b)d aantekeningen bijgewerkt%(a)dkB opwaarts, %(b)dkB neerwaarts%(tot)s %(unit)s%d kaart%d kaarten%d kaart verwijderd.%d kaarten verwijderd.%d kaart geëxporteerd.%d kaarten geëxporteerd.%d kaart geïmporteerd.%d kaarten geïmporteerd.%d kaart gestudeerd in%d kaarten gestudeerd in%d kaart/minuut%d kaarten/minuut%d set bijgewerkt.%d sets bijgewerkt.%d groep%d groepen%d aantekening%d aantekeningen%d aantekening toegevoegd%d aantekeningen toegevoegd%d aantekening geïmporteerd.%d aantekeningen geïmporteerd.%d aantekening bijgewerkt%d aantekeningen bijgewerkt%d herhaling%d herhalingen%d geselecteerd%d geselecteerd%s bestaat al op uw bureaublad. Wilt u het bestand overschrijven?%s kopiëren%s dag%s dagen%s dag%s dagen%s verwijderd.%s uur%s uur%s uur%s uur%s minuut%s minuten%s minuut.%s minuten.%s minuut%s minuten%s maand%s maanden%s maand%s maanden%s seconde%s seconden%s seconde%s seconden%s te verwijderen:%s jaar%s jaar%s jaar%s jaren%sd%sh%sm%smo%ss%sy&Over...&InvoegtoepassingenDatabase &controleren...&Blokken...B&ewerken&Exporteren...&Bestand&Zoeken&Gaan&Gids&Gids...&Help&Importeren&Importeren&Selectie omkeren&Volgende kaartMap met invoegtoepassingen &openen...&Voorkeuren...&Vorige kaart&Planning wijzigen...Anki &steunen...&Profiel omschakelen...H&ulpmiddelen&Ongedaan maken%(row)s' bevatten %(num1)d velden, verwachtte er %(num2)d(%s juist)(einde)(gefilterd)(aan het leren)(nieuw)(limiet van bovenliggend niveau: %d)(kies 1 kaart)....anki2 bestanden zijn niet bedoeld om te importeren. Als u een back-up probeert te herstellen, lees dan het hoofdstuk 'Back-ups' van de gebruikershandleiding./0d1 101 maand1 jaar10AM10PM3AM4AM4PM504 gateway time-out fout ontvangen. Gelieve uw antivirus software tijdelijk uit te schakelen en opnieuw te proberen.: en%d kaart%d kaartenMap met back-ups openenBezoek website%(pct)d%% (%(x)s van de %(y)s)%Y-%m-%d @ %H:%MBack-ups
Anki zal een back-up maken van uw collectie telkens wanneer het programma geopend of gesynchroniseerd wordt.Exportformaat:Zoeken:Grootte lettertype:Lettertype:In:Set:Regelbreedte:Vervangen door:SynchronisatieSynchronisatie
Uitgeschakeld; klik op de Sync-knop in het hoofdscherm om deze functie in te schakelen.

Account vereist

Een gratis account is vereist om uw collectie gesynchroniseerd te houden. Gelieve eerst een account aan te vragen, vooraleer onderstaande gegevens in te vullen.

Update Anki

Anki %s is beschikbaar.

Hartelijk dank aan iedereen die heeft bijgedragen met suggesties, foutrapporten of giften.Het gemak van een kaart is de lengte van het volgende interval wanneer u een herhaling als "goed" evalueert.Een bestand genaamd collection.apkg is op uw bureaublad opgeslagen.Afgebroken: %sOver AnkiToevoegenToevoegen (sneltoets: ctrl+enter)Veld toevoegenMedia toevoegenNieuwe set toevoegen (Ctrl+N)Aantekeningstype toevoegenOmgekeerde toevoegenTags toevoegenNieuwe kaart toevoegenToevoegen aan:Toevoegen: %sToegevoegdVandaag toegevoegdDubbel toegevoegd met eerste veld: %sOpnieuwVandaag opnieuwAantal te herdoen: %sAlle setsAlle veldenAlle kaarten in willekeurige volgorde (blokmode)Alle kaarten, aantekeningen en media voor dit profiel zullen worden verwijderd. Weet u het zeker?HTML in velden toestaanEr trad een fout op in een invoegtoepassing.
Gelieve een bericht te plaatsen op het forum voor invoegtoepassingen:
%s
Een fout trad op. Dit kan veroorzaakt zijn door een schadeloze programmeerfout,
of er zou een probleem kunnen zijn met uw set.

Om te bevestigen dat er geen probleem is met uw set, gelieve Hulpmiddelen > Database controleren uit te voeren.

Als dat het probleem niet oplost, gelieve het volgende te kopiëren
naar een foutenrapport:Een afbeelding is op uw bureaublad opgeslagen.AnkiAnki 1.2 set (*.anki)Anki 2 slaat uw kaarten op in een nieuw formaat. Deze wizard zal automatisch uw kaartensets converteren naar dat formaat. Er zal een back-up van uw sets gemaakt worden voor de conversie van start gaat, zodat uw huidige sets altijd nog te gebruiken zijn met de eerdere versie van Anki.Anki 2.0 setAnki 2.0 ondersteunt alleen de automatische upgrade vanaf Anki 1.2. Om oudere kaartensets te converteren kunt u ze eerst in Anki 1.2 openen en converteren, en ze vervolgens importeren in Anki 2.0.Ingepakte Anki-setAnki kon de lijn tussen de vraag en het antwoord niet vinden. Pas het sjabloon handmatig aan om vraag en antwoord te verwisselen.Anki is een toegankelijk en intelligent systeem voor studie d.m.v. gespreide herhaling. Het is gratis en open source.Anki gebruikt de AGPL3 licentie. Gelieve het licensiebestand in de brondistributie raad te plegen voor verdere informatie.Anki kon uw bestaande configuratie niet laden. Gelieve Bestand>Importeren te gebruiken om uw kaartensets uit eerdere versies van Anki te importeren.AnkiWeb ID of wachtwoord was onjuist; probeer het opnieuw.AnkiWeb ID:Er is een fout in AnkiWeb opgetreden. Probeer het over een paar minuten opnieuw, en dien een foutenrapport in als het probleem blijft optreden.AnkiWeb is momenteel te zwaar belast. Probeer het over enkele minuten opnieuw.AnkiWeb is in onderhoud. Gelieve over enkele minuten opnieuw te proberen.AntwoordAntwoordknoppenAntwoordenAnki wordt door antivirus of firewall-software gehinderd bij het maken van een internetverbinding.Kaarten die nergens aan gekoppeld zijn zullen verwijderd worden. Als een aantekening geen kaarten meer heeft, zal deze verdwijnen. Weet u zeker dat u verder wilt gaan?Kwam twee keer in bestand voor: %sBent u zeker dat u %s wil verwijderen?Minstens één kaarttype is vereist.Minstens één leerstap is vereist.Afbeelding/geluid/video toevoegen (F3)Geluid automatisch afspelenProfiel automatisch synchroniseren bij openen/sluitenGemiddeldeGemiddelde duurGemiddelde antwoordtijdGemiddelde gemakGemiddelde voor dagen waarop u studeerdeGemiddeld intervalAchterkantVoorvertoning achterkantSjabloon achterkantBack-upsBasisBasis (en omgekeerde kaart)Basis (omgekeerde kaart optioneel)Vette tekst (Ctrl+B)BladerenBlader && installeer...BrowserBrowser (%(cur)d kaart getoond; %(sel)s)Browser (%(cur)d kaarten getoond; %(sel)s)BrowseruitzichtBrowserinstellingenBouwTags toevoegen aan meerdere aantekeningen (Ctrl+Shift+T)Tags verwijderen van meerdere aantekeningen (Ctrl+Shift+T)BegravenAantekening begravenAnki detecteert standaard het karakter tussen velden, zoals tabs, komma's, etc. Indien Anki het karakter verkeerd detecteert kan u het hier invoeren. Gebruik \t voor een tab.AnnulerenKaartKaart %dKaart 1Kaart 2KaartgegevensKaartenlijstKaarttypeKaarttypesKaarttypes voor %sKaart opgeschort.Deze kaart was moeilijk.KaartenKaarttypesKaarten kunnen niet handmatig aan een gefilterde set toegevoegd worden.Kaarten in tekst zonder opmaakKaarten zullen na het herhalen automatisch terugkeren naar hun oorspronkelijke sets.Kaarten...CentrerenWijzigen%s wijzigen naar:Set veranderenAantekeningstype veranderenAantekeningstype veranderen (Ctrl+N)Aantekeningstype veranderen...Kleur aanpassen (F8)Set veranderen op basis van aantekeningstypeGewijzigdBestanden in de media-map controlerenBezig met controleren...KiezenSet selecterenAantekeningstype selecterenTags kiezenDupliceer: %sSluitenSluiten en huidige invoer verwerpen?ClozeCloze (Ctrl+Shift+C)Code:Collectie is beschadigd. Gelieve de handleiding te raadplegen.Dubbele puntKommaInterfacetaal en -instellingen configurerenBevestig wachtwoord:Proficiat! U bent voorlopig klaar met deze set.Bezig met verbinden...DoorgaanKopiërenJuiste antwoorden voor rijpe kaarten: %(a)d/%(b)d (%(c).1f%%)Juist: %(pct)0.2f%%
(%(good)d van de %(tot)d)Kon geen verbinding maken met AnkiWeb. Gelieve uw netwerkverbinding te controleren en dan opnieuw te proberen.Kon geen geluid opnemen. Heeft u lame en sox geïnstalleerd?Kon bestand niet opslaan: %sBlokkenSet aanmakenGefilterde set aanmaken...AangemaaktCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulatiefCumulatieve %sCumulatieve antwoordenCumulatieve kaartenHuidige setHuidige aantekeningstype:Aangepaste studieAangepaste studiesessieAangepaste leerstappen (in minuten)Kaarten aanpassen (Ctrl+L)Velden aanpassenKnippenDatabase herbouwd en geoptimaliseerd.DatumDagen gestudeerdMachtiging intrekkenDebug consoleSetSet overschrijvenSet zal geïmporteerd worden zodra een profiel wordt geopend.SetsAfnemende intervallenStandaardVertragingen totdat herhalingen weer getoond worden.Verwijderen%s verwijderen?Kaarten verwijderenSet verwijderenLege kaarten verwijderenAantekening verwijderenAantekeningen verwijderenTags verwijderenOngebruikte kaarten verwijderenVeld uit %s verwijderen?Het '%(a)s' kaarttype en de bijhorende %(b)s verwijderen?Wilt u dit aantekeningstype en alle bijbehorende kaarten verwijderen?Wilt u dit ongebruikte aantekeningstype verwijderen?Ongebruikte media verwijderen?Verwijderen…%d kaart met ontbrekende aantekening verwijderd.%d kaarten met ontbrekende aantekening verwijderd.%d kaart met ontbrekend sjabloon verwijderd.%d kaarten met ontbrekend sjabloon verwijderd.%d aantekening met ontbrekend aantekeningstype verwijderd.%d aantekeningen met ontbrekend aantekeningstype verwijderd.%d aantekening met 0 kaarten verwijderd.%d aantekeningen met 0 kaarten verwijderd.%d aantekening met verkeerd aantal velden verwijderd.%d aantekeningen met verkeerd aantal velden verwijderd.Verwijderd.Verwijderd. Gelieve Anki te herstarten.Door deze set uit de lijst te verwijderen zullen alle resterende kaarten terugkeren naar hun oorspronkelijke set.BeschrijvingBeschrijving getoond op het studiescherm (enkel voor de huidige set):DialoogvensterVeld verwerpenDownloaden mislukt: %sDownloaden van AnkiWebDownload gelukt. Gelieve Anki te herstarten.Bezig met downloaden van AnkiWeb...VerwachtEnkel verwachte kaartenMorgen verwacht&AfsluitenGemakkelijkheidsgraadMakkelijkBonus voor makkelijke kaartenInterval voor makkelijke kaartenBewerken%s bewerkenHuidige bewerkenHTML bewerkenBewerken om aan te passenBewerken...BewerktLettertype invoerveldBewerkingen opgeslagen. Gelieve Anki te herstarten.LeegLege kaarten...Lege kaarten: %(c)s Velden: %(f)s Lege kaarten gevonden. Gelieve Hulpmiddelen>Lege kaarten uit te voeren.Leeg eerste veld: %sEindeGeef de set op waar de %s nieuwe kaarten aan toegevoegd moeten worden, of laat leeg:Nieuwe kaartpositie (1...%s):Voer nieuwe tags in:Voer te verwijderen tags in:Fout tijdens downloaden: %sFout tijdens opstarten: %sFout bij uitvoeren %s.Fout bij uitvoeren van %sExporterenExporteren...ExtraFF1F3F5F7F8Veld %d van bestand wordt:VeldkoppelingVeldnaam:Veld:VeldenVelden voor %sVelden gescheiden door: %sVelden...Fil&tersBestand is ongeldig. Gelieve te herladen van back-up.Bestand niet gevonden.FilterFilter:GefilterdGefilterde set %d&Dubbele kaarten zoeken...Dubbele kaarten zoekenZoeken en &vervangen...Zoeken en vervangenBeëindigenEerste kaartEerste herhalingOmdraaienMap bestaat al.Lettertype:VoettekstOm veiligheidsredenen is '%s' niet toegestaan in kaarten. U kan dit nog wel gebruiken als u in plaats hiervan het commando in een ander pakket plaatst, en dat pakket importeert in de LaTex koptekst.VoorspellingFormulierDoorgeven & optioneel omkerenDoorgeven & omkeren%(a)s in %(b)s gevonden.VoorkantVoorvertoning voorkantSjabloon voorkantAlgemeenAangemaakt bestand: %sAangemaakt op %sGedeelde set downloadenGoedInterval na lerenHTML-editorMoeilijkHeeft u latex en dvipng geïnstalleerd?KoptekstHelpHoogste gemakGeschiedenisStartVerdeling per uuruurUren met minder dan 30 herhalingen worden niet getoondGelieve contact met ons op te nemen als uw bijdrage niet vermeld wordt.Als u elke dag had gestudeerdNegeer antwoordtijden langer danHoofd-/kleine letters negerenLijnen negeren waarvan het eerste veld identiek is aan een reeds bestaande aantekeningDeze update negerenImporterenBestand importerenImporteren zelfs als het eerste veld hetzelfde is als in een bestaande aantekeningImporteren mislukt. Importeren mislukt. Debug-informatie: Instellingen voor importerenKlaar met importeren.In media-map maar niet gebruikt in kaarten:Media toevoegenPlanningsinformatie toevoegenTags toevoegenDe limiet op nieuwe kaarten vandaag verhogenDe limiet op nieuwe kaarten vandaag verhogen metDe limiet op herhaalkaarten vandaag verhogenDe limiet op herhaalkaarten vandaag verhogen metToenemende intervallenInfoInvoegtoepassing installerenInterfacetaal:IntervalIntervalsfactorIntervallenOngeldige code.Ongeldig bestand. Gelieve te herladen van back-up.Ongeldig wachtwoord.Ongeldige reguliere expressie.Daarom werd hij opgeschort.Schuine tekst (Ctrl+I)JavaScript-fout op regel %(a)d: %(b)sSpring naar tags met Ctrl+Shift+TBewarenLaTeXLaTeX-formuleLaTeX wiskunde-omgevingVergissingenLaatste kaartMeest recente herhalingMeest recent toegevoegde eerstLerenMaximaal vooruit lerenLeren: %(a)s, Herhalen: %(b)s, Opnieuw leren: %(c)s, Gefilterd: %(d)sAan het lerenMoeilijke kaartActie moeilijke kaartenDrempelwaarde moeilijke kaartResterendBeperken totBezig met laden…Vergrendel account met wachtwoord, of laat leeg:Langste intervalZoek in veld:Laagste gemakBeherenAantekeningstypes beheren...Koppelen aan %sKoppelen aan tagsMarkerenAantekening markerenAantekening markeren (Ctrl+K)GemarkeerdRijpMaximumintervalMaximum herhalingen/dagMediaMinimumintervalMinutenMeng nieuwe kaarten en herhalingenMnemosyne 2.0 set (*.db)MeerMeeste vergissingenKaarten verplaatsenVerplaatsen naar set (Ctrl+D)Kaarten verplaatsen naar set:&AantekeningNaam bestaat.Naam voor set:Naam:NetwerkNieuwNieuwe kaartenNieuwe kaarten in set: %sEnkel nieuwe kaartenNieuwe kaarten/dagNieuwe setnaam:Interval nieuwe kaartenNieuwe naam:Nieuw aantekeningstype:Nieuwe naam voor deze optiegroep:Nieuwe positie (1...%d):Volgende dag begint omEr worden nog geen kaarten verwacht.Geen enkele kaart voldeed aan de criteria die u ingaf.Geen lege kaarten.Er werden vandaag geen rijpe kaarten geleerd.Geen ongebruikte of ontbrekende bestanden gevonden.AantekeningAantekeningstypeAantekeningstypesAantekening en de bijbehorende %d kaart verwijderd.Aantekening en de bijbehorende %d kaarten verwijderd.Aantekening begraven.Aantekening opgeschort.Let op: er wordt geen back-up gemaakt van uw media. Maak voor de zekerheid zelf regelmatig een back-up van uw Anki-bestanden.Let op: een deel van de geschiedenis ontbreekt. Zie voor meer informatie de documentatie van de browser.Aantekeningen in tekst zonder opmaakAantekeningen moeten ten minste één veld bevatten.NietsOkOudste eerstTijdens de volgende synchronisatie, veranderingen in één bepaalde richting forcerenEén of meerdere aantekeningen werden niet geïmporteerd omdat ze geen kaarten genereerden. Dit kan gebeuren wanneer u lege velden heeft of wanneer u de inhoud van het tekstbestand aan de verkeerde velden hebt gekoppeld.Alleen nieuwe kaarten kunnen hun volgorde veranderen.OpenenBezig met optimaliseren...Limiet (optioneel):InstellingenInstellingen voor %sOptiegroep:Instellingen…VolgordeVolgorde van toevoegingVolgorde van verwachtingAchterkant sjabloon overschrijven:Lettertype overschrijven:Voorkant sjabloon overschrijven:Wachtwoord:Wachtwoorden kwamen niet overeenPlakkenAfbeeldingen van het klembord naar het PNG-formaat converterenPauker 1.8 les (*.pau.gz)PercentagePeriode: %sAan het einde van de rij met nieuwe kaarten plaatsenIn de rij met te herhalen kaarten plaatsen met een interval tussen:Gelieve eerst een ander aantekeningstype toe te voegen.Een ogenblik alstublieft; dit kan even duren.Gelieve een microfoon aan te sluiten, en ervoor te zorgen dat geen andere programma's gebruikmaken van het geluidsapparaat.Pas deze aantekening aan en voeg een aantal clozes toe. (%s)Controleer dat een profiel is geopend en dat Anki niet bezig is, en probeer opnieuw.Gelieve PyAudio te installerenGelieve mplayer te installerenOpen eerst een profiel.Gelieve Hulpmiddelen>Lege kaarten uit te voerenGelieve een set te selecteren.Gelieve kaarten van één aantekeningstype te selecteren.Gelieve iets te selecteren.Gelieve de laatste versie van Anki te installeren.Gelieve Bestand->Importeren te gebruiken om dit bestand te importeren.Gelieve AnkiWeb te openen, vervolgens uw set te upgraden en dan opnieuw te proberen.PositieVoorkeurenVoorvertoningGeselecteerde kaart (%s) vooraf bekijkenNieuwe kaarten op voorhand herhalenNieuwe kaarten vooraf bekijken die werden toegevoegd in de laatsteBezig met verwerken...Wachtwoordprofiel...Profiel:ProfielenProxy vereist authenticatie.VraagAchterkant wachtrij: %dVoorkant wachtrij: %dBeëindigenWillekeurigVolgorde willekeurig door elkaar halenBeoordelingKlaar om te upgradenOpnieuw opbouwenEigen stem opnemenGeluid opnemen (F5)Bezig met opnemen...
Tijd: %0.1fHerlerenLaatste invoer tijdens toevoegen onthoudenTags verwijderenOpmaak verwijderen (Ctrl+R)Door dit aantekeningstype te verwijderen zullen één of meerdere kaarten ook verwijderd worden. Definieer eerst een nieuw aantekeningstype.HernoemenSet hernoemenGeluid opnieuw afspelen...Eigen stem afspelenVolgorde veranderenVolgorde nieuwe kaarten veranderenVolgorde veranderen...Vereis één of meer van deze tags:HerplanPlanning wijzigenHerplan kaarten op basis van mijn antwoorden in deze setNu hervattenOmgekeerde tekstrichting (RNL)Herzet naar de staat vóór '%s'.HerhalenAantal herhalingenHerhalingstijdOp voorhand herhalenOp voorhand herhalen voorKaarten herhalen die vergeten waren in de laatsteVergeten kaarten herhalenSuccespercentage voor elk uur van de dag bekijken.HerhalingenHerhalingen op komst in set: %sRechtsAfbeelding opslaanBereik: %sZoekenBinnen opmaak zoeken (traag)Willekeurig&Alles selecteren&Aantekeningen selecterenSelecteer ongewilde tags:De geselecteerde file was niet in het UTF-8 formaat. Gelieve de importeersectie in de handleiding erop na te lezen.Selectief studerenPuntkommaServer niet gevonden. Ofwel is uw verbinding verbroken, ofwel belet antivirus/firewall software Anki zich te verbinden met het internet.Deze optiegroep op alle sets onder %s toepassen?Op alle subsets toepassenVoorgrondkleur instellen (F7)De shift-toets was ingedrukt. Automatisch synchroniseren en laden van invoegtoepassingen wordt overgeslagen.Positie van bestaande kaarten opschuivenSneltoets: %sSneltoets: %s%s tonenAntwoord tonenDubbels tonenAntwoordtimer tonenNieuwe kaarten na herhalingen tonenNieuwe kaarten vóór herhalingen tonenNieuwe kaarten in volgorde van toevoegen tonenNieuwe kaarten in willekeurige volgorde tonenDe tijd van de volgende herhaling boven de antwoordknoppen tonen.Aantal resterende kaarten tijdens leren tonenStatistieken tonen. Sneltoets: %sGrootte:Sommige instellingen worden pas toegepast nadat u Anki opnieuw opgestart heeft.SorteerveldGebruik dit veld in de browser om te sorterenSorteren op deze kolom is niet mogelijk. Kies een andere kolom.Geluid & afbeeldingenSpatieStartpositie:Beginwaarde gemakStatistiekenLeerstap:Leerstappen (in minuten)Leerstappen moeten in minuten worden ingevoerd.HTML weglaten bij tekst plakkenVandaag %(a)s gestudeerd in %(b)s.Vandaag gestudeerdStuderenKaarten in set studerenKaarten in set studeren...Nu studerenLeren aan de hand van kaartstatus of tagStijlStijl (gedeeld tussen kaarten)Subscript (Ctrl+=)Supermemo XML uitvoer (*.xml)Superscript (Ctrl+Shift+=)OpschortenKaart opschortenAantekening opschortenOpgeschortGeluiden en afbeeldingen ook synchroniserenSynchroniseren met AnkiWeb. Sneltoets: %sBezig met synchroniseren van media...Synchronisatie mislukt: %sSynchronisatie mislukt; internet offline.Synchronisatie vereist dat de klok op uw computer juist is ingesteld. Stel uw klok bij en probeer opnieuw.Bezig met synchroniseren...TabAlleen taggenTagsDoelset (Ctrl+D)Doelveld:TekstTekst gescheiden door tabs of puntkomma's (*)Deze set bestaat reeds.Die veldnaam is al in gebruik.Die naam is al in gebruik.De verbinding met AnkiWeb duurde te lang. Controleer uw netwerkverbinding en probeer opnieuw.De standaardconfiguratie kan niet verwijderd worden.De standaardset kan niet verwijderd worden.De verdeling van kaarten in uw set(s).Het eerste veld is leeg.Het eerste veld van dit aantekeningstype moet gekoppeld zijn.Het volgende karakter mag niet gebruikt worden: %sDe iconen zijn afkomstig van verschillende bronnen; zie de Anki-broncode voor verwijzingen.Met uw invoer zou de vraag op alle kaarten leeg zijn.Het aantal vragen dat u beantwoord hebt.Het aantal op komst zijnde herhalingen.Het aantal keer dat u de verschillende knoppen heeft ingedrukt.Er zijn geen kaarten met die zoektermen. Wilt u de termen aanpassen?Voor deze verandering is het nodig om bij de volgende synchronisatie de hele database op te laden. Als er op een ander apparaat nog herhalingen of andere veranderingen zijn die nog niet gesynchroniseerd zijn, dan zullen deze verloren gaan. Doorgaan?De tijd die u nam om vragen te beantwoorden.De upgrade is voltooid, en Anki 2.0 is klaar voor gebruik.

Hieronder vindt u een log van de update:

%s

Er zijn meer nieuwe kaarten beschikbaar, maar de dagelijkse limiet is bereikt. U kunt de limiet in de instellingen verhogen, maar let er op dat dit uw werkdruk op de korte termijn zal verzwaren.Er moet minstens één profiel bestaan.Op deze kolom kan niet gesorteerd worden, maar u kunt wel zoeken naar individuele kaarttypes, bv. met 'card:Kaart 1'.Op deze kolom kan niet gesorteerd worden, maar u kunt wel zoeken naar specifieke sets door een set aan de linkerkant te selecteren.Dit bestand lijkt geen geldig .apkg bestand te zijn. Indien u deze fout kriigt voor een bestand dat werd gedownload van AnkiWeb, is de kans groot dat uw download mislukte. Gelieve nogmaals te proberen, en indien het probleem zich herhaalt, gelieve de download in een andere browser te proberen.Dit bestand bestaat. Bent u zeker dat u het wil overschrijven?In deze map wordt al uw Anki-data op één locatie opgeslagen, om het aanmaken van back-ups te vergemakkelijken. Als u Anki een andere locatie wilt laten gebruiken, kijk dan op: %s Dit is een speciale set bedoeld om buiten de normale planning te studeren.Dit is een {{c1::sample}} cloze.Dit zal uw bestaande collectie verwijderen en vervangen door de data in het bestand dat u aan het importeren bent. Weet u het zeker?De wizard zal u door het Anki 2.0 upgrade-proces leiden. Lees de volgende pagina's aandachtig om de upgrade soepel te laten verlopen. TijdMaximale studeertijdTe herhalenKlik op de Bladeren knop hieronder om invoegtoepassingen te bekijken.

Als u een invoegtoepassing wilt installeren, plak de bijbehorende code dan hieronder.Om te kunnen importeren in een met een wachtwoord beveiligd profiel, dient u dit profiel te openen voordat u het importeerproces start.Om een cloze te maken van een bestaande aantekening moet u eerst het type veranderen naar cloze, via Bewerken>Aantekeningstype.Klik op onderstaande Aangepaste studie knop om buiten de normale planning te studeren.VandaagHet maximum te herhalen kaarten is voor vandaag bereikt, maar er zijn nog steeds kaarten die voor vandaag gepland waren. Overweeg deze dagelijkse limiet in de instellingen te verhogen, om optimaal te leren.TotaalTotale tijdTotaal aantal kaartenTotaal aantal aantekeningenInvoer behandelen als reguliere expressieTypeType antwoord: onbekend veld %sKan een alleen-lezen bestand niet importeren.Onderstreep tekst (Ctrl+U)Ongedaan maken%s ongedaan makenOnbekend bestandsformaatOngezienBestaande aantekeningen aanpassen als het eerste veld overeenkomtUpgrade voltooidUpgrade-wizardBezig met upgradenBezig met upgrade van set %(a)s van %(b)s... %(c)sOpladen naar AnkiWebBezig met opladen naar AnkiWeb...Gebruikt in kaarten maar niet gevonden in media-map:Gebruiker 1Versie %sAan het wachten tot u klaar bent met bewerken.Waarschuwing, clozes zullen niet werken zolang u het type bovenaan niet verandert naar Cloze.WelkomBij het toevoegen, standaard de huidige set gebruiken.Het geluid van zowel vraag als antwoord afspelen als het antwoord getoond wordtAls u klaar bent om het upgrade-proces te starten, klik dan de Commit-knop hieronder. De upgrade-handleiding zal in uw browser worden geopend terwijl de upgrade bezig is. Gelieve de handleiding aandachtig te lezen, aangezien er veel is veranderd sinds de vorige Anki-versie.Als uw kaarten worden geconverteerd naar het nieuwe formaat, zal Anki proberen alle geluiden en afbeeldingen te kopiëren van de oude kaartensets. Als u een aangepaste Dropbox-map of media-map gebruikte, is het mogelijk dat het upgrade-proces uw media niet kan vinden. Verderop in het proces krijgt u een overzicht van de upgraderesultaten. Als u merkt dat sommige mediabestanden niet gekopiëerd zijn terwijl dat wel zou moeten gebruiken, raadpleeg dan de upgradegids voor verdere instructies.

AnkiWeb ondersteunt nu directe synchronisatie van media. U hoeft verder niets te doen om dit in te stellen: uw media zal worden meegenomen als u uw kaarten synchroniseert met AnkiWeb.Volledige collectieWilt u het nu downloaden?Geschreven door Damien Elmes. Patches, vertalingen, testen en design door:

%(cont)sU hebt een cloze aantekeningstype, maar u heeft nog geen clozes gecreëerd. Verdergaan?U heeft een groot aantal sets. Gelieve %(a)s te lezen. %(b)sU heeft uw stem nog niet opgenomen.U moet minstens één kolom hebben.JongJong+LerenUw setsUw aanpassingen zullen een effect hebben op verschillende sets. Als u enkel deze set wenst te veranderen, gelieve eerst een nieuwe optiegroep aan te maken.Uw collectiebestand blijkt corrupt te zijn. Dit kan gebeuren wanneer het bestand gekopiëerd of verplaatst werd terwijl Anki nog open was, of wanneer de collectie opgeslagen is op een netwerk- of cloud-drive. Gelieve de handleiding te raadplegen voor informatie over het herstellen vanaf een automatische back-up.Uw collectie is in een inconsistente staat. Gelieve Hulpmiddelen>Database controleren uit te voeren, en dan opnieuw te synchroniseren.Uw collectie was succesvol opgeladen naar AnkiWeb. Indien u nog andere apparaten gebruikt, gelieve die nu te synchroniseren, erop lettend ervoor te kiezen om de collectie te downloaden die u net hebt opgeladen van deze computer. Eenmaal gebeurd zullen toekomstige herhalingen en toegevoegde kaarten automatisch worden samengevoegd.Uw sets hier en op AnkiWeb verschillen dermate dat ze niet kunnen samengevoegd worden. Daarom is het nodig de sets van één van beide zijden te overschrijven met de sets van de andere zijde. Indien u kiest voor downloaden, zal Anki uw collectie downloaden van AnkiWeb, en alle veranderingen die u hebt gemaakt op uw computer sinds de laatste synchronisatie zullen verloren gaan. Indien u kiest voor opladen, zal Anki uw collectie opladen naar AnkiWeb, en alle veranderingen die u hebt gemaakt op AnkiWeb of enig ander apparaat sinds de laatste synchronisatie zullen verloren gaan. Nadat al uw apparaten terug gesynchroniseerd zijn, zullen toekomstige herhalingen en toegevoegde kaarten terug automatisch samengevoegd kunnen worden.[geen set]back-upskaartenkaarten van de setkaarten geselecteerd doorcollectieddagensetlevensduur sethelpverbergenuuruur na middernachtvergissingengekoppeld aan %sgekoppeld aan Tagsminutenminutenmaherhalingensecondenstatistiekendeze paginawvolledige collectie~anki-2.0.20+dfsg/locale/uk/0000755000175000017500000000000012256137063015133 5ustar andreasandreasanki-2.0.20+dfsg/locale/uk/LC_MESSAGES/0000755000175000017500000000000012065014111016702 5ustar andreasandreasanki-2.0.20+dfsg/locale/uk/LC_MESSAGES/anki.mo0000644000175000017500000027747212252567246020230 0ustar andreasandreasUl5hGiG pG{GG"GG GGG8GH.H?H"PH$sH$H&HH"I&I9IJI$gI III0I JJ&"J IJUJ(fJJJ,JJ*J&K,;K hKvK(KKKKKKK KKKKK K LLLL L*L0L 8LCL UL`LxLLLLLLL0L MM M &M1M7MJMaMeMMMMMN NNNNNT!NvNxN,N(NN!O%Of=OO OO O OOPP(Pe?PP7OQ QQ5QXQY3R8RkR 2S >SISMS hS rS|S S SS SSSS S$S T TT +T 5T%@TKfTTNT"U9U#PVtVyVV WW5XGXRXvYwY7 Z EZwQZEZ@[P[W[f[Rn[[D\#_\#\\ \\(])] 1]>] R]_]x]] ] ]]]]]]^ ^^L'^t^^^^^^ ^ ^)^'_C__` ```!`)` B` L` V`a` s```` `3``S`PaYa`a ga uaaaaa"aaa&b 5bAb HbTb eb qb{bbbbb-bbb(c,c5>c tccc8c5cPc7Pddd ddddd dddeeeee$e+e2e9e @e Me Ze ge te e e eeee e eee ef f'fWiPiii]j lj8xjj jjj)jk6k:k IkVk\kak fk qkkk k kkkk k!kkk)l02lclyl4}l!llllm,m@mQm Xmbmhmjmmmpmsmvmym m mmm mm mm,m#n5nqOq.UqFqqq r4rErXr _r1krrrrr*rs tt tt"u"6u Yuzuuuuuu u u u) v5vGvvvvw1wPwUw[wjwzw w wwww<wx x xx-x2x ;x+Fxrxx xxx x xx xxxxyy%y+yz KzUzdz|zzz+zz#z!{>{C{ K{ U{<`{ {{]{a|z|!| ||||,|}#}k}`~ e~s~~~~ ~~ ~ ~~~~! 2<SYw  ,#)VD8EԀ1He,Ł-ށ+ 88q z# ߂ 2; LZ_fv}Ճ i9 Ä Ԅ߄ "% -18 ju  Dž Ӆ-&T\t z  Ɇ׆VF V`,%G@  Lj ψۈ8V*u'!ȉ@618h !?Ί$ 4 BMSf} Ƌ ̋ ׋  1Da| *Ɍ!d: ƍˍ ( 6WXr+ˎ"&A0[+>UFM*(1,ؑIO'?tgܓ#ȔdeQ8Cw(rWژߘ au/WM՚ۚ| !Ư̈̀'16>S.Z& М&ڜ,+X _jUߝ$8 E( I"ZW}Sա0)$Z" {;^<5ѤUڥ 0:BH\ ny{ Ĩب  13 2 = HTbdǫ ɫ֫8/Ѭe}g`iF\a %o5X˯}$hC 5O] !EY-nQ34"WW1U37Wkô#ߴGKOSW^b fs,ŵݵ "4I[s"0ж 9T!rG /N a9k!ǸC˸(17=CIOnM:Ի!1I&?!Tv ͽ! Qz #-s^ <R h+","#FY jwO #H]qX+h2Wau  4U+ W+ffU3]=C8<L4k*9*Q|P! =(X 7T 7X'k4-13.bsYj Wv  56l"+ =Jp^;  $-"'PxR.]($ =""`1m+>OG$k(BW_j8`12C=a   - : G T a n {(" '&#N2r7, *J;+) :]J #zct!3= q>[K-By*,2>q@}I 0!X?'(! , =H!d#4(@.[cC"f& ~ =^V<+/% 66m!%   ' HTZd# ,#Hl$ ( D.O~ !V6 EJP0 E ,Q~%:)I _,j##  .c;'iG,,  b f !  Q-  &;;wKP\0K%9Ba)rSQ pJ0 #,9/f-!$0F wCp7H3]5 a#a!3 ()R!e* )XS'iB  #*1N4  )+Am !!6"!Y={4V'EWmV+G]u )$Job= H^ !   4 |!{!P#X#`$q$$ $"$"$$%$"%&G%Fn% %B%5& O&(\&&Z&&''E0'_v'J'P!(r(+))2i*2*I*W+q+L+!+P+sM,,J-Y-"r-B-A-e..%...=. ///K/ i/!t/=//$/0*!0L01k0'00D0 12<1o1L2'g2 2:2'2?3*S3A~333v3s464545%5;5!U5&w5A5,5_ 6m6W6 6%6 7 7C+7o7~77>77#888d95E:1{::C;;<6<)J<#t<0<^<J(=Ts=S=p>s>F? H?V?s?xR@@C@|-A!A A"A#A B 5B ?B.`BOB3B!C 5C@CXCsC=C C1C"D0'D*XDDD!DD=DF+E(rE2EcE2F9GSGWGuG G/GG G]G(FH<oH8HHZINI:1J#lJ^JRJBKKjLEMVIMPM>MH0OyOONQRR<TTU|VoNX'XtY=[ZZ"H[k\.r\\\].h^l_``!` aa0b23bJfbbZbpcc*ccc+cda3dJd6d2eJe7je!e%eceNfef:uffOgOmggBhE"jhn6~nnAo[p2^pGpppqqrtju>u8w|} .};}X}x}}} },}}}} ~* ~8~)G~1q~~~~~~~ 87-]'|&Z(1 q*USC3`BU<X8 I 9c<j!Jb"#+Vn!UR,}~Rm}n%A*PP=xE0ElY :hs~_5k+!XEWA_N[a(87  cgL.yT92Y/H e<_\)KL )[g^wJ<X\Dv=U:.Fu-OzedQPTo|DdW%p0,A*74yvVD%;F s $o9-BG2NJ{)ti?.Q#8yO#7/&j]f 'o G6YlF;]d'^G=eCn3$w LrO xqE[/iSH&?{I2bM6zxp0#i>HG 3MC"N*uu5HvBIw65$4@@t9\C:K;)K:m kz(?^'DN$VRr%|hk f@3,>BZ> `ZJhMKt a{aT!SQjsI(QM0f~c=8+41&564gpSml"-`.WR/b1F2}>1"AP  rT,@ ;q+OL?  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: 1.0.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-30 19:16+0000 Last-Translator: SteppenwolfUA Language-Team: Ukrainian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) Language: ua Стоп (1 з %d) (вимк) (увімкн) Містить %d картку. Містить %d карток. Містить %d карток.%% Вірно%(a)0.1f %(b)s/день%(a)0.1fs (%(b)s)%(a)d з %(b)d картки оновлено%(a)d з %(b)d карток оновлено%(a)d з %(b)d карток оновлено%(a)dkB відправлено, %(b)dkB отримано%(tot)s %(unit)s%d картка%d карток%d карток%d картку видалено.%d карток видалено.%d карток видалено.%d картку експортовано.%d карток експортовано.%d карток експортовано.%d карку імпортовано.%d карток імпортовано.%d cards imported.%d катка вивчена за%d картки вивчені за%d картки вивчені за%d картка/хвилину%d карток/хвилину%d карток/хвилину%d колоду оновлено.%d колод оновлено.%d колод оновлено.%d група%d груп%d груп%d нотатка%d нотатки%d нотатки%d нотатку додано%d нотток додано%d нотток додано%d нотатку імпортовано.%d нотаток імпортовано.%d нотаток імпортовано.%d нотатку оновлено%d нотаток оновлено%d нотаток оновлено%d повторення%d повторень%d повторень%d вибрано%d вибрано%d вибрано%s вже існує на вашому робочому столі. Перезаписати?копія %s%s день%s дні%s днів%s день%s дні%s днів%s видалено.%s година%s години%s годин%s година%s години%s годин%s хвилина%s хвилини%s хвилин%s хвилина.%s хвилин.%s хвилин.%s хвилина%s хвилини%s хвилин%s місяць%s місяці%s місяців%s місяць%s місяці%s місяців%s секунда%s секунди%s секунд%s секунда%s секунди%s секунд%s до видалення:%s рік%s роки%s років%s рік%s роки%s років%sd%sh%sm%sмі%ss%sy&Про Anki&Додатки&Перевірити базу даних...&Зубріння...&Редагування&Експортувати...&Файл&Знайти&Перейти&Довідник&Довідник...&Допомога&Імпортувати&Імпортувати…&Інвертувати вибір&Наступна Картка&Відкрити теку розширень...&Параметри...&Попередня картка&Перемістити...&Підтримати Anki...&Змінити профіль...&Інструменти&Скасувати'%(row)s' вміщує %(num1)d полів, очікуючих %(num2)d(%s правильно)(кінець)(відфільтровано)(вивчення)(новi)(ліміт колоди вищого порядку: %d)(виберіть 1 картку)...Файли .anki2 не придатні для імпортування. Якщо ви намагаєтеся відновити інформацію з резервної копії, ознайомтеся, будь ласка, з розділом "Ререзвні копії" інструкції користувача./0d1 101 місяць1 рік10:0022:0003:0004:0016:00Отримано помилку таймаута шлюзу 504. Спробуйте тимчасово призупинити вашу антивірусну програму.: and%d картку%d карток%d картокВідкрити теку резервних копійВідвідати вебсторінку%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MРезервні копії
Anki створюватиме резервну копію вашої колекції кожного разу при закритті або синхронізації.Формат експорту :Знайти:Розмір шрифту:Шрифт:В:Включити:Розмір рядка:Замінити на:СинхронізаціяСинхронізація
В даний момент не включена; для включення клацніть на кнопку синхронізації в головному вікні.

Необхідно Обліковий запис

Для підтримки синхронізації вашої колекції колод треба мати безкоштовний обліковий запис. Зареєструйтеся для отримання облікового запису, а потім внизу введіть Ваш логін та пароль.

Anki оновлено

Вийшла нова версія Anki %s.

<текст не в юнікоді><для пошуку наберіть запит тут; натисніть ввід, щоб показати поточну колоду>Дуже дякуємо всім за ваші пропозиції, повідомлення про вади, а також матеріальну підтримку.Легкість картки - це інтервал, через який цю картку знову буде показано, якщо ви дали відповідь "добре" під час повторення.На вашому робочому столі було збережено файл з назвою collection.apkg.Під час синхронізації медіа-файлів виникла помилка. Будь ласка, скористайтеся командою Інструменти>Перевірити медіа-файли, а потім проведіть повторну синхронізацію для виправлення помилки.Відхилено: %sПро AnkiДодатиДодати (скорочення клавіш: Ctrl+Enter)Додати полеДодати медіа-файлДодати нову колоду (Ctrl+N)Додати тип нотатокДодати зворотню сторонуДодавання мітокДодати нову карткуДодати до:Додати: %sДоданоДодано сьогодніДодано дублікат з однаковим першим полем: %sЗновуПовторити сьогодніКількість карток з відповіддю "Знову": %sУсі колодиВсі поляУсі картки у довільному порядку (режим зубріння)Всі картки, записи та медіа-файли для цього профілю будуть видалені. Ви певні?Допускається HTML у поляхУ додатку до програми виникла помилка.
Будь ласка, повідомте про це на форумі додатків до програми:
%s
Помилка під час відкриття %sВиникла помилка. Можливо це незначна вада,
або можливо проблема з вашою колодою.

Щоб переконатися, що проблема не з вашою колодою, виконайте команду Інструменти > Перевірити бузу даних.

Якщо це не усунуло проблему, скопіюйте наступне у повідомленя про ваду:Зображення було збережено на вашому робочому столі .AnkiКолода Anki 1.2 (*.anki)Anki 2 зберігає ваші колоди у новому форматі. Цей майстер автоматично переконвертує ваші колоди у цей формат. Перед оновленням програми буде зроблено резервні копії ваших колод, тому, якщо вам треба буде повернутися до попередньої версії Anki, ви можете користуватися вашими колодами.Колода Anki 2.0Anki 2.0 підтримує лише автоматичне оновленя з версії Anki 1.2. Для завантаження старих колод, їх треба відкрити в Anki 1.2 для оновлення, а потім імпортувати їх до Anki 2.0.Сторінка колод AnkiАнкі не вдалося знайти межу між питанням і відповіддю. Налаштуйте шаблон вручну, щоб розділити питання та відповідь.Anki - це зручна в користуванні, розумна система навчання з перервами. Вона безкоштовна та має відкритий код.Anki доступна по ліцензії AGPL3. Додаткову інформацію можна отримати з файла з текстом ліцензії, який входить до дистрибуційного комплекту вихідного коду.Anki не вдалося завантажити ваш старий конфігураційний файл. Скористайтеся "Файл>Імпортувати", щоб імпортувати ваші колоди з попередніх версій Anki.Невірні логін AnkiWeb або пароль; повторіть спробу.Обліковий запис на AnkiWeb:AnkiWeb зустріла помилку. Повторіть через декілька хвилин, і, якщо проблема не зникне, відправте повідомлення про ваду.AnkiWeb надто перевантажена в даний момент. Спробуйте ще рез через декілька хвилин.AnkiWeb на технічному обслуговуванні. Спробуйте ще рез через декілька хвилин.ВідповідьКнопки відповідіВідповідіАнтивірусна програма або файервол не дозволяє Anki підключитися до інтернету.Картки, у яких нема відповідників, будуть видалені. Якщо нотатка більше не містить карток, вона буде втрачена. Ви впевнені, що хочете продовжити?Повторилося двічі у файлі: %sВи впевнені, що хочете видалити %s?Необхідно принаймні один тип карток.Необхідно принаймні один крок.Додати зображення/аудіо/відео (F3)Автоматично програвати звукАвтоматична синхронізація при відкритті/закритті профілюСереднєСередній часСередній час відповідіСередня легкістьСередній показник за дні роботи з програмоюСередній інтервалНазадЗворотній бік - попередній виглядЗворотній бік - шаблонРезервні копіїБазоваБазова (із зворотньою карткою)Базова (із необов'язковою зворотньою карткою )Жирний шрифт (Ctrl+B)НавігаторЗнайти && Встановити...НавігаторНавігатор (%(cur)d картку відображено; %(sel)s)Навігатор (%(cur)d карток відображено; %(sel)s)Навігатор (%(cur)d карток відображено; %(sel)s)Зовнішній вигляд НавігатораНалаштування НавігатораПобудуватиДодати групу міток (Ctrl+Shift+T)Видалити групу міток (Ctrl+Alt+T)ПоховатиПоховати карткуПоховати нотаткуПоховати пов'язані нові картки до наступного дняПоховати пов'язані картки на повторення до наступного дняЗа замовчуванням, Anki буде знаходити знаки між полями, такі як символ табуляції, кома, и т.д. Якщо Anki визначить символ невірно, ви можете ввести його тут. Використовуйте \t для відображення TAB.ВідмінитиКарткаКартка %dКартка 1Картка 2Індекс карткиІнформація по картці (Ctrl+Shift+I)Список картокТип карткиТипи картокТипи карток для %sКартку похованоКартку відкладено.Картка була приставуча.КарткиТип картокКартки не можна вручну переміщати до відфільтрованої колоди.Картки з неформатованим текстомПісля повторення картки автоматично повертаються до своєї оригінальної колоди.Картки...ЦентрЗмінитиЗмінити %s на:Змінити колодуЗмінити тип нотаткиЗмінити тип нотатки (Ctrl+N)Змінити тип нотатки...Змінити колір (F8)Змінити колоду в залежності від типу нотаткиЗміненоПеревірити &медіа-файли...Перевірити директорію з аудіо-візуальними файламиПеревірка…ВибратиОберіть КолодуОберіть Тип НотаткиВибрати міткиКлон: %sЗакритиЗакрити та втратити поточні дані?Картка з пробіламиКартка з пробілами (Ctrl+Shift+C)Код:Колекція пошкоджена. Зверніться до інструкції користувача.ДвокрапкаКомаВибіо мови інтерфейсу та інших налаштуваньПідтвердіть пароль:Вітаємо! В даний момент ви закінчили роботу з цією колодою.Підключення...ПродовжитиКопіюватиПравильні відповіді по зрілим карткам: %(a)d/%(b)d (%(c).1f%%)Вірно: %(pct)0.2f%%
(%(good)d з %(tot)d)Не вдалося зв'язатися з AnkiWeb. Перевірте підключення до інтернету та повторіть спробу.Не вдалося записати аудіо. У вас встеновлені lame та sox?Не вдалося зберегти файл: %sЗубрінняСтворити колодуСтворити відфільтровану колоду...СтвореноCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZСукупноСумарно %sСумарно по відповідяхСумарно по карткахПоточна колодаПоточний тип нотатки:Додаткове навчанняСесія додаткового навчанняНастроювані кроки (в хвилинах)Налаштувати картки (Ctrl+L)Налаштувати поляВирізатиБаза даних перебудована та оптимізованаДатаДнів роботи з програмоюДеавторизуватиКонсоль зневаджуванняКолодаІгнорування налаштувань колодиКолоду буде імпортовано під час відкриття профілю.КолодиНисхідні інтервалиТиповийЧас, через який будуть знову показуватися картки для повторювання.ВидалитиВидалити %s?Видалити карткиВидалити колодуВидалити пустіВидалити нотаткуВидалити нотаткиВидалити міткиВидалити невикористовуваніВидалити поле з %s?Видалити тип картки '%(a)s', та її %(b)s?Видалити цей тип нотатки та всі картки цього типу?Видалити цей невикористаний тип нотаток?Видалити невикористані медіа-файли?Видалити...Вилучено %d картка з відсутньою нотаткою.Вилучено %d карток з відсутньою нотаткою.Вилучено %d карток з відсутньою нотаткою.Вилучено %d картку з відсутнім шаблоном.Вилучено %d карток з відсутнім шаблоном.Вилучено %d карток з відсутнім шаблоном.Вилучено %d картку з відсутнім типом нотатки.Вилучено %d карток з відсутнім типом нотатки.Вилучено %d карток з відсутнім типом нотатки.Вилучено %d нотатку без карток.Вилучено %d нотаток без карток.Вилучено %d нотаток без карток.Вилучено %d нотатку з невірною кількістю полів.Вилучено %d нотаток з невірною кількістю полів.Вилучено %d нотаток з невірною кількістю полів.Вилучено.Вилучено. Перезапустіть Anki.Після видалення цієї колоди з переліку колод усі залишкові картки буде повернуто до їхньої оригінальної колоди.ОписОпис, для відображення на екрані навчання (лише для поточної колоди):ДіалогСкинути полеЗавантаження не вдалося: %sЗавантажити з AnkiWebЗавантаження пройшло успішно. Перезапустіть Anki.Завантаження з AnkiWeb...ОчікуєтьсяЛише очікувані карткиОчікуються завтра&ВихідЛегкістьЛегкоБонус легкостіІнтервал легкостіРедагуванняРедагувати %sРедагувати поточнуРедагувати HTMLРедагувати для налаштуванняРедагувати...ВідредагованоШрифт режиму редагуванняВнесені зміни збережено. Будь ласка, перезапустіть Anki.СпорожнитиПорожні картки...Номери порожніх карток: %(c)s Поля: %(f)s Знайдено порожні картки. Виконайте команду "Інструменти>Порожні картки".Порожнє перше поле: %sКінецьВкажіть колоду, до якої помістити нові %s картки або залиште порожнім:Введіть нову позицію картки (1...%s):Введіть мітки, які треба додати до виділених картокВведіть мітки для видалення з виділених картокПомилка завантаження: %sПомилка під час запуску: %sПомилка виконання %s.Помилка запуску %sЕкспорт колоди в інший форматЕкспорт ...ДодатковоFF1F3F5F7F8Поле %d з файлу:Відповідність полівНазва поля:Поле:ПоляПоля для %sПоля, розділені: %sПоля...&ФільтриНедійсний файл. Відновіть його з резервної копії.Файл був відсутній.ФільтрФільтр:ВідфільтрованіВідфільтрована колода %dПошук &дублікатів...Пошук дублікатів&Знайти і замінити...Знайти і замінитиЗавершеноПерша карткаВперше побаченаПерше поле співпало: %sВиправлено %d картку з недійсними властивостями.Виправлено %d карток з недійсними властивостями.Виправлено %d карток з недійсними властивостями.Виправлено тип нотаток: %sПеревернутиТека вже існує.Шрифт:Нижній колонтитулЗ метою безпеки, '%s' не дозволяється зазначати на картках. Ви все ще можете використовувати це шляхом розміщення даної команди в іншому пакеті та імпортування цього пакету у заголовок LaTeX.ПрогнозФормаЛицьова сторона & необов'язкова ЗворотняЛицьова & Зворотня сторониЗнайдено %(a)s в %(b)s.Лицьова сторонаПопередній перегляд Лицьової сторониШаблон Лицьової сторониЗагальнеЗгенерований файл: %sЗгенеровано на %sКолоди загального користуванняПам'ятаюГрадуйований інтервалРедактор HTMLтяжкоВи встановили latex та dvipng?Верхній колонтитулДопомогаНайвища легкістьІсторіяДомівкаПогодинна розбивкаГодиниГодини з менше ніж 30 повтореними картками не показано.Якщо ви зробили свій внесок у розвиток програми, але не зазначені в цьому списку, будь ласка, зв'яжіться з нами.Якби ви вчились щодняНе враховувати час відповіді довше ніжБез урахування регіструІгнорувати рядки, в яких перше поле має відповідник в існуючій нотатціІгнорувати це оновленняІмпортІмпортувати файлІмпортувати, навіть якщо існуюча нотатка містить однакове перше полеІмпорт не вдався. Імпортування не вдалося. Інформація для зневаджування: Параметри імпортуІмпорт завершено.В медіа теці не використовується жоден файл:Щоб забезпечити правильну роботу вашої колекції при переміщенні між пристроями, Anki вимагає, щоб внутрішній годинник вашого комп'ютера був правильно налаштований. Внутрішній годинник може йти неправильно, навть якщо ваша система показує правильний місцевий час. Перейдіть до налаштувань годинника на вашому комп'ютері і перевірте наступне: - час вказано до полудня чи після полудня - помилка годинника - день, місяць та рік - часовий пояс - перехід на літній/зимовий час Різниця з правильним часом: %s.Включити медіа-файлиВключити інформацію про розкладВключити міткиЗбільшити ліміт нових карток на сьогодніЗбільшити ліміт нових карток на сьогодні наЗбільшити ліміт карток для повторення на сьогодніЗбільшити ліміт повторень на сьогодні наЗростаючі інтервалиІнфоВстановити додаток до програмиМова інтерфейсу:ІнтервалМодифікатор інтервалуІнтервалиНедійсний код.Недійсне кодування; будь ласка, перейменуйте:Недійсний файл. Відновіть з резервної копії.Недійсний пароль.У картці знайдено недійсну властивість. Будь ласка, виконайте команду Інструменти>Перевірити базу даних, а при повторній появі проблеми поставте про це питання на сайті підтримки.Невірний регулярний виразВідкладено.Курсив (Ctrl+I)Помилка JS в рядку %(a)d: %(b)sПерейти до міток з Ctrl+Shift+TЗберігати доLaTeXРівняння LaTeXМатематичне оточення LaTeXНевдачіОстання карткаОстанній переглядСпочатку додані останнімиВчитиЛіміт карток для вивчення наперед наВивчити: %(a)s, Повторити: %(b)s, Перевчити: %(c)s, Відфільтровано: %(d)sНавчанняПриставучіДія щодо приставучих картокПоріг для приставучих картокЗліваОбмежитиЗавантаження...Захистіть обліковий запис паролем або не заповнюйте:Найдовший інтервалШукати в полі:Найменша легкістьУправлінняУправління типами нотаток...Підмапитись до %sСпівставити з міткамиПозначитиПозначити нотаткуПозначити нотатку (Ctrl+K)ПозначеніЗріліМаксимальний інтервалМаксимальна кількість повторених карток в день.Медіа-файлиМінімальний інтервалХвилиниЗмішати нові картки з переглянутимиMnemosyne 2.0 Deck (*.db)БільшеНайбільше невдачПеремістити карткиПеремістити в колоду k (Ctrl+D)Перемістити картки в колоду:Н&отаткаІм'я вже існує.Назва колоди:Назва:СинхронізаціяНовіНових картокНових карток в колоді: %sЛише нові карткиНових карток/деньНова назва колоди:Новий інтервалНова назва:Новий тип нотаток:Нова назва групи налаштувань:Нова позиція (1...%d):Наступний день починається черезПоки нема очікуваних карток.Жодна картка не відповідає вказаним критеріям.Нема порожніх карток.Сьогодні не було пройдено жодної зрілої картки.Жодного невикористовуваного файлу не знайденоНотаткаІндекс нотаткиТип нотатокТипи нотатокНотатку та її %d картку видалено.Нотатку та її %d карток видалено.Нотатку та її %d карток видалено.Нотатку поховано.Нотатку відкладено.Увага: Медіа-файли не включено до резервної копії. Для певності періодично робіть резервну копію вашої теки з файлами Anki самостійно.Увага: Не вистачає деякої історії. Для подальшої інформації звертайтеся до документації до Навігатора.Нотатки у неформатованому текстіУ нотатках необхідно мінімум одне поле.Нотатки з мітками.НічогоOKСпочатку найраніше побаченіПовна примусова одностороння синхронізація при наступному запускуОдну або декілька нотаток не було імпортовано, бо на їх основі не було згенеровано жодних карток. Це може статися, коли у вас є порожні поля або коли ви не вказали, в які поля записувати вміст текстового файлу.Можна змінити черговість лише нових карток.Лише один клієнт за раз може мати доступ до AnkiWeb. Якщо попередня синхронізація була невдалою, повторіть, будь ласка, спаробу через кілька хвилин.ВідкритиОптимізую...Довільний ліміт:ОпціїНалаштування для %sГрупа налаштувань:Налаштування...ПорядокВ порядку додаванняВ порядку очікуванняІгнорувати шаблон зворотньої сторони:Ігнорувати шрифт:Ігнорувати шаблон лицьової сторони:Запакована Колода Anki (*.apkg *.zip)ПарольПаролі не співпадаютьВставитиВставити зображення із буфера обміну у форматі PNGPauker 1.8 Lesson (*.pau.gz)ВідсотокПеріод: %sПомістити в кінець черги нових картокПомістити у чергу карток на повтор з інтервалом між:Спочатку треба додати інший тип нотаток.Потерпіть, ця операція може піти певний час.Будь ласка, під'єднайте мікрофон і переконайтеся, що інші програми не використовують аудіо-пристрій.Відредагуйте цю нотатку та додайте кілька карток для тесту з пробілами. (%s)Переконайтеся, будь ласка, що профіль відкритий та програма Anki не зайнята, а потім спробуйте знову.Встановіть, будь ласка, PyAudioВстановіть, будь ласка, mplayerСпочатку відкрийте, будь ласка, профіль.Виконайте команду " Інструменти>Порожні картки"Оберіть колодуВиберіть картки лише одного типу нотаток.Оберіть що-небудь.Будь ласка, оновіть Anki до найновішої версії.Щоб імпортувати цей файл, виконайте команду "Файл>Імпортувати".Відвідайте, будь ласка, AnkiWeb, оновіть вашу колоду, а потім повторіть спробу.ПозиціяНалаштуванняПопередній виглядПопередній вигляд обраної картки (%s)Попередньо переглянути нові карткиПопередньо переглянути нові картки, додані за останніхОбробка даних...Пароль для профілю...Профіль:ПрофіліНеобхідна автентифікація проксі.ПитанняКінець черги: %dПочаток черги: %dВийтиДовільний порядокРозташувати у довільному порядкуРейтингГотово до оновленняПеребудуватиЗаписати власний голосЗаписати звук (F5)Запис розпочато...
Час: %0.1fВідносне просроченняВчити зновуЗапам'ятовувати останні внесені даніВидалити міткиОчистити форматування (Ctrl+R)Видалення даного типу картки призведе до видалення однієї або кілька нотаток. Спочатку треба створити новий тип карток.ПереіменуватиПереіменувати колодуПрослухати ще разПрослухати ще раз власний голосЗмінити розташуванняЗмінити розташування нових картокЗмінити розташування...Потрібно одна чи кілька з цих міток:Змінити розкладЗмінити розкладЗмінити розклад карток, спираючись на мої відповіді у цій колодіПродовжити заразЗворотній напрямок тексту (RTL)Повернення до стану перед '%s'.ПроглянутиКількість повтореньЧас повтореньПовторити напередПовторити наперед наПовторити картки, забуті за останніПовторити забуті карткиПродивитися процент успішності на кожну годину дня.ПовторенняКартки, що очікуються для повторення в колоді: %sЗправаЗберегти зображенняМасштаб: %sПошукШукати серед форматування (повільно)Вибрати&Виділити всеВибрати &нотаткиВибрати мітки, які слід виключити:Обнаний файл не був у форматі UTF-8. Перегляньте розділ "Імпортування" в інструкції користувача.Вибіркове навчанняКрапка з комоюСервер не знайдено. Або у вас відсутнє з'єднання з інтернетом, або антивірусна програма чи фаєрвол не дозволяють Anki з'єднатися з інтернетом.Віднести усі колоди нижче %s до цієї групи налаштувань?Встановити для усіх підколодВстановити колір шрифта (F7)Під час запуску програми було утримано клавішу "Shift". Відключено автоматичну синхронізацію та підключення розширень програми під час запуску.Зсунути розташування наявних картокГаряча клавіша: %sГаряча клавіша: %sПоказати %sВІДОБРАЗИТИ ВІДПОВІДЬПоказати дублікатиПоказати таймер відповідіПоказувати нові картки після карток для повторенняПоказувати нові картки перед переглядомПоказувати нові картки в порядку їх додаванняПоказувати нові картки у випадковому порядкуПоказувати час наступного повторення над кнопками відповідіПоказувати кількість карток, що залишилися, під час повторенняПоказати статистику. Гаряча клавіша: %sРозмір:Деякі пов'язані або поховані картки було відкладено до наступного сеансу.Деякі налаштування вступлять в силу лише після перезапуску Anki.Деякі данні не було актуалізовано, оскільки змінився тип нотатки:Поле сортуванняСортувати по цьому полю у навігаторіСортування в цій колонці не підтримується. Будь ласка, оберіть іншу.Звуки & зображенняПробілПочаткова позиція:Початкова легкістьСтатистикаКрок:Кроки (у хвилинах)Кроки мають бути числами.При вставці тексту знімати формутування HTMLСьогодні пройдено %(a)s за %(b)s.Пройдено сьогодніВчитиВчити колодуВчити колоду...Вчити заразВчити за станом картки або міткоюСтильСтиль (спільний для карток)Нижній індекс (Ctrl+=)Файл Supermemo у форматі XML (*.xml)Верхній індекс (Ctrl+Shift+=)ВідкластиВідкласти карткуВідкласти нотаткуВідкладеніСинхронізувати також медіа-файлиСинхронізація з AnkiWeb. Гаряча клавіша: %sСинхронізація медіа...Синхронізація не вдалася: %sСинхронізація не вдалася; нема з'єднання з інтернетом.Для сихнронізації необхідно, щоб годинник на вашому комп'ютері був правильно налаштований. Будь ласка, налагодьте годинник і повторіть спробу.Синхронізую...TabДублікати мітокЛише міткаМіткиКолода, в яку додаємо (Ctrl+D)Цільове поле:ТекстТекстовий файл, розділений TAB або крапкою з комою (*)Така колода вже існує.Назва поля вже використовується.Ця назва вже використовується.Вийшов час з'єднання з AnkiWeb. Будь ласка, перевірте з'єднання з мережею і повторіть спробу.Конфігурацію за замовчуванням не можна видаляти.Колоду за замовчуванням не можна видаляти.Поділ карток у вашій колоді (ах).Перше поле порожнє.Для першого поля типу нотатки має бути відповідник.Не можна використовувати наступний символ: %sЛицьова сторона цієї картки порожня. Виконайте, будь ласка, команду "Інструменти>Порожні картки".Піктограми були отримані з різних джерел. Вони перераховані у файлах з вихідним кодом Anki.Вказана вами інформація очистить питання на всіх картках.Кількість питань, на які ви відповіли.Кількість повторень, очікуваних у майбутньому.Кількість разів, що ви натисли кожну кнопку.Дозволи до тимчавової теки вашої системи неправильні, а Anki не взмозі виправити їх автоматично. Більше інформації можна знайти, пошукавши 'temp folder' в інструкції користувача Anki.Вибраний файл не є справжнім файлом .apkg.По вказаним критеріям пошуку не знайшлося карток. Ви хочете ії змінити?Бажані зміни вимагатимуть повної відправки бази даних під час наступної синхронізації вашої колекції. Якщо у Вас була статистика повторених карток або інші зміни на інших приладах, які ще не було синхронізовано, їх буде втрачено. Продовжити?Час, витрачений, щоб відповісти на питання.Оновлення закінчено і ви готові розпочати роботу з Anki 2.0.

Нижче подано журнал оновлення:

%s

У колоді ще є нові картки, але денний ліміт вже вичерпано. Ви можете збільиши ліміт у налаштуваннях, але, будь ласка, не забувайте: чим більше нових карток ви запровадите у навчальний цикл, тим більше карток вам доведеться повторювати за короткий період.Має бути як мінімум один профіль.По цій колонці не можна проводити сортування, але ви можете проводити пошук окремих типів карток, наприклад 'card:Card 1'.По цій колонці не можна проводити сортування, але ви можете обирати окремі колоди, клацаючи на їхні назви на панелі зліва.Файл, здається, не є справжнім файлом .apkg. Якщо ви отримуєте помилку з файлу, завантаженого з AnkiWeb, існує вірогідність, що скачування файлу не пройшло успішно. Будь ласка, повторіть спробу, і якщо проблема не зникне, спробуйте скачати файл в іншому браузері.Цей файл вже існує. Ви впевнені що бажаєте перезаписати його?У цій теці в одному місці зберігаються усі ваші дані для роботи з Anki, щоб полегшити створення ререзвних копій. Щоб вказати інше місце зберігання, ознайомтеся: %s Це - спеціальна колода для навчання поза встановленим графіком.Це - {{c1::зразок}} тесту з пробілами.Це видалить вашу існуючу колекцію колод та замінить дані у файлі, що ви імпортуєте. Ви впевнені?Цей майстер супроводжуватиме вас через увесь процес оновлення до версії Anki 2.0. Для безпроблемного оновлення, будь ласка, уважно прочитайте наступні сторінки. ЧасВстановити ліміт таймераПовторитЩоб проглянути додатки до програми, клацніть на кнопці внизу.

Коли ви знайдете додаток, що вам до вподоби, вставте внизу його код.Щоб імпортувати до профілю, захищеного паролем, будь ласка, відкрийте профіль перед спробою імпортування.Для створення картки з тестом з пробілами по існуючій нотатці, спочатку потрібно змінити її тип на тип тесту з пробілами командою "Редагування>Змінити тип нотатки..."Щоб побачити їх зараз, клацніть внизу на кнопку "Розкопати".Для навчання за межами звичайного графіка, натисніть на кнопку "Додаткове навчання" внизу.СьогодніЛіміт повторень на сьогодні вичерпано, але ще є картки, які можна повторити. Для оптимального запам'ятовування можна збільшити денний ліміт у налаштуваннях.РазомЗагальний часЗагальна кількість картокЗагальна кількість нотатокРозглядати введення як регулярний виразТипВведення відповіді з клавіатури: невідоме поле %sНеможливо імпортувати файл, призначений лише для зчитування.РозкопатиПідкреслити текст (Ctrl+U)СкасуватиВідмінити - %sНевідомий формат файлу.Не проглянутіОновити існуючі нотатки, коли співпадають перше полеАктуалізовано %(a)d з %(b)d існуючих нотаток.Оновлення програми завершеноМайстер оновлення програмиОновлення триваєОновлення колоди %(a)s з %(b)s... %(c)sВідправити на AnkiWebВідправляю на AnkiWeb...Використовується в картках, але відсутнє в медіа теці:Користувач 1Версія %sЧекаю на звершення редагування.Увага! Тести з пробілами не спрацюють, поки ви не зміните тип вгорі на Тест з пробілами.Ласкаво просимоДодавати у поточну колоду за замовчуваннямПід час відображення відповіді відтворювати аудіо питання та відповідіКоли ви будете готові до оновлення, клацніть на кнопку запуску для продовження. Довідник з оновлення відкриється у вашому веб-браузері під час процесу оновлення. Будь ласка, уважно прочитайте його, оскільки дана версія Anki суттєво відрізняється від попередньої.Під час оновлення ваших колод, Anki спробує скопіювати медіа-файли зі старих колод. Якщо ви користувалися користувацькою текою DropBox або користувацькою текою медіа-файлів, вони можуть бути не знайдені під час процес оновлення. Пізніше, вам буде надано звіт про результати оновлення. Якщо ви помітите, що медіа-файли не було вчасно скопійовано, зверніться до довідника по оновленню по детільні інструкції.

AnkiWeb тепер підтримує синхронізацію медіа-файлів напряму. Більше не вимагається спеціальних налаштувань, і медіа-файли буде синхронізовано разом з вашими картками під час синхронізації з AnkiWeb.Вся колеціяВи бажаєте завантажити зараз?Автор — Damien Elmes; з патчами, перекладом, тестуванням та оформленням від:

%(cont)sУ вас тип нотатки з тестом з пробілами, але ви не створили жодних тестових карток з пробілами. Продовжити?У вас багато колод. Прогляньте, будь ласка, %(a)s. %(b)sВи ще не записали ваш голос.Треба, щоб була принаймні одна колонка.НезріліНезрілі+ВчитиВаші колодиВаші зміни вплинуть на кілька колод. Якщо ви хочете змінити лише поточну колоду, спочатку треба додати нову групу налаштувань.Здається, що файл вашої колекції пошкоджено. Це може статися, коли файл колекції копіюється, коли Anki відкрито, або коли колекція зберігається на диску у мережі або у хмарі. Щоб довідатися, як відновити інформацію з резервної копії, зверніться, будь ласка, до інструкції користувача.Ваша колекція перебуває у невпорядкованому стані. Будь ласка, виконайте команду "Інструменти>Перевірити базу даних", а потім повторіть синхронізацію.Ваша колекція або медіа-файли завеликі для синхронізації.Ваша колода була успішно відправлена на сервер AnkiWeb. Якщо ви користуєтеся програмою на інших пристроях, синхронізуйте їх зараз і завантажте із сервера колоду, яку ви щойно відправили з цього комп'ютера. Після цього, статистика перглянутих карток та додані картки в усіх копіях колоди будуть об'єднані автоматично.Ваші колоди тут та на сервері AnkiWeb відрізняются настільки, що не можуть бути об'єднані автоматично, тому необхідно замінити копію колоди на даному пристрою тією, що на сервері, або навпаки. Якщо ви оберете варіант завантаження із сервера, Anki завнтажить колекцію колод із сервера AnkiWeb, при цьому будь-які зміни, зроблені в колодах на цьому пристрої після останньої синхронізації, буде втрачено. Якщо ви оберете відправку на сервер, Anki відправить вашу колекцію колод на сервер AnkiWeb, при цьому будь-які зміни, зроблені в колодах на сервері AnkiWeb або інших пристроях після останньої синхронізації, буде втрачено. Після синхронізації усіх пристроїв, статистика наступних переглядів карток та додані картки будуть об'єднані автоматично.[нема колоди]резервні копіїкарткикартки з колодикартки, обрані заколекціяднднівколодатривалість життя колодидублікатдопомогасховатигодингодин(и) після опівночіневдачівідображувати на %sспівставлено з міткамихвилин(а)хвилин(и)місповтореннясекунд(и)статистикаця сторінкатвся колекція~anki-2.0.20+dfsg/locale/tlh/0000755000175000017500000000000012256137063015303 5ustar andreasandreasanki-2.0.20+dfsg/locale/tlh/LC_MESSAGES/0000755000175000017500000000000012065014111017052 5ustar andreasandreasanki-2.0.20+dfsg/locale/tlh/LC_MESSAGES/anki.mo0000644000175000017500000000142712252567246020361 0ustar andreasandreas t"&+/38?     Stop%%sd%sh%sm%smo%ss%syBackCancelProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:13+0000 Last-Translator: Damien Elmes Language-Team: Klingon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) Language: mev%%sd%sh%sm%smo%ss%syDoHmevanki-2.0.20+dfsg/locale/sl/0000755000175000017500000000000012256137063015132 5ustar andreasandreasanki-2.0.20+dfsg/locale/sl/LC_MESSAGES/0000755000175000017500000000000012065014111016701 5ustar andreasandreasanki-2.0.20+dfsg/locale/sl/LC_MESSAGES/anki.mo0000644000175000017500000015602012252567246020210 0ustar andreasandreas-8<9< @<K<R<"X<{< }<<8<<<"<$ =$E=&j=="===$> (>I>^>0v>>>&>>(>?4?,K?x?*??,? ?@(@@@D@H@L@Q@U@ Y@c@l@@@ @@@@@ @@@ @@ @@AA'A6AGAZAaA0gA A A AAAAAeBgBjBoBtByB}BBBB(BB!BCfCC CC C CCCC De!DD71E iE5sEXEYF8\F FFF F FF F FG GG!G )G5G ;GGG WG aGKlGG#GGG H IIIIRHJwJ7K KKwWKEKL$LR,LLM#MAM `MM(MM MM MMN #N 0N>NFN`NNNNNLNOOO6OTO YOcOP&P+P3P:PAP ZP dP nPyPP P3PSP1Q:QAQ HQ VQbQsQQQ"QQ&Q RR R%R 6R@RFRdRjR-pRRR(RR5R S)S5.SPdS7SST TT-T5TX^XgX]X XX XYY).YXY tYYY Y YYY Y YYYY Y!YZZ).ZXZnZ4rZ!ZZZZ[![5[F[ M[W[][_[b[e[h[k[n[ [ [[[ [[ [[[[\ \\&\:\J\_\ p\ {\\\\\\a]j]o]]] ]]]]] ] ^^ "^.^$3^X^_^ d^q^y^~^^.^F^ _$_ D_4P___ _1___ ``*0` [`i` ``"`"` `a1a6aEaYa ka uaaaaaaabbb %b /b=bPb<bbbbbb b+bb c c&c -c 7cCc HcRceclcscccccccc c cdd1d 7dDdJdRd Vd`d vdd d ddddd+d'e!7eYe ^e he<se ee]ea+ff!ffff#gg ggggh hh #h /h 9hChZh`h ~h hh,h#h)iE.itiiii,ij-j+Ij8ujj jj#j jkk$k-kLk ]kkkpkwkkkkkkkk lli-ll l ll ll l"lm !m1,m ^mim m m mmmm-m n8n >n InSnZnzn n nnn n,nno *oKo \ohoxooooo*p'-p!Upwp6}p p!p?p!q1q7q Gq Uq`qfqyqq qq q q qqq r(r 0r =r Jr*krrr!rdr AsLsPsYs^s sss(ss ssXt+^t"t&tt0tUuFuu*u(u1vIBvv'|wtwx#y8)ybyCyr6zz,{1{ D{N{a{M3|||(} .} 9} E}!Q}s}x}'}}}}}}.}.~?~ N~&X~~~,~~ ~~$84m(Hq"W$""E K V`hn у  " * 9QG RkU|U҇S(g|Fa+)JT`W/+, AKMiHӋ&)CVm'ČV+C[oˍ܍NJNRV[_cr{  Ŏ̎ Ԏߎ 4CVk{ ? 26ɐːΐӐؐݐ3'4!\~4E]lunŒ4L ;QHR`EN ɕ!Օ " 0=P Y cp v P)=B Zfu }oKOܛ^U%ٜ--He7~ ѝ 4Lct%ў؞ ˟&ҟ'! (6   $ < J Vbt 1Iˡ  *3BYn# ܢ + >J"Psy: ģ#ˣ22B7Jf<$&K R` { ť̥ӥڥ    * 7 D Q^el s} ɦ٦ !//7gm|' -6 ?M^uΨ1& >Jª I T^uԫ٫ 8!Zp ì Ҭݬ %,.>m?$ɭ '>Un ͮ ߮  (9@ HSf| ïЯ̰֯1AV\r" ұܱ*F&m8C۲7<<K'Ƴֳ>&'Ai)y,.д11 HTdt ҵ !) /=UdsI  1P dr η   <P!Wy¸ܸ   -GX i vGع 43h p |N]tolQ!j'b ˽ ޽ ,$4Y b'n6;5Q r**-&BT ( 3Pg~ %4Dnb # 9*E p}8  %$7\%w#  ))S e3o$$6 S#t7/708"i E:IX_r % - =%Jp '!3<kp  .07h ~f,!'Nv-gCA*1@A)e:]B|A`{y ]IE $<R o z 5 ,I[;o  ,=[3M\b{  $ 1=NViprv|  HCeY*|E#n9 wOA"WuAKSf$4xh,]-(!~0,^#tiPv|F9hiVx6Da DY~QLMyNP]) I1{^C)t %n[vq]1WFRrJ7T:Gpv5{8oc >H\7 Kg.7h#& 3?!*<J_j 6D ~rXOks1Oub k`Q /8UjXB=}2Yo/3qcrC"|q$5fL-m%e:`&;Klw%UV`5<b2/E00d4pZ@Bx$f?Ta+S8_a[XZM;\y<GEb sm4\d  9j}F! VB(" lu'{NGzI)J*z}o+_-c.RI&[Z=@;2(.T^>,QkHRPNtwiLA=y'Umgd@nge>3lzpSs:?M' 6W+ Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(filtered)(learning)(new)(parent limit: %d)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 1010AM10PM3AM4AM4PM: andOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.About AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAdded TodayAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.Answer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBack PreviewBack TemplateBackupsBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard was a leech.Cards TypesCards can't be manually moved into a filtered deck.Cards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeClone: %sCloseClose and lose current input?ClozeCode:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...CopyCorrect: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete this note type and all its cards?Delete this unused note type?Delete...Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...Due tomorrowE&xitEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst CardFirst ReviewFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.Front PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:Interval modifierIntervalsInvalid code.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sKeepLaTeXLaTeX equationLaTeX math env.Last CardLatest ReviewLatest added firstLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLeechLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageMap to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name:NetworkNewNew CardsNew cards in deck: %sNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards matched the criteria you provided.No empty cards.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOldest seen firstOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder duePassword:Passwords didn't matchPastePaste clipboard images as PNGPercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.Queue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Review CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.Reviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selective StudySemicolonSet all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift position of existing cardsShortcut key: %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied TodayStudyStudy DeckStudy Deck...Study NowStylingStyling (shared between cards)Supermemo XML export (*.xml)SuspendSuspend CardSuspend NoteSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.Underline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou haven't recorded your voice yet.You must have at least one column.YoungYour Decks[no deck]backupscardscards selected bycollectionddaysdeckhelphourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatswwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:15+0000 Last-Translator: Ales Primozic Language-Team: Slovenian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: sl Ustavi (1 od %d) (izklopljeno) (vklopljeno) Vsebuje %d kartic. Vsebuje %d kartico. Vsebuje %d kartici. Vsebuje %d kartic.%% pravilnih%(a)0.1f %(b)s/dan%(a)d od %(b)d zapiskov posodobljenih%(a)d od %(b)d zapiskov posodobljenih%(a)d od %(b)d zapiskov posodobljenih%(a)d od %(b)d zapiskov posodobljenih%(a)dkB gor, %(b)dkB dol%(tot)s %(unit)sIzbrisano %d kartic.Izbrisana %d kartica.Izbrisani %d kartici.Izbrisano %d kartic.Izvoženo %d kartic.Izvožena %d kartica.Izvoženi %d kartici.Izvoženo %d kartic.Uvoženih %d kartic.Uvožena %d kartica.Uvoženi %d kartici.Uvožene %d kartice.%d kartic naštudiranih v%d kartica naštudirana v%d kartici naštudirani v%d kartic naštudiranih v%d kartic/minuto%d kartica/minuto%d kartici/minuto%d kartice/minuto%d paketov posodobljenih.%d paket posodobljen.%d paketa posodobljena.%d paketov posodobljenih.%d skupin%d skupina%d skupini%d skupinDodanih %d zapiskovDodan %d zapisekDodana %d zapiskaDodanih %d zapiskovUvoženih %d zapiskov.Uvožen %d zapisek.Uvožena %d zapiska.Uvoženi %d zapiski.Posodobljenih %d zapiskovPosodobljen %d zapisekPosodobljena %d zapiskaPosodobljeni %d zapiski%d pregledov%d pregled%d pregleda%d pregledi%d izbran%d izbranih%d izbrani%d izbrani%s že obstaja na vašem namizju. Prepišem?Kopija %s%s dan%s dneva%s dni%s dni%s dan%s dneva%s dni%s dni%s ur%s ura%s uri%s ure%s uro%s ur%s ur%s ur%s minut%s minuta%s minuti%s minute%s minut.%s minuta.%s minuti.%s minut.%s minuta%s minuti%s minute%s minut%s mesec%s meseca%s mesece%s mesecev%s mesec%s meseca%s mesece%s mesece%s sekunda%s sekunda%s sekundi%s sekunde%s sekundo%s sekundi%s sekunde%s sekunde%s za izbrisati:%s let%s leto%s leti%s leta%s leto%s leti%s leta%s let%sd%sh%sm%smo%ss%sy&O programu...&Dodatki&Preveri zbirko podatkov...&Stisni...&Uredi&Izvozi...&Datoteka&Najdi&Pojdi&Vodnik&Vodnik...&Pomoč&Uvozi&Uvozi...Preo&brni izbor&Naslednja kartica&Odpri mapo z dodatki...&Nastavitve...&Prejšnja kartica&Ponovno razvrsti...&Podpri Anki...&Zamenjaj profil...&Orodja&Razveljavi'%(row)s' je vsebovalo %(num1)d polja, pričakovano pa %(num2)d(%s pravilnih)(filtrirano)(v fazi učenja)(nova)(omejitev nadrejenega: %d)...Datoteke .anki2 niso načrtovane za uvoz. Če želite obnoviti iz varnostne kopije, preverite poglavje 'Varnostne kopije' v uporabniškem vodniku./0d1 1010AM10PM3AM4PM4PM: inOdpri mapo z varnostno kopijoObišči spletno stran%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MVarnostne kopije
Anki bo izdelal varnostno kopijo vaše zbirke vsakič, ko se program zapre ali ko se sinhronizirajo podatki.Izvozi format:Poišči:Velikost pisave:Pisava:VVključi:Velikost črteZamenjaj z:SinhronizacijaSinhronizacija
Ni trenutno omogočena; Omogočite jo s klikom na gumb Sinhroniziraj v glavnem oknu.

Zahtevan je račun

Če želite vašo zbirko sinhronizirati, potrebujete brezplačen račun. Prijavite se za brezplačen račun, nato pa spodaj vnesite podatke.

Anki je bil posodobljen

Anki %s je zadnja izdana različica.

Najlepša hvala vsem, ki ste prispevali predloge, opozorila o napakah in donacije.Enostavnost kartice je dolžina naslednjega intervala, ko ob pregledu odgovorite "dobro".Datoteka z imenom collection.apkg je bila shranjena na vaše namizje.O programu AnkiDodajDodaj (bližnjica: Ctrl+Enter)Dodaj poljeDodaj večpredstavnostno datotekoDodaj nov paket (Ctrl+N)Dodaj tip zapiskaDodaj obratnoDodaj oznakeDodaj novo karticoDodaj v:Dodaj: %sDodano danesZnovaPonovno danesPonovno štetje: %sVsi paketiVsa poljaVse kartice, zapiski in mediji tega profila bodo izbrisani. Ali ste prepričani?Dovoli HTML v poljihSlika je bila shranjena na vaše namizje.AnkiPaket Anki 1.2 (*.anki)Anki 2 shranjuje zbirke kartiv v novem formatu. Ta čarovnik bo vaše zbirke samodejno pretvoril v novi format. Vaše zbirke bodo varnostno kopirane pred pretvorbo. Tako bodo vaše zbirke dosegljive v primeru, da se odločite za uporabo prejšnje različice programa.Paket Anki 2.0Anki 2.0 podpira samo samodejno nadgradnjo z Anki 1.2. Če želite odpreti stare pakete, jih najprej odprite v Anki 1.2, in jih nato uvozite v Anki 2.0.Anki paketPovezave med vprašanjem in odgovorom ni bilo mogoče najti. Za zamenjavo vprašanja in odgovora ročno prilagodite predlogo.Anki je prijazen in inteligenten sistem za časovno razporejeno učenje. Je odprtokoden in brezplačen program.Vašega stare konfuguracijske datoteke ni bilo mogoče naložiti. Za uvoz vaših paketov iz prejšnje verzije programa Anki izberite Datoteka->Uvozi.AnkiWeb uporabniško ime ali geslo je nepravilno; prosimo, poskusite znova.AnkiWeb uporabniško ime:AnkiWeb je naletel na težavo. Prosimo, poskusite ponovno čez nekaj minut; če se težava ponovi, prosimo izpolnite poročilo o napaki.AnkiWeb je trenutno preobremenjen. Prosimo, poskusite ponovno čez nekaj minut.Gumbi z odgovoriOdgovoriAnki se ne more povezati v splet, ker mu to preprečuje protivirusni program ali požarni zid.Vse kartice, ki niso povezane, bodo izbrisane. Če zapisek ne vsebuje nobene kartice več, bo izbrisan. Želite vseeno nadaljevati?Se je v datoteki pojavila dvakrat: %sAli ste prepričani, da želite izbrisati %s?Zahtevan je vsaj en korak.Pripni sliko/zvok/video (F3)Samodejno predvajaj zvokPri odpiranju/zapiranju profila samodejno sinhronizirajPovprečjePovprečni časPovprečen čas za odgovorPovprečna enostavnostPovprečje za dneve študijaPovprečni intervalPredogled zadnje straniPredloga zadnje straniVarnostne kopijeOsnovna (in obrnjena kartica)Osnovna (in izbirno obrnjena kartica)Krepko besedilo (Ctrl+B)BrskajPrebrskaj in namesti...BrskalnikBrskalnik (%(cur)d prikazuje kartico; %(sel)s)Brskalnik (%(cur)d prikazuje kartice; %(sel)s)Brskalnik (%(cur)d prikazuje kartice; %(sel)s)Brskalnik (%(cur)d prikazuje kartice; %(sel)s)Možnosti brskalnikaZgradiMnožično dodaj oznake (Ctrl+Shitf+T)Množično odstrani oznake (Ctrl+Alt+T)UmakniSkrij zapisekAnki privzeto zazna znak, ki loči polja med seboj (kot npr. tabulator, vejica, itn.). Če je Anki ta znak narobe razpoznal, ga lahko vnesete tukaj. Za tabulator uporabite /t.PrekličiKarticaKartica %dKartica 1Kartica 2Informacije o kartici (Ctrl+Shift+I)Seznam karticTip karticeTipi karticTipi kartic za %sKartica je bila pijavka.Tipi karticKartic ni možno ročno dodati v filtriran paket.Kartice bodo samodejno vrnjene v izvirne pakete, ko jih boste pregledali.Kartice...SredinskoSpremeniSpremeni %s v:Spremeni zbirko karticSpremeni tip zapiskaSpremeni tip zapiska (Ctrl+N)Spremeni tip zapiska...Spremeni barvo (F8)Spremeni paket glede na tip zapiskaSpremenjenoPreveri datoteke v mapi medijevPreverjanje...IzberiIzberi paketIzberi tip zapiskaPodvoji: %sZapriZapri in razveljavi trenutni vnos?ZapriKoda:Zbirka je poškodovana. Preverite uporabniški priročnik.DvopičjeVejicaNastavi možnosti in jezik vmesnikaPotrdite geslo:Čestitam! S tem paketom ste za sedaj zaključili.Povezovanje ...KopirajPravilnih: %(pct)0.2f%%
(%(good)d od %(tot)d)Ni bilo možno vzpostaviti povezave z AnkiWeb. Prosimo, preverite svojo povezavo in poskusite ponovno.Ni bilo možno posneti zvoka. Ali ste namestili lame in sox?Datoteke %s ni bilo mogoče shranitiStisniUstvari paketUstvari filtriran paket...UstvarjenoCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+ZSkupajSkupaj %sSkupaj odgovorovSkupaj karticTrenutna zbirka karticTrenutni tip zapiska:Študij po meriUčna ura po meriKoraki po meri (v minutah)Prilagodi kartice (Ctrl+L)Nastavi poljaIzrežiZbirka podatkov ponovno zgrajena in optimirana.DatumDnevi študijaOdstrani avtorizacijoKonzola za iskanje napakPreglasitev paketaPaket se bo uvozil, ko bo profil odprt.Zbirke karticPadajoči intervaliOdloži dokler se spet ne pokažejo pregledi.IzbrišiIzbrišem %s?Izbriši karticeIzbriši zbirko karticIzbriši prazneIzbriši zapisekIzbriši zapiskeIzbriši oznakeIzbriši neuporabljeneIzbrišem polje iz %s?Izbrišem ta tip zapiska in vse povezane kartice?Izbrišem ta neuporabljen tip zapiska?Izbriši...Izbrisal %d kartic z manjkajočo predlogo.Izbrisal %d kartico z manjkajočo predlogo.Izbrisal %d kartici z manjkajočo predlogo.Izbrisal %d kartice z manjkajočo predlogo.Izbrisal %d zapiskov z manjkajočim tipom zapiska.Izbrisal %d zapisek z manjkajočim tipom zapiska.Izbrisal %d zapiska z manjkajočim tipom zapiska.Izbrisal %d zapiske z manjkajočim tipom zapiska.Izbrisal %d zapiske brez kartic.Izbrisal %d zapiskek brez kartic.Izbrisal %d zapiska z brez kartic.Izbrisal %d zapiske brez kartic.Izbrisano.Izbrisano. Znova zaženite Anki.Izbris tega paketa iz seznama paketov bo vrnil vse preostale kartice v njihove izvorne pakete.OpisPogovorno oknoOnemogoči poljePrenos ni uspel: %sNaloži z AnkiWeb-aPrenos je bil uspešno zaključen. Znova zaženite Anki.Nalaganje z AnkiWeb-aZapadejo jutriI&zhodEnostavnoDodatek za lahkeEnostaven intervalUrediUredi %sUredi trenutnoUredi HTMLUredi za prilagoditev po meriUredi...UrejenoUrejanje pisavePopravkiPraznoPrazne kartice...Številke praznih kartic: %(c)s Polja: %(f)s Prazno prvo polje: %sKonecUredite zbirko, da umestite %s novih kartic ali pustite prazno:Vnesite mesto nove kartice (1...%s):Vnesite oznake za dodajanje:Vnesite oznake za brisanje:Napaka pri prenosu: %sNapaka med zagonom: %sNapaka pri izvajanju %s.Napaka pri izvajanju %sIzvozIzvozi ...DodatnoFF1F3F5F7F8Polje %d datoteke je:Usklajevanje poljIme polja:Polje:PoljaPolja za %sPolja ločena z: %sPolja...Fil&triDatoteka manjka.FilterFilter:FiltriranoFiltriran paket %dPoišči &dvojnike...Poišči dvojnikeNa&jdi in zamenjaj...Najdi in zamenjajPrva karticaPrvi pregledObrniMapa že obstaja.Pisava:&NogaZaradi varnosti '%s' ni dovoljen na kartici. Še vedno ga lahko uporabljate s tem, da postavite ukaz v drug paket, in le-tega potem uvozite v glavo LaTeX.NapovedOblikaSpredaj in neobvezno zadajSpredaj in zadajNajdenih %(a)s čez %(b)s.Predogled pisavePredloga prednje straniSplošnoGenerirana datoteka: %sGenerirana v %sNaloži javne zbirkeDobroInterval napredovanjaUrejevalnik HTMLZahtevnoAli ste namestili latex in dvipng?GlavaPomočNajvišja enostavnostZgodovinaDomovRazčlenitev po urahUreUre z manj kot 30 pregledi niso prikazane.Če ste sodelovali in niste na tem seznamu, nas prosimo kontaktirajte.Če bi študirali vsak danSpreglej odgovore, za katere je bilo porabljeno več kotVelikost črk ni pomembnaPrezri vse vrstice, kjer se prvo polje ujema z obstoječim zapiskomSpreglej to posodobitevUvozUvozi datotekoUvozi kljub temu, da ima obstoječi zapisek enako prvo poljeUvažanje ni uspelo. Nalaganje ni uspelo. Podatki o napaki: Možnosti uvozaUvoz zaključen.Obstaja v medijski mapi, a ni uporabljeno na nobeni od kartic:Vključi medijske datotekeVključi podatke za časovno planiranjeVključi oznakePovečaj omejitev današnjih novih karticPovečaj omejitev današnjih novih kartic zaPovečaj omejitev današnjih kartic za pregledPovečaj omejitev današnjih kartic za pregled zaVedno večji intervaliInformacijeNamesti dodatekJezik vmesnika:Modifikator intervalaIntervalieNapačna koda.Geslo ni pravilno.Nepravilen splošni izraz.Je bila odložena.Ležeče besedilo (Ctrl+I)Napaka JS v vrstici %(a)d: %(b)sObdržiLaTeXLaTeX enačbaLaTeX matematična spr.Zadnja karticaZadnji pregledNajnovejše dodane prveOmejitev učenja vnaprejUčenje: %(a)s, Pregled: %(b)s, Ponovno učenje: %(c)s, Filtrirano: %(d)sPijavkaPrag pijavkLevoOmeji naNalaganje ...Zaklenite up. račun z geslom ali pustite prazno:Najdaljši intervalGlej v polju:Najnižja enostavnostUpravljanjePoveži z/s %sPoveži z oznakamiOznačiOznači zapisekOznači zapisek (Ctrl+K)OznačenoZrelNajvečji intervalMaksimum ponovitev/danVečpredstavnostna datotekaNajmanjši intervalMinutePomešaj nove kartice in pregledePaket Mnemosyne 2.0 (*.db)DodatnoNajveč spodrsljajevPremakni karticePremakni v paket (Ctrl+D)Premakni kartice v zbirko:&ZapisekIme obstaja.Ime:OmrežjeNovoNove karticeNovih kartic v paketu: %sNovih kartic/danNovo ime zbirke:Nov intervalNovo ime:Nov tip zapiska:Novo ime zbirke opcij:Novo mesto (1...%d):Naslednji dan se začne obGlede na kriterije, ki ste jih vnesli, ni mogoče najti nobene kartice.Ni praznih kartic.Ni najdenih neuporabljenih ali manjkajočih datotek.ZapisekTip zapiskaTipi zapiskovZapisek in njegovih %d kartic je bilo izbrisanih.Zapisek in njegova %d kartica sta bili izbrisana.zapisek in njegovi %d kartici so bili izbrisani.Zapisek in njene %d kartice so bilo izbrisane.Zapisek skrit.Zapisek odložen.Opozorilo: Medijske datoteke nimajo varnostne kopije. Priporočamo, da občasno naredite varnostno kopijo mape Anki.Opozorilo: Nekaj zgodovine ni na voljo. Za več informacij, preverite uporabniško dokumentacijo brskalnika.Zapiski v golem besediluZapiski zahtevajo vsaj eno polje.NičNajprej vidne najstarejšeEn ali več zapiskov ni bil uvožen, ker niso ustvarile nobene kartice. To se lahko zgodi, ko imate prazna polja ali ko niste povezali vsebine iz tekstovne datoteke s pravimi polji.Prerazporedite lahko samo nove kartice.OdpriOptimiranje...Izbirna omejitev:MožnostiMožnosti za %sSkupina možnosti:Možnosti...Vrstni redUredi dodaneUredi zapadleGeslo:Gesli se ne ujemataPrilepiPrilepi slike z odložišča kot PNGOdstotekObdobje: %sPrestavi na konec čakalne vrste karticPrestavi v čakalno vrsto za pregled z intervalom med:Najprej dodajte tip zapiska.Proces lahko traja nekaj časa. Bodite potrpežljivi.Preverite, da je profil odprt, ter da Anki ni zaseden. Nato poskusite še enkrat.Namestite PyAudio.Namestite mplayer.Najprej odprite profil.Izberite paket.Izberite kartice samo enega tipa zapiskov.Izberite nekaj.Uporabite zadnjo različico programa Anki.Uporabite Datoteka->Uvoz za uvoz te datoteke.Obiščite AnkiWeb, nadgradite vaš paket in poskusite še enkrat.PoložajMožnostiPredogled novih karticPredogled novih kartic dodanih v zadnjemV obdelavi ...Geslo za profil...Profil:ProfiliZahtevano preverjanje prisotnosti proxy strežnika.Dno čakalne vrste: %dVrh čakalne vrste: %dZapriNaključnoNaključno urediOcenaPripravljen za nadgradnjoPonovno zgradiPosnemi svoj glasPosnemi zvok (F5)Snemanje...
Čas: %0.1fZapomni si zadnji vnos med dodajanjemOdstrani oznakeOdstrani oblikovanje (Ctrl+R)Zaradi odstranitve tega tipa kartice bi bil en ali več zapiskov izbrisanih. Najprej naredite nov tip kartice.PreimenujPreimenuj paketZnova predvajaj zvokZnova predvajaj svoj glasPrestaviPrestavi nove karticePrestavi...Zahtevaj eno ali več od naslednjih oznak:PrerazporediDoloči nov razporedPrerazporedi kartice glede na moje odgovore v tem paketuNadaljuj zdajObratna smer besedila (RTL)Število pregledovČas pregledaPreglej naprejPreglej naprej zaPreglej pozabljene kartice v zadnjihPreglej pozabljene karticeUspešnost pregleda za vse ure dneva.Pregledov v paketu, ki zapadejo: %sDesnoShrani slikoObseg: %sIskanjeIšči v oblikovanju (počasno)IzberiIzberi &vseIzberi &zapiskeIzberite oznake, ki naj bodo izključene:Študij po izbiriPodpičjeNastavim vse pakete pod %s za to skupino možnosti?Nastavi za vse podrejene paketeNastavi barvo ospredja (F7)Zamakni položaj obstoječih kartic.Bližnjica: %sPrikaži odgovorPrikaži dvojnikePrikaži časomer za odgovorPokaži nove kartice po pregleduPokaži nove kartice pred pregledomPokaži nove kartice v vrstnem redu, kot so bile dodanePokaži nove kartice v naključnem vrstnem reduPokaži čas za naslednji pregled nad gumbi za odgovorePokaži število preostalih kartic med pregledomPokaži statistiko. Bližnjica: %sVelikost:Nekatere nastavitve bodo pričele delovati po ponovnem zagonu Ankija.Polje za urejanjeUredi po tem polju v brskalnikuUrejanje po tem stolpcu ni podprto. Izberite drug stolpec.Zvoki in slikeRazmikZačetni položaj:Začetna dostopnostStatistikaKorak:Koraki (v minutah)Koraki morajo biti številke.Odstrani HTML pri lepljenju besedila.Naučene danesŠtudirajPaket za učenjePaket za učenje...Študiraj sedajStiliziranjeStiliziranje (skupno večim karticam)Izvoz Supermemo XML(*.xml)OdložiOdloži karticoOdloži zapisekSinhroniziraj tudi zvok in slikeSinhroniziraj z AnkiWeb. Bližnjica: %sSinhroniziranje medijskih datotekSinhroniziranje ni uspelo: %sSinhroniziranje ni uspelo; brez povezave do spleta.Sinhroniziranje zahteva, da je čas na računalniku pravilno nastavljen. Nastavite čas in poskusite znova.Sinhroniziranje...ZavihekSamo oznakaOznakeCiljni paket (Ctrl+D)Ciljno polje:BesediloBesedilo ločeno s tabulatorji ali podpičji (*)Ta paket že obstaja.To ime polja je že uporabljeno.To ime je že uporabljeno.Časovna omejitev za povezavo na AnkiWeb se je iztekla. Preverite mrežno povezavo in poskusite znova.Privzeta konfiguracija ne možno odstraniti.Privzetega paketa ni mogoče izbrisati.Delitev kart v vaših paketih.Prvo polje je prazno.Prvo polje tipa zapiska mora biti preslikano.Ikone so bile pridobljene iz različnih virov. Preverite izvorno kodo programa Anki za več informacij.Vaš vnos bi povzročil, da bi vse kartice imele prazno vprašanje.Število vprašanj, ki ste jih odgovorili.Število pregledov, ki bodo na vrsti v prihodnje.Število klikov na vsak gumb.Izraz za iskanje ni našel nobenih kartic. Bi ga radi popravili?Zahtevana sprememba bo zahtevala prenos celotne zbirke podatkov ob naslednji sinhroniziraciji. Pregledi ali druge spremembe na ostalih napravah, ki še niso bile sinhronizirane, bodo izgubljeni. Nadaljujem?Čas porabljen za odgovore na vprašanja.Nadgradnja se je zaključila. Anki 2.0 je pripravljen za uporabo.

Seznam sprememb:

%s

Na voljo je še več novih kartic, vendar ste že dosegli dnevno mejo. Lahko povišate mejo, toda upoštevajte, da s tem ko povečate število kartic, bolj obremenite kratkoročni pregled.Obstajati mora vsaj en profil.Ta datoteka obstaja. Ali ste prepričani, da jo želite prepisati?V tej mapi so na enem mestu shranjeni vsi Anki podatki, da je izdelava varnostne kopije bolj enostavna. Če želite, da Anki uporabi drugo mapo, preverite: %s Ta poseben paket je namenjen za učenje zunaj običajnega urnika.S tem boste izbrisali vašo obstoječo zbirko in jo nadomestili s podatki iz datoteke, ki jo uvažate. Ali ste prepričani?Čarovnik vas bo vodil skozi proces nadgradnje Anki 2.0 Za gladek proces nadgradnje pazljivo preberite naslednje strani. ČasČasovna omejitevZa pregledČe želite poiskati dodatke, kliknite gumb Brskaj.

Ko najdete dodatek, ki ga želite uporabiti, prilepite njegovo kodo v polje spodaj.Za uvoz profila, ki je zaščiten z geslom, najprej odprite profil in ga šele potem uvozite.Za učenje zunaj običajnega urnika, kliknite gumb "Študij po meri".DanesDanašnja meja pregledov je bila dosežena, vendar še vedno ostajajo kartice, ki čakajo na pregled. Za boljši spomin premislite o tem, da bi povečali dnevno mejo.SkupajSkupni časSkupaj karticSkupaj zaznamkovObravnavaj vnos kot običajno izjavoTipVnesi odgovor: neznano polje %sUvoz iz datoteke, ki je označena samo za branje, ni mogoč.Podčrtano besedilo (Ctrl+U)RazveljaviRazveljavi %sNeznana oblika datoteke.NeopaženePosodobi obstoječe zapiske, ko se prvi polji ujemataNadgradnja zaključenaČarovnik za nadgradnjoNadgradnjaNadgrajevanje paketa %(a)s od %(b)s... %(c)sPrenos na AnkiWebPrenos v AnkiWeb...Uporabljeno na karticah, a manjka v mapi medijskih datotek:Uporabnik 1Različica %sČakam na zaključek urejanja.DobrodošliMed dodajanjem naj bo privzet trenutni paketKo se prikaže odgovor, predvajaj zvok vprašanja in odgovoraKo boste pripravljeni na nadgradnjo, kliknite gumb Uveljavi. Med nadgradnjo se bodo v brskalniku odprla navodila za nadgradnjo. Pazljivo jih preberite, ker se je od prejšnje verzije programa Anki veliko spremenilo.Med nadgradnjo vaših paketov bo Anki poskušal kopirati vse zvoke in slike iz starejših paketov. Če ste uporabljali poljubno DropBox mapo ali mapo za medije po meri, proces nadgradnje mogoče ne bo našel vaših medijskih datotek. Kasneje bo prikazano poročilo o nadgradnji. Če ugotovite, da medijska datoteka ni bila kopirana, preverite navodila za nadgradnjo.

AnkiWeb sedaj podpira neposredno sinhronizacijo medijskih datotek. Vse medijske datoteke se bodo sinhronizirale skupaj s karticami, ko boste sinhronizirali z AnkiWeb.Celotna zbirkaAli ga želite prenesti sedaj?Napisal ga je Damien Elmes, dodatke, prevode, testiranje in oblikovanje pa so opravili:

%(cont)sNiste še posneli svojega glasu.Imeti morate vsaj en stolpec.SvežeVaši paketi[ni paketa]varnostne kopijekarticekartice izbrane odzbirkaddnipaketpomočureur od polnočispodrsljajipovezano z %spovezano z Oznakamiminutminutemopregledisekundstatistikawcelotna zbirka~anki-2.0.20+dfsg/locale/fa/0000755000175000017500000000000012256137063015102 5ustar andreasandreasanki-2.0.20+dfsg/locale/fa/LC_MESSAGES/0000755000175000017500000000000012065014111016651 5ustar andreasandreasanki-2.0.20+dfsg/locale/fa/LC_MESSAGES/anki.mo0000644000175000017500000024340212252567245020160 0ustar andreasandreas9O3DD DDE"E+E -E7EJE8\EEEE"E$E$F&=FdF"FFFF$F G-GBG0ZGGG&G GG(GH$H,;HhH*{HH,H HH(I0I4I8I fPJfff]f g8,geg lgzgg)gggg g hhh h %h3h8h @h MhWhihqh xh!hhh)h0hi-i41i!fiiiiiiij jjjj"j%j(j Dj Rj^jej ljzj jj,jjjjjj k!k1kFkWk ^k ikvk{kkkkOlXl]lxlll lllll llm m"m$'mLmSm Xmemmmrmm.mFmmn 8n4Dnynn n1nnnoo*$o Oo]o |oo"o"o op%p*p9pMpVp hp rp)pppppq"qAqFqLq[qkq rq |qqqq<qqq rrr#r ,r+7rcrtr rrr r rr rrrrrsss-s5sOsis ns zssss sssss sst t t /t u<Iu uu]uavcv!wvvvv,vv#ww wwww x x#x )x 5x?xWxfx xxxx x xx,x#&y)JyVty8yEzJzazxzzz,zz-{+<{8h{{ {{{{#{ ||1|:|C|b|k| |||||||||||} } -}9}iT}} } }} }} ~"~@~ H~1S~ ~~ ~~ ~ ~ ~~ *-Aow    V a q{,+@G[ ā Ձ 5Sq*'!6 B!M?oŃ Ճ ; Yg m x ҄ % 2 ? I*j!dۅ @KOX] r( ȆX+]"&Ӈ0+>JUF߈*&(Q1zI't#ode^8UC(br a&uMLR  !>C'aʓ.ѓ&'8 G&Qx,ϔ ֔UV$^8("јWSL0$љ"  +{6^U q{  ƟП՟ڟ%*2:B HRTe Y d r ~ Ǣ7٢0B S_z$٣ #/"S!vs 3 ?I` r~  ϥ٥  -7 N X dr w! Ӧ   ! - 8F Xcv/8ϧ/#Nr=   ./9.iª˪Ӫ۪%<ܫ2"Lo"Uxǭح.'Q'yy'u;Ų ۲21'I"q ͳ,9I شeT;8>ҶEDMmd(ɼ#x!)K{2f9I9G0K+|7gcr(/" '?Od#m/) 1O2b)1S(A|J   % 0;&Ov%"2gM={ *")L6c: #20VE * 5H; 4G* C NN[9kv++)?i z    ' 4AWo  1Od")1"@CG TK#[m -FVl.VSX; E?8Lx<L OA\FUU !}2% "-6N `m}+R `i9p 0 Qs\?,/=m)$ ),/2'5]q .\Z x  +%+ Q\p& 8!'(P(k 09@_u1| ! Lj:G1 yt8HZYu%V"L oa9@:YJ:J'e))^>#7 >E"+@0q&^X!=zA].% &/M&e5" , 7 X5c %)+*Vf)!9Sp*$6 RB&O; HWm># 2n@*W$O|T!$1Vt 4.C\n"I @]`LB N}m(5&2\T,X,japj 9 )ZG (CLbv  3IJZ$%%/(XNt%T U &p ,     % ;/ +k ?  '    + 6 'E  m z  ; y f   xW 4 *0? $ 8FZ#vNGF16xQP.R s?_  #> GR-o5. !.D^G}C3#Wv5E/L/|Y( )BSCZ=6/C6C1<u#L0#Tsj:MIgEI <9"v""##|%.&cM'L''()))**++, -!!-C. H.V.o.A..-.V/X/ h///<//w0K{0%0#018)1%b141^1 2 )2=52s23d/3Y33;59L9|::D*;9o;8;;;;<'=??}AE/E EERE)jE EE EEE EE E&EF&6F3]F F F FF FF FF@otq<D?yDUU(~`?{|} 6gy'JEn1Zc(zON(uW4M\#$F FAw]AlG9lT_B%"*8BC:Wx93]Ck"*HbP[j1%i  K_` Z>^RU"[rfL).aH6[Pm2s-Z .-/1,2OL*+ueD S-g~V{a+ #fSRn'}5Xd  !o !M2veoK)M=\- #f,jh GF$i<@&Je]s&0<#5XVmJ8T2.w&9.IIQv)|j_ gC0`1$u3wXtxBh|4NvV%{4GcLqR%r 79!,ncH8}Yzp6+KE8N04/"(h~x3 /IkrWO:mz=q ^> Qk/S,\)bY d! Yp*Q 7 b? '^l$dPsE0T&t5i7'a;;3A67;>+ p:@=5y Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraF1F3F5F7Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Password:Passwords didn't matchPastePaste clipboard images as PNGPercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesreviewssecondsstatsthis pagewwhole collectionProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-10-30 18:20+0000 Last-Translator: majidabed Language-Team: There isn't any translation team MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) X-Poedit-Country: iran Language: fa X-Poedit-Language: Persian توقف (۱ از %d) خاموش روشن آن داشت %d کارت.%% صحیح%(a)0.1f %(b)s/روز%(a)0.1fs (%(b)s)%(a)d of %(b)dیادداشت بروز رسانی شده%(a)dkB بارگذاری, %(b)dkB بارگیری%(tot)s %(unit)s%d کارت%d کارت حذف شده.%d کارت صادر شده.%d کارت وارد شده.%d کارت مطالعه شده در%d کارت/دقیقه%d دسته بروز شده.%d گروه%d یادداشتها%d یادداشت اضافه شده%d یادداشت وارد شده.%d یادداشت بروز شده%d مرورها%d انتخاب شده%s بر روی دسکتاپ شما از قبل وجود دارد . آیا آن را بازنویسی می کنید?%s نسخه%s روز%s روز%s حذف شده.%s ساعت%s ساعت%s دقیقه%s دقیقه.%s دقیقه%s ماه%s ماه%s ثانیه%s ثانیه%s برای حذف:%s سال%s سال%s روز%s ساعت%s دقیقه%smo%s ثانیه%sy&درباره...&افزودنی‌ها&بررسی پایگاه داده&یادگیری با شتاب...&ویرایش&صادرکردن...&فایل&جستجو&برو‌&راهنما&راهنما ...&کمک‌&وارد کردن&وارد کردن...&وارونه کردن انتخاب شده ها&کارت بعدی&باز کردن پوشه‌ی افزودنی‌ها ...&تنظیمات ...&کارت قبلی&زمان بندی مجدد...&پشتیبانی از انکی ...&تعویض نمایه ...&ابزارها&برگرداندن'%(row)s' داشت %(num1)d فیلدها, منتظر%(num2)dd(%s صحیح)(پایان)(فیلترشده)(یادگیری)(جدید)(محدوده به عنوان والدین: %d)(لطفا یک کارت انتخاب کنید)...فایلهای نسخه 2 آنکی برای وارد کردن طراحی نشده اند. اگر می خواهید آنها را از یک فایل پشتیبان بازیابی کنید، لطفا بخش پشتیبان را از راهنمای کاربران ببینید./0ر1 101 ماه1 سال10ق.ظ10ب.ظ3ق.ظ4ق.ظ4ب.ظحطای 504 مربوط به مدت زمان دریافت گردیده است. لطفا بطور موقت آنتی ویروس خود را غیر فعال نمایید.: و%d کارتبازکردن پوشه پشتیبانبازدید از وب‌سایت%(pct)d%% (%(x)s از%(y)s)%Y-%m-%d @ %H:%Mپشتیبان‌ها
انکی هربار که بسته می‌شود یا یکپارچه‌سازی می‌شود،یک پشتیبان از مجموعه‌ی شما ایجاد خواهد کرد.فرمت صادر کردن:یافتن:سایز فونت:فونت:درون:شامل:اندازه خطوط:جایگزینی با:یکپارچه‌سازییکپارچه‌سازی
اخیراً فعال نشده است؛ برای فعال کردن آن در پنجره‌ی اصلی برروی دکمه‌ی یکپارچه‌سازی کلیک کنید.

نیازمند به حساب

برای اینکه مجموعه شما یکپارچه شود یک حساب رایگان نیاز می باشد. لطفاً برای یک حساب ثبت نام کنید، سپس جزئیاتتان را درپایین وارد نمایید.

انکی به روز رسانی شد

انکی %s منتشر شد.

<صرف نظر شده><متن غیر یونیکد><جهت جستجو اینجا تایپ کنید; برای نمایش دسته فعلی اینتر را فشار دهید>از همه کسانی که پیشنهاد، خطاهای رخ داده و هدیه ارسال می کنند کمال تشکر را داریم.یک کارت's آسان اندازه مدت بعدی است ، وقتی جواب شما در یک مرور "خوب" است.یک فایل با نام کالکشن (مجموعه).apkg بر روی دسکتاپ شما ذخیره شده است.بی نتیجه: %sدرباره انکیافزودنافزودن (میانبر: کنترل+اینتر)افزودن فیلدافزودن رسانهافزودن دسته جدید (Ctrl+N)افزودن نوع یادداشتوارونه اضافه کردنافزودن برچسبافزودن کارت جدیداضافه کردن به :افزودن: %sاضافه‌شدهامروز اضافه شدهدر اولین فیلد دوبار اضافه شده: %sدوبارهدوباره امروزشمارش مجدد: %sتمام دسته(ها)تمام فیلدهاهمه کارتها بطور تصادفی مرتب شده (درحالت یادگیری با شتاب)تمام کارتها، یادداشتها و فایهای رسانه برای این نمایه حذف خواهد شد. آیا مطمئن به انجام هستید؟اچ تی ام ال در فیلدها اجازه دارندیک خطا در افزودنی اتفاق افتاده است.
لطفا آن را به انجمن افزودنی ها اطلاع دهید:
%s
یک خطا هنگام باز کردن رخ داده است %sAیک خطای رخ داده است. ممکن است به علت یک باگ بی ضرر باشد,
یا دسته شما ممکن است مشکل داشته باشد.

برای مشخص شدن اینکه مشکل از دسته کارت شما نباشد، لطفا مراحل زیر را اجرا کنید ابزار> بررسی پایگاه داده.

اگر مشکل برطرف نشد، آن را در داخل یک گزارش باگ کپی کنید
into a bug report:یک تصویر بر روی دسکتاپ شما ذخیره گردیدانکیدستۀ انکی 1.2 (*.anki)نسخه 2 آنکی دسته های شما را با فرمت جدید ذخیره می کند. این ویزارد بصورت خودکار دسته های شما به آن فرمت تیدیل می کند. از دسته های خود قبل از بروز رسانی پشتیبان تهیه کرده و همچنین اگر نیاز به برگشت به نسخه قبلی آنکی دارید پیشتیبان را تهیه نمایید تا دسته هایتان بعدا قابل استفاده باشد.دسته نسخه 2 آنکیآنکی 2 بطور خودکار دسته های قدیمی آنکی 1.2 را بروز رسانی و بارگذاری می کند، لطفا آنها را در آنکی 1.2 باز کتید تا آنها بروز رسانی شوند و سپس آنها را به آنکی 2.0 وارد نمایید.مجموعه دسته آنکیآنکی قادر به یافتن خط بین سوال و جواب نیست. لطفا بطورت دستی قالب را تنظیم نموده و سوال و جواب را مجددا ببینید.آنکی یک سیستم یادگیری هوشمند و دوستانه است. این نرم افزار مجانی و منبع باز می باشد.آنکی تحت مجوز AGPL3 می باشد. لطفا برای اطلاعات بیشتر فایل مجوز را در محل توزیع ببینید.آنکی قادر به بارگذاری فایل تنظیمات قدیمی نیست. لطفا از فایل>وارد کردن برای وارد نمودن دسته های حود از نسخه های قبلی آنکی استفاده نمایید.نام کاربر و یا رمز انکی وب نادرست می‌باشد؛ لطفاً دوباره تلاش کنید.نام کاربر انکی‌وبآنکی وب با یک خطا مواجه شده است. لطفا چند دقیقه دیگر مجددا سعی نمایید و اگر مشکل همچنان وجود داشت لطفا یک فایل گزارش خطا بفرستید.آنکی وب همچنان در این لحظه مشغول است. لطفا چند دقیقه دیگر سعی نمایید.آنکی وب تحت تعمیر است. لطفا چند دقیقه دیگر مراجعه نمایید.پاسخدکمه‌های پاسخپاسخ‌هانرم افزار آنتی ویروس یا فایروال از اتصال آنکی به اینترنت جلوگیری می کند.طبق برنامه هیچ چیزی در هر کارت حذف نخواهد شد. اگر باقیمانده کارتها یک یادداشت نداشته باشند، آن از دست خواهد رفت. آیا برای ادامه مطمئن هستید؟دوبار در پرونده نشان داده شده: %sآیامطمئن هستید که می خواهید حذف کنید؟ %sحداقل یک نوع کارت لازم است.حداقل یک مرحله لازم است.ضمیمه کردن تصاویر/صوت/ویدئو (F3)پخش خودکار صدامجموعه تنظیمات باز/بسته به صورت خودکار یکپارچه سازی شوندمیانگینمیانگین زمانمیانگین زمان پاسخگوییمیانگین آسانیمیانگین روزهای مطالعه شدهمیانگین بازه زمانیعقبپیشنمایش پشتقالب پشتپشتیبان(ها)پایهپایه (و کارت وارونه)پایه (کارت انتخابی وارونه)پررنگ کردن متن (کنترل+B)مرورمرور و &نصب ...مرورگرنمایش مرورگراختیارات مرورگرایجادکردنافزودن کلی برچسب ها (Ctrl+Shift+T)حذف کلی برچسب ها(Ctrl+Alt+T)از نظر مخفی کردندفن کردن کارتیادداشت های از نظر مخفی شدهکارتهای جدید وابسته از نظر مخفی شده تا روز بعددفن کردن مرور‌های مشابه تا روز بعدیبه صورت پیش فرض، انکی کاراکتر بین فیلدها را تشخیص می دهد، مثل تب، ویرگول و غیره.اگر تشخیص انکی اشتباه بود، شما می توانید آن را در این قسمت وارد کنید. از \t به جای دکمه تب استفاده نمایید.لغوکارتکارت %dکارت 1کارت 2شماره کارتاطلاعات کارت (Ctrl+Shift+I)فهرست کارتنوع کارتنوع های کارتنوع کارت برای %sکارت دفن شد.کارت معلق شدهکارت یک کارت سخت بود.کارت‌هاانواع کارت‌هاکارتها بصورت دستی قابل انتقل به یک دسته فیلتر شده نیستند.کارتها در فرمت متن ساده(پلین تکست)کارتها بعد از مرورشان مجددا بطور خودکار به دسته اصلی خود برگردانده می شوندکارت (ها) ...مرکزتغییر دادنتغییر دادن %s به:تغییر دستهتغییر نوع یادداشتتغییر نوع یادداشت (Ctrl+N)تغییر نوع یادداش ...تغییر رنگ (F8)تغییر دسته براساس نوع یادداشتتغییر کردهبررسی و رسانه ...بررسی کردن فایل ها در شاخه رسانهدرحال بررسی ...انتخاب کندسته را انتخاب کنیدنوع یادداشت را انتخاب کنیدانتخاب برچسبمشابه: %sبستنبستن و از دست دادن اطلاعات ورودی جاری؟جاخالیجا خالی حذف شده (Ctrl+Shift+C)کد:مجموعه خراب است. لطفاً راهنما را ببینید.دونقطهکاماپیکربندی رابط زبان و تنظیماتتایید رمز:تبریک! شما فعلاً این دسته را تمام کردید.درحال اتصال...ادامهرونوشتپاسخ های صحیح در کارتهای دائم: %(a)d/%(b)d (%(c).1f%%)صحیح: %(pct)0.2f%%
(%(good)d از %(tot)d)اتصال به AnkiWeb ممکن نیست. لطفاً اتصال به شبکه خود را بررسی کنید و دوباره تلاش کنید.امکان ضبط کردن صدا فراهم نمی باشد. آیا sox و lame نصب شده دارید؟پرونده ذخیره نمی‌شود: %sیادگیری با شتابایجاد دستهایجاد دسته فیلتر شده ...ایجادشدهکنترل+=کنترل+Aکنترل+آلت+Fکنترل+آلت+شیفت+cکنترل+BCtrl+Dکنترل+Eکنترل+Fکنترل+Iکنترل+Lکنترل+Nکنترل+Pکنترل+Qکنترل+Rکنترل+شیبف+=کنترل+شیبفت+Aکنترل+شیفت+Cکنترل+شیفت+Fکنترل+شیفت+Lکنترل+شیفت+Mکنترل+شیفت+PCtrl+Shift+Rکنترل+Uکنترل+Zمرکبیکجا %sپاسخهای یکجاکارتهای انباشتهدسته ی فعلینوع یادداشت فعلی:مطالعه سفارشیجلسه مطالعه سفارشیمراحل سفارشی (در دقیقه)سفارشی کردن کارتها (کنترل+L)سفارشی کردن فیلدهابرشپایگاه داده بازسازی و بهینه‌سازی شد.تاریخروزهای مطالعه شدهکنسول رفع اشکالدستهدسته باطل شدهوقتی یک نمایه باز شده باشد، دسته وارد خواهد شد.دسته (ها)کاهش بازه های زمانیپیش‌فرضتاوقتی که مرورها دوباره نشان داده شوند به تاخیر انداخته شود.حذف کردنحذف %s؟حذف کارتهاحذف کردن دستهحذف خالیحذف یادداشتحذف یادداشتحذف برچسب هاحذف استفاده نشدهحذف فیلد از %s?حذف '%(a)s' نوع کارت, و آن %(b)s?این نوع یاددداشت و همه آن کارتها را حذف می کنید؟این نوع یادداشتهای بلااستفاده را حذف می کنید؟رسانه بلااستفاده را حذف می کنید؟...حذفحذف شد%d کارتهایی با یادداشت های مفقود.حذف شد %d کارتهایی با قالبهای مفقود.حذف شد %d یادداشتهایی با نوع یادداشت مفقود.حذف شد%d یادداشتهایی با هیچ کارتی.حذف شد %d یادداشتهایی با تعدای فیلد اشتباه.حذف شد.حذف شد. لطفا آنکی را راه اندازی کنید.حذف کردن این دسته از لیست دسته ها همه کارتهای باقیمانده را به دسته اصلی اشان برخواهد گرداند.توضیحاتتوصیف برای نمایش در صحفه مطالعه (فقط دسته فعلی):گفتگواز بین بردن فیلددانلود نا موفق: %sبارگیری از انکی وببارگیری باموفقیت به اتمام رسید. لطفاً انکی را دوباره راه اندازی کنید.درحال بارگیری از انکی‌وب ...موعد مرورموعد مرور فقط کارتهاموعد مرور فرداخروجسهولتآسانامتیاز آسانیمدت آسانیویرایشویرایش %sوایرایش فعلیویرایش HTMLویرایش برای سفارشی کردنویرایش…ویرایش شدهویرایش فونتویرایش ذخیره شد. لطفا آنکی را راه اندازی کنید.خالیکارتهای خالی ...تعداد کارت خالی: %(c)s فیلدها: %(f)s کارت خالی پیدا نشد. لطفا این مسیر را اجرا کنید ابزار>کارت خالی.اولین فیلد خالی: %sپایانبرای قرادادن %s کارت جدید دسته‌ای را وارد کنید، یا خالی بگذارید:موقعیت کارت جدید را وارد کنید (1...%s):برای افزودن برچسب بزنید:برای حذف کردن برچسب بزنید:خطای بارگیری: %sخطا هنگام شروع: %sاجرای %s باخطا مواجه شد.خطایی در اجرای %s استصادر کردنصادر کردن...اضافیF1F3F5F7فیلد%d از فایل هست:نگاشت فیلدنام فیلد:فیلد:فیلدهافیلد برای %sفیلدها جدا شده به وسیله: %sفیلدها...ف&یلترهافیلد بی اعتبار است. لطفا فایل پشتیبان را برگردانید.پرونده خراب بود.فیلترفیلتر:فیلتر شدهدسته فیلتر شده %dیافتن &تکراری ها...یافتن تکراری‌هایافتن و &جایگزین نمودن...یافتن و جایگزین کردنپایاناولین کارتنخستین مروربرگرداندنپوشه از قبل وجود داردفونتپاورقیبه دلیل امنیتی, '%s'اجازه انجام روی این کارتها را ندارید.شما می توایند هنوز از آن استفاده کنید بوسیله قراردادن فرمان در یک مجموعه متفاوت و وارد کردن آن مجموعه در LaTeX بجای هدر.پیش‌بینیفرمپیشرفت و انتخاب معکوسپیشرفت و معکوسپیدا شده%(a)s سرتاسر %(b)s.روپیش‌نمایش روالگوی روعمومیفایل ایجاد شده: %sایجاد شده روی %sگرفتن به اشتراک گذاشته شدهخوببازه زمانی عمومیویرایشگر HTMLسختآیا latex و dvipng نصب شده دارید؟سرآمدراهنماخیلی آسانتاریخچهخانهتفکیک ساعت به ساعتساعاتکمتر از 30 مرور در ساعت نمایش داده نشده است.اگر شما همکاری نموده اید و نام شما در لیست موجود نمی باشد، لطفا در تماس باشید.اگر شما هر روز مطالعه نموده‌ایدنادیده گرفتن زمان های پاسخ بیشتر از ایننادیده گرفتن موردهرجا که اولین فیلد خروجی یادداشت مطابقت داشت، خط را نادیده بگیر.این به روز رسانی را نادیده بگیروارد کردنوارد کردن فایلحتی اگر همان اولین فیلد از قبل وجود داشت، وارد کن.وارد کردن شکست خورد. وارد کردن با شکست روبرو شد.اطلاعات اشکال زدایی: اختیارات وارد کردنوارد کردن کامل شد.در پوشه رسانه‌ها ولی توسط هیچ کارتی استفاده نشده است:حاوی رسانهاطلاعات زمان بندی نیز شامل شوندشامل برچسب هاافزایش تعداد کارتهای جدید امروزافزایش تعداد کارتهای جدید امروز به وسیلهافزایش تعداد کارتهای مرور امروزافزایش تعداد کارتهای مرور امروز به وسیلهافزایش بازه های زمانیاطلاعاتنصب افزونهزبان رابط کاربری:بازه زمانیتغییر دهنده بازه زمانیبازه های زمانیکد نامعتبر.فایل نامعتبر است. لطفا از فایل پشتیبان بازیابی کنید.رمز نامعتبر.عبارت منظم نامعتبر.این معلق شد.نوشته کج (کنترل+I)خطای جاوااسکریپت در خط %(a)d : %(b)sبا کنترل+شیفت+T روی برچسب قرار بگیرنگه داشتنLaTeXمعادله فرمول نویسیتوابع ریاضی فرمول نویسیدورهای سپری شدهآخرین کارتآخرین مرورآخرین اضافه شده در ابتدا قرار بگیردیادگیریمیزان پیشرفت یادگیرییادگیری: %(a)s, مرورشده: %(b)s, بازآموزی: %(c)s, فیلترشده: %(d)sدر حال یادگیریکارت علامتگذاری شده به عنوان خیلی سخت توسط سیستمعلامتگذاری به عنوان کارت خیلی سختآستانه علامتگذاری به عنوان خیلی سختچپمحدود بهدرحال بارگذاری...حساب کاربری خود را با رمز قفل کنید، یا خالی بگذارید:بیشترین بازه ی زمانیبیاب در فیلد :پایین ترین آسانیمدیریتمدیریت نوع یادداشت ...نقشه به %sنقشه به برچسب هاعلامت گذاشتنعلامت گذاشتن یادداشتعلامت گذاشتن یادداشت (کنترل+K)علامت گذاری شدهدائمبیشترین بازه زمانیحداکثر مرورها/روزرسانهکمترین بازه زمانیدقیقهادغام کارت‌های جدید و مرورها"Mnemosyne 2.0 دسته (*.db)"بیشتربیشترین خطاکارتها را انتقال بدهانتقال به دسته (کنترل+D)انتقال کارت‌ها به دسته:&یادداشتنام موجود است.نام برای دسته :نام:شبکهجدیدکارت های جدیدکارتهای جدید در دسته: %sفقط کارتهای جدیدکارت‌های جدید/روزنام دسته جدید:بازه زمانی جدیدنام جدید:نوع کارت جدید:نام گروه اختیارات جدید:موقعیت جدید (1...%d):روز دیگر شروع شود ازهنور موعد مرور هیچ کارتی نیست.هیچ کارتی با معیارهای مشروط شما مطابقت نداشت.کارت خالی وجود ندارد.هیچ کارت دائمی در مطالعه شده های امروز نبود.فایل ناکارآمد و یا خراب پیدا نشد.یادداشتنوع یادداشتنوع های یادداشتیادداشت و مال آن %d کارتهای حذف شده.یادداشت از بین رفتهیادداشت معلق شدهتوجه : از رسانه پشتیبان گرفته نشده است. لطفا متناوباً از پوشه آنکی خود پشتیان تهیه نمایید تا آن ایمن بماند.توجه : برخی از تاریخچه ها ناکارآمد هستند. لطفا برای اطلاعات بیشتر مرورگر اسناد را ببینید.یادداشت در فرمت ساده (Plain Text)یادداشتها حداقل یک فیلد لازم دارند.هیچ‌چیزخُبآخرین دیده شده در ابتدادر همگامسازی بعدی،اجباراً در یک دستور تغییر بدهیک یا بیشتر از یک یادداشت وارد نشده است. زیرا آنها هیچ کارتی ایجاد نکرده اند و این اتفاق زمانی رخ می دهد که یا شما فیلد خالی دارید و یا در فایل متن مفاد ترسیم شده ای برای تصحیح فیلد ندارید.فقط کارتهای جدید قابلیت تغییر موقعیت را دارند.باز کردندرحال بهینه‌سازی ...محدوده انتخابی :اختیاراتاختیارات برای %sگروه اختیارات:اختیارات ...چیدمانمرتب شده با توجه به اضافه شدنبراساس موعد مرور تنظیم کنلغو قالب پشت :لغو فونت :لغو قالب جلورمز:رمزها یکسان نیستندجاگذاریتصویر حافظه موقت به عنوان PNG جاگذاری شود.درصددوره: %sدر انتهای صف کارتهای جدید قرار بگیردر آخر صف کارتهای مرور قرار بگیرد با بازه زمانی بین:لطفا ابتدا یک نوع یادداشت دیگر اضافه کنید.لطفا صبور باشید؛ این مدتی طول می کشد.لطفا میکروفون را متصل کنید و مطمئن شوید که سایر برنامه ها از سیستم صوتی استفاده نمی کنند.لطفا این یادداشت را ویرایش کنید و برخی جای خالی ها را اضافه نمایید. (%s)لطفا مطمئن شوید که یک نمایه باز است و آنکی مشغول نمی باشد، سپس مجددا سعی نمایید.لطفاً PyAudio را نصب کنید.لطفا پخش کننده رسانه نصب کنیدلطفاً اول یک شناسه باز کنید.لطفا این مسیر را اجرا کنید: ابزار< کازتهای خالیلطفا یک دسته انتخاب کنیدلطفا کارتها را فقط از یک نوع یادداشت انتخاب کنید.لطفا چیزی را انتخاب کنیدلطفاً نرم‌افزار را به آخرین نسخه از انکی ارتقاء دهید.برای وارد کردن این فایل از این مسیر اقدام کنید: فایل< وارد کردنلطفا به سایت آنکی وب مراجعه ، دسته خود را بروز کرده و سپس مجدداً سعی نمایید.موقعیتتنظیماتپیش نمایشپیش نمایش کارتهای انتخاب شده (%s)پیش نمایش کارتهای جدیدپیش نمایش کارتهای جدید اضافه شده در آخردرحال پردازش...رمز نمایه...نمایه:نمایه‌هامجوز نماینده لازم است.پرسشانتهای صف: %dبالای صف: %dخروجدرهممخلوط کردن چیدمانرتبه‌دهیآماده برای ارتقاءبازسازیضبط صدای خودضبط صدا (F5)درحال ضبط کردن ...
زمان: %0.1fبازآموزیبخاطر سپردن آخرین ورودی هنگام اضافه کردنحذف برچسب هاحذف شکلبندی (کنترل+R)حذف کردن این نوع کارت سبب حذف یک نوع یا بیشتر خواهد شد. لطفا ابتدا یک نوع کارت جدید بوجود بیاورید.نام‌گذاری مجددنام‌گذاری مجدد دستهپخش مجدد صوتپخش مجدد صدای خودتانتغییر موقعیتتغییر موقعیت کارتهای جدیدتغییر موقعیت ...یک یا بیشتر از یکی از این برچسب ها لازم است :زمان بندی شدزمان‌بندی کردن مجددکارتها براساس پاسخ من در این دسته زمانبندی شودالان ادامه بدهبرگرداندن جهت متن (RTL)برگشت به حالت قبلی به '%s'.مرورتعداد مرورزمان مرورپیشرفت مرورپیشرفت مرور به وسیلهمرور کارتهای فراموش شده در انتهامرور کارتهای فراموش شدهمیزان موفقیت مرور در هر ساعت از روزمرورهاموعد مرورها در دسته: %sراستذخیره تصویرهدف: %sجست و جوجستجو با شکلبندی (کند)انتخابانتخاب &همهانتخاب &یادداشتهاانتخاب برچسبها برای مستثنی کردن:فایل انتخاب شده در فرمت UTF-8 نبود. لطفا راهنمای بخش مربوطه را ببینید.مطالعه گزینشینقطه ویرگولسرور پیدا نشد. یا ارتباط قطع گردیده یا نرم افزار آنتی ویروس/فایروال ارتباط آنکی با اینترنت را قطع کرده است.Sآیا همه دسته های زیر را %s به عنوان اختیارات این گروه قرار می دهید؟برای همه زیر دسته ها قرار بدهتعیین رنگ پیش‌زمینه (F7)کلید شیفت پایین نگه داشته شده بود. همگامسازی و بارگذاری افزونه بطور خودکار رد گردید.موقعیت کارتهای موجود را تغییر دهیدکلید میانبر: %sمیانبر: ‪%sنمایش %sنمایش پاسخنمایش تکراریهانمایش زمان سنج پاسخکارت‌های جدید بعد از مرورها نشان داده شوندکارت های جدید را قبل از مرور ها نشان بدهکارت ها را به ترتیب اضافه شدن، نشان بدهکارت ها را بدون ترتیب نشان بدهزمان مرور بعدی را در بالای دکمه پاسخ نشان بدهتعداد کارت باقیمانده در طول مرور را نشان بدهنمایش آمار. کلید میانبر: %sاندازه:برخی از تغییرات پس از اینکه انکی دوباره شروع شد اعمال خواهند شد.فیلد را مرتب کنبه وسیله این فیلد در مرورگر مرتب کنمرتب سازی بر اساس این ستون پشتیبانی نشده است. لطفا یکی دیگر را انتخاب کنید.اصوات و تصاویرفاصلهموقعیت شروع:آسان شروع کردنآمارمرحلهمراحل (به دقیقه)مراحل باید به اعداد باشد.HTML را هنگام چسباندن متن بردارمطالعه شده%(a)s در%(b)s امروز.امروز مطالعه شدهمطالعهمطالعه دستهمطالعه دسته ...اکنون مطالعه شودبه وسیله حالت یا برچسب کارت مطالعه کنیدسبکسبک(بین کارتهای به اشتراک گذاشته شده)امضاء(Ctrl+=)(*.xml) XML صادر کردن ابر یادداشتبالانویس(Ctrl+Shift+=)معلق کردنمعلق کردن کارتمعلق کردن نوشتهمعلق شدهتصاویر و صوت نیز یکپارچه شوندیکپارچه سازی با انکی وب. کلید میانبر: %sدرحال یکپارچه‌سازی رسانهعدم موفقیت یکپارچه سازی: %sیکپارچه سازی با شکست مواجه شد؛ اینترنت خاموش است.برای یکپارچه سازی لازم است که ساعت کامپیوترتان بصورت صحیح تنظیم شود. لطفا ساعت را تنظیم کرده و مجددا سعی نمایید.درحال یکپارچه‌سازی ...زبانهفقط برچسببرچسب‌هادسته هدف (Ctrl+D)فیلد هدف:متنمتن جدا شده با زبانه یا نقطه ویرگول (*)این دسته هم‌اکنون موجود می‌باشد.نام فیلد قبلا استفاده شده است.این نام قبلاً استفاده شده.به جهت زمان بیش از حد، اتصال با آنکی وب قطع شد. لطفا اتصالات شبکه خود را بررسی کرده و مجددا سعی نمایید.تنظیمات پیش فرض قابل حذف نیست.امکان حذف دسته پیشفرض موجود نمی باشد.تقسیم کارت ها درون دسته (ها) ی شما.اولین فیلد خالی استفیلد اول نوع یادداشت باید برنامه ریزی شود.خط زیر قابل استفاده نیست: %sقسمت جلوی این کارت خالی است. لطفا این مسیر را اجرا کنید: ابزار< کارتهای خالیآیکونها از منابع قبلی به دست آمده؛ لطفا برای اعتبار بیشتر منبع آنکی را ببینید.وارد کردن مشروط به اینکه یک پرسش خالی در همه کارتها ساخته باشید.تعداد سؤالاتی که شما پاسخ دادید.تعداد مرورهایی که درآینده باید انجام دهید.تعداد دفعاتی که شما هر دکمه را فشرده اید.جستجوی شرطی با هیچ کارتی مطابقت نداشت.هنگام یکپارچه سازی بعدی مجموعه خود، به یک بارگذاری کامل پایگاه داده نیاز خواهید داشت. اگر مرور یا تغییرات دیگری روی دستگاههای دیگر کرده اید ، هنوز یکپارچه سازی انجام نشده است .آنها از بین خواهد رفت. آیا ادامه می دهید؟زمانی که برای پاسخ به سؤالات صرف شده است.بروز رسانی تمام شده است و شما آماده اید تا از آنکی 2.0 استفاده کنید.

در زیر یک گزارش بروز رسانی هست:

%s

یک یا بیشتر از یک کارت جدید قابل دسترسی است اما تعداد کارتهای روزانه محدود گردیده شما می توانید تعداد کارتها را از طریق اختیارات افزایش دهید ، اما لطفا به یادداشته باشید که معرفی کارتهای جدید بیشتر حجم مرورها را در کوتاه مدت بالا می بردحداقل یک نمایه در اینجا باید باشداین ستون قابل مرتب سازی نیست اما شما می توانید برای انواع کارتها جستجو کنید, مانند 'کارت:کارت 1'.این ستون قابل مرتب سازی نیست، اما شما می توانید دسته های ویژه را از طریق کلیک بر روی یکی از سمت چپ جستجو کنید.این فایل به صورت یک فایل apkg معتبر نیست. اگر شما یک خطا از یک فایل بارگیری شده از سایت آنکی وب دریافت کرده اید، این اتفاق زمانی می افتد که بارگیری شما با شکست مواجه شده است. لطفا مجددا سعی کنید و اگر مشکل برطرف نشد با یک مرورگر متفاوت دیگر دوباره اقدام کنید.این فایل موجود است. آیا مطمئن هسیتد که می خواهید آن را بازنویسی کنید؟این پوشه منحصر به فرد محل ذخیره سازی کلیه اطلاعات آنکی است که پشتیان گیری را آسان می کند برای اینکه به آنکی بگویید که از یک محل دیگر استفاده کند، لطفا ببیند: %s این یک دسته ویژه برای مطالعه خارج از زمانبندی عادی است.این یک {{c1::مثال}} برای پر کردن جای خالی است.این عمل سبب حذف مجموعه موجود شما و جابجایی آن با اطلاعات فایلی که در حال وارد نمودن آن هستید خواهد شد. آیا می خواهید انجام دهید؟این ویزارد شما را در مراحل به روز رسانی آنکی نسخه 2 راهنمایی می کند. برای بروز رسانی بدون اشکال، لطفا صفحات زیر را به دقت بخوانید. زمانمحدوده زمانی جعبه زمانبرای مروربرای مرور افزونه ها لطفا بر روی دکمه مرور زیر کلیک کنید.

وقتی که افزونه ای را که می خواهید یافتید، لطفا کد آن را در محل زیر بچسبانید.برای وارد کردن رمز عبور ایمنی نمایه، لطفا قبل از سعی برای وارد شدن نمایه را باز کنید.برای ایجاد یک جای خالی بر روی یادداشت موجود، ابتدا از طریق این مسیر: ویرایش < تغییر نوع یادداشت ، نیاز به تغییر نوع به جای خالی دارید.برای مطالعه خارج از زمان بندی عادی بر روی دکمه مطالعه سفارشی زیر کلیک کنید.امروزمحدوده مرور امروز سر رسید شده است، اما هنوز کارتهایی وجود دارد که منتظر برای مرور هستند. برای بهینه کردن حافظه،افزایش محدوده روزانه در اختیارات را ملاحظه کنید.کلزمان کلتمام کارت‌هاتمام نوشته‌هاتلقی ورودی به عنوان یک بیان با قاعدهنوعنوع جواب: فیلد ناشناخته %sقادر به وارد کردن از یک فایل فقط خواندنی نیستید.غیر مخفیمتن زیرخط (کنترل+U)برگرداندنبرگرداندن %sشکل‌بندی فایل ناشناخته می‌باشد.دیده‌نشدهوقتی اولین فیلد مطابقت داده شد یادداشت های موجود را بروز رسانی کن.بروز رسانی شده %(a)d of %(b)d یادداشت های موجود.به روز رسانی کامل شد.ویزارد به روز رسانیدرحال ارتقاءدرحال ارتقاء دسته %(a)s of %(b)s... %(c)sبارگذاری در انکی‌وبدرحال بارگذاری در انکی‌وب ...کارتهای استفاده شده اما از پوشه رسانه مفقود گردیده :کاربر 1نسخه %sبرای ویرایش تا پایان منتظر بمانیداخطار، جای خالی تا وقتی که شما نوع را از بالا به جای خالی تغییر ندهید بطور صحیح کار نخواهد کرد.خوش آمدیدهنگام افزدون کارت جدید، دسته فعلی به عنوان پیش فرض باشدهنگام نمایش پاسخ، هم سوال و هم پاسخ صوتی را پخش کنزمانیکه برای به روز رسانی آماده اید،دکمه مربوطه را برای ادامه کلیک کنید. هنگام انجام مراحل برور رسانی راهنمای ارتقاء در مرورگر شما باز خواهد شد. لطفا آن را به دقت بخوانید، چون تغییرات بسیاری در نسخه قبلی آنکی صورت می گیرد.وقتی دسته های شما به روز رسانی شد، آنکی سعی می نماید تا یک رونوشت از هر صدا و تصویری در دسته های قدیمی شما بگیرد. اگر از یک پوشه افتادنی یا پوشه رسانه سفارشی استفاده می کنید، مراحل به روز رسانی قادر به یافتن رسانه های شما نیست. از این پس، یک گزارش بروز رسانی برای شما ارسال خواهد شد. اگر مشاهده کردید که رسانه ها رونوشت برداری نشده در حالیکه می بایست انجام می گردید، لطفا برای راهنمایی بیشتر به راهنمای بروز رسانی مراجعه کنید.

آنکی وب در حال حاضر مستقیما یکپارچه سازی رسانه را پشتیبانی می کند. احتیاجی به نصب خاصی نیست و رسانه همراه با یکپارجه سازی کارتها هنگام یکپارچه سازی در آنکی وب یکپارچه می شوند.تمام مجموعهآیا میخواهید اکنون این را بارگیری نمایید؟نوشته شده به وسیله Damien Elmes با وصله ها، ترجمه،آزمایش و طراحی از :

%(cont)sیک نوع یادداشت با جای خالی دارید اما هیچ جای خالی ایجاد نشده است.ادامه می دهید؟تعدادی دسته دارید. لطفا ببینید %(a)s. %(b)sهنوز صدای ضبط شده تان را ندارید.حداقل باید یک ستون داشته باشید.موقتموقت+آموزشدسته(ها)ی شماتغییرات شما بر روی چندین دسته تأثیر خواهد گذاشت. اگر می خواهید تغییرات فقط بر روی دسته فعلی تأثیر بگذارد، لطفا ابتدا یک گروه اختیارات جدید اضافه کنید.فایل مجموعه شما خراب شده است. این خرابی زمانی اتفاق می افتد که یا فایل هنگام باز بودن آنکی رونوشت برداری یا منتقل شده و یا فایل در یک شبکه یا فضای ابری ذخیره سازی گردیده است. لطفا برای اطلاع در زمینه چگونگی بازیابی از یک فایل پشتیبان خودکار به راهنما مراجعه نمایید.مجموعه شما در حالت متناقض می باشد. لطفا این مسیر : ابزار< بررسی پایگاه داده را اجرا کرده، سپس مجددا یکپارچه سازی کنید.اگر از هیچ دستگاه دیگری استفاده نمی کنید، لطفا الان آنها را یکپارچه سازی کنید و با انتخاب بارگیری شما مجموعه بارگذاری شده از این رایانه را خواهید داشت. بعد از انجام این عمل، در آینده مرورها و کارتهای جدید بصورت خودکار ادغام خواهند شد.دسته شما در اینجا و آنکی وب با یکدیگر فرق دارند و به همین جهت قادر به ادغام با یکدیگر نیستند. لازم است که از یک طرف دسته ها بازنویسی شوند و از طرف دیگر با همدیگر ادغام شوند. اگر بارگیری را انتخاب کنید، آنکی مجموعه را از آنکی وب بارگیری می کند و هر تغییری که شما در رایانه تان ایجاد کرده اید تا آخرین یکپارچه سازی از بین خواهد رفت. اگر بارگذاری را انتخاب کنید، آنکی مجموعه را در آنکی وب بارگذاری کرده و هر تغییری که شما در آنکی وب یا دستگاههای دیگر ایجاد کرده اید تا آخرین یکپارچه سازی بر روی این دستگاه از بین خواهد رفت.[بدون دستهپشتیبان (ها)کارتهاکارتهای دستهکارتهای منتخب به وسیلهمجموعهروزروز(ها)دستهعمر دستهراهنمامخفیساعاتساعت از نیمه شب گذشتهدوره های سپری شدهبرنامه ریزی شده %sبرنامه ریزی شده برچسب هادقیقهدقایقمرورهاثانیه(ها)آماریاین صحفهه‍فتهمجموعه سالمanki-2.0.20+dfsg/locale/de/0000755000175000017500000000000012256137063015104 5ustar andreasandreasanki-2.0.20+dfsg/locale/de/LC_MESSAGES/0000755000175000017500000000000012065014110016652 5ustar andreasandreasanki-2.0.20+dfsg/locale/de/LC_MESSAGES/anki.mo0000644000175000017500000022367712252567245020176 0ustar andreasandreasUl5hGiG pG{GG"GG GGG8GH.H?H"PH$sH$H&HH"I&I9IJI$gI III0I JJ&"J IJUJ(fJJJ,JJ*J&K,;K hKvK(KKKKKKK KKKKK K LLLL L*L0L 8LCL UL`LxLLLLLLL0L MM M &M1M7MJMaMeMMMMMN NNNNNT!NvNxN,N(NN!O%Of=OO OO O OOPP(Pe?PP7OQ QQ5QXQY3R8RkR 2S >SISMS hS rS|S S SS SSSS S$S T TT +T 5T%@TKfTTNT"U9U#PVtVyVV WW5XGXRXvYwY7 Z EZwQZEZ@[P[W[f[Rn[[D\#_\#\\ \\(])] 1]>] R]_]x]] ] ]]]]]]^ ^^L'^t^^^^^^ ^ ^)^'_C__` ```!`)` B` L` V`a` s```` `3``S`PaYa`a ga uaaaaa"aaa&b 5bAb HbTb eb qb{bbbbb-bbb(c,c5>c tccc8c5cPc7Pddd ddddd dddeeeee$e+e2e9e @e Me Ze ge te e e eeee e eee ef f'fWiPiii]j lj8xjj jjj)jk6k:k IkVk\kak fk qkkk k kkkk k!kkk)l02lclyl4}l!llllm,m@mQm Xmbmhmjmmmpmsmvmym m mmm mm mm,m#n5nqOq.UqFqqq r4rErXr _r1krrrrr*rs tt tt"u"6u Yuzuuuuuu u u u) v5vGvvvvw1wPwUw[wjwzw w wwww<wx x xx-x2x ;x+Fxrxx xxx x xx xxxxyy%y+yz KzUzdz|zzz+zz#z!{>{C{ K{ U{<`{ {{]{a|z|!| ||||,|}#}k}`~ e~s~~~~ ~~ ~ ~~~~! 2<SYw  ,#)VD8EԀ1He,Ł-ށ+ 88q z# ߂ 2; LZ_fv}Ճ i9 Ä Ԅ߄ "% -18 ju  Dž Ӆ-&T\t z  Ɇ׆VF V`,%G@  Lj ψۈ8V*u'!ȉ@618h !?Ί$ 4 BMSf} Ƌ ̋ ׋  1Da| *Ɍ!d: ƍˍ ( 6WXr+ˎ"&A0[+>UFM*(1,ؑIO'?tgܓ#ȔdeQ8Cw(rWژߘ au/WM՚ۚ| !Ư̈̀'16>S.Z& М&ڜ,+X _jUߝ$8 E( I"ZW}Sա0)$Z" {;^<5ѤUڥ 0:BH\ ny{ Ĩب  13  <W YcvG*Ы 57U7Ŭ ެ<<Q:e8:٭!6NT  Ϯݮ&CXk~ ɯۯ߯  & 1=MT\ e p~ İ, @ K6Y +Ʊղײڲ߲-"ݳ"#;մ $:QiI PbQ>A " -)9ct! ع ':V^ s ~ /Yƺ X9.-VƾcL9Q *ZD)n v \r"-(! !-AO  +D\mu# RCZ o7y:Y%Y   , 6BVm FA S ]go ~&  ."Q `kz * J Vb"hF! <6[y? Lmt #*:JZjz 3 No &:.ip)  '5T+kE/ )c5OlNVv &'hN D ;1U  $/6 R` x 4'D]vb{& 8Qg   ( 8B9J  #/#Cdg  !+ /? Xd~  ' )39OW"\C^*E!cY Sj13w#,/ /92i  ',9T Pq##   -=Z!aP 02H{  0 9EYqx& +DK [gmv z ":"L2o+2 & /T;@'$* -HN8|K Taw  " #""F i"s / 4JD6HqFyBa',5+1H8zY $%-S2i " -:AX` s!" 3 7Bb 2Ca/u 5 3?Y _l7|,%4; NY!_ ` lv7?Zsx(' 9CRe%z(D,D;5#[I?J 2Xl   +'1 Yg n| %(! 7AQ a1l.#9 E  $ 8B4G |#~9`-'8 4BTw[?(*h1: 4 bD ) /   , t &=L5i,KRx YnGxc$* $/@)R|%7 + A8K/ ,-;A } b 8!6Z$\k/B.,  :G [g`tZ!J!:"U# o&}&&&&&&&&&&& '''/'6'O'j'o'w'z'' ' ''''7-]'|&Z(1 q*USC3`BU<X8 I 9c<j!Jb"#+Vn!UR,}~Rm}n%A*PP=xE0ElY :hs~_5k+!XEWA_N[a(87  cgL.yT92Y/H e<_\)KL )[g^wJ<X\Dv=U:.Fu-OzedQPTo|DdW%p0,A*74yvVD%;F s $o9-BG2NJ{)ti?.Q#8yO#7/&j]f 'o G6YlF;]d'^G=eCn3$w LrO xqE[/iSH&?{I2bM6zxp0#i>HG 3MC"N*uu5HvBIw65$4@@t9\C:K;)K:m kz(?^'DN$VRr%|hk f@3,>BZ> `ZJhMKt a{aT!SQjsI(QM0f~c=8+41&564gpSml"-`.WR/b1F2}>1"AP  rT,@ ;q+OL?  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: ankiqt_de_DE Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-12-05 19:00+0000 Last-Translator: Thomas Kahn Language-Team: polski MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: Stopp (1 von %d) (aus) (ein) Dort befindet sich %d Karte. Dort befinden sich %d Karten.%% Richtig%(a)0.1f %(b)s/Tag%(a)0.1fs (%(b)s)%(a)d von %(b)d Notiz aktualisiert%(a)d von %(b)d Notizen aktualisiert%(a)dkB auf den Server, %(b)dkB vom Server%(tot)s %(unit)s%d Karte%d Karten%d Karte wurde gelöscht.%d Karten wurden gelöscht.%d Karte wurde exportiert.%d Karten wurden exportiert.%d Karte wurde importiert.%d Karten wurden importiert.%d Karte in%d Karten in%d Karte/Minute%d Karten/Minute%d Stapel wurde aktualisiert.%d Stapel wurden aktualisiert.%d Gruppe%d Gruppen%d Notiz%d Notizen%d Notiz wurde hinzugefügt%d Notizen wurden hinzugefügt%d Notiz wurde importiert.%d Notizen wurden importiert.%d Notiz wurde aktualisiert%d Notizen wurden aktualisiert%d Wiederholung%d Wiederholungen%d ausgewählt%d ausgewählt%s existiert bereits auf Ihrem Desktop. Möchten Sie die Datei überschreiben?Kopie von %s%s Tag%s Tage%s Tag%s Tagen%s gelöscht.%s Stunde%s Stunden%s Stunde%s Stunden%s Minute%s Minuten%s Minute gelernt.%s Minuten gelernt.%s Minute%s Minuten%s Monat%s Monate%s Monat%s Monate%s Sekunde%s Sekunden%s Sekunde%s SekundenLösche %s:%s Jahr%s Jahre%s Jahr%s Jahren%sd%sh%smin%s Mo.%ss%s J.&Über...Er&weiterungenDatenbank &prüfen&Pauken...&Bearbeiten&Exportieren...&Datei&Suchen&Gehe zu&Anleitung&Anleitung...&Hilfe&Importieren&Importieren...Auswahl &umkehrenFolge&nde KarteErweiterungsordner &öffnen...&Einstellungen…&Vorherige Karte&Neu planen...Anki &unterstützen...Profil &wechseln...&Werkzeuge&Rückgängig'%(row)s' hat %(num1)d Felder, erwartet waren %(num2)d(%s richtig)(Ende)(in Auswahlstapel)(lernen)(neu)(Grenzwert des übergeordneten Stapels: %d)(bitte wählen Sie 1 Karte aus)....anki2-Dateien sind nicht für den Import bestimmt. Wenn Sie Ihre Daten aus einer Sicherungskopie wiederherstellen möchten, lesen Sie dazu bitte den Abschnitt 'Backups' im Benutzerhandbuch..0d1 101 Monat1 Jahr10 Uhr22 Uhr3 Uhr4 Uhr16 UhrFehler 504: Zeitüberschreitung. Deaktivieren Sie zeitweilig Ihr Antivirenprogramm, um zu sehen, ob der Fehler hierdurch behoben wird.:und%d Karte%d KartenÖffne SicherungsordnerWebseite besuchen%(pct)d%% (%(x)s von %(y)s)%d.%m.%Y @ %H:%MSicherungskopien
Jedes Mal, wenn Anki geöffnet oder synchronisiert wird, erstellt es eine Sicherungskopie Ihrer Sammlung.Exportformat:Suchen:Schriftgröße:Schrift:InStapel:Liniengröße:Ersetzen durch:SynchronisierungSynchronisierung
Im Moment nicht aktiviert; klicken Sie den Button "Synchronisieren" im Hauptfenster, um sie zu aktivieren.

Anmeldung erforderlich

Melden Sie sich kostenlos an, um Ihre Sammlung zu synchronisieren. Danach geben Sie Benutzernamen und Passwort hier ein.

Ein Update ist verfügbar.

Anki %s wurde veröffentlicht.

Vielen Dank an alle Personen, die mit Vorschlägen, Fehlerberichten und Spenden beigetragen haben.Die Leichtigkeit einer Karte ist der Faktor, um den das letzte Intervall erhöht wird, wenn Sie eine Wiederholung als "gut" bewerten.Die Datei collection.apkg wurde auf Ihrem Desktop gespeichert.Die Synchronisation ist fehlgeschlagen. Um den Fehler zu beheben, führen Sie bitte Werkzeuge>Medien prüfen aus und synchronisieren dann erneut.Abgebrochen: %sÜber AnkiHinzufügenHinzufügen (Tastenkürzel: Strg+Eingabe)Feld hinzufügenMedien hinzufügenNeuen Stapel hinzufügen (Strg+N)Notiztyp hinzufügenGegenrichtung hinzufügenTags hinzuNeue Karte hinzufügenHinzufügen zu:Hinzufügen: %sHinzugefügtHeute hinzugefügtDuplikat zu %s hinzugefügtNochmalHeute fehlgeschlagenFalsch: %sAlle StapelAlle FelderAlle Karten in zufälliger Reihenfolge (Pauken)Alle Karten, Notizen und Medien dieses Profils werden gelöscht. Möchten Sie fortfahren?HTML in Feldern zulassenIn einem Add-On trat ein Fehler auf.
Bitte posten Sie ihn im Add-On-Forum:
%s
Beim Öffnen von %s ist ein Fehler aufgetretenEs ist ein Fehler aufgetreten. Die Ursache könnte ein Programmierfehler in Anki sein, oder es liegt ein Problem mit Ihrem Stapel vor.

Um sicherzustellen, dass der Fehler nicht durch Ihren Stapel verursacht wird, führen Sie bitte Werkzeuge > Datenbank prüfen aus.

Sollte der Fehler dadurch nicht behoben werden, melden Sie bitte den Fehler
unter Angabe der folgenden Informationen:Das Bild wurde auf Ihrem Desktop gespeichert.AnkiAnki 1.2 Stapel (*.anki)Anki 2 speichert Ihre Stapel in einem neuen Format. Dieser Assistent übernimmt die Konvertierung für Sie. Ihre Stapel werden vor der Aktualisierung gesichert, damit Sie Ihre Stapel weiterhin benutzen können, falls Sie zur vorherigen Version von Anki zurückkehren müssen.Anki 2.0-StapelAnki 2.0 kann nur Stapel aus Anki 1.2 automatisch aktualisieren. Wenn Sie Stapel aus älteren Anki-Versionen in Anki 2.0 verwenden möchten, öffnen Sie diese zunächst mit Anki 1.2 und importieren Sie sie danach in Anki 2.0.Anki-KartenpaketAnki konnte die Trennlinie zwischen Frage und Antwort nicht finden. Bitte passen Sie die Vorlage von Hand an, um Frage und Antwort zu vertauschen.Anki ist ein freundliches, intelligentes Karteikarten-Lernsystem. Es ist kostenlos und Open Source.Anki ist lizenziert unter der AGPL3 Lizenz. Bitte lesen Sie für weitere Informationen die Lizenz-Datei im Quellordner der Distribution.Anki konnte Ihre alte Konfigurationsdatei nicht öffnen. Um Stapel aus einer früheren Anki-Version zu übernehmen, wählen Sie Datei>Importieren.Die AnkiWeb-ID oder das Passwort waren inkorrekt; bitte versuchen Sie es nochmal.AnkiWeb-ID:AnkiWeb hat einen Fehler festgestellt. Bitte versuchen Sie es in ein paar Minuten noch einmal, falls das Problem weiter besteht, senden Sie bitte einen Bug-Report.AnkiWeb ist im Moment zu beschäftigt. Bitte versuchen Sie es in ein paar Minuten nochmal.AnkiWeb wird gerade gewartet. Bitte versuchen Sie es später erneut.AntwortBewertungAntwortenEin Antiviren- oder Firewall-Programm verhindert, dass Anki auf das Internet zugreifen kann.Alle leeren Karten werden gelöscht. Sind sämtliche Karten einer Notiz gelöscht, wird diese ebenfalls entfernt. Möchten Sie fortfahren?Doppelt vorhanden in Datei: %sMöchten Sie %s wirklich löschen?Mindestens ein Kartentyp muss vorhanden sein.Mindestens ein Schritt ist erforderlich.Bilder/Audio/Video anhängen (F3)Audio-Datei automatisch abspielenBeim Öffnen/Schließen eines Profils automatisch synchronisierenDurchschnittDurchschnittliche ZeitDurchschnittliche AntwortzeitDurchschnittliche LeichtigkeitDurchschnitt an LerntagenMittleres IntervallRückseiteVorschau für RückseiteVorlage für RückseiteSicherungskopienEinfachEinfach (beide Richtungen)Einfach (eine oder zwei Richtungen)Fett (Strg+B)DurchsuchenSuchen && installieren...BrowserBrowser (%(cur)d Karte gezeigt; %(sel)s)Browser (%(cur)d Karten gezeigt; %(sel)s)Darstellung im BrowserBrowsereinstellungenErstellenTags zu markierten Karten hinzufügen (Strg+Umschalt+T)Ausgewählte Tags markierter Karten entfernen (Strg+Alt+T)ZurückstellenKarte zurückstellenNotiz zurückstellenVerwandte neue Karten nicht am selben Tag lernen, sondern bis zum Folgetag zurückstellenVerwandte Karten nicht am selben Tag wiederholen, sondern bis zum Folgetag zurückstellenFür gewöhnlich wird Anki das Trennzeichen zwischen zwei Feldern, z.B. ein Komma, Tabulator oder Ähnliches, erkennen. Sollte Anki das Trennzeichen nicht korrekt erkennen, können Sie es hier eingeben. Für einen Tabulator verwenden Sie \t.AbbrechenKarteKarte %dKarte 1Karte 2Karten-IDKartendetails (Strg+Umschalt+I)KartenlisteKartentypKartentypenKartentypen für %sKarte zurückgestellt.Karte wurde ausgesetzt.Karte war eine Lernbremse.KartenKartenstatusKarten können nicht manuell in einen Auswahlstapel verschoben werden.Karten als Plain TextGelernte Karten kehren automatisch in ihren Heimatstapel zurück.Karten...ZentriertÄndernÄndere %s in:VerschiebenNotiztyp ändernNotiztyp ändern (Strg+N)Notiztyp ändern...Farbe ändern (F8)Stapel abhängig vom Notiztyp zuweisenGeändert&Medien überprüfenÜberprüfe die Dateien im 'media'-VerzeichnisÜberprüfe...AuswählenStapel wählenNotiztyp wählenTags auswählenKlone: %sSchließenSchließen und aktuelle Eingabe verwerfen?LückentextLückentext (Strg+Umschalt+C)Code:Die Sammlung ist beschädigt. Bitte konsultieren Sie das Benutzerhandbuch.DoppelpunktKommaMenüsprache und Optionen anpassenPasswort bestätigen:Herzlichen Glückwunsch! Sie sind für heute mit diesem Stapel fertig.Verbindung zum Server aufbauen...FortsetzenKopierenRichtige Antworten bei alten Karten: %(a)d/%(b)d (%(c).1f%%)Korrekt: %(pct)0.2f%%
(%(good)d von %(tot)d)Konnte keine Verbindung zu AnkiWeb aufbauen. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es nochmal.Tonaufnahme fehlgeschlagen. Haben Sie Lame und Sox installiert?Konnte Datei nicht speichern: %sPaukenStapel erstellenAuswahlstapel erstellen ...ErstelltStrg+Umschalt+#Strg+AStrg+Alt+FStrg+Alt+Shift+CStrg+BStrg+DStrg+EStrg+FStrg+IStrg+LStrg+NStrg+PStrg+QStrg+RStrg+#Strg+Umschalt+AStrg+Umschalt+CStrg+Umschalt+FStrg+Umschalt+LStrg+Umschalt+MStrg+Umschalt+PStrg+Umschalt+RStrg+UStrg+WStrg+ZKumulativ%s insgesamtAntworten insgesamtWiederholungen insgesamtAktueller StapelAktueller Notiztyp:Benutzerdefiniertes LernenBenutzerdefinierte SitzungLernstufen (in Minuten) anpassenKartenlayout anpassen (Strg+L)Felder anpassenAusschneidenDatenbank neu generiert und optimiert.DatumLerntageAutorisierung aufhebenFehlerbehebung (Konsole)StapelFeste StapelzuweisungIhr Stapel wird importiert, sobald Sie ein Profil öffnen.StapelIntervall (absteigend)StandardZeit, bis Karten erneut angezeigt werden.Löschen%s löschen?Karten löschenStapel löschenLeere Karten entfernenNotiz löschenNotizen löschenTags löschenNicht genutzte Medien löschenFeld aus %s entfernen?Kartentyp '%(a)s' und seine %(b)s löschen?Möchten Sie dieser Notiztyp und alle seine Karten wirklich löschen?Dieser Notiztyp wird nicht verwendet. Löschen?Unbenutzte Medien löschen?Löschen...%d Karte ohne zugehörige Notiz wurde gelöscht.%d Karten ohne zugehörige Notiz wurden gelöscht.%d Karte ohne Vorlage wurde gelöscht.%d Karten ohne Vorlage wurden gelöscht.%d Notiz ohne zugeordneten Notiztyp wurde gelöscht.%d Notizen ohne zugeordneten Notiztyp wurden gelöscht.%d Notiz ohne Karten wurde gelöscht.%d Notizen ohne Karten wurden gelöscht.%d Notiz mit falscher Anzahl von Feldern wurde gelöscht.%d Notizen mit falscher Anzahl von Feldern wurden gelöscht.Gelöscht.Gelöscht. Bitte starten Sie Anki neu.Wenn Sie diesen Stapel entfernen, werden alle verbleibenden Karten wieder ihrem Heimatstapel zugeführt.BeschreibungBeschreibung auf dem Lernbildschirm (nur für ausgewählten Stapel):DialogFeld verwerfenDownload fehlgeschlagen: %sVon AnkiWeb herunterladenDownload erfolgreich. Bitte starten Sie Anki neu.Lade von AnkiWeb herunter...FälligNur fällige KartenMorgen fälligAnki &beendenLeichtigkeitEinfachLeichtigkeitsbonusIntervall für einfache KartenBearbeiten%s ...Angezeigte Karte bearbeitenHTML eingebenZum Anpassen bearbeitenBearbeiten...BearbeitetSchrift bearbeitenÄnderungen gespeichert. Bitte starten Sie Anki neu.LeerenLeere Karten...Leere Karten: Nr. %(c)s Felder: %(f)s Leere Karten gefunden. Führen Sie bitte Werkzeuge>Leere Karten aus.Erstes Feld ist leer: %sEndeWählen Sie den Stapel, in dem neue %s-Karten hinzugefügt werden sollen (Feld kann frei bleiben):Neue Kartenposition eingeben (1...%s):Folgende Tags hinzufügen:Folgende Tags löschen:Fehler beim Download: %sFehler beim Start: %sFehler beim Ausführen von %s.Fehler beim Ausführen von %sExportierenExportieren...ExtraFF1F3F5F7F8Feld %d der Datei ist:FeldzuordnungFeldname:Feld:FelderFelder für %sFeldtrenner: %sFelder...Fil&terUngültige Datei. Bitte öffnen Sie eine Sicherungskopie.Datei war nicht vorhanden.FilterFilter:AuswahlstapelAuswahlstapel %d&Duplikate suchenDuplikate suchenSuchen und &Ersetzen...Suchen und ErsetzenFertigErste KarteErstmals wiederholtErstes Feld stimmt überein mit: %sUngültige Eigenschaften bei %d Karte korrigiert.Ungültige Eigenschaften bei %d Karten korrigiert.Notiztyp korrigiert: %sSeiten vertauschenDer Ordner existiert bereits.Schriftart:FußzeileAus Sicherheitsgründen können Sie '%s' auf Ihren Karten nicht benutzen. Wenn Sie den Befehl trotzdem verwenden möchten, definieren Sie ihn in einem anderen Paket und importieren dieses in der LaTeX-Präambel.PrognoseEingabemaskeEine oder zwei RichtungenZwei Richtungen%(a)s in %(b)s gefunden.VorderseiteVorschau für VorderseiteVorlage für VorderseiteAllgemeinErzeugte Datei: %sZeit: %sStapel herunterladenGutIntervall für AufstiegHTML-EditorSchwerHaben Sie LaTeX und dvipng installiert?KopfzeileHilfeGrößte LeichtigkeitVerlaufPos1Gedächtnisleistung nach TageszeitStundenUhrzeiten mit weniger als 30 Wiederholungen werden nicht angezeigt.Wenn auch Sie etwas beigetragen haben und nicht in dieser Liste stehen, melden Sie sich bitte.Wenn Sie jeden Tag lerntenIgnoriere Antwortzeiten überGroß-/Kleinschreibung ignorierenZeilen ignorieren, wenn das erste Feld mit einer bereits vorhandenen Notiz übereinstimmtDieses Update ignorierenImportierenDatei importierenAuch dann importieren, wenn das erste Feld bereits auf einer Ihrer Notizen auftrittImport fehlgeschlagen. Import fehlgeschlagen. Die Fehlermeldung lautet: Einstellungen importierenImport abgeschlossen.Im Multimediaordner, aber von keiner Karte benutzt:Um Ihre Sammlung fehlerfrei zwischen verschiedenen Geräten auszutauschen, müssen Datum und Uhrzeit Ihres Computers korrekt eingestellt sein. Dazu genügt es nicht, wenn die korrekte Uhrzeit angezeigt wird. Überprüfen Sie Ihre Datum- und Uhrzeiteinstellungen bitte außerdem auf: - Tag, Monat, Jahr, - Zeitzone sowie - Sommerzeit/Winterzeit. Differenz zur Ortszeit: %s.Einschließlich MedienZeitabstände ebenfalls exportierenTags exportierenHeutigen Grenzwert für neue Karten erhöhenHeutigen Grenzwert für neue Karten erhöhen umHeutigen Grenzwert für Wiederholungen erhöhenHeutigen Grenzwert für Wiederholungen erhöhen umIntervall (ansteigend)DetailsErweiterung installierenSprache der Benutzeroberfläche:IntervallIntervallfaktorIntervalleUngültiger Code.Ungültige Codierung; bitte umbenennen:Ungültige Datei. Bitte öffnen Sie eine Sicherungskopie.Passwort ungültig.Karten mit ungültigen Eigenschaften gefunden. Bitte führen Sie Werkzeuge>Datenbank prüfen aus. Sollte das Problem weiterhin bestehen, melden Sie es bitte den Entwicklern.Ungültiger regulärer Ausdruck.Sie wurde ausgesetzt.Kursiv (Strg+I)Fehler bei JS in Zeile %(a)d: %(b)sTags bearbeiten mit Strg+Umschalt+TBehalteLaTeXLaTeX-FormelLaTeX-MathematikumgebungFehlschlägeLetzte KarteLetzte PrüfungErstelldatum (neuste zuerst)LernenGrenzwert für vorzeitiges LernenNeu: %(a)s, wiederholt: %(b)s, erneut gelernt: %(c)s, ausgewählte Karten: %(d)sLernenLernbremseAktion für LernbremsenGrenzwert für LernbremsenLinksBeschränken aufDaten werden geladen...Profil mit Passwort schützen (kann frei bleiben):Längstes IntervallIn folgendem Feld suchen:Niedrigste LeichtigkeitVerwaltenNotiztypen verwalten...%s zuordnenTags zuordnenMarkierenNotiz markierenNotiz markiered (Strg+K)MarkiertAlte KartenMaximales IntervallMax. Wiederholungen/TagMedienMindestintervallMinutenNeue Karten und Wiederholungen mischenMnemosyne 2.0-Stapel (*.db)MehrFehlerzahl (häufigste zuerst)Karten verschiebenVerschiebe nach Stapel (Strg+D)Karten verschieben nach:N&otizName existiert.Stapelname:Name:NetzwerkNeuNeue KartenNeue Karten dieses Stapels: %sNur neue KartenNeue Karten/TagNeuer Stapelname:Neues IntervallNeuer Name:Neuer Notiztyp:Name der neuen Optionengruppe:Neue Position (1...%d):Neuer Tag beginntEs sind noch keine Karten fällig.Keine Karten stimmen mit Ihren Kriterien überein.Keine leeren Karten.Heute wurden keine alten Karten wiederholt.Keine unbenutzten oder fehlenden Dateien gefunden.NotizNotitz-IDNotiztypNotiztypen:Notiz und %d zugehörige Karte gelöscht.Notiz und %d zugehörige Karten gelöscht.Notiz zurückgestellt.Notiz ausgesetzt.Achtung: Von Medien wird keine Sicherungskopie erstellt. Bitte erstellen Sie sicherheitshalber regelmäßig Kopien Ihres Anki-Ordners.Achtung: Ein Teil des Verlaufs kann nicht angezeigt werden. Für weitere Informationen konsultieren Sie bitte die Browser-Dokumentation.Notizen mit unformatiertem TextNotizen benötigen mindestens ein Feld.Tags hinzugefügt.KeineOKerstem Lerntag (älteste zuerst)Bei der nächsten Synchronisation Änderungen in eine Richtung erzwingenEine oder mehrere Notizen wurden nicht importiert, da aus ihnen keine Karten erzeugt werden können. Dies kann geschehen, wenn einige Felder leer sind oder Sie den Inhalt der Textdatei nicht korrekt den Feldern zugeordnet haben.Die Position kann nur für neue Karten geändert werden.Mehrere Geräte können nicht gleichzeitig auf AnkiWeb zugreifen. Ist die Synchronisation fehlgeschlagen, versuchen Sie es in einigen Minuten erneut.&ÖffnenOptimiere...Grenzwert (optional):OptionenOptionen für %sOptionengruppe:Einstellungen...ReihenfolgeErstelldatum (älteste zuerst)FälligkeitVorlage für Rückseite festlegen:Schriftart festlegen:Vorlage für Vorderseite festlegen:Gepacktes Anki-Deck (*.apkg *.zip)Passwort:Passwörter stimmen nicht übereinEinfügenBilder aus der Zwischenablage als PNG einfügenPauker 1.8 Lektion (*.pau.gz)Prozentualer AnteilZeitraum: %sAm Ende der Warteschlange für neue Karten einfügenIn die Warteschlange für Wiederholungen einfügen mit Intervall zwischen:Bitte fügen Sie zunächst einen neuen Notiztyp hinzu.Dieser Vorgang kann einige Minuten dauern. Bitte haben Sie etwas Geduld.Schließen Sie ein Mikrofon an und stellen Sie sicher, dass andere Programme nicht auf das Audiogerät zugreifen.Bitte bearbeiten Sie diese Notiz und fügen Sie Lückentexte ein. (%s)Bitte vergewissern Sie sich, dass ein Profil geöffnet und Anki nicht beschäftigt ist, und versuchen Sie es noch einmal.Bitte installieren Sie PyAudioBitte installieren Sie mplayerBitte öffnen Sie zunächst ein Profil.Bitte führen Sie Werkzeuge>Leere Karten ausBitte wählen Sie einen Stapel.Bitte wählen Sie nur Karten desselben Notiztyps aus.Bitte wählen Sie etwas aus.Verwenden Sie bitte die neueste Version von Anki.Bitte importieren Sie diese Datei mit Datei>Importieren.Bitte besuchen Sie AnkiWeb und aktualisieren dort Ihre Stapel, bevor Sie synchronisieren.PositionEinstellungenVorschauVorschau für ausgewählte Karte (%s)Vorschau neuer KartenVorschau neuer Karten, hinzugefügt in den letztenVerarbeite...Profilpasswort...Profil:ProfileProxy Authentifizierung benötigt.FrageEnde der Warteschlange: %dAnfang der Warteschlange: %dAnki beendenZufallZufällige ReihenfolgeWertungBereit zum UpgradeNeu erstellenEigene Stimme aufzeichnenAudio aufnehmen (F5)Aufnahme läuft...
Zeit: %0.1fÜberfällig relativ zum IntervallErneut lernenBeim Hinzufügen zuletzt eingegebenen Text behaltenTags entf.Formatierung entfernen (Strg+R)Wenn Sie diesen Kartentyp entfernen, würden dadurch eine oder mehrere Notizen gelöscht. Bitte erstellen Sie zunächst einen neuen Kartentyp.UmbenennenStapel umbenennenErneut abspielenAufnahme abspielenPosition ändernPosition neuer Karten ändernPosition ändern...Nur Karten mit einem oder mehreren dieser Tags:Neu planenNeu planenAntworten in diesem Stapel beeinflussen KartenplanungJetzt fortfahrenTextrichtung umkehren'%s' rückgängig gemacht.WiederholenAnzahl der WiederholungenDauerVorauslernenVorauslernen umKarten wiederholen, die vergessen wurden in den letztenVergessene Karten wiederholenErfolgsrate für Wiederholungen nach UhrzeitWiederholungenFällige Wiederholungen in Stapel :%sRechtsAls Bild speichernStapel: %sSucheMit Formatierung suchen (langsam)Zeige&Alle Karten markieren&Notizen auswählenAuszuschließende Tags wählenDie gewählte Datei war nicht im UTF-8-Format. Für weitere Hinweise konsultieren Sie bitte den Abschnitt 'Import' in der Bedienungsanleitung.LernauswahlSemikolonServer nicht gefunden. Entweder ist Ihre Verbindung unterbrochen oder eine Antivirus-/Firewall-Software blockiert Ankis Verbindung zum Internet.Allen Teilstapeln von %s diese Optionengruppe zuweisen?Allen Teilstapeln zuweisenVordergrundfarbe wählen (F7)Sie haben die Umschalttaste gehalten. Automatische Synchronisation wird übersprungen, Erweiterungen nicht geladen.Position existierender Karten verändernTastenkürzel: %sTastenkürzel: %s%s zeigenAntwort zeigenDuplikate anzeigenAntwortzeit anzeigenZeige neue Karten nach WiederholungenZeige neue Karten vor den WiederholungenZeige neue Karten in der Reihenfolge, in der sie hinzugefügt wurdenZeige neue Karten in zufälliger ReihenfolgeZeit für nächste Wiederholung über Antwortschaltflächen anzeigenZähler für verbleibende Karten beim Lernen anzeigenStatistik zeigen. Tastenkürzel: %sGröße:Einige Karten wurden zurückgestellt. Sie werden in einer späteren Sitzung wieder gezeigt.Einige Einstellungen werden erst nach einem Neustart von Anki angewendet.Einige Notizen wurden nicht aktualisiert, da ihr Notiztyp geändert wurde:SortierfeldIn der Kartenübersicht nach diesem Feld sortierenNach dieser Spalte kann nicht sortiert werden. Bitte wählen Sie eine andere Spalte aus.Tonaufnahmen & BilderLeerzeichenAnfangsposition:Anfängliche LeichtigkeitStatistikSchrittweite:Lernstufen (in Minuten)Bitte geben Sie Zahlen ein.HTML-Code beim Einfügen von Text entfernenSie haben heute %(a)s in %(b)s gelernt.Heute gesehenLernenStapel lernenStapel lernen...Jetzt lernenKarten mit bestimmtem Status oder TagStilStil (für alle Karten dieses Notiztyps)Tiefgestellt (Strg+#)Supermemo XML-Export (*.xml)Hochgestellt (Strg+')AussetzenKarte aussetzenNotiz aussetzenAusgesetztTonaufnahmen und Bilder ebenfalls synchronisierenMit AnkiWeb synchronisieren. Tastenkürzel: %sMedien synchronisieren...Synchronisierung fehlgeschlagen: %sSynchronisation fehlgeschlagen: Keine Internetverbindung.Zum Synchronisieren müssen Datum und Uhrzeit Ihres Computers korrekt eingestellt sein. Bitte korrigieren Sie die Einstellungen und versuchen Sie es noch einmal.Synchronisiere...TabulatorDuplikate taggenNur taggenTagsZielstapel (Strg+D)Zielfeld:TextDurch Absatzmarken oder Semikola getrennter Text (*)Dieser Stapel existiert bereits.Dieser Feldname ist schon vergeben.Dieser Name ist schon vergeben.Zeitüberschreitung bei der Verbindung mit AnkiWeb. Bitte überprüfen Sie die Netzwerkverbindung und versuchen Sie es erneut.Die Standardeinstellungen können nicht gelöscht werden.Das Standarddeck kann nicht gelöscht werden.Aufteilung der Karten in Ihren Stapeln.Das erste Feld ist leer.Das erste Feld des Notiztyps muss auf Karten erscheinen.Das folgende Zeichen kann nicht verwendet werden: %sDie Vorderseite dieser Karte ist leer. Führen Sie bitte Werkzeuge>Leere Karten aus.Die Icons stammen aus verschiedenen Quellen; Herkunftsangaben finden Sie im Anki-Quelltext.Ihre Eingabe würde nur Karten mit leerer Vorderseite erzeugen.Anzahl der von Ihnen beantworteten Fragen.Anzahl der in Zukunft anfallenden Wiederholungen.Wie häufig Sie welche Antwortmöglichkeit gewählt haben.Die Zugangsberechtigung zu Ihrem temporären Ordner ist nicht korrekt eingestellt. Anki kann diesen Fehler nicht automatisch korrigieren. Im Abschnitt 'Permissions of Temp Folder' des Handbuches finden Sie Instruktionen, wie sie den Fehler bei Windows 7 beheben können.Die ausgewählte Datei ist keine valide .apkg-Datei.Es wurden keine Karten gefunden, die zu dieser Auswahl passen. Möchten Sie die Kriterien ändern?Sie sind im Begriff, Änderungen vorzunehmen, die es bei der nächsten Synchronisation erforderlich machen, Ihre gesamte Sammlung neu hochzuladen. Falls Sie auf einem anderen Gerät Änderungen vorgenommen haben, die noch nicht synchronisiert wurden, gehen diese verloren. Möchten Sie fortfahren?Bis zur Beantwortung der Frage vergangene Zeit.Die Aktualisierung wurde beendet. Sie können jetzt Anki 2.0 verwenden.

Es folgt das Aktualisierungsprotokoll:

%s

Weitere neue Karten sind verfügbar, aber Sie haben das Tageslimit erreicht. Sie können den Grenzwert in den Einstellungen erhöhen, aber denken Sie daran, dass die Anzahl kurzfristiger Wiederholungen umso größer wird, je mehr neue Karten Sie einsetzen.Sie müssen mindestens ein Profil erstellen.Diese Spalte kann nicht sortiert werden, aber Sie können nach einzelnen Karten-Typen suchen, z. B. via "card:....".Diese Spalte kann nicht sortiert werden, aber Sie können nach bestimmten Stapeln suchen, indem Sie links auf einen Stapel klicken.Diese Datei ist wahrscheinlich keine gültige .apkg-Datei. Wenn dieser Fehler bei einer Datei auftritt, die Sie von AnkiWeb heruntergeladen haben, ist der Download höchstwahrscheinlich fehlgeschlagen. Laden Sie sie erneut herunter, und falls das Problem weiterhin besteht, versuchen Sie es mit einem anderen Browser.Diese Datei ist bereits vorhanden. Möchten Sie sie wirklich überschreiben?Dieser Ordner enthält alle Ihre Anki-Daten an einem Ort, um Aktualisierungen zu erleichtern. Möchten Sie Ihre Daten an einem anderen Ort speichern, lesen Sie bitte: %s Dies ist ein besonderer Stapel, dafür angelegt, Karten außerhalb des gewöhnlichen Zeitplans zu lernen.Ein {{c1::Beispiel}} für einen Lückentext.Möchten Sie wirklich Ihre gesammte Sammlung durch die importierte Datei ersetzen?Dieser Assistent wird sie bei der Aktualisierung auf Anki 2.0 unterstützen. Um einen reibungslosen Ablauf zu gewährleisten, lesen Sie bitte die folgenden Seiten sorgfältig durch. ZeitZeitbegrenzung für SitzungenWiederholenUm Erweiterungen zu durchsuchen, klicken Sie unten auf die Durchsuchen-Schaltfläche.

Haben Sie ein Zusatzpaket gefunden, das Ihnen gefällt, fügen Sie unten bitte dessen Code ein.Für den Import in ein passwortgeschütztes Profil müssen sie zuerst das Profil öffnen.Um einen Lückentext zu einer bereits vorhandenen Notiz hinzuzufügen, müssen Sie dieser erst den Notiztyp Lückentext zuweisen. Wählen Sie dazu Bearbeiten>Notiztyp ändern.Um sie jetzt anzuzeigen, klicken Sie unten auf Zurückstellen aufheben.Klicken Sie unten auf Benutzerdefiniertes Lernen, um außerhalb des regulären Lehrplans zu lernen.HeuteDer Grenzwert für die heutigen Wiederholungen ist erreicht, weitere Karten warten jedoch noch darauf, wiederholt zu werden. Um Ihre Gedächtnisleistung optimal zu nutzen, erwägen Sie bitte die Erhöhung des Grenzwertes in den Einstellungen.GesamtGesamtzeitKarten insgesamtNotizen insgesamtEingabe als regulären Ausdruck behandelnTypAntwort eingeben: Unbekanntes Feld %sImport nicht möglich: Die Datei ist schreibgeschützt.Zurückstellen aufhebenUnterstrichen (Strg+U)RückgängigRückgängig: %sUnbekannter Dateityp.UngelerntNotizen mit übereinstimmendem erstem Feld aktualisierenEs wurden %(a)d von %(b)d Notizen aktualisiert.Aktualisierung beendetUpgrade-AssistentAktualisiereAktualisiere Stapel %(a)s von %(b)s... %(c)sAuf AnkiWeb hochladenLade auf AnkiWeb...In einigen Karten benutzt, aber nicht im Multimedia-Ordner:Benutzer 1Version %sWarte auf Ende der Bearbeitung.Achtung! Lückentext wird nur korrekt angezeigt, wenn Sie oben als Notiztyp 'Lückentext' wählen.WillkommenBeim Hinzufügen aktuellen Stapel als Standard festlegenBei aufgedeckter Antwort Audio beider Seiten abspielenWenn Sie Anki jetzt aktualisieren möchten, klicken Sie OK. In ihrem Browser wird sich ein Leitfaden zur Aktualisierung öffnen, während diese fortschreitet. Bitte lesen Sie diesen sorgfältig durch, da sich die neue Version von der vorigen stark unterscheidet.Bei der Aktualisierung Ihrer Stapel wird Anki versuchen, alle Tonaufnahmen und Bilder aus den alten Stapeln zu kopieren. Wenn Sie einen eigenen DropBox- oder Medienordner verwendet haben, kann es sein, dass Ihre Medien bei der Aktualisierung nicht gefunden werden. Überprüfen Sie deshalb bitte das Aktualisierungsprotokoll, das Ihnen nach der Aktualisierung angezeigt wird. Wenn Sie feststellen, dass Medien, die kopiert werden sollten, nicht kopiert wurden, entnehmen Sie weitere Hinweise bitte dem Leitfaden zur Aktualisierung.

AnkiWeb unterstützt inzwischen die direkte Synchronisierung von Medien. Dafür sind keine zusätzlichen Schritte notwendig; Medien werden gemeinsam mit Ihren Karten synchronisiert, wenn Sie die Synchronisierung mit AnkiWeb aktivieren.Gesamte SammlungMöchten Sie es jetzt herunterladen?Geschrieben von Damien Elmes, mit Patches, Übersetzungen, Tests und Designs von:

%(cont)sSie haben 'Lückentext' als Notiztyp gewählt, aber keinen Lückentext eingegeben. Möchten Sie fortfahren?Sie haben sehr viele Stapel angelegt. Bitte lesen Sie %(a)s. %(b)sSie haben Ihre Stimme noch nicht aufgezeichnetSie müssen mindestens eine Spalte anzeigen.Junge KartenJunge & neue KartenIhre StapelIhre Änderungen betreffen mehrere Stapel. Soll nur der aktuelle Stapel angepasst werden, erstellen Sie bitte zunächst eine neue Optionengruppe.Ihre Kartensammlung ist wahrscheinlich beschädigt. Dies kann passieren, wenn Sie die Datei kopieren oder verschieben, während Anki geöffnet ist, oder wenn Sie die Datei in einem Netzwerk oder einer Cloud speichern. Bitte konsultieren Sie die Bedienungsanleitung für Informationen über die Wiederherstellung aus einer automatischen Sicherungskopie.Ihre Sammlung ist inkonsistent. Bitte führen Sie 'Werkzeuge>Datenbank prüfen' aus und synchronisieren dann erneut.Ihre Sammlung oder eine Mediendatei ist zu groß für die Synchronisation.Ihre Sammlung wurde erfolgreich nach AnkiWeb hochgeladen. Wenn Sie weitere Geräte verwenden, synchronisieren Sie sie bitte jetzt, und laden Sie die Sammlung, die Sie gerade von diesem Computer hochgeladen haben, herunter. Künftige Reviews und neu hinzugefügte Karten werden danach automatisch zusammengeführt.Ihre Stapel hier und auf AnkiWeb unterscheiden in einer solchen Weise, dass sie nicht zusammengeführt werden können. Es ist daher notwendig, die Stapel auf einer Seite mit den Stapeln auf der anderen Seite zu überschreiben. Wenn Sie "Herunterladen (Download)" wählen, wird Anki die Stapel von AnkiWeb herunterladen, und alle Änderungen, die Sie seit der letzten Synchronisation auf Ihrem Computer gemacht haben, gehen verloren. Wenn Sie "Hochladen (Upload)" wählen, wird Anki Ihre Stapel nach AnkiWeb hochladen, und alle Änderungen, die Sie im AnkiWeb oder Ihren anderen Geräten seit der letzten Synchronisation gemacht haben, gehen verloren. Nachdem die Stapel auf allen Geräten synchron sind, werden zukünftige Reviews und neu hinzugefügte Karten automatisch zusammengeführt.[kein Stapel]SicherungskopienKartenKarten aus dem StapelKarten, ausgewählt nachSammlungdTagenStapelLebensdauer des StapelsDuplikatHilfeAusblendenStundenStunden nach MitternachtFehlerabgebildet auf %sabgebildet auf TagsMin.MinutenMoWiederholungenSekundenStatistikdiese Seitewkomplette Sammlung~anki-2.0.20+dfsg/locale/sr/0000755000175000017500000000000012256137063015140 5ustar andreasandreasanki-2.0.20+dfsg/locale/sr/LC_MESSAGES/0000755000175000017500000000000012166637501016727 5ustar andreasandreasanki-2.0.20+dfsg/locale/sr/LC_MESSAGES/anki.mo0000644000175000017500000025040312252567246020216 0ustar andreasandreas;O3E E EE"E"(EKE MEWE8jEEEE"E$F$&F&KFrF"FFFF$F G;GPG0hGGG&G GG(GH2H,IHvH*HH,H HI(I>IBIFIJIOISI WIaIjI}II IIIII III II IIJJ%J4JEJXJ_J0eJ JJ J JJJJJJKKKKKKKKKKTKLL,L(ILrL!LLfL2M HMUM gM tMMMMMeM3N7N OO52OXhOYO8P TP `PkPoP P PP P PP PPPP P$Q+Q 1Q=Q MQ WQ%bQKQQNQ"8R[R#rSSSS TTWUiURUv@VwV7/W gWwsWEW@1XrXyXXRXXfY#Y#YY Y Z("ZKZ SZ`Z tZZZZ Z ZZZZZ[%[,[A[LI[[[[[[[ [) \3\\\\] ]] *] 4] >]I][]k]}] ]3]]S]+^4^;^ B^ P^\^m^^^"^^&^ _ _ __ 0_ <_F_L_j_p__-___(__5 ` ?`M`V`8[`5`P`7aSaja oa{aaaa aaaaaaaaaaab b b %b 2b ?b Lb Yb fbsbzbb b bbb bb bbc!c:cKcOcoc tc c cc c/cccc%d'd .d 9d Fd Rd _d kd xd dd,d(dde 1eF;eNePe>"fPafff]f 7g8Cg|g ggg)gghh h!h'h,h 1h jAjDj `j njzjj jj jj,jjkkkk)k=kMkbksk zk kkkkkkkltlyllll lllll mmm 2m>m$Cmhmom tmmmmm.mFmn4n Tn4`nnn n1nnno,o*@o koyo oo"o"o p,pApFpUpiprp p p)pppp q q>q]qbqhqwqq q qqqq<qrr r*r:r?r Hr+Srrr rrr r rr rrrs ss2s8sIsQskss s ssss sssss s tt .t}F} f}r}i}} } ~~ (~3~ H~"V~y~ ~1~ ~~ ~   '4Dc-z    +VC ,7dyG ܁  #/?Qn*ɂ'!>6D {!?  '-@Wt  Ʉ ;V ^ k x *΅߅!d y ( "X=+"‡& 0&+W>UˆF*_(1I/'tG#ďe18ǎCW(rď7 Ґܐa_uM7, 2 = I!Uw|'“ɓ. &9`q &Ô,۔ U9$8(Ж" W-S0ٙ$ "/R X d{o^KUT Ÿ֟   -4H^cknv~   ɢԢFݢ$&5R0*-;aiaˤ[-yLeP)5^mup9T;Rʨ!-!Oq!!-˩0-*-X-55 /8/h ëʫ , .:K ]go լ7(=\y Gƭ + B O(Z! įʯЯׯy{U\&C#j!e#òֲ% /#Im5I> L׶yt '<(P%y ܸ" 1>:V "%Xo6('ӻOݽb3a  u`c7Y?A:6N!e ,:g7! (F-U1$-.$)!K9\7 N.F u 3!1!S.u _#)~M   $$-I'wCDVet$*5-cPk I"LAS8Q`2I |/ #*18?FM T a n {  )#?c(}90# 5N@%3 O*z%A .H`|% 9ZULR P[PEa9'ak}#J$-RYy "'?0WK C9v}"x =b:(*,#B0f )( -7@'Q ya- % 2@#Uy/'> f pz,#9 O)Z  =) :EVgv R*>,**WT>r2iG$? DI>C!3'<d})aJ3i",. ;OU'j "q+ *" *d@77*V $%- E#P t<"! %&(Lu! %#5Ys1#!;:^v%JSF%-'ZE mMnR  8 Yf{!'-U,e @$9'Va;ODR . . == 7{  S $ ?C T  X i ~ / & S 8  H  i w <       >(Ir ((*Bm"5*Q.|$ P<Urs7'4\o E8,Ve5 * ;?F3U+%=9,?Q!o.<@`>GqYY>v{EzX q~ "9>71v 890Bs)!!&<=@z,6`  :!#Z!~! !!! !n!,M"@z"2""V#J#9($$b$P$G$x %%x,&@&I&H0'qy''4))ko*:+,,-4//c0M;11g2 ?3'J3r33q}445 t606 7777> 8L8?S8m899.9=9/O99c9J9(?:#h::3::":t;;;9;;x<W<p<W=8>.C8JCCDGD3D7E PE[EqEETFBHI\J7OQO `OkOOOOO OO OOO$OP!.P+PP|PPPPPPPPPQ=lsp;A?yDRT(~_>yw{| 7fx'GBm.;Y`'xLN$uV3M\"#E F@t\AiG8zkT_B$!&9?B:Ww63]Ck")GaP[g0!f J\`  W=]QUXoeI)-aE3ZOj2r,Z -).0+1OL*+tbC R-d}Vz`*#cSO&~|4Wc    nJ/udoK(L=Y,f(ie~FC#i<?&IeZ%,9"6UUmJ8S1.v"9*HIPv%{j^ g@/]1$r2wXtxA7h|5KskS%{1D cKqR$r 64:!+nbH5}Yym5'HD7M/3.!'g}u0+FjqTN9lz<n [> Nh/P,[(_Xd  Vos)Q 6 b<#^l aMpE0Q%q4h4&^:;2-> 588;* p7@:2v Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBury related new cards until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-08-19 15:40+0000 Last-Translator: Snezana Language-Team: Serbian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Стоп (1 од %d) искљ. укљ. Има %d карту. Има %d карте. Има %d карата.%% тачних%(a)0.1f %(b)s/ дневно%(a)d oд %(b)d белешке је обновљена%(a)d oд %(b)d белешке су обновљене%(a)d oд %(b)d бележака је обновљено%(a)dkB послато, %(b)dkB примљено%(tot)s %(unit)s%d карата%d карте%d карата%d карта уклоњена.%d карте уклоњене.%d карата уклоњено.%d карта извезена.%d карте извезене.%d карата извезено.%d карта увезена.%d карте увезене.%d карата увезено.%d карта прегледана за%d карте прегледане за%d карата прегледано за%d карта/минут%d карте/минут%d карата/минут%d шпил обновљен.%d шпила обновљена.%d шпилова обновљено.%d група%d групе%d група%d белешка%d белешке%d белешки%d белешка додата%d белешке додате%d бележака додато%d белешка извезена.%d белешке извезене.%d бележака извезено.%d белешка обновљена%d белешке обновљене%d бележака обновљено%d преглед%d прегледа%d прегледа%d изабрана%d изабране%d изабрано%s већ постоји на радној површини. Преснимити?%s копија%s дан%s дана%s дана%s дан%s дана%s данаУклоњено: %s.%s сат%s сата%s сати%s сат%s сата%s сати%s минут%s минута%s минута%s минут.%s минута.%s минута.%s минут%s минута%s минута%s месец%s месеца%s месеци%s месец%s месеца%s месеци%s секунда%s секунде%s секунди%s секунда%s секунде%s секунди%s за брисање:%s година%s године%s година%s година%s године%s година%s д.%s ч.%s мин.%s мес.%s с.%s г.&О програму...&Додаци&Провери базу података...&Бубање...&Уреди&Извези...&Датотека&Нађи&Иди&Упутство&Упутство&Помоћ&Увоз&Увези...&Инвертуј избор&Следећа карта&Отвори фасциклу са додацима...&Поставке...&Претходна карта&Прераспореди...&Подржи Anki...&Промени профил...Алатке&Poništi'%(row)s' садржи %(num1)d поља, очекујућих %(num2)d(%s тачних)(крај)(филтрирано)(учење)(нови)(лимит у надређеном: %d)(изаберите 1 карту)...датотеке .anki2 нису намењене за увоз. Ако желите обнављање из резервне копије "погледајте одељак 'Backups' и упутство за употребу./0 д.1 101 месец1 година10 ч.22 ч.3 ч.4 ч.16 ч.излаз 504 је добио обавештење о грешци. Покушајте привремено да искључите свој антивирус.: и%d карта%d карте%d каратаОтвори фасциклу са резервним копијамаПосети сајт%(pct)d%% (%(x)s из %(y)s)%Y-%m-%d @ %H:%MРезервне копије
Anki ће направити резервну копију колекције при сваком затварању и синхронизацији.Формат извоза:Шта наћи:Величина слова:Слова:Где тражити:садржи:Величина линије:Замени са:СинхронизацијаСинхронизација
Искључена је; да бисте је укључили, кликните на дугме синхронизације у главном прозору.

Потребан је налог

За синхронизацију колекције, потребан вам је налог. Региструјте налог, а затим испод унесите податке из налога.

Anki је ажуриран

Објављен је Anki %s.

<игнорисано><текст није у Unicode><унесите овде услов за претраживање; притисните Еnter за приказ текућег шпила>Велико хвала свима који су давали предлоге, пријављивали грешке и донирали.Лакоћа карте - величина следећег интервала када, при понављању, дате оцену "Добро".Датотека са називом collection.apkg је сачувана на вашој радној површини.Неуспео: %sО AnkiДодајДодај (пречица: ctrl+enter)Додај пољеДодај медија датотекуДодај нови шпил (Ctrl+N)Додај тип белешкеДодај повратакДодај ознакеДодај нову картуДодај у:Додај: %sДодатоДодато данасДодат дупликат са првим пољем: %sПоновоНе запамћене данасБрој заборављених: %sСви шпиловиУ свим пољимаСве карте у случајном редоследу (режим нагурати)Све карте, белешке и медија датотеке ће бити избрисане. Да ли то желите?Дозволи коришћење HTML у пољимаДогодила се грешка у додатку.
Напишите о томе на форуму додатка:
%s
Грешка при отварању %sДошло је до грешке. Узрок може бити безазлен,
можда је проблем у вашем шпилу.

Да бисте утврдили да ли је проблем у вашем шпилу, покрените алатку>Провера базе података.

Ако не откријете проблем, копирајте пратећи
извештај о грешци:Слика је сачувана на вашој радној површини.AnkiШпил Anki 1.2 (*.anki)Anki 2 чува шпилове у новом формату. Овај чаробњак аутоматски претвара ваше шпилове у тај формат. Њихове резервне копије ће бити сачуване до ажурирања, и ако се будете враћали на стару верзију Anki, шпилови ће вам бити доступни.Шпил Anki 2.0Anki 2.0 подржава аутоматско ажурирање само са Anki 1.2. За учитавање старијих шпилова, отворите их у Anki 1.2, а затим увезите у Anki 2.0.Пакет шпилова AnkiAnki није пронашао линију између питања и одговора. Да бисте заменили њихова места, уредите шаблон ручно.Anki је једноставан, интелигентан програм за учење методом "одложеног понављања". Бесплатан је и са отвореним кодом.Anki поседује AGPL3 лиценцу. За више информација, погледајте датотеку лиценце.Anki није успео да учита вашу стару датотеку конфигурације. Искористите Датотека>Увоз, да бисте увезли шпилове из претходних Anki верзија.AnkiWeb ID или лозинка су били погрешни; покушајте поново.AnkiWeb ID:AnkiWeb је открио грешку. Покушајте поново за неколико минута, и ако се проблем понавља, пошаљите извештај о грешци.AnkiWeb је тренутно презаузет. Покушајте поново за неколико минута.AnkiWeb се обнавља. Покушајте поново за неколико минута.ОдговорДугмета одговораОдговориВаш антивирус или фајервол не дозвољавају да се Anki прикључи на Интернет.Карте на којима нема ништа, биће обрисане. Ако белешка нема више карата, биће избрисана. Да ли желите да наставите?Два пута се среће у датотеци: %sДа ли заиста желите да избришете %s?Мора да постоји бар један тип карте.Мора да постоји бар један корак.Прикључи слике/аудио/видео (F3)Аутоматски озвучиАутоматски синхронизуј при отварању/затварању профилаПросечноПросечно времеПросечно време одговораПросечна лакоћаПросечно за непропуштене данеПросечни интервалНаличјеПреглед наличјаШаблон наличјаРезервне копијеОсновноОсновна (и обратне карте)Основна (обратне по избору)Подебљан текст (Ctrl+B)ПрегледајПрегледај и инсталирај...ПрегледачПрегледач (%(cur)d карта приказана; %(sel)s)Прегледач (%(cur)d карте приказане; %(sel)s)Прегледач (%(cur)d карата приказано; %(sel)s)Приказ у прегледачуПодешавања прегледачаПрављењеГрупно додавање ознака (Ctrl+Shift+T)Групно уклањање ознака (Ctrl+Alt+T)СакријСакриј белешкуСачувај везане нове карте до следећег данаПодразумевано, Anki ће открити знакове између поља, таквих као што су табулатор, зарез итд. Ако Anki погрешно препозна знак, можете га унети овде. Користите \t за приказ Tаb.ОткажиКартаКарта %dКарта 1Карта 2Информација о карти (Ctrl+Shift+I)Списак каратаТип каратаТипови каратаТипови карата за %sКарта је одложена.Карта је била "преузимач".КартеТипови каратаКарте се не могу ручно преместити у филтрирани шпил.Карте у прост текстПошто их прегледате, катре ће бити аутоматски враћене у изворни шпил.Карте...У центруИзмениИзмени %s на:У други шпилПромени тип белешкеПромени тип белешке (Ctrl+N)Промени тип белешке...Изабери боју (F8)Промени шпил зависно од типа белешкеИзмењениПровери фасциклу с медија датотекамаProvjeravam...ИзабериИзабери шпилИзабери тип белешкеИзабери ознакеКлонирај: %sЗатвориЗатвори и поништи унос?ПропустиПопуњавање пропуста (Ctrl+Shift+C)Код:Колекција је оштећена. Погледајте упутство.ДвотачкаЗарезИзабери језик сучеља и друге могућностиПотврди лозинку:Честитамо! Завршили сте овај шпил за сада.Повезивање...НаставиКопирајТачни одговори за старије карте: %(a)d/%(b)d (%(c).1f%%)Тачно: %(pct)0.2f%%
(%(good)d of %(tot)d)Није успело повезивање с AnkiWeb. Проверите свој мрежни прикључак и покушајте поново.Неуспело снимање звука. Да ли сте инсталирали lame и sox?Неуспело чување датотеке: %sБубањеНаправи шпилНаправи филтрирани шпил...НаправљенCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZУкупан бројСвега %sСвега одговораСвега каратаТекући шпилТекући тип белешке:Додатно учењеСесија додатног учењаПрилагођени кораци (у минутима)Прилагођавање карата (Ctrl+L)Прилагођавање пољаИсециБаза података је обновљена и оптимизована.DatumДана учењаОткажи ауторизацијуКонзола за уклањање грешакаШпилРедефиниши шпилШпил ће бити увезен после отварања профила.ШпиловиСмањивање интервалаПодразумеваноПоново се појављује кашњење одзива.ИзбришиИзбриши %s?Избриши картеИзбриши шпилИзбриши празнеИзбриши белешкуИзбриши белешкеИзбриши ознакеИзбриши некоришћенеИзбриши поље из %s?Избриши '%(a)s' тип карте и њен %(b)s?Да избришем овај тип белешке и све карте тог типа?Да избришем овај некоришћени тип белешке?Да избришем некоришћени тип медија датотеке?Obriši...Избрисана %d карта са непостојећом белешком.Избрисане %d карте са непостојећом белешком.Избрисано %d карата са непостојећом белешком.Избрисана %d карта са непостојећим шаблоном.Избрисане %d карте са непостојећим шаблоном.Избрисано %d карата са непостојећим шаблоном.Избрисана %d белешка са непостојећим типом белешке.Избрисане %d белешке са непостојећим типом белешке.Избрисано %d бележака са непостојећим типом белешке.Избрисана %d белешка без карте.Избрисане %d белешке без карата.Избрисано %d бележака без карата.Избрисана %d белешка са погрешним пољем рачуна.Избрисане %d белешке са погрешним пољем рачуна.Избрисано %d бележака са погрешним пољем рачуна.Избрисано.Избрисано. Покрените Anki поново.Брисање овог шпила из списка шпилова вратиће све преостале карте у њихове изворне шпилове.ОписОпис се приказује на екрану за учење (само за текуће карте):ДијалогОдбаци пољеГрешка учитавања: %sПреузми са AnkiWebПреузимање успешно. Покрените Anki поново.Преузимање са AnkiWeb...РокРок само за картеРок сутраИ&злазЛакоћаВеома лакоБонус за лакеИнтервал за лаганоУређивањеИзмени %sУређивање параметараУређивање HTMLИзабрати за прилагођавањеИзмени...ИзмењеноМењање фонтаПромене су сачуване. Покрените Anki поново.ИспразниПразне карте...Бројеви празних карата: %(c)s Поља: %(f)s Пронађене су празне карте. Молимо покрените Алатке>Празне карте.Празно прво поље: %sКрајЗадајте шпил за смештање нових карата %s, или оставите поље празно:Унесите нову позицију карте (1...%s):Унесите ознаке за додавање ка свим изабраним картама:Унесите име постојеће ознаке, за њено удаљавање са свих изабраних карата:Грешка у преузимању: %sГрешка при покретању: %sГрешка при извршавању %s.Грешка током рада %sИзвоз карте у други форматИзвоз...ДодатноFF1F3F5F7F8Поље %d из датотеке:Састављање карте пољаНазив поља:Поље:ПољаПоља за %sПоља су одвојена са: %sПоља...Фи&лтериДатотека је оштећена. Обновите је из резервне копије.Датотека није пронађена.ФилтерФилтер:ФилтрираноФилтриран је шпил %dНађи &Дупликате...Нађи дупликатеНађи и За&мени...Нађи и замениЗавршетакПрва картаВиђена први путПреврниФасцикла већ постоји.Фонт:ZaglavljeИз сигурносних разлога, '%s' није дозвољено на картама. Можете да га користите поставивши команду у други пакет и да увезете тај пакет у заглављу уместо LaTeX.ПрогнозаОбразацЛице и наличје по изборуЛице и наличјеНађено %(a)s у %(b)s.ЛицеПример лицаШаблон лицаОпштеНаправљена датотека: %sНаправљена на %sПоделиДоброИнтервалHTML уређивачТешкоДа ли су вам инсталирани latex и dvipng?ЗаглављеПомоћНајлакшеИсторијаПочетнаВреме у дануЧасоваНису приказани часови са мање од 30 понављања.Ако сте придонели развоју програма, а нисте на овом списку, молико вас да нас контактирате.Ако сте учили сваки данИгнориши времена одговора дужа одИгнориши величину словаИгнориши линије у којима се прво поље подудара са постојећом белешком.Занемари ово ажурирањеУвозУвези датотекуУвези иако постојећа белешка има исто прво пољеНеуспешан увоз. Неуспео увоз. Информација помоћи: Опције увозаЗавршен увоз.Постоји у фасцикли за медија датотеке, али се не користи у ниједној карти:Укључујући медија датотекеУкључи у извоз информацију о распоредуЗаједно са ознакамаУвећај данашњи лимит за нове картеУвећај данашњи лимит за нове карте наУвећај данашњи лимит за понављањаУвећај данашњи лимит за понављања наИнтервали увећањаИнфоИнсталирање додатакаЈезик сучеља:ИнтервалМодификатор интервалаИнтервалиНедозвољен код.Датотека је оштећена. Обновите је из резервне копије.Нетачна лозинка.Неисправан регуларни израз.Суспендована је.Искошен текст (Ctrl+I)Грешка JS у линији %(a)d: %(b)sПређи на ознаке са Ctrl+Shift+TСачувај доLaTeXLaTeX формулаИскључена формула LaTeXПромашајиПоследња картаПоследњи прегледПрво најновијеУчењеНаучи да ограничишУчених: %(a)s, поновљених: %(b)s, поново учених: %(c)s, филтрираних: %(d)sУчењеПрилепљенеПоступак за прилепљенеПраг за прилепљенеЛевоОграничи доУчитавање...Постави лозинку на отварање профила или остави празно:Најдужи интервалТражи у пољу:НајлакшеУправљајУправљање типовима бележака...Пресликавање у %sПресликавање за ознакеОзначиОзначи белешкуОзначи белешку (Ctrl+K)ОзначеноРазвијенМаксимални интервалМаксимум прегледа у дануНосачМинимални интервалминутаПремештај нове карте и поновљенеШпил Mnemosyne 2.0 Deck (*.db)ЈошНајвише промашајаПремести картеПремести у шпил (Ctrl+D)Премести карте у шпил:&БелешкаНазив већ постоји.Назив шпила:Назив:МрежаНовоНове картеНове карте у шпилу: %sСамо нове картеНових карата у дануНазив за шпил:Нови интервалНови назив:Нови тип белешке:Назив за нову групу опција:Нова позиција (1...%d):Нови дан почиње одНикакве карте још нису обавезне.Нема карата које одговарају задатим критеријумима.Нема празних карата.Нема доспелих карата за изучавање данас.Нема некоришћених или непостојећих датотека.БелешкаТип белешкеТип бележакаБелешка и %d карта су обрисане.Белешка и %d карте су обрисане.Белешка и %d карата је обрисано.Белешка је скривена.Белешка је суспендована.Пажња: датотеке стављене на карте се не копирају. За сваки случај, повремено направите резервне копије своје фасцикле Anki.Напомена: Недостаје део историје. За више информација погледајте документацију прегледача.Белешке у прост текстЗа белешку је потребно бар једно поље.ништаПотврдиПрво најстаријеПри следећој синхронизацији, значење се мења у једном смеруЈедна или више бележака нису увезене, јер не генеришу ниједну карту. То се може десити ако имате празна поља или ако нисте мапирали садржај одговарајућих поља у текстуланој датотеци.Само новим картама можете променити положај.ОтвориОптимизација...Опционални лимит:ОпцијеОпције за %sГрупа опција:Опције...РедоследРедослед додатакаРедослед обавезаЗамена шаблона:Замена фонта:Замена шаблона фонта:Лозинка:Лозинке се не поклапају.НалепиНалепи слику из међумеморије као PNGЛекција Pauker 1.8 (*.pau.gz)ПроценатПериод: %sСтави на крај реда нових каратаСтави у ред за понављање са интервалима између:Најпре додај нову врсту белешке.Молимо будите стрпљиви, ово може потрајати.Повежите микрофон и обезбедите да други програми не користе аудио уређај.Молимо уредите ову белешку, додајући неколико пропуста за попуњавање. (%s)Уверите се да је профил отворен и да Anki није заузет, а затим покушајте поново.Молимо, инсталирајте PyAudioМолимо, инсталирајте mplayerНа почетку, прво отворите профил.Покрените Алатке>Празне картеИзаберите шпил.Одаберите карте из само једне врсте бележака.Одаберите нешто.Ажурирајте Anki до последње верзије.За увоз ове датотеке, користите Датотека>Увоз.Молимо, посетите AnkiWeb, надоградите свој шпил,а затим покушајте поново.ПозицијаПодешавањаПрегледПреглед изабране карте (%s)Преглед нових каратаПреглед нових карата, које су додате последњеОбрада...Лозинка профила...Профил:ПрофилиПрокси тражи потврду идентитета.ПитањеКрај реда: %dПочетак реда: %dИзлазСлучајноСлучајни поредакОценаСпреман за надоградњуПоново изградиСними свој глассними звук (F5)Снимање...
Time: %0.1fПоновно учењеЗапамти последњи уносУклони ознакеУклони обликовања (Ctrl+R)Уклањањем ове врсте карата, избрисаћете једну или више бележака. Направите прво нову врсту карата.ПреименујПреименуј шпилПоново репродукуј звукРепродукуј властити гласПреместиПремести нове картеРед...Потребна је једна или неколико ових ознака:ПрерасподелиИзмени редоследИзмени редослед картица на основу мојих одговора у овом шпилу.Настави садСмер текста с десна на лево (RTL)Врати на стање пре '%s'.ПонављањеБрој понављањаВреме понављањаПреглед спредаПреглед спреда заПонављање последње заборављене картеПонављање заборављених каратаПрегледајте свој успех за сваки сат у току данаПонављањаОбавезна понављања у шпилу: %sДесноСачувај сликуЗахват: %sТражиПретражи унутар обликовања (споро)ИзабериИзабери &свеИзабери &белешкеИзабери искључујуће ознаке:Изабрана датотека није у UTF-8 формату. Молимо, погледајте одељак за увоз у упутству.Селективно учењеТачка-зарезСервер није пронађен. Или је веза прекинута, или антивирус или фајервол блокира да се Anki прикључи на Интернет.Све шпилове испод %s постави у ову групу опција?Задај за све подшпиловеЗадај боју текста (F7)Shift типка је притиснута. Прескакање аутоматске синхронизације и учитавање додатка.Промени позицију других каратаНа тастатури: %sПречица: %sПрикажи %sПрикажи одговорПрикажи дупликатеПрикажи време одговарањаПрикажи нове карте пре понављањаПрикажи нове карте после понављањаПрикажи нове карте према редоследу њиховог додавањаПрикажи нове карте у случајном пореткуПрикажи време следећег понављања над дугмадима са одговоримаПриказуј број преосталих карата током понављањаПокажи статистику. На тастатури: %sВеличина:Нека подешавања ће почети деловати тек када поново покренете Anki.Поље сортирањаСортирај према овом пољу у прегледачуСортирање према овој колони није подржано. Изаберите другу колону.Звуци и сликеРазмакПочетни положај:Почетна лакоћаСтатистикаКорак:Корака (у минутима)Кораке наводити у виду бројева.Уклони HTML приликом уметања текстаДанас прегледано %(a)s за %(b)s.Прегледано данасУчиУчи шпилУчи шпил...Учи садПреглед стања карте или ознакеСтилСтил (дели се мођу картама)Индекс (Ctrl+=)Супермемо XML извоз (*.xml)Експонент (Ctrl+Shift+=)ОбуставиСуспендуј картуСуспендуј белешкуОбустављеноСинхронизуј такође звуке и сликеСинхронизуј са AnkiWeb. На тастатури: %sСинхронизација медија...Синхронизација није успела: %sСинхронизација није успела; нема везе са Интернетом.За синхронизацију, сат на вашем рачунару мора бити исправно подешен. Подесите сат и покушајте поново.Синхронизација...Симболи табулацијеСамо ознакаОзнакеЦиљни шпил (Ctrl+D)Циљно поље:ТекстТекст, одељен симболима табулације или тачкама са зарезом (*)Овакав шпил већ постоји.Тај назив за поље је већ у употреби.Тај назив је већ у употреби.Истекло је време за спајање са AnkiWeb. Проверите мрежни прикључак и покушајте поново.Подразумевана подешавања се не могу избрисати.Подразумевани шпил се не може избрисати.Распоред карата у шпилу (-овима)Прво поље је празно.Прво поље у типу белешке мора бити мапирано.Следећи симбол не може бити коришћен: %sПредња страна ових карата је празна. Идите на Алатке>Празне карте.Иконе смо добили из више извора; заслуге можете видети у Anki изворним текстовима.Ваша улазна информација би генерисала празно поље у свим картама.Број питања на која сте одговорили.Број понављања планираних у будућности.Колико пута сте притиснули свако дугме.Нема картица које задовољавају упит. Желите ли да задате нове?Измена, коју сте затражили, захтеваће учитавање целе базе података приликом следеће синхронизације ваше колекције. Ако на другом уређају имате измене које још нису синхронизоване, изгубићете их. Да ли желите да наставите?Време потрошено на одговоре.Ажурирање је завршено и можете почети коришћење Anki 2.0.

Испод се налази записник ажурирања:

%s

Доступне су нове карте, али је већ достигнут дневни лимит. Можете да увећате лимит у опцијама, али имајте у виду, да што више нових карата наведете, то ћете имати веће оптерећење у каткорочном приказу.Мора да остане бар један профил.Ова колона се не може сортирати, али можете тражити засебне типове карата, такве као што је 'card:Card 1'.Ова колона не може бити сортирана, али можете тражити специфичан шпил, кликнувши на један са леве стране.Ова датотека не изгледа као исправна .apkg датотека. Ако добијате ову грешку из датотеке, преузете с AnkiWeb, велике су шансе да преузимање није успело. Покушајте поново, а ако се проблем настави, покушајте поново помоћу другог прегледача.Ова датотека већ постоји. Да ли сте сигурни да желите да је презапишете?У овој фасцикли се на једном месту чувају сви ваши подаци за Anki како би се олакшало резервно копирање. Ако желите да Anki користи другу локацију, погледајте:: %s Ово је специјални шпил за учење ван обичног распореда.Ево га {{c1::пример}} попуњавања пропуштеног.Ово ће обрисати вашу постојећу колекцију и заменити је подацима из датотеке, коју увозите. Да ли сте сигурни да то желите?Овај чаробњак ће вас провести кроз ажурирање за Anki 2.0. За једноставно ажурирање, пажљиво прочитајте следеће странице. времеВременско ограничењеЗа понављањеЗа прегледање додатака, кликните доле на дугме за прегледање.

Када пронађете додатак који вам се допада, упишите испод његов код.За увоз у профил заштићен лозинком, пре увоза отворите профил.Да бисте додали попуњавање пропуста у постојећој белешци, потребно је да јој прво измените тип у "пропуст" (cloze), преко Уреди>Измени тип белешкеЗа учење ван обичног распореда, кликните на дугме Додатно учење испод.ДанасДанашњи лимит за преглед је достигнут, али још увек постоје картице које чекају да буду прегледане. За оптимизацију меморије, размислите о повећању лимита у опцијама.укупноУкупно времеУкупно каратаУкупно бележакаТретирај унос као регуларан изразТипНапишите одговор: непознато поље %sНије успео увоз из датотеке која је доступна само за читање.ОдвезаноПодвучено (Ctrl+U)ОпозовиОпозови %sНепознат формат датотеке.НевиђеноАжурирај постојеће белешке када се прво поље подудараАжурирано %(a)d од %(b)d постојећих бележака.Ажурирање је завршеноЧаробњак ажурирањаАжурирањеАжурирам шпил %(a)s из %(b)s... %(c)sУчитај на AnkiWebУчитавање на AnkiWeb...Коришћено на картама, али недостаје у фасцикли за слике и звуке:Корисник 1Верзија %sОчекивање завршетка уређивања.Упозорење, пропуштање неће радити док не укључите тип на врху за пропуштање (Cloze).Добро дошлиПодразумевано ставити направљено у текући шпилКада се одговор прикаже, репродукуј звучно и питање и одговорКада будете спремни за ажурирање, кликните на дугме фиксације, за наставак ажурирања. У време ажурирања, у прегледачу ће се отворити упутство. Прочитајте га пажљиво, јер се много тога променилу у односу на претходну верзију Anki.Када ваши шпилови буду ажурирани, Anki ће покушати да копира све звуке и слике из осталих шпилова. Ако користите фасциклу сервиса DropBox или другу фасциклу са могућношћу корисничког подешавања, процес ажурирања неће бити у стању да одреди локацију веше медија датотеке. Касније ћете добити извештај о ажурирању. Ако приметите да медија датотеке нису биле копиране, погледајте упутство са инструкцијом о томе.

AnkiWeb сада подржава директну синхронизацију медија датотека. Нема специјалног инсталирања и медија датотеке ће бити синхронизоване заједно са вашом картом при синхронизацији са AnkiWeb.Цела колекцијаЖелите ли да га преузмете сада?Аутор Damien Elmes; закрпама, преводима, тестирањем и дизајном помогли:

%(cont)sИмате "пропуст" (cloze) тип белешке, али нисте попунили ниједан пропуст. Да наставите?Имате много шпилова. Погледајте %(a)s. %(b)sЈош нисте снимили свој глас.Морате имати бар једну колону.СвежеСвеже-ученоВаши шпиловиПромена ће утицати на више шпилова. Ако желите да промените само тренутни шпил, додајте прво нову групу опција.Ваша колекција датотека изгледа да је заражена. То се може десити када се датотека копира или премешта док је Anki отворен, или када се чува колекција на мрежном диску или у облаку. Погледајте упутство и информације о томе како да све вратите из аутоматске резервне копије.Ваша колекција је у лошем стању. Молимо, покрените Алатке>Провера базе података, и синхронизујте поново.Ваша колекција је успешно учитана у AnkiWeb. Ако користите неке друге уређаје, молимо да их сада синхронизујете преузмете колекцију, коју сте управо учитали са свог рачунара. Након што то урадите, будући прегледи и додавање карата ће бити обједињени аутоматски.Ваши шпилови овде и на AnkiWeb се разликују, тако да не могу бити обједињени, и неопходно је да замените шпилове на једној страни шпиловима са друге стране. Ако се одлучите за преузимање, Anki ће преузети колекцију из AnkiWeb и све промене, које сте урадили на рачунару од момента последње синхронизације, биће изгубљене. Ако се одлучите за отпремање, Anki ће учитати своју колекцију у AnkiWeb, и све промене, које сте урадили на AnkiWeb или другим уређајима, од мемента последње синхронизације за тај уређај, биће изгубљене. Након што синхронизујете све уређаје, будући прегледи и додавања карата могу бити обједињени аутоматски.[нема шпилова]резервекартекарте из шпилаизабране картеколекцијаdданипакетсве времепомоћhideсатачасова после поноћипромашајипресликано у %sпресликано у ознакемин.мин.мес.поновљенисекундестатистикаова страницаwцела колекција~anki-2.0.20+dfsg/locale/pl/0000755000175000017500000000000012256137063015127 5ustar andreasandreasanki-2.0.20+dfsg/locale/pl/LC_MESSAGES/0000755000175000017500000000000012065014111016676 5ustar andreasandreasanki-2.0.20+dfsg/locale/pl/LC_MESSAGES/anki.mo0000644000175000017500000022015712252567246020210 0ustar andreasandreasV|5xGyG GGG"GG GGG8G%H>HOH"`H$H$H&HH"I6IIIZI$wI III0IJ#J&2J YJeJ(vJJJ,JJ* K6K,KK xKK(KKKKKKK KKKKL LLL%L)L 0L:L@L HLSL eLpLLLLLLLL0L M%M +M 6MAMGMZMqMuMNNN NNN N%N)N-NT1NNN,N(NN!O5OfMOO OO O OPP#P8PeOPP7_Q QQ5QXQYCR8RkR BS NSYS]S xS SS S SS SSSS S$ST T+T ;T ET%PTKvTTNT"&UIU#`VVVV WWEXWXRXv.YwY7Z UZwaZEZ@[`[g[v[R~[[T\#o\#\\ \\(]9] A]N] b]o]]] ] ]]]]]^^^/^L7^^^^^^^ ^ ^)_'+_S_```#`*`1`9` R` \` f`q` ```` `3``S a`aiapa wa aaaaa"abb&b EbQb Xbdb ub bbbbbb-bc cc(-cVc5hc ccc8c5cP)d7zddd dddde ee$e+e2e9e@eGeNeUe\ece je we e e e e e eeee e eff $f1f DfQffffffff f f ff f/ g=gCgXg%`gg g g g g g g g gg,h(4h]h{h hFhNhP0i>iPijj]8j j8jj jjk)kDk`kdk skkkk k kkk k kkkk k!kl#l)2l0\lll4l!llm'm=mVmjm{m mmmmmmmmm m mmm mm nn, nMn_nfnnnwnnnnnn n nnN oXoloqooooEpNpSpnppp ppppp ppp qq$qBqIq Nq[qcqhqyq.qFqqr .r4:rorr r1rrrrs*sEs tt uu"=u"`u uuuuuuu u v v)5v_vqvvw(w=w[wzwwwww w wwww<w+x4x :xGxWx\x ex+pxxx xxx x xx x yy#y*y;yOyUyfynyyy y yyyy yy zzz z&zU!Fw*(1D,I/y'it#de{8ؖC(r &au /M Û!ϛ'<C[`h}.&ڜ &+=,U U $86o(Js"WS0S$"̢ Ң ޢ{e^f5ŤU Zdlr  èȨͨӨ%(08 >HJ[] [ gqy) ϫn'Px;J߬G*Pr1íKA [6|NN&Q"x,ȯѯ  /Pm%%Ѱ 8J`vz~ ±α ֱ   -CTs ɲղ/ݲ & 7EL_rv +17=CIbOȴ6! <]su* ;EUkwG޷ &4IJrb1j '5<B ] ht  Ѻ ۺ%!'=Sc1rUC$W+|!ʽϽ&n H6}KLc  V2"++1&]""< 5!Ik|  + * FsT)&"I O\/k."  $?] c>mO- 4 BPc' !%4H Ye$mB $',T/g A5X.I $.5 <GX_fmt{    %2GVe{! +' , 6BV \3j   (6EW'k0%_o] p,{_= K ZgB  $ .9@[p w  7(*6SD(4Rh  +1 6BX`8h09Hb9B Xbi (#2V!o   /' WbhMHH+gJ E(!n997!,('U2}-   (;C0WA! #-LUdw P   *8 A M1[  $8 U bl ">Xa q~  2I#b0163 ; F Rh_~|0Gcgj>~,em~   #3W_u"{ %2)))SU}4r{&"3*N1y-S - 9ENk%'/6HN eo .#{? -%@ f r/~ " (B"^6 ! ")HPb se = Z"z  #&'J'r;3' 2U;HK&(6L_  7!Xz *#'Ebjy )-%B-pp '?N/T!w5S,'0");LlQ.G/v'-_ "z>( f k=  1  7R ' h      grn.IZx0"2RXo v C34I)]6  #Z&%8"HM(&) *s67vWY&u N[l q ' - 3  6 @  G  R \ ^ m  7.^(}'Z)2 q+UTD4`CV=X9 J :d=k"Jb#$+Wo!VS,~Sn~n&B+PQ>yF1ElY  ;ht~`r6l,"YFWB`O [a)88 !dgM/z U:3Z0I f=_])LL *\h_xK<Y\Dw>V;/Fv.OzfeRQUo|EeX&p1-B+84yvWE&<G t %p:.CH3OK|*ti?/R$9zP$80'j^g 'p!H6Zm  G;]d(_G>eCo3%x MrP yF\0jTI'@{I3cN7{xq1#j?IH4ND"N*uv6HwBJw75%5AAu9]D;L<*K:m k{)@^(EO$VSs%}il gA4-?C[?a[KiNLu!b|bT"TRksJ(QM0fc=9,52&675hqSnm#-a.XR/c1G2}>2#AQ  sU-@<r,PM@  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaCompress backups (slower)Configure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: ankiqt_pl_PL Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-12-10 11:04+0000 Last-Translator: Piotr Kubowicz Language-Team: s120801-translate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: pl Zatrzymaj (1 z %d) (wył) (wł) Ma %d kartę. Ma %d karty. Ma %d kart.%% poprawnych%(a)0.1f %(b)s/dzień%(a)0.1fs (%(b)s)Zaktualizowano %(a)d z %(b)d notatekZaktualizowano %(a)d z %(b)d notatekZaktualizowano %(a)d z %(b)d notatekwysłano %(a)dkB, ściągnięto %(b)dkB%(tot)s %(unit)s%d karta%d karty%d kartUsunięto %d kartę.Usunięto %d karty.Usunięto %d kart.Wyeksportowano %d kartę.Wyeksportowano %d karty.Wyeksportowano %d kart.zaimportowano %d kartę.zaimportowano %d karty.zaimportowano %d kart.Przeglądnięto %d kartę wPrzeglądnięto %d karty wPrzeglądnięto %d kart w%d karta/minutę%d karty/minutę%d kart/minutęZaktualizowano %d talię.Zaktualizowano %d talie.Zaktualizowano %d talii.%d grupa%d grupy%d grup%d notatka%d notatki%d notatekdodano %d notatkędodano %d notatkidodano %d notatekzaimportowano %d notatkę.zaimportowano %d notatki.zaimportowano %d notatek.zaktualizowano %d notatkęzaktualizowano %d notatkizaktualizowano %d notatek%d powtórka%d powtórki%d powtórek%d wybrana%d wybrane%d wybranych%s już istnieje na pulpicie. Zastąpić go?kopia %s%s dzień%s dni%s dni%s dzień%s dni%s dniusunięto %s.%s godzina%s godziny%s godzin%s godzinę%s godziny%s godzin%s minuta%s minuty%s minut%s minuta.%s minuty.%s minut.%s minutę%s minuty%s minut%s miesiąc%s miesiące%s miesięcy%s miesiąc%s miesiące%s miesiący%s sekunda%s sekundy%s sekund%s sekundę%s sekundy%s sekund%s do usunięcia:%s rok%s lata%s lat%s rok%s lata%s lat%sd%sh%sm%smo%ss%sy&O programie...&Dodatki&Sprawdź bazę danych...&Zakuwaj...&Edytuj&Eksportuj...&Plik&Szukaj&Idź&Poradnik&Poradnik...&Pomoc&Importuj&Importuj...&Odwróć zaznaczenie&Następna karta&Otwórz folder z dodatkami...&Preferencje...&Poprzednia karta&Zmień plan...&Wesprzyj Anki...&Zmień profil...&Narzędzia&Cofnij'%(row)s' ma %(num1)d pól, oczekiwano %(num2)d(%s poprawnych)(koniec)(przefiltrowane)(nienauczona)(nowa)(parent limit: %d)(wybierz 1 kartę)...Pliki .anki2 nie zą przeznaczone do importowania. Jeśli próbujesz odtworzyć talię z kopii zapasowej, zobacz sekcję 'Backups' w podręczniku użytkownika./0d1 101 miesiąc1 rok10:0022:0003:0004:0016:00Wystąpił błąd 504 gateway timeout. Spróbuj na chwilę wyłączyć Twój program antywirusowy.: i%d kartę%d karty%d kartOtwórz katalog kopii zapasowychOdwiedź stronę%(pct)d%% (%(x)s z %(y)s)%Y-%m-%d @ %H:%MKopie zapasowe
Anki stworzy kopie zapasową Twojej kolekcji przy każdym wyłączeniu lub synchronizacji.Format eksportu:Znajdź:Rozmiar czcionki:Czcionka:W:Zawiera:Rozmiar linii:Zastąp przez:SynchronizacjaSynchronizacja
Aktualnie wyłączona; kliknij przycisk synchronizacji w oknie głównym, aby ją włączyć.

Wymagane konto

Wymagane jest posiadanie darmowego konta, aby Twoja kolekcja mogła być synchronizowana. Proszę zarejestrować konto, a następnie wprowadzić swoje dane poniżej.

Aktualizacja Anki

Została wydana nowa wersja: Anki %s.

Podziękowania dla wszystkich osób, które podawały pomysły, zgłaszały błędy i wpłacały dary pieniężne.Trudność karty oznacza przerwę, jaką otrzyma karta po wybraniu "dobrze" przy powtórce.Plik collection.apkg zostal zapisany na pulpicie.Wystąpił problem podczas synchronizacji plików. Wybierz z menu Narzędzia>Sprawdź pliki a następnie uruchom ponownie synchronizację.Przerwane: %sO AnkiDodajDodaj (skrót: ctrl+enter)Dodaj poleDodaj plikiDodaj nową talię (Ctrl+N)Dodaj typ notatkiDodaj rewersDodaj etykietyDodaj nową kartęDodaj do:Dodaj: %sDodanoDodane dzisiajDodano duplikat z pierwszym polem: %sZnowuDzisiejsze odp. ZnowuLiczba odp. Znowu: %sWszystkie talieWszystkie polaWszystkie karty w losowej kolejności (zakuwanie)Wszystkie karty, notatki i media tego profilu zostaną usunięte. Czy jesteś pewien?Zezwól na HTML w polachWystąpił błąd w dodatku.
Napisz na forum dodatku:
%s
Wystąpił błąd przy otwieraniu %sWystąpiła awaria. Przyczyną mógł być drobny błąd
lub Twoja talia może mieć problem.

Aby upewnić się, że problem nie leży w Twojej talii, uruchom Narzędzie > Sprawdź bazę danych.

Jeśli nie rozwiąże to sprawy, skopiuj poniższy tekst
do raportu o błędzie:Obraz zostal zapisany na pulpicieAnkiTalia Anki 1.2 (*.anki)Anki 2 przechowuje Twoje talie w nowym formacie. Ten kreator automatycznie przekonwertuje do niego Twoje talie. Zostaną wykonane kopie zapasowe Twoich talii przed ich uaktualnieniem, więc jeżeli będziesz potrzebował wrócić do poprzedniej wersji Anki, będziesz mógł ich nadal używać.Talia Anki 2.0Program Anki 2.0 wspiera automatyczne uaktualnianie tylko z wersji programu 1.2. Aby załadować starsze talie, należy otworzyć je w programie Anki 1.2, aktualizować je, po czym importować do programu Anki 2.0.Pakiet talii AnkiProgram Anki nie mógł odnaleźć linijki pomiędzy pytaniem a odpowiedzią. Proszę ręcznie dopasować szablon, by zamienić pytanie z odpowiedzią.Anki to przyjazny w użyciu, inteligentny system wspomagający naukę. Jest wolnym i otwartym oprogramowaniem.Anki jest udostępnione na licencji AGPL3. Aby dowiedzieć się więcej, przeczytaj plik licencji w dystrybucji z kodem źródłowym.Program Anki nie mógł załadować Twojego starego pliku konfiguracyjnego. Proszę użyć Plik>Importuj, aby zaimportować Twoje talie z poprzednich wersji Anki.Identyfikator AnkiWeb ID lub hasło jest niepoprawne; spróbuj ponownie.Identyfikator AnkiWeb ID:AnkiWeb napotkał problem. Spróbuj ponownie za kilka minut, a jeżeli błąd nadal występuje, wypełnij raport o błędzie.AnkiWeb jest zbyt zajęty w tym momencie. Spróbuj ponownie za kilka minut.AnkiWeb przechodzi właśnie konserwację. Spróbuj ponownie za parę minut.OdpowiedźPrzyciski odpowiedziOdpowiedziProgram antywirusowy lub zapora sieciowa uniemożliwia Anki połączenie z Internetem.Wszystkie karty nieprzypisane do niczego zostaną usunięte. Jeżeli w notatce nie pozostały żadne karty, zostanie ona utracona. Czy jesteś pewien, że chcesz kontynuować?Pojawił się dwa razy w pliku:% sCzy jesteś pewien, że chcesz usunąć %s?Co najmniej jedna karta typu jest wymagana.Przynajmniej jeden krok jest wymagany.Załącz zdjęcia/audio/wideo (F3)Automatycznie odtwórz pliki audioAutomatycznie synchronizuj przy otwarciu/zamknięciu profiluŚredniaŚredni czasŚredni czas odpowiedziŚrednia trudnośćŚrednia dla dni, gdy się uczonoŚrednia przerwaTyłPodgląd tyłuSzablon tyłuKopie zapasowePodstawowyPodstawowy (z odwrotną kartą)Podstawowy (z opcjonalną odwrotną kartą)Tekst pogrubiony (Ctrl+B)PrzeglądajPrzeglądaj i zainstaluj...PrzeglądarkaPrzeglądarka (%(cur)d karta; %(sel)s)Przeglądarka (%(cur)d karty; %(sel)s)Przeglądarka (%(cur)d kart; %(sel)s)Wygląd przeglądarkiOpcje przeglądarkiBudujZbiorcze dodawanie etykiet (Ctrl+Shift+T)Zbiorcze usuwanie etykiet (Ctrl+Alt+T)ZakopZakop kartęZakop notatkęZakop powiązane nowe karty do następnego dniaZakop powiązane powtórki do następnego dniaDomyślnie Anki wykrywa znak oddzielający pola, jak np. tabulator, dwukropek itp. Jeśli Anki nieprawidłowo wykrywa taki znak, możesz wpisać go tutaj. Użyj \t jako oznaczenie tabulacji.AnulujKartaKarta %dKarta 1Karta 2ID kartyInformacje o karcie (Ctrl+Shift+I)Lista kartTyp kartyTypy kartTypy kart dla %sKarta została zakopana.Karta została zawieszona.Karta okazała się pijawką.KartyTypy kartKarty nie mogą być ręcznie przeniesione do talii z filtrem.Karty jako zwykły tekstPo zakończeniu powtórek, karty automatycznie powrócą do talii źródłowej.Karty...WyśrodkowanieZmieńZmień %s na:Zmień talięZmień typ notatkiZmień typ notatki (Ctrl+N)Zmień typ notatki...Zmień kolor (F8)Zmień talię na podstawie typu notatkiZmienionoSprawdź &pliki...Sprawdź pliki w katalogu mediówSprawdzanie...WybierzWybierz talięWybierz typ notatkiWybierz etykietySklonuj: %sZamknijZamknąć i porzucić aktualne dane?LukaLuki (Ctrl+Shift+C)Kod:Kolekcja jest uszkodzona. Prosimy o zapoznanie się z instrukcją.DwukropekPrzecinekKompresuj kopie zapasowe (spowalnia)Konfiguracja języka interfejsu i opcjiPotwierdź hasło:Gratulacje! Zakończyłeś na teraz tę talię.Łączenie...KontynuujKopiujPoprawne odpowiedzi dla dojrzałych kart: %(a)d/%(b)d (%(c).1f%%)Poprawne: %(pct)0.2f%%
(%(good)d z %(tot)d)Nieudane połączenie z AnkiWeb. Sprawdź połączenie twojej sieci i spróbuj ponownie.Nie udało się nagrać twojego audio. Czy zainstalowałeś lame lub sox?Nie można zapisać pliku: %sZakuwajStwórz talięStwórz filtrowaną talię...UtworzonaCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZŁącznieŁącznie %sŁącznie odpowiedziŁącznie kartAktualna taliaAktualny typ notatki:Niestandardowa naukaSesja niestandardowej naukiNiestandardowe kroki (w minutach)Dostosuj karty (Ctrl+L)Dostosuj polaWytnijBaza danych przebudowana i zoptymalizowana.DataDni naukiDeautoryzujKonsola debugowaniaTaliaWymuś talięTalia zostanie zaimportowana przy otwarciu profilu.TalieMalejące przerwyDomyślnaCzas do kolejnego wyświetlenia.UsuńUsunąć %s?Usuń kartyUsuń talięUsuń pusteUsuń notatkęUsuń notatkiUsuń etykietyUsuń nieużywaneUsunąć pole z %s?Usunąć typ kart '%(a)s' i jego %(b)s?Usunąć ten typ notatki i wszystkie jego karty?Usunąć ten nieużywany typ notatki?Usunąć nieużywane pliki?Usuń...Usunięto %d kartę bez notatki.Usunięto %d karty bez notatki.Usunięto %d kart bez notatki.Usunięto %d kartę z brakującym szablonem.Usunięto %d karty z brakującym szablonem.Usunięto %d kart z brakującym szablonem.Usunięto %d notatkę bez ustawionego typu notatki.Usunięto %d notatki bez ustawionego typu notatki.Usunięto %d notatek bez ustawionego typu notatki.Usunięto %d notatkę bez kart.Usunięto %d notatki bez kart.Usunięto %d notatek bez kart.Usunięto %d notatkę ze złą liczbą pól.Usunięto %d notatki ze złą liczbą pól.Usunięto %d notatek ze złą liczbą pól.Usunięto.Usunięto. Proszę uruchomić ponownie Anki.Usunięcie tej talii z listy talii zwróci wszystkie pozostałe karty do ich oryginalnej talii.OpisOpis pokazywany na ekranie nauki (tylko dla aktualnej talii):Okno dialogoweOdrzuć poleNieudane pobieranie: %sPobierz z AnkiWebPobieranie zakończone sukcesem. Proszę uruchomić ponownie Anki.Pobieranie z AnkiWeb...OczekująceTylko oczekujące kartyPrzychodzące jutroZakoń&czTrudnośćŁatwaPremia odpowiedzi "Łatwa"Przerwa dla łatwychEdytujEdytuj %sEdytuj aktualnąEdytuj HTMLEdytuj, by dostosowaćEdytuj...ZmodyfikowanoCzcionka edycjiModyfikacje zapisane. Proszę uruchomić Anki ponownie.PustyPuste karty...Numery pustych kart: %(c)s Pola: %(f)s Znaleziono puste karty. Uruchom Narzędzia>Puste kartyPuste pierwsze pole:% sZakończWprowadź talię, aby dodać %s nowych kart lub pozostaw puste pole:Wprowadź nową pozycję karty (1...%s):Wpisz etykiety do dodania:Wpisz etykiety do usunięcia:Błąd pobierania: %sBłąd podczas uruchamiania: %sBłąd podczas wykonywania% s.Błąd uruchamiania %sEksportujEksportuj...DodatkoweFF1F3F5F7F8Pole %d z pliku jest:Odwzorowanie pólNazwa pola:Pole:PolaPola dla %sPola oddzielone o: %sPola...&FiltryPlik jest nieprawidłowy. Odtwórz go z kopii zapasowej.Brakuje pliku.FiltrFiltr:PrzefiltrowaneFiltrowana talia %dZnajdź &duplikaty...Znajdź duplikatyZnajdź i za&mień...Znajdź i zamieńZakończPierwsza kartaPierwsze przeglądnięciePierwsze dopasowane pole: %sNaprawiono %d kartę z nieprawidłowymi wartościami.Naprawiono %d karty z nieprawidłowymi wartościami.Naprawiono %d kart z nieprawidłowymi wartościami.Naprawiono typ notatki: %sOdwróćFolder już istnieje.Czcionka:StopkaZe względów bezpieczeństwa, '%s' jest niedozwolony dla kart. Można go nadal używać przez umieszczenie polecenia w innym zestawie i zaimportowanie go wraz z nagłówkiem LaTeX.PrognozaFormularzZwykła i opcjonalna odwrotna kartaZwykła i odwrotna kartaZnaleziono %(a)s spośród %(b)s.PrzódPodgląd przoduSzablon przoduOgólneWygenerowany plik: %sWygenerowane %sPodziel sięDobraPrzerwa kart "absolwentów"Edytor HTMLTrudnaCzy masz zainstalowane programy latex i dvipng?NagłówekPomocNajmniejsza trudnośćHistoriaEkran głównyPodział godzinowygodzinGodziny, w których przeprowadzono mniej niż 30 powtórek, nie są pokazane.Jeśli masz swój wkład w program i nie jesteś na liście, zgłoś to.Gdybyś uczył się codziennieIgnoruj odpowiedzi z czasem dłuższym niżIgnoruj wielkość literIgnoruj ​​linie, których pierwsze pole pasuje do istniejącej notatkiIgnoruj tę aktualizacjęImportujImportuj plikImportuj nawet jeśli istniejąca notatka ma takie samo pierwsze poleImportowanie nie powiodło się. Importowanie nie powiodło się. Informacje debugowania: Opcje importowaniaImport zakończony powodzeniem.W katalogu z mediami, ale nieużywane przez żadne karty:Aby zapewnić, że Twoja kolekcja działa poprawnie na wszystkich urządzeniach, Anki potrzebuje poprawnie ustawionego zegara systemowego. Zegar systemowy może chodzić źle nawet jeśli Twój system pokazuje poprawny czas lokalny. Otwórz ustawienia czasu swojego komputera i sprawdź: - AM/PM - spóźnienie zegara - dzień, miesiąc i rok - strefę czasową - czas zimowy/letni Różnica w stosunku do poprawnego czasu: %sDołącz plikiDołącz informację o planowaniuDołącz etykietyZwiększenie dzisiejszego limitu nowych kartZwiększ dzisiejszy limit nowych kart oZwiększenie dzisiejszego limitu przejrzanych kartZwiększ dzisiejszy limit przejrzanych kart oRosnące przerwyInformacjaZainstaluj dodatekJęzyk interfejsu:PrzerwaModyfikator przerwPrzerwyNieprawidłowy kod.Złe kodowanie znaków; proszę zmienić nazwę:Nieprawidłowy plik. Proszę przywrócić dane z kopii zapasowej.Niepoprawne hasło.Karta zawiera nieprawidłową wartość. Uruchom Narzędzia->Sprawdź bazę danych, jeśli problem powtórzy się, zadaj pytanie na stronie wsparcia technicznego.Niepoprawne wyrażenie regularne.Została zawieszona.Kursywa (Ctrl+I)Błąd JS w linijce %(a)d: %(b)sPrzeskocz do etykiet z Ctrl+Shift+TZachowajLaTeXRównanie LaTeXŚrodowisko matematyczne LaTeXPomyłkiOstatnia kartaOstatnia powtórkaNajpierw ostatnio dodaneNienauczoneNauka ponad limitNienauczone: %(a)s, Powtarzane: %(b)s, Uczone ponownie: %(c)s, Filtrowane: %(d)sNienauczonePijawkaDziałanie dla pijawekPróg pijawekPo lewejOgranicz doŁadowanie...Zabezpiecz konto hasłem lub pozostaw puste pole:Najdłuższa przerwaSzukaj w polu:Największa trudnośćZarządzajZarządzaj typami notatekOdwzorowanie na %sOdwzorowanie na etykietyWyróżnijWyróżnij notatkęWyróżnij notatkę (Ctrl+K)WyróżnioneDojrzałeMaksymalna przerwaMaksymalnie powtórek/dzieńPlikiMinimalna przerwaminutWymieszaj nowe karty i powtórkiTalia Mnemosyne 2.0 (*.db)WięcejNajwięcej pomyłekPrzenieś kartyPrzenieś to talii (Ctrl+D)Przenieś karty do talii:N&otatkaNazwa istnieje.Nazwa talii:Nazwa:SiećNoweNowe kartyNowych kart w talii: %sTylko nowe kartNowe karty/dzieńNowa nazwa talii:Przerwa nowej kartyNowa nazwa :Nowy typ notatki:Nowa nazwa grupy opcji:Nowa pozycja (1...%d):Nowy dzień zaczyna sięNie oczekują jeszcze żadne karty.Żadne karty nie odpowiadają podanym kryteriom.Brak pustych kart.Nie przejrzano dzisiaj żadnych dojrzałych kart.Nie znaleziono nieużywanych lub brakujących plików.NotatkaID notatkiTyp notatkiTypy notatekUsunięto notatkę i jej %d kartę.Usunięto notatkę i jej %d karty.Usunięto notatkę i jej %d kart.Notatka zakopana.Notatka została zawieszona.Uwaga: pliki nie podlegają kopii zapasowej. Dla bezpieczeństwa danych należy co jakiś czas robić kopię zapasową folderu Anki.Uwaga: Brakuje niektórych elementów historii. Aby dowiedzieć się więcej na ten temat, zobacz dokumentację przeglądarki.Notatki jako zwykły tekstW notatce wymagane jest przynajmniej jedno pole.Notatki oznaczone etykietąNicOKNajstarsze najpierwPrzy następnej synchronizacji wymuś zmiany w jednym kierunkuJedna lub więcej notatek nie zostały zaimportowane ponieważ nie tworzą żadnej karty. Tak się może zdarzyć kiedy są puste pola lub są nieprawidłowo przypisane wartości z pliku do właściwych pól.Można zmieniać pozycję tylko nowych kart.Tylko jeden klient może uzyskać w tym samym czasie dostęp AnkiWeb. Jeśli synchronizacja się nie powiodła należny spróbować ją wykonać ponownie za kilka minut.OtwórzOptymalizacja...Opcjonalny limit:OpcjeOpcje dla %sGrupa opcji:Opcje...KolejnośćW kolejności dodaniaW kolejności przyjściaZmień szablon tyłu:Zmień czcionkę:Zmień szablon przodu:Spakowana talia Anki (*.apkg *.zip)Hasło:Hasła nie są zgodneWklejWklej zdjęcia ze schowka jako PNGLekcja Pauker 1.8 (*.pau.gz)ProcentowoOkres: %sUmieść na końcu nowej kolejki kartUmieść w kolejce powtórek z przerwą pomiędzy:Proszę najpierw dodać inny typ notatki.Cierpliwości; to może potrwać chwilę.Podłącz mikrofon i upewnij się, że inne programy nie używają urządzenia audio.Należy edytować tę notatkę i usunąć luki. (%s)Proszę upewnić się, że profil jest otwarty i program Anki nie jest zajęty, a następnie spróbować ponownie.Proszę zainstalować PyAudioNależy zainstalować program MplayerProszę najpierw utworzyć profil.Uruchom Narzędzia>Puste kartyProszę wybrać talię.Proszę wybrać karty tylko z jednego typu notatki.Należy wybrać co najmniej jeden element.Proszę zaktualizować Anki do najnowszej wersji.Użyj Plik>Import, by zaimportować ten plik.Należy przejść na stronę AnkiWeb, zaktualizować talię i spróbować ponownie.PołożeniePreferencjePodglądPodgląd wybranej karty (%s)Podgląd nowych kartPodgląd kart dodanych przez ostatniePrzetwarzanie...Hasło profilu...Profil:ProfileWymagana autentykacja proxy.PytanieKoniec kolejki: %dPoczątek kolejki: %dZamknijLosowaKolejnośc losowaOcenaGotowy do aktualizacjiPrzebudujNagraj swój głosNagraj dźwięk (F5)Nagrywanie...
Czas: %0.1fWedług względnego spóźnieniaUczone ponownieZapamiętuj ostatnią wartość przy dodawaniuUsuń etykietyUsuń formatowanie (Ctrl+R)Usunięcie tego typu karty spowodowałoby usunięcie jednej lub więcej notatek. Proszę najpierw utworzyć nowy typ karty.Zmień nazwęZmień nazwę taliiOdtwórz audioOdtwórz swój głosZmień pozycjęZmień pozycję nowych kartZmień pozycję...Wymagaj co najmniej jednej z etykiet:Zmień planZmień planZmień plan na podstawie odpowiedzi w tej taliiWznów terazOdwrotny kierunek tekstu (RTL)Przywrócono do stanu sprzed '%s'.PowtarzaneLiczba powtórekCzas powtórkiPowtórka z wyprzedzeniemPowtórka z wyprzedzeniem oPowtórz karty zapomniane ostatnioPowtórka zapomnianych kartOdsetek poprawnych odpowiedzi w różnych porach dnia.PowtórkiPowtórki oczekujące w talii: %sPo prawejZapisz obrazZakres: %sSzukajSzukaj z formatowaniem (wolne)WybierzZaznacz &wszystkoWybierz ¬atkiWybierz etykiety do wykluczenia:Wybrany plik nie używa kodowania UTF-8. Przeczytaj rozdział o imporcie w podręczniku użytkownika.Selektywna naukaŚrednikNie znaleziono serwera. Albo twoje połączenie nie działa, albo program antywirusowy lub zapora sieciowa blokuje Anki dostęp do Internetu.Ustawić tę opcję grup dla wszystkich poniższych %s talii?Ustaw dla wszystkich podtaliiUstaw kolor pierwszoplanowy (F7)Przytrzymano klawisz Shift. Pomijanie automatycznej synchronizacji i ładowania dodatków.Zmień pozycję istniejących kartSkrót klawiszowy: %sSkrót: %sWyświetl %sPokaż odpowiedźPokaż duplikatyPokaż czas odpowiedziPokaż nowe karty po powtórkachPokaż nowe karty przed powtórkamiPokaż nowe karty w kolejności dodaniaPokaż nowe karty w losowej kolejnościPokaż czas następnej powtórki nad przyciskami odpowiedziPokaż ilość pozostałych kart w czasie powtórkiPokaż statystki. Skrót klawiszowy: %sRozmiar:Zostały jeszcze powiązane lub zakopane karty - czekają na następną sesję nauki.Niektóre ustawienia zadziałają dopiero po ponownym uruchomieniu Anki.Niektóre zmiany zostały zignorowane, ponieważ zmienił się typ notatki:Pole sortowaniaSortuj w przeglądarce według tego polaSortowanie w tej kolumnie nie jest możliwe. Proszę wybrać inną kolumnę.Dźwięki i obrazyOdstępPołożenie początkowe:Początkowa trudnośćStatystykiKrok:Kroki (w minutach)Kroki muszą być liczbami.Usuń HTML przy wklejaniu tekstuPrzejrzano dzisiaj %(a)s w %(b)s.Przejrzane dzisiajNaukaNauka taliiNauka talii...Ucz się terazPowtórka według stanu karty lub etykietyStylStyl (wspólny dla wszystkich kart)Indeks dolny (Ctrl+=)Eksport XML Supermemo (*.xml)Indeks górny (Ctrl+Shift+=)ZawieśZawieś kartęZawieś notatkęZawieszoneSynchronizuj również dźwięki i obrazySynchronizuj z AnkiWeb. Skrót klawiszowy: %sSynchronizacja plików...Synchronizacja nie powiodła się: %sSynchronizacja nie powiodła się; brak połączenia z internetem.Synchronizacja wymaga, aby zegar na twoim komputerze był ustawiony poprawnie. Nastaw zegar i spróbuj ponownie.Synchronizacja...ZakładkaDuplikaty etykietTylko etykietaEtykietyTalia docelowa (Ctrl+D)Pole docelowe:TekstTekst oddzielony tabulacją lub średnikami (*)Ta talia już istnieje.Ta nazwa pola jest już używana.Ta nazwa jest już używana.Przekroczono limit czasu połączenia z AnkiWeb. Proszę sprawdzić stan połączenia z siecią i spróbować ponownie.Usunięcie domyślnej konfiguracji nie jest możliwe.Domyślna talia nie może zostać usunięta.Podział kart w Twojej talii (taliach).Pierwsze pole jest puste.Pierwsze pole typu notatki musi być przypisane.Ten znak nie może być użyty: %sPrzód tej karty jest pusty. Uruchom Narzędzia>Puste kartyIkony zostały pozyskane z różnych źródeł; w kodzie źródłowym Anki znajduje się lista ich autorów.Wprowadzony tekst spowodowałby utworzenie pustego pytania we wszystkich kartach.Liczba pytań, na które odpowiedziałeś/aś.Liczba powtórek oczekujących w przyszłości.Liczba naciśnięć każdego przycisku.Uprawnienia do systemowego folderu tymczasowego są nieprawidłowe, a Anki nie jest w stanie automatycznie ich poprawić. Przeczytaj w podręczniku Anki część "temp folder".Podany plik nie jest poprawnym plikiem .apkg.Nie znaleziono kart odpowiadającym kryteriom wyszukiwania. Chcesz spróbować z innym hasłem?Żądana zmiana wymagać będzie pełnego wysłania bazy danych przy następnej synchronizacji Twojej kolekcji. Jeżeli posiadasz powtórki lub inne oczekujące zmiany na innym urządzeniu, które nie zostały jeszcze zsynchronizowane, zostaną one utracone. Czy kontynuować?Czas odpowiedzi na pytania.Aktualizacja została ukończona i możesz już używać Anki 2.0.

Poniżej znajduje się raport zmian:

%s

Więcej nowych kart jest dostępnych, ale dzienny limit został przekroczony. Możesz zwiększyć limit w opcjach, ale miej na uwadze, że im więcej nowych kart poznajesz, tym liczba kart do przejrzenia w najbliższym czasie będzie większa.Musi istnieć przynajmniej jeden profil.Nie można sortować po tej kolumnie, ale możesz szukać konkretnych typów kart, np. 'card:Karta 1'.Nie można sortować po tej kolumnie, ale możesz szukać konkretnej talii, klikając ją po lewej stronie.Ten plik nie jest prawidłowym plikiem .apkg. Jeżeli ten błąd dotyczy plików pobranych z AnkiWeb, to być może nie został poprawnie pobrany. Jeżeli problem będzie się powtarzał spróbuj użyć innej przeglądarki.Plik już istnieje. Na pewno chcesz go nadpisać?W tym katalogu przechowywane są wszystkie dane programu Anki, aby łatwo tworzyć kopie zapasowe. Żeby zmienić lokalizację plików, zobacz: %s Specjalna talia do powtórek poza normalnym rozkładem.To {{c1::sample}} luka do wypełnienia.Twoja kolekcja zostanie usunięta i zastąpiona danymi z pliku, który importujesz. Chcesz kontynuować?Ten kreator przeprowadzi Cię przez proces aktualizacji Anki 2.0. Dla bezproblemowej aktualizacji, proszę uważnie przeczytać poniższe strony. CzasLimit czasowy - TimeboxDo przejrzeniaAby przeglądać dodatki, kliknij poniższy przycisk Przeglądaj.

Jeśli znalazłeś dodatek, który Ci się spodobał, wklej jego kod poniżej.Aby importować do profilu zabezpieczonego hasłem, proszę otworzyć ten profil przed próbą importu.Aby wprowadzić luki do istniejącej notatki, musisz zmienić jej typ na lukę przez Edycja>Zmień typ notatkiAby je teraz zobaczyć, kliknij przycisk OdkopAby uczyć się poza normalnym rozkładem, kliknij poniżej przycisk Niestandardowa nauka.DzisiajDzisiejszy limit powtórki został osiągnięty, ale są jeszcze karty czekające na powtórkę. Dla najlepszego zapamiętywania, rozważ zwiększenie dziennego limitu w opcjach.RazemCałkowity czasWszystkich kartWszystkich notatekTraktuj wartość pola jako wyrażenie regularneTypWpisz odpowiedź: nieznane pole %sNie można zaimportować z pliku tylko do odczytu.OdkopPodkreślenie (Ctrl+U)CofnijCofnij %sNieznany format pliku.NiewidzianeAktualizuj istniejące notatki jeżeli zgadzają się pierwsze polaZaktualizowano %(a)d z %(b)d istniejących notatek.Aktualizacja zakończonaKreator aktualizacjiAktualizacja w tokuAktualizacja talii %(a)s z %(b)s... %(c)sWyślij do AnkiWebWysyłanie do AnkiWeb...Użyte w kartach, ale brakujące w folderze z plikami:Użytkownik 1Wersja %sOczekiwanie na zakończenie edycji.Uwaga: wypełnianie luk nie będzie działać, jeśli nie ustawisz typu na górze na Luka.Witaj!Dodawaj domyślnie do aktualnej taliiKiedy widoczna odpowiedź, odtwórz pytanie i odpowiedźGdy będziesz gotów do aktualizacji, kliknij przycisk dokonania zmian, aby kontynuować. W trakcie dokonywania aktualizacji w Twojej przeglądarce zostanie otwarty przewodnik aktualizacji. Proszę go dokładnie przeczytać, gdyż wiele się zmieniło od poprzedniej wersji Anki.Przy aktualizacji Twoich talii Anki spróbuje skopiować wszelkie dźwięki i obrazy ze starych talii. Jeżeli używałeś własnego folderu DropBoxa lub innego własnego folderu, proces aktualizacji może nie być w stanie zlokalizować Twoich mediów. Na koniec zostanie Ci zaprezentowany raport z aktualizacji. Jeżeli zauważysz, że media nie zostały skopiowane, choć powinny, proszę spojrzeć do przewodnika aktualizacji, by otrzymać więcej instrukcji.

AnkiWeb umożliwia teraz bezpośrednią synchronizację mediów. Żadne specjalne ustawienia nie są wymagane, a media zostaną zsynchronizowane wraz z Twoimi kartami przy synchronizacji z AnkiWeb.Cała kolekcjaCzy chcesz ściągnąć ją teraz?Stworzone przez Damiena Elmesa, z poprawkami, tłumaczeniami, testowaniem i projektem autorstwa następujących osób:

%(cont)sWybrano typ Luka, ale nie ma żadnych luk do wypełnienia. Kontynuować?Masz mnóstwo talii. Zobacz %(a)s. %(b)sNie nagrałeś jeszcze swojego głosu.Musi istnieć przynajmniej jedna kolumna.MłodeMłode+NienauczoneTwoje talieTwoje zmiany dotkną wiele talii. Jeśli chcesz zmienić tylko aktualną talię, dodaj najpierw nową grupę opcji.Twój plik kolekcji wydaje się być popsuty. Może się to zdarzyć, gdy ten plik jest kopiowany lub przesuwany podczas gdy Anki jest otwarte lub gdy kolekcja jest przechowywana na dysku w sieci lub chmurze. Zobacz podręcznik użytkownika, by dowiedzieć się, jak przywrócić automatyczną kopię zapasową.Twoja kolekcja jest w niespójnym stanie. Uruchom Narzędzia>Sprawdź bazę danych i ponownie wykonaj synchronizację.Twoja kolekcja lub pliki multimedialne są zbyt duże i nie można ich synchronizować.Twoja kolekcja została pomyślnie przesłana do AnkiWeb. Jeśli wykorzystywane są innych urządzenia, to należy zsynchronizować je i pobrać kolekcję właśnie przesłaną z tego komputera. Dzięki temu przyszłe aktualizacje i dodatkowe karty zostaną ze sobą połączone automatycznie.Twoje talie tu i na AnkiWeb różnią się w taki sposób, że nie mogą być złączone razem. Konieczne jest nadpisanie talii po jednej stronie taliami z drugiej strony. Jeśli wybierzesz ściągnięcie, Anki ściągnie kolekcję z AnkiWeb i wszystkie zmiany wykonane na Twoim komputerze od ostatniej synchronizacji będą stracone. Jeśli wybierzesz wysłanie, Anki wyśle Twoją kolekcję do AnkiWeb i wszystkie zmiany wykonane w AnkiWeb albo na innych urządzeniach od ostatniej synchronizacji będą stracone. Po zsynchronizowaniu wszystkich urządzeń kolejne powtórki i dodane karty zostaną złączone automatycznie.[brak talii]kopii zapasowychkartkarty z taliiWybrane karty:kolekcjaddnitaliaczas życia taliiduplikatpomocukryjgodzingodziny po północypomyłekodwzorowane na %sodwzorowane na etykietyminutminutmopowtóreksekundstatystykita stronawcała kolekcja~anki-2.0.20+dfsg/locale/af/0000755000175000017500000000000012256137063015102 5ustar andreasandreasanki-2.0.20+dfsg/locale/af/LC_MESSAGES/0000755000175000017500000000000012065014110016650 5ustar andreasandreasanki-2.0.20+dfsg/locale/af/LC_MESSAGES/anki.mo0000644000175000017500000001143112252567245020153 0ustar andreasandreasid   " 6 8 8B {  &  (   + 1 < B H L R Z e w                       # ( 0 7 > I Z a h o v }          ( 4 ; A F K U ] c g x                  ' :M \%j %    $ 0 > LXacelq v     & -8IPW^elsz        +3<C L Wcgm    ! I236 7/bM9:N;=LF&cZV'R"%P0f_#\Wa *5K? i@AJBh]>CD1.E`e QgOS8G-Y) U,(H<+$^[4XdT Stop (1 of %d) It has %d card. It has %d cards.%% Correct%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%d selected%d selected%s day%s days%s day%s days%s hour%s hours%s hour%s hours%s minute%s minutes%s month%s months&Edit&Export...&File&Find&Go&Help&Import&Import...&Invert Selection&Preferences...&Tools&Undo/:AddAgainAnkiAnswersAverageBackBrowseBrowserBuildCancelCards...CenterChangeChangedChecking...CloseColonCommaConnecting...CopyCreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+UCtrl+ZCutDateDeauthorizeDeleteDelete...DescriptionDialogE&xitEasyEditEdit HTMLEdit...EmptyEndError running %sForecastFrontHoursIntervalLeftMinutesPercentagePositionRandomReviewReviewsRightSuspendedTextTotalTotal TimeUnseenhoursminutesProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-04-04 12:14+0000 Last-Translator: C van Rooyen Language-Team: Afrikaans MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:43+0000 X-Generator: Launchpad (build 16869) Language: af Stop (1 van %d) Dit het %d kaarte. Dit het %d kaarte.%% Korrek%(a)d of %(b)d nota opdateer%(a)d of %(b)d notas opdateer%d geselekteer%s dag%s dae%s dag%s dae%s uur%s ure%s uur%s ure%s minuut%s minute%s maand%s maande&Redigeer&Voer uit...&Leêr&Soek&Gaan&Hulp&In voer&In voer...&Omkeer Keuse&Voorkeure...&Gereedskap&Ontdoen/:ByvoegWeerAnkiAntwoordeGemiddeldTerugBlaaiBlaaierBouKanselleerKaarte...MiddelVeranderVeranderdBesig om na te gaan...ToemaakDubbelpuntKommaKoppel tans...KopieerGeskepCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+UCtrl+ZKnipDatumStaak toestemmingVerwyderSkrap...BeskrywingDialoog&VerlaatMaklikRedigeerWysig HTMLRedigeer...PapEindeKon nie %s laat loop nieVoorspellingVoorUreIntervalLinksMinutePersentasiePosisieLukraakHersienResensiesRegsUitgesitTeksTotaalTotaal TydOngesienureminuteanki-2.0.20+dfsg/locale/tr/0000755000175000017500000000000012256137063015141 5ustar andreasandreasanki-2.0.20+dfsg/locale/tr/LC_MESSAGES/0000755000175000017500000000000012065014111016710 5ustar andreasandreasanki-2.0.20+dfsg/locale/tr/LC_MESSAGES/anki.mo0000644000175000017500000013546212252567246020226 0ustar andreasandreasm(66 666"66 6678$7]7v77"7$7$7&8,8"K8n888$8 88 90"9S9[9&j9 99(999,:0:*C:n:,: ::(:::;; ; ; ;;$;7;@; F;Q;W;];a; h;r;x; ;; ;;;;;;;<<0< P<]< c< n<y<<<<<:=<=?=D=L=S=X=]=a=e=Ti===,=(>,>!K>m>f>> ?? !? .?9?I?[?p?e??7@ @@5@X"AY{A8A B B%B)B DB NBXB nB |BB BBBB B$BB BB C C%CKBCCNC"CD#,EPEUElE dFrFG#GRGvGwqH7H !Iw-IEI@I,J3JBJRJJJ K#;K#_KK KK(KL LL .L;LTLeL jL wLLLLLLLLLLMPMcMsMyMMM M M)M'MNNNNNNNO O (O 2O=O OO\OlO~O O3OOSO,P5P3XPrXXX]X HY8TYY YYY)YYZZ %Z2Z8Z=Z BZ MZ[Z`Z hZ uZZZZ Z!ZZZ)Z0[?[U[4Y[![[[[[\\-\ 4\>\D\F\I\L\O\R\U\ q\ \\\ \\ \\,\\]] ])]:]N]^]s]] ] ]N]]^ ^"^(^/^^^^__4_ :_H_W___r_ ___ __$___ ___``.`FH``` `4` aa #a1/aaaqaaa*a aa bb"9b"\b bbbbbbb b c c)1c[cmcc d$d9dWdvd{dddd d dddd<d'e0e 6eCeSeXe ae+leee eee e ee efff&f7fKfQfbfjfff f ffff ffg gg g"g8g GgUg dg qg{ggggg+gh#h!Bhdhih qh {h<h hh]ha>ii!i iiii,j.j#jkkk kkkkk kk k kkll!6l Xlblylll l ll,l#m)@mVjmEmnn5nRnon,nn-n+n8%o^o goso{oo#o oooopp(p-p4pDpKp\pdpupppp ppip\q cq oq|q q qqqq q q6qr;r CrMr^rcr kr"vrWrrr s s%s -s7sHsJs uu "u -u'7u_uauruu[u$uv*v!:v7\v1vCv w-(wVw fwtw1w)ww!x=(x fxrx'x xx'xxy+y Dy#Pyty+y yy'yyyzz zz z z,z Iz Sz]znzuzzz z zz zzz zzz {{3{I{ _{i{9r{ {{ { {{{{||||||||||||t|Y}[}+p}-}}(}~l'~$~ ~~~~ ~  :iK=VPgn=;M\!a  ΂ނ  !>E]q 9TɃ"MA U*16 P\my NzdL6mHG>=CSW\g#1@rȌ:&5L_{ ԍ g% ʎގ .3=q07<DKRZ v ֐ <CTZ  ̑ۑ-#Cgv)ʒ ϒܒ2 @Fc-h,/'?HBP4XȔ0!Rj|  ̕ݕ # 0 = J W d q ~  Жݖ2Ri2m̗8;D W3d ˜Әܘ /)3Y*$ݙ9FReDKI+Re~ RBJ%\Q , 2<B Q] ft ǝӝ1%-7Ge Ǟ>Ҟ%7To$Ÿܟ 3 EPV^o ,Π (7M_ eoWݡ $+ˢҢע -9?U is{!ţΣ֣ߣ 3 Q=!(ڤ8$ ;I=b=B1 t&&צ665l}  ǧ/ԧ,1Aܨ *?jou© ҩܩX MW\o 4 Ӫ %. ?JZ sӫ2ګ (/CTl  ج #2Oh +έ'+ 9 =J S?_mĮ[2 ԯ=:*.±Ʊ۱ ' 6@Ra{#вز #; B(N1w/(ٳ`Xcִ -?1X.FҵMg m y"ڶ *:?EN_n ܷ !>Ҹ + <] lvC:ڹ  1 K U `lJԺܺ  05OA(h-T.~/)%y172WD]U%-U m`19L!Z"Gi8[+i_e4:E eQ{;YZ,zW?7*e$h w\)6u #3N HU'>5G?L#~%E2-}|:@w(8 m Z9lSYh @,I:n86@2G4cR dj[j" 03(j}Wbrk$4Fk!K&]k0KsOpfDplr.SJ0CSA>c\X<; /B!bNBJ'P{)9pzd+DMvqQ v[mVfT>`R',P}vB3 uCq~16stFJ/|r&txIsVa^&XfRN7F xQ+X^ulg MP<yw`x$oiHM_*bagC={OYA n" d^?.yLonqa I|Ez=tc5T=Ho;K*_]gV<\# Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionRescheduleReverse text direction (RTL)ReviewReviewsSelect &AllShow AnswerSome settings will take effect after you restart Anki.Strip HTML when pasting textSuspendSuspendedSyncing Media...TagsUndo %sVersion %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sdaysmapped to %smapped to Tagsminssecondsthis pagewhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-25 12:44+0000 Last-Translator: Mutlu Can YILMAZ Language-Team: Turkish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) Language: tr Dur (%d taneden: 1) (kapalı) (açık) %d kart bulunuyor. %d kart bulunuyor.%Doğru yüzdesi.%(a)0.1f %(b)s/gün%(a)0.1fs (%(b)s)Toplam %(a)d içinden %(b)d not güncellendi.Toplam %(a)d içinden %(b)d not güncellendi.%(a)dkB yüklendi, %(b)dkB indirildi%(tot)s %(unit)s%d kart%d kart%d kart silindi.%d kart silindi.%d kart dışa aktarıldı.%d kart dışa aktarıldı.%d kart içe aktarıldı%d kart içe aktarıldı%d kartın çalışılma süresi:%d kartın çalışılma süresi:%d kart/dakika%d kart/dakika%d deste güncellendi.%d deste güncellendi.%d grup%d grup%d not%d not%d not eklendi%d not eklendi%d not içe aktarıldı.%d not içe aktarıldı.%d not güncellendi.%d not güncellendi.%d inceleme%d inceleme%d seçili öğe%d seçili öğeMasa üstünüzde %s tane var zaten. Üzerine yazılsın mı?%s kopyası%s gün%s gün%s gün%s gün%s silindi.%s saat%s saat%s saat%s saat%s dakika%s dakika%s dakika.%s dakika.%s dakika%s dakika%s ay%s ay%s ay%s ay%s saniye%s saniye%s saniye%s saniye%s silinecek%s yıl%s yıl%s yıl%s yıl%sd%sh%sm%smo%ss%sy&Hakkında...&Eklentiler&Veritabanını Kontol Et...&Ezber...Dü&zenle&Dışa Aktar...&Dosya&Bul&Git&Kılavuz&Kılavuz&Yardım&İçe Aktar&İçe Aktar...S&eçimi Tersine ÇevirSonraki &Kart&Eklentiler Klasörünü Aç...&Seçenekler...&Önceki Kart&Yeniden Planlamak...&Anki'ye Destek Ol...&Profil Değiştir...&Araçlar&Geri Al'%(row)s' içinde %(num1)d alan vardı, beklenen %(num2)d(%s doğru)(son)(süzgeçli)(öğreniyor)(yeni)(ana kaynak limiti: %d)(lütfen 1 kart seçin)....anki2 dosyaları içe aktarılacak şekilde oluşturulmamıştır. Bir yedeklemeyi geri yüklemeye çalışıyorsanız, kılavuzun "Yedekleme" bölümüne bakın./0d1 101 ay1 yıl10AM10PM3AM4AM4PM504 ağ geçidi zaman aşımı hatası alındı. Lütfen antivirüs uygulamanızı devre dışı bırakarak deneyin.: ve%d kart%d kartYedek klasörünü açSiteye git%(pct)d%% (%(y)s içinden %(x)s )%Y-%m-%d @ %H:%MYedekler
Anki her kapandığında ya da senkronize edildiğinde koleksiyonunuzun yedeğini alacak.Dışarıya Aktarım Biçimi:Bul:Yazı BüyüklüğüYazıtipi:İçeride:Dahil:Çizgi Tipi:...İle DeğiştirEşitlemeEşitleme
Henüz etkin değil. Ana pencerede eşitleme düğmesine tıklayarak etkinleştirin.

Hesap Gerekli

Koleksiyonunuzun eşitlenmesi için ücretsiz hesap açmanız gerekiyor. Lütfen hesap açın ve bilgilerinizi yazın.

Anki Güncellendi

Anki %s sürümü çıktı.

Önerileri, hata raporları ve bağışları ile katkı sağlayan herkese büyük teşekkür ediyoruz.Bir kartın kolaylığı gözden geçirirken "iyi" cevabını verdiğinizde belirecek bir sonraki tekrar süresinin büyüklüğüdür.collection.apkg adlı bir dosya bilgisayarınıza kaydedildi.İptal Edildi: %sAnki HakkındaEkleEkle (kısayol tuşu: ctrl+enter)Alan EkleMedya EkleYeni Deste Ekle (Ctrl+N)Not Türü EkleTersini EkleEtiketleri ekleYeni kart ekleŞuna ekle:Ekle: %sEklendiBugün Eklenenlerİlk alanın aynısı eklendi: %sTekrarBugün tekrar edilenlerTekrar sayısı: %sBütün DestelerTüm AlanlarTüm kartlar rastgele sıralı (yoğun çalışma tarzı)Bu profil için bütün kartlar, notlar ve medya dosyaları silinecek. Emin misiniz?Alanlarda HTML kodlarına izin verEklentide bir sorun oluştu.
Lütfen eklentiyi foruma bildirin:
%s
%s 'i açarken bir hata oluştu.Bir hata oluştu. Bu hata uygulamadaki bir sorundan ya da
destenizdeki bir problemden kaynaklanıyor olabilir.

Destenizde bir problem olmadığını görmek için, lütfen Araçlar > Veritabanını Kontrol Et'i çalıştırın.

Eğer bu problemi çözmez ise, lütfen aşağıdaki
yazıyı hata raporuna kopyalayın:Masaüstünüze bir görüntü kaydedildi.AnkiAnki 1.2 Destesi (*.anki)Anki 2 destelerinizi yeni bir formatta kaydediyor. Bu sihirbaz, destelerinizi otomatik olarak o formata dönüştürecek. Destleriniz, güncellemeden önce kaydedilecek. Böylece, Anki'nin eski bir sürümüne dönmeniz gerekirse desteler yine kullanılabilir olacak.Anki 2.0 DestesiAnki 2.0 sadece 1.2 dan otomatik güncellemeyi destekler.Eski destelerinizi yüklemek için,onları 1.2 da açın ve güncelleyin, sonra onları 2.0 a aktarın.Anki deste paketiAnki, soruyla cevap arasında bağlantı kuramadı. Soru ve cevabın yerini değiştirmek için şablonu elle ayarlayın.Anki arkadaştır, akıllı öğrenme sistemidir. Bedava ve açık kaynaktır.Anki AGPL3 lisansı ise lisanslanmıştır. Daha fazla bilgi için lütfen kaynak dağıtımdaki lisans dosyasına bakın.Anki eski konfigürasyon dosyanızı açamadı, lütfen dosya>içeri aktar ile eski anki versiyonlarındaki destelerinizi aktarın.AnkiWeb kullanıcı adı ya da şifresi hatalıydı. Lütfen tekrar deneyin.Kullanıcı Adı:AnkiWeb bir sorunla karşılaştı. Birkaç dakika sonra tekrar deneyin. Sorun devam ederse hatayı bildirin.AnkiWeb sunucusu şu anda meşgul. Birkaç dakika sonra tekrar deneyin.AnkiWeb bakımda. Lütfen birkaç dakika sonra tekrar deneyin.CevapCevap TuşlarıCevaplarBir Antivirus ya da Firewall programı, Anki'nin internete bağlanmasına engel oluyor.İçi boş kartlar silinecek. Bir notun içinde hiç kart yoksa silinecek. Devam etmek istiyor musunuz?Dosya %s içinde çifte giriş var.%s girdisini silmek istediğinizden emin misiniz?En az bir kart tipi gereklidir.En az bir adım gereklidir.resim/ses/video ekle (F3)Sesi otomatik olarak çalAçma/kapama anında profili otomatik olarak senkronize etOrtalamaOrtalama ZamanOrtalama cevap süresiOrtalama kolaylıkOrtalama çalışılan günOrtalama aralıkGeriArka GörünümüArka ŞablonYedeklerTemelTemel (ve ters kart)Temel (seçimli ters kart)Kalın yazı (Ctrl+B)AçAç && Yükle...TarayıcıTarayıcıda (%(cur)d kart gösterilmekte; %(sel)s)Tarayıcıda (%(cur)d kart gösterilmekte; %(sel)s)Tarayıcı GörünümüTarayıcı SeçenekleriYapılandırToplu Etiket YükleToplu Etiket KaldırBuryGizli KartNotu GizleBir sonraki güne kadar ilgili kartları gizleErtesi güne kadar gizli kartlar gözden geçirilirVarsayılan, Anki karakter arasında boş alan tespit ettiğinde, örneğin tab, virgül vb. Eğerr Anki yanlış karakter tespit ettiyse buraya girebilirsiniz. tab tuşunu \t ile kullanın.İptalKartKart %dKart 1Kart 2Kart IDKart Bilgisi (Ctrl+Shift+I)Kart ListesiKart tipiKart Tipleri%s için Kart TipleriKart Gizlendi.Kart askıya alındı.Kart bir sömürücüydü.KartlarKart TipleriKartlar filtrelenmiş bir desteye manuel olarak taşınamaz.Düz Metindeki KartlarKartlar incelemenizden sonra otomatik olarak orjinal destelerine döndürülecekler.Kartlar...OrtalaDeğiştir%s değişti :Desteyi DeğiştirNot Tipi DeğiştirNot Tipi DeğiştirNot Tipi Değiştir...Rengi değiştir (F8)Not tipine göre desteyi değiştirDeğiştirildiKontrol & VeritabanıMedya dizinindeki dosyaları kontrol edinKontrol ediliyor...SeçDeste SeçinNot Tipi SeçinEtiketleri SeçinKlon: %sKapatKapatmak ve geçerli veri girişini kaybetmek mi ?KapatSilmeyi Kapat (Ctrl+Shift+C)Kod:Koleksiyon bozuldu. Lütfen kılavuzu okuyun.İki nokta üst üsteVirgülDil ve seçenekler arayüzünü yapılandırParolayı onaylayın:Tebrikler! Bu desteyi şimdilik tamamladınız.Bağlantı kuruluyor...Devam EtKopyalaTamamlanmış kartlardaki doğru cevaplar: %(a)d/%(b)d (%(c).1f%%)Doğru: %(pct)0.2f%%
(%(good)d of %(tot)d)AnkiWeb'e bağlanılamadı. Lütfen ağ bağlantınızı kontrol edin ve tekrar deneyin.Ses kaydedilemedi. Lame ve sox'u yüklediniz mi?Dosya kaydedilemedi: %sYoğun ÇalışmaDeste OluşturFiltreli Deste Yaratın...OluşturulduCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZToplamToplam %sToplam CevaplarToplam KartlarMevcut DesteMevcut not tipi:Özel ÇalışmaÖzel Çalışma OturumuÖzel ilerleme (dakikada)Kartları Özelleştir (Ctrl+L)Alanları ÖzelleştirKesVeritabanı yapılandırıldı ve optimize edildi.TarihÇalışılan günlerYetkiyi KaldırHata Ayıklama KonsoluDesteDesteyi Geçersiz KılmaBir oturum açıldığında deste içe aktarılacaktır.DestelerAralığı azaltmaÖntanımlıGözden geçirme tekrar gösterilene kadar erteler.SilSil %s?Kartları SilDesteyi kaldırİçeriksizi silNotu SilNotu SilEtiketleri silKullanılmayanları sil%s dan itibaren haneleri sil'%(a)s' kart tipi ve ona ait %(b)s silinsin mi?Bu not kategorisini ve içindeki tüm kartları silKullanılmayan bu not kategorisini kaldırKullanılmayan ortamlar silinsin mi?Sil...İçeriksiz %d kart silindi.İçeriksiz %d kart silindi.Şablonu olmayan %d kart silindi.Şablonu olmayan %d kartlar silindi.Not tipi belirlenmemiş %d not silindi.Not tipi belirlenmemiş %d notlar silindi.Kart içermeyen %d not silindi.Kart içermeyen %d notlar silindi.Hatalı alan sayılı %d not silindi.Hatalı alan sayılı %d not silindi.Silindi.Silindi.Lütfen Anki'yi yeniden başlatın.Bu desteyi deste listesinden sildiğinizde geri kalan tüm kartlar orijinal desteye geri dönecektir.AçıklamaÇalışma ekranı üzerinde gösterilecek açıklama(sadece mevcut deste için) :PencereAlanı boşaltınİndirme işlemi başarısız oldu:%sAnkiWeb'den indirinİndirme işlemi başarılı bir şekilde tamamlandı.Anki'yi yeniden başlatın.AnkiWeb'den indiriyor...VadeSadece geçmiş kartlarYarına kadarKapatKolaylıkKolayKolay ikramiyeKolay süreDüzenle%s'i DüzenleMevcut olanı düzenleHTML'yi düzenleÖzelleştirmek için düzenleDüzenle...DüzenlendiYazı tipi düzenlemesiDüzenleme kaydedildi.Anki'yi yeniden başlatın.BoşaltKartları kaldırBoş kart numaraları: %(c)s Alanlar: %(f)s Boş kartlar bulundu. Lütfen Araçlar>Boş Kartlar'ı çalıştırın.İlk alanı boşalt :% sSonlandırDesteye yeni % s kartları yerleştirin, ya da boş bırakın:Yeni kart sırasını girin (1...%s):Eklenecek etiketleri girin :Silinen etiketleri girin :İndirme hatası: %sBaşlatılma hatası: %s%s çalıştırırken bir hata oldu.%s çalıştırma hatasıDışarıya AktarDışarıya Aktar...EkFF1F3F5F7F8Dosyanın %d alanıAlan eşleştirmeAlan adı:Alan:Alanlar%s için alanlarİle ayrılmış alanlar: %sAlanlar...Süz&geçGeçersiz dosya. Lütfen yedekten yükleyin.Dosya bulunamadı.FiltreFiltre:FiltrelenmişFiltrelenmiş Deste %d&Kopyaları Bul...Kopyaları BulBul ve Değ&iştir...Bul ve DeğiştirBitirİlk Kartİlk Gözden GeçirmeGeçersiz özelliklerle %d kart onarıldı.Geçersiz özelliklerle %d kart onarıldı.Onarılan not türü: %sÇevirDosya önceden bulunmakta.Yazı tipi:DipnotGüvenlik sebebiyle, '%s' kartlarda izin verilmemektedir. Komutu farklı pakete taşıyarak ve bu paketi LaTeX başlığında içe aktararak kullanabilirsiniz.TahminFormİleri & Seçimli Tersİleri ve Ters%(b)s içinde %(a)s bulundu.ÖnÖn GörünümÖn ŞablonGenelÜretilmiş dosya: %sÜretildiği yer %sDeste BulİyiydiSüreyi bitirmeHTML DüzenleyiciZorduLatex ve dvipng'i yüklediniz mi?BaşlıkYardımEn kolayGeçmişAna SayfaSaatlik AnalizSaatler30 gözden geçirmeden daha az gösterilen saatler.Eğer katkıda bulunmuş ve listede yoksanız, lütfen bizimle iletişim kurunuz.Eğer her gün çalıştıysanızCevap süresinden uzun olanları yok sayYok sayma durumuİlk alanı mevcut not ile eşleşen satırları yok sayBu güncelemeyi yoksayİçeri AktarDosyayı İçeriye AktarMevcut not aynı ilk alana sahip olmasına rağmen içe aktarİçe Aktarma başarısız. İçe aktarma gerçekleştirilemedi. Hata ayıklama bilgisi: İçe aktarma seçenekleriİçe aktarma tamamlandı.Medya dosyasında, ancak hiçbir kart tarafından kullanılmıyor:Ortam EkleZamanlama bilgisini dahil etEtiketleri dahil etBugünün yeni kart limitini artırınBugünün yeni kart limitini artırınBugünün gözden geçirilmiş kart limitini artırınBugünün gözden geçirilmiş kart limitini artırınSüreyi artırmaBilgiEklenti yükleyinArayüz dili:AralıkSüre ayarlayıcıSürelerHatalı kod.Geçersiz kodlama; lütfen yeniden adlandırınGeçersiz dosya. Lütfen yedekten yükleyin.Hatalı şifre.Kartınızda geçersiz özellik bulundu. Lütfen Araçlar>Veritabanını Kontrol Et'i kullanın, ve problem tekrarlanırsa, lütfen destek sitesine sorun.Geçersiz düzenli ifade.Durdurulmuştur.İtalik metin (Ctrl+I)JS hatası, satır: %(a)d: %(b)sCtrl+Shift+T ile etiketlere geçiş yapınKoruLaTeXLaTeX eşitliğiLaTeX matematik ort.SapmalarSon KartSon Gözden GeçirmeSon eklenen ilkÖğrenmeİleri limiti öğrenmeÖğrenme: %(a)s, Gözden Geçirme: %(b)s, Tekrar Öğrenme: %(c)s, Filtrelenmiş: %(d)sÖğrenmeYakaSömürü hareketiSömürü eşiğiSolSınırlaYükleniyor...Hesabı şifre ile kilitleyin, ya da boş bırakın.En uzun süreAlanda bakın:En düşük kolaylıkYönetNot Tiplerini Yönet...Eşle %sEtiketleri EşleİşaretleNotu İşaretleNotu İşaretle (Ctrl+K)İşaretlendiGeçmişEn fazla süreEn fazla gözden geçirme/günİçerikEn düşük süreDakikaYeni kartları ve gözden geçirmeleri karıştırMnemosyne 2.0 Deste (*.db)DiğerEn yüksek sapmalarKartları TaşıDesteye Taşı (Ctrl+D)Kartları desteye taşı:N&oteAd mevcut.Deste adı:Ad:AğYeniYeni KartlarDestedeki yeni kartlar: %sSadece yeni kartlarYeni kartlar/günYeni deste adı:Yeni süreYeni ad:Yeni not tipi:Yeni seçenekler grubu adı:Yeni sıralama (1...%d):Bir sonraki gün başlarHenüz zamanı gelmiş kart yok.Girdiğiniz kritere uygun kart bulunamadı.Boş kart bulunamadı.Bugün çalışılan geçmiş kart yok.Kullanılmayan ya da eksi belge bulunmadı.NotNot KimliğiNot TipiNot TipleriNot ve ona ait %d kart silindi.Not ve ona ait %d kart silindi.Not saklandı.Not askıya alındı.Not: İçerik yedeklenmedi. Güvenlik için lütfen Anki klasörünüzün periyodik yedeklemesini oluşturun.Not: Bazı tarihçeler eksik. Daha fazla bilgi için lütfen tarayıcı belgelerine bakın.Düz Metinli NotlarEn az bir alan gereken notlar.Notlar etiketlndi.HiçbirşeyTamamEn eski görülen ilkBir sonraki senkronizasyonda değişiklikleri tek yönlü yapBir ya da daha fazla not içe aktarılamadı, çünkü kart oluşturmadılar. Bu boş alanlar olduğundan ya da metin dosyasındaki içeriğin doğru alanlarla eşleştirilmediğinden kaynaklanabilir.Sadece yeni kartlar tekrar sıralanabilir.Sadece bir alıcı aynı anda AnkiWeb'e ulaşabilir. Eğer önceki bir eşitleme başarısız olduysa, lütfen birkaç dakika sonra tekrar deneyin.AçOptimize ediliyor...İsteğe bağlı limit:Seçenekler%s için seçeneklerSeçenekler grubu:Seçenekler...SıralamaSıralama eklendiSıralama sonuArka şablonu değiştir:Yazi tipini değiştir:Ön şablonu değiştir:Paketli Anki Destesi (*.apkg *.zip)Şifre:Parolalar eşleşmiyorYapıştırPano resmini PNG olarak yapıştırPauker 1.8 Dersi (*.pau.gz)YüzdePeriyot: %sYeni kart sırasının sonuna yerleştirGözden geçirme sırasına aralıkla yerleştir:Lütfen ilk olarak başka bir not tipi ekleyin.Lütfen bekleyin; bu bir süre alabilir.Lütfen mikrofon bağlayın ve diğer uygulamaların ses cihazını kullanmadığına emin olun.Lütfen bir profil açıkken ve Anki meşgul değilken sağlayın, sonra tekrar deneyin.Lütfen PyAudio yükleyinLütfen mplayer yükleyinLütfen önce bir profil açın.Lütfen Araçlar>Boş Kartlar çalıştırınLütfen bir deste seçinLütfen sadece bir not türünden kartlar seçin.Lütfen bir şey seçin.Lütfen Anki'nin son sürümüne güncelleyin.Lütfen bu dosyayı içe aktarma için Dosya>İçe Aktar'ı kullanın.Lütfen AnkiWeb'i ziyaret edin, destenizi güncelleyin, sonra tekrar deneyin.KonumSeçeneklerÖnizlemeSeçilen Kartı Önizle (%s)Yeni kartları önizleSon eklenen yeni kartları önizleİşleniyor...Profil Parolası...Profil:ProfillerVekil sunucu kimlik doğrulaması gerekli.SoruÇıkRastgeleKarışık SıraDeğerlendirmeGüncellemeye HazırYeniden oluşturKendi Sesiniz KaydedinSes Kayıt (F5)Kayıtediliyor...
Zaman:%0.1fTekrar ÖğrenEklerken son girişi hatırlaEtiketleri KaldırBiçimlendirmeyi kaldır (Ctrl+R)Bu kart türünü kaldırmak bir veya daha fazla notun silinmesine neden olabilir. Lütfen önce yeni bir kart türü oluşturun.Yeniden AdlandırDesteyi Yeniden AdlandırSesi TekrarlaKendi Sesinizi TekrarlayınYeniden KonumlandırYeniden PlanlamaYazı yönünü değiştir (RTL)Gözden GeçirTekrarlar&Tümünü SeçCevabı GösterBazı ayarlar Anki yeniden başlatıktan sonra geçerli olacaktır.Yalın yazıyı yapıştırıyorken, HTML kodlarını sil.Askıya AlAskıya AlındıMedya Eşzamanlanıyor...EtiketlerGeri al %sVersiyon %sŞimdi indirmek istermisin ?Yazan Damien Elmes, Yamalar, çeviri, test etme ve tasarımlar:

%(cont)sgünlereşlenmiş %sEşlenmiş Etiketlerdksaniyebu sayfatüm koleksiyon~anki-2.0.20+dfsg/locale/sk/0000755000175000017500000000000012256137063015131 5ustar andreasandreasanki-2.0.20+dfsg/locale/sk/LC_MESSAGES/0000755000175000017500000000000012234216063016710 5ustar andreasandreasanki-2.0.20+dfsg/locale/sk/LC_MESSAGES/anki.mo0000644000175000017500000007033412252567246020212 0ustar andreasandreasY  "# %/B8T"$$&5\"{$ %:0R& (  ,3 ` *s  ,  ( (!,!0!4!9!=! A!K!T!g!p! v!!!!! !!! !! !!!"""/"B"I"0O" "" " """"""j#l#o#t#|######T###,$(3$\$!{$$f$% 2%?% Q% ^%i%y%%%e%&7& & '5'XR'Y'8( >( J(U(Y( t( ~(( ( (( (((( ($() )') 7) A)%L)Kr))N)""*E*#\++++ ,,A-S-R-v*.w.7/ Q/w]/E/@0\0c0r0Rz00P1#k1#11 11( 252 =2J2 ^2k222 2 22222233+3L33333333 3 3)3''4O4 5555&5-555 N5 X5 b5m5 555 5355S5J6S6Z6 a6 o6{6666"666&7 /7;7 B7N7 _7 k7u7{7777-777(7&8588 n8|888858P87J999 99999 9999: ::::%:,:3: :: G: T: a: n: {: : :::: : ::: :; ;!;6;P;i;z;~;; ; ; ;; ;/; <<(<%0<V< ]< h< u< < < < < <<,<(=-=K= `=Fj=N=P>>Q>P>>>]? f?8r?? ???)?@0@ B %B /B yCGCGD;HD3DVD E&0ECWEREVE)EF%oF:F FF:F,GhEhLhSh Zh gh th h h h h hhhh hhhii.iGiZijiii i3iiijj0j9j1Njjj j.j jjjkk/kEk[kpkk+k5k,l /lPl_llms0nn Ko(YonooJoBp Spapwp7pp2.D!aKIG  5*cqhS3=U8UQ:J`O= %_ L S"<}"x#(Az 7nC-X&9sK BXH)9>:OT@A $Z{MP0;&!1i'<gG/WY,DR?47%*0EH#MVE8F Npob;F] t\+(-.Q/^,|12f56d+vklwju$JT6'Vye>)B NCm4W@R YIP[rL3~? Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...Project-Id-Version: anki Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-02 18:28+0000 Last-Translator: Radoslav Šopoň Language-Team: Slovak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Zastaviť (1 z %d) (zakázať) (povoliť) Má %d kartu. Má %d karty. It has %d kariet.%% Správne%(a)0.1f %(b)s/deň%(a)0.1fs (%(b)s)%(a)d z %(b)d poznámok aktualizovaná%(a)d z %(b)d poznámok aktualizovaných%(a)d z %(b)d poznámok aktualizovanýchNahrané: %(a)dkB, stiahnuté: %(b)dkB%(tot)s %(unit)s%d karta%d karty%d karietvymazaná %d karta.vymazané %d karty.vymazaných %d kariet.exportovaná %d karta.exportované %d karty.exportovaných %d kariet.importovaná %d karta.importované %d karty.importovaných %d kariet.naučená %d kartanaučené %d kartynaučených %d kariet%d karta/minútu%d karty/minútu%d kariet/minútu%d kolekcia aktualizovaná.%d kolekcie aktualizované.%d kolekcií aktualizovaných.%d skupina%d skupiny%d skupiny%d poznámka%d poznámky%d poznámok%d poznámka pridaná%d poznámky pridané%d poznámok pridaných%d poznámka importovaná.%d poznámky importované.%d poznámok importovaných.%d poznámka aktualizovaná%d poznámky aktualizované.%d poznámok aktualizovaných%d opakovanie%d opakovania%d opakovaní%d vybraná%d vybrané%d vybraných%s už existuje na vašom osobnom počítači. Prepísať?%s kópia%s deň%s dni%s dní%s deň%s dni%s dní%s vymazaných.%s hodina%s hodiny%s hodín%s hodina%s hodiny%s hodín%s minúta%s minúty%s minút%s minúta.%s minúty.%s minút.%s minúta%s minúty%s minút%s mesiac%s mesiace%s mesiacov%s mesiac%s mesiace%s mesiacov%s sekunda%s sekundy%s sekúnd%s sekunda%s sekundy%s sekúnd%s k vymazaniu:%s rok%s roky%s rokov%s rok%s roky%s rokov%sdní%shod%smes%smes%ss%sr&O aplikácii...&Rozšírenia&Kontrola databázy...&Bifľovať...&Upraviť&Exportovať...&Súbor&Nájsť&Prejsť na&Príručka&Príručka...&Pomocník&Importovať&Importovať...&Invertovať výber&Nasledujúca karta&Otvoriť zložku s rozšíreniami...&Predvoľby...Pre&dchádzajúca karta&Preplánovať...Podporte &Anki...&Prepnúť profil...&Nástroje&Vrátiť späť'%(row)s' malo %(num1)d polí, namiesto očakávaných %(num2)d(%s správne)(koniec)(filtrované)(uči sa)nový(rodičovský limit: %d)(prosím, vyberte si 1 kartu)...Súbory .anki2 nie sú určené pre importovanie. Ak sa snažíte obnoviť údaje zo zálohy, prosím nazrite do sekcie 'Zálohovanie' v návode pre používateľa./0 dní1 101 mesiac1 rok10.0022.003.004.0016.00Vyskytla sa chyba 504 gateway timeout. Prosím, skúste dočasne zakázať antivírovú aplikáciu.: a%d karta%d karty%d karietOtvoriť zložku so zálohamiNavštíviť webovú stránku%(pct)d%% (%(x)s z %(y)s)%Y-%m-%d @ %H:%MZálohy
Anki vytvorí zálohu vašej kolekcie pri zatvorení alebo synchronizácii.Formát exportu:Nájsť:Veľkosť písma:Písmo:V:Zahrnúť:Veľkosť riadku:Nahradiť:SynchronizáciaSynchronizácia
Nie je momentálne povolená. Povolíte ju kliknutním na tlačidlo 'Synchronizácia' v hlavnom okne.

Je potrebný účet

Na synchronizáciu vašej kolekcie je potrebný bezplatný účet. Zaregistrujte si účet a potom zadajte svoje údaje nižšie.

Anki aktualizované

Vyšla nová verzia Anki %s.

Veľká vďaka všetkým ľuďom, ktorí nám poskytli návrhy na zlepšenie, nahlásili chyby a darovali finančné prostriedky.Nenáročnosť karty je veľkosť nasledujúceho intervalu, pokiaľ pri skúšaní odpoviete "Dobre".Súbor s názvom collection.apkg bol uložený do vašeho osobného počítača.Prerušené: %sO AnkiPridaťPridať (skratka: ctrl+enter)Pridať polePridať médiáPridať novú kolekciu (Ctrl+N)Pridať typ poznámkyPridať rub kartyPridať štítkyPridať novú kartuPridať k:Pridať: %sPridanéPridané dnesPridaný duplikát s prvým poľom: %sZnovuDnes znovuPočet Znovu: %sVšetky kolekcieVšetky poliaVšetky karty v náhodnom poradí (Bifľovací mód)Všetky karty, poznámky a médiá pre tento profil budú odstránené. Ste si istí?Povoliť HTML v poliachV rozšírení sa vyskytla chyba.
Prosím, pošlite ju do fóra rozšírení:
%s
Pri otváraní %s sa vyskytla chybaVyskytla sa chyba. Môže byť zapríčinená chybou aplikácie,
alebo problémom vo vašej kolekcii.

Aby sa potvrdilo, že problém nie je vo vašej kolekcii, prosím spustite Nástroje > Skontrolovať databázu.

Ak sa tým problém nevyrieši, prosím, skopírujte nasledujúci text
do hlásenia chyby:Obrázok bol uložený na váš počítač.Ankibalík Anki 1.2 (*.anki)Anki 2 ukladá vaše kolekcie do nového formátu. Tento sprievodca automaticky skonvertuje vaše kolekcie do tohoto formátu. Pre vaše pôvodné kolekcie bude pred aktualizáciou vytvorená záloha, takže pokiaľ sa rozhodnete vrátiť k predošlej verzii Anki, vaše kolekcie budú stále použiteľné.Balík Anki 2.0Anki 2.0 podporuje automatickú aktualizáciu len z verzie Anki 1.2. Pokiaľ chcete nahrať staršie kolekcie, prosím otvorte ich v Anki 1.2, aby sa aktualizovali a potom ich importujte do Anki 2.0.Balík AnkiAnki nemohol rozoznať otázku od odpovedi. Prosím upravte šablónu ručne, aby bolo možné prepínať medzi otázkou a odpoveďou.Anki je prívetivý, inteligentný výukový systém typu "spaced learning". Je zdarma a má otvorené (open source) zdrojové kódy.Anki je licencovaný AGPL3 licenciou. Pre viac informácií si prosím prečítajte licenčný súbor v zdrojovej distribúcii.Anki nebol schopný načítať váš pôvodný konfiguračný súbor. Pre importovanie vašich kolekcií z predchádzajúcej verzie Anki použite prosím menu Súbor > Importovať.AnkiWeb ID alebo heslo nie sú správne; prosím, skúste ich zadať znovu.AnkiWeb ID:V AnkiWeb sa vyskytla chyba. Prosím, skúste akciu opakovať o niekoľko minút. Pokiaľ problém bude pretrvávať, vyplňte prosím hlásenie o chybe.AnkiWeb je v tejto chvílu príliš zaneprázdnený. Prosím, skúste akciu opakovať o niekoľko minút.Na AnkiWebe sa momentálne vykonáva údržba. Prosím, skúste akciu opakovať o niekoľko minút.OdpoveďTlačidlo odpovediOdpovedeAntivírový software alebo firewall bráni Anki pripojiť sa na internet.Karty, ktoré nie sú na nič mapované, budú zmazané. Ak už v poznámke nezostávajú žiadne karty, bude poznámka stratená. Skutočne chcete pokračovať?Vyskytuje sa dva razy v súbore: %sSte si istí, že si prajete odstrániť %s?Je potrebný aspoň jeden typ karty.Je potrebný aspoň jeden krok.Pripojiť obrázok/zvuk/video (F3)Automaticky prehrať zvukAutomaticky synchronizovať pri otvorení a zavretí profiluPriemerPriemerný časPriemerný čas odpovediPriemerná nenáročnosťPriemer za študijné dniPriemerný intervalSpäťNáhľad rubuŠablóna rubuZálohyZákladnýZákladný (plus obrátená karta)Základný (plus voliteľná obrátená karta)Tučný text (Ctrl+B)PrehliadaťPrehliadať && inštalovať...PrehliadačPrehliadač (zobrazená %(cur)d karta; %(sel)s)Prehliadač (zobrazené %(cur)d karty; %(sel)s)Prehliadač (zobrazených %(cur)d kariet; %(sel)s)Zobrazenie v prehliadačiMožnosti prehliadačaZostaviťHromadné pridanie štítkov (Ctrl+Shift+T)Hromadné odobratie štítkov (Ctrl+Alt+T)SkryťSkryť kartuSkryť poznámkuSkryť súvisiace nové karty do ďalšieho dňaSkryť súvisiace hodnotenia do ďalšieho dňaAnki implicitne deteguje znak medzi poliami, ako je tabulátor, čiarka a iné. Ak ho Anki deteguje nesprávne, môžete ho vložiť sem. ako tabulátor použite \t.ZrušiťKartaKarta %dKarta 1Karta 2ID kartyInformace o kartě(Ctrl+Shift+I)Seznam karetTyp kartyTypy karettypy karet pro %sKarta skrytá.Karta pozastavená.KartyTypy karietKarty nemôžu byť ručne presunuté do filtrovanej kolekcieKarty ako obyčajný textKarty budú automaticky vrátené do ich originálnych kolekcií po tom, čo si ich zopakujete.Karty...Na stredZmeniťZmeniť %s na:Zmeniť kolekciuZmeniť typ poznámkyZmeniť typ poznámky (Ctrl+N)Zmeniť typ poznámky...Zmeniť farbu (F8)Zmeniť kolekciu v závislosti na type poznámkyZmenenéSkontrolovať &médiáSkontrolovať súbory v zložke médiíKontrolujem...VybraťVybrať kolekciuVybrať typ poznámkyVybrať značkyNaklonovať: %sZatvoriťZatvoriť a zrušiť momentálne vkladané údaje?VyplňovaťVymazať vyplnenie (Ctrl+Shift+C)Kód:Kolekcia je poškodená. Prosím pozrite si inštrukcie v manuáli.DvojbodkaČiarkaNastaviť jazykové rozhranie a možnostiPotvrdenie hesla:Blahoželáme! Práve ste dokončili túto kolekciu.Pripája sa...PokračovaťKopírovaťUpraviť odpovede na zrelých kartách: %(a)d/%(b)d (%(c).1f%%)Správne: %(pct)0.2f%%
(%(good)d z %(tot)d)Nemôžem sa pripojiť na AnkiWeb. Prosím skontrolujte vaše sieťové pripojenie a skúste to znovu.Nemôžem nahrávať zvuk. Máte nainštalovaný lame a sox?Nemôžem uložiť súbor: %sBifľovaťVytvoriť kolekciuVytvoriť filtrovanú kolekciu...VytvorenéCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZSúhrnnýKumulatívny: %sKumulatívne odpovedeKumulatívne kartyAktuálna kolekciaAktuálny typ poznámky:Vlastné štúdiumVlastná lekciaVlastné kroky (v minútach)Upraviť karty (Ctrl+L)Upraviť poliaVystrihnúťDatabáza bola zrekonštruovaná a optimalizovaná.DátumŠtudované dníZrušiť oprávnenieKonzola na ladenie.KolekciaPreskočiť kolekciuKolekcia bude importovaná pri otvorení profilu.KolekcieZnížiť intervalyVýchodzíOdklad, než budú opakovania znovu ukázané.OdstrániťOdstrániť %s?Odstrániť kartyOdstrániť kolekciuOdstrániť prázdneOdstrániť poznámkuOdstrániť poznámkyOdstrániť štítkyOdstrániť nepoužitéOdstrániť polia z %s?Odstrániť '%(a)s' typ karty, a jej %(b)s?Odstrániť tento typ poznámky a všetky jeho karty?Odstrániť tento nevyužitý typ poznámky?Odstrániť nevyužité médiá?Odstrániť...Odstránená %d karta s chýbajúcou poznámkou.Odstránené %d karty s chýbajúcou poznámkou.Odstránených %d kariet s chýbajúcou poznámkou.Odstránená %d karta s chýbajúcou šablónou.Odstránené %d karty s chýbajúcou šablónou.Odstránených %d kariet s chýbajúcou šablónou.Odstránená %d karta s chýbajúcim typom poznámky.Odstránené %d karty s chýbajúcim typom poznámky.Odstránených %d kariet s chýbajúcim typom poznámky.Odstránená %d poznámka bez kariet.Odstránené %d poznámky bez kariet.Odstránených %d poznámok bez kariet.Odstránená %d poznámka s nesprávnym počtom polí.Odstránené %d poznámky s nesprávnym počtom polí.Odstránených %d poznámok s nesprávnym počtom polí.Odstránené.Odstránené. Prosím reštartujte Anki.Odstránenie tejto kolekcie zo zoznamu kolekcií vráti všetky zostávajúce karty do ich pôvodnej kolekcie.PopisPopis pre zobrazenie na študijnej obrazovke (len pre aktuálnu kolekciu):Dialógové oknoZrušiť polePrevzatie zlyhalo: %sPrevziať z AnkiWebuPreberanie bolo úspešné. Prosím, reštartujte Anki.Preberám z Ankiwebu...anki-2.0.20+dfsg/locale/zh_HK/0000755000175000017500000000000012256137063015517 5ustar andreasandreasanki-2.0.20+dfsg/locale/zh_HK/LC_MESSAGES/0000755000175000017500000000000012065014111017266 5ustar andreasandreasanki-2.0.20+dfsg/locale/zh_HK/LC_MESSAGES/anki.mo0000644000175000017500000001023312252567246020570 0ustar andreasandreas_  *2G \f lw}       % + 2 7 > E M Y _ e k y ~              # 0 = J Q X ` d x                   " ( . 6      $ + 9 E S _ k w      % 2?D KU \fm t~    #*18? F S ` m z    ") 0:AH O\cgnu |'^GD.%MJ N"YQ+,>] WI2/)@B [&<LR\KU$S?O#X3-AHFEV=0Z645T* 78 :1P9C;_( ! Stop%%d selected%d selected%s copy%s minute%s minutes%s second%s seconds&About...&Edit&Export...&File&Find&Go&Help&Import&Next Card&Preferences...&Previous Card&Reschedule...&Tools&Undo(new)/1 month:AddAdd MediaAdd TagsAnkiAverageBackBrowseBrowserBuildCancelCardCenterChangeChangedChecking...CloseCode:ColonConnecting...CopyCreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+UCtrl+ZDefaultDueError executing %s.Error running %sExtraForecastFrontHoursIntervalLearnLearningLeftMinutesPercentagePositionRandomReviewReview CountReviewsRightSuspendedTextTotalUnseenYounghoursminutesProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:09+0000 Last-Translator: Damien Elmes Language-Team: Chinese (Hong Kong) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) Language: zh_HK 停止%已選擇 %d 個%s 複本%s 分鐘%s 秒關於 &A ...編輯 (&E)匯出(&E)...檔案 (&F)尋找 (&F)移至 (&G)說明 (&H)匯入 (&I)下一張名片(&N)偏好設定(&P)...上一張名片(&P)重新排程採購項目 &R ...工具 (&T)復原(&U)(新增)/1 個月:新增新增媒體加入標籤Anki平均上一頁瀏覽瀏覽器製造取消信用卡中心更改已更改檢查中...關閉編碼:冒號正在連接...複製建立日期Ctrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+UCtrl+Z預設值到期執行 %s 發生錯誤。執行 %s 時發生錯誤額外預測前小時間隔學習學習左側分鐘百份比職稱隨機檢閱評論計數評論右暫停文字全部未閱讀年輕小時分鐘anki-2.0.20+dfsg/locale/pt/0000755000175000017500000000000012256137063015137 5ustar andreasandreasanki-2.0.20+dfsg/locale/pt/LC_MESSAGES/0000755000175000017500000000000012065014111016706 5ustar andreasandreasanki-2.0.20+dfsg/locale/pt/LC_MESSAGES/anki.mo0000644000175000017500000004374212252567246020223 0ustar andreasandreas lgXY `kr"x 8 "$>$c&"$2 Wx&(2,Iv*, (>BFJOS Waj}     +<OV0\  IKNS[bglptx(!fw   eh7 J5TX   - ; D Q Y a m s  K   !"R""# #&# .#;#L#Q#W#\#$ $ )$3$ 9$E$L$ S$&a$$$$-$($ %%%$%+%2%9% @%M% T%_% %%%% %% %%%%%%%%&$& +&5&8& T&b&i&r&& &&&& &&$&&&F&A'Z'm't''' ' ''' '''( (( #( -(9(@(G(O(T( \(f(n( s(}( ( (((( ( ( (() ) ) )>)\)6{))))))&**.*(Y*1*'*8* + +!,+N+V+ ]+"h+W++ ++++,&, +,7. >. I. V.4`.. .?... /="/3`/+/3/%//0J0f0'0%0)00 1 21<1&K1r1(111,12(2?2.V222&2222222 2 223 3,3 53@3D3J3S3 Z3 d3q33333 333 4454T4 ]4j4q44254575<5C5I5N5S5W5[5_5:u5 5!55q 6}6666 6677s/774R8 8K8]8 <9 I9S9r9"9999 9 9: ::/:E:JU::::;;M<< <#<= =-=>=E=M=V=?>H>Z>j>s>>>>/>>$>>8?,>?k??????? ?? ?(??@@@@-@6@F@ L@W@^@ e@@@@@ @@@AA!A*ACAYA kAuA|A AAAAAJA B"B>BGB_B#xBB BBBBB BC CC +C!7CYCaChCpCuC zCCCC C CCCC C CDD ,D6D>DPD*aD*D*D<D%E EEOE hErE/E+E)E.F+@F9lF F F+F FF F GS*G~G GGG G#GGB7;ThJ~HRwqk\L5Qs<iYu N dPpfGy, ?aK(W DO:M]0S{#nt2`/I&m69exF v![3"A=1%'V)l}o |*@+ -.gzUCb_rXZc^$84Ej> Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s copy%s day%s days%s day%s days%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(filtered)(learning)(new)(parent limit: %d).anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM andOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.About AnkiAddAdd (shortcut: ctrl+enter)Add MediaAdd New Deck (Ctrl+N)Add Note TypeAdd TagsAdd new cardAdd to:Add: %sAdded TodayAgainAgain TodayAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki is a friendly, intelligent spaced learning system. It's free and open source.Answer ButtonsAnswersAppeared twice in file: %sAverageAverage TimeAverage intervalBackBasicBuryBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCard ListCard TypeCardsCards TypesCenterChangeChange %s to:Check the files in the media directoryCloseClose and lose current input?ClozeCollection is corrupt. Please see the manual.Configure interface language and optionsConnecting...CramCreatedCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZCumulativeDatabase rebuilt and optimized.Days studiedDeckDefaultDeleteDelete TagsDialogDiscard fieldE&xitEaseEasyEditEnter tags to add:Enter tags to delete:Error executing %s.Error running %sExportExport...F1Field %d of file is:Field mappingFieldsFil&tersFind and Re&place...Find and ReplaceFirst ReviewForecastFrontGoodHTML EditorHardHave you installed latex and dvipng?HelpHoursIf you have contributed and are not on this list, please get in touch.If you studied every dayIgnore this updateImportImport failed. Import optionsInclude scheduling informationInclude tagsIntervalsInvalid regular expression.KeepLatest ReviewLearnLearningLeechLeftLongest intervalMap to %sMap to TagsMarkedMatureMinutesMoreNetworkNote TypeNothingOpenPassword:PositionPreferencesProcessing...Record audio (F5)Recording...
Time: %0.1fRelearnRescheduleReview CountReview TimeReviewsRightSelect &AllShow AnswerShow new cards before reviewsShow new cards in order addedShow new cards in random orderSome settings will take effect after you restart Anki.Supermemo XML export (*.xml)SuspendSyncing Media...TagsThat deck already exists.The division of cards in your deck(s).The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The time taken to answer the questions.This file exists. Are you sure you want to overwrite it?Total TimeTotal notesTreat input as regular expressionUndo %sUnseenVersion %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYoungYoung+Learnddaysmapped to %smapped to TagsminsProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-02-20 23:26+0000 Last-Translator: pedro jorge oliveira Language-Team: Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) X-Poedit-Country: PORTUGAL Language: pt X-Poedit-Language: Portuguese Stop (1 de %d) (Desligado) (Ligado) Ele tem o cartão de %d Ele tem os cartões de% d.%% Correto%(a)d de %(b)d nota atualizada%(a)d de %(b)d notas atualizadas%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d cartão%d cartões%d do cartão está eliminado%d dos cartões está eliminado%d do cartão exportado.%d dos cartões exportado.%d cartão importado%d cartões importados%d do cartão em estudo.%d dos cartões em estudo.%d cartão/minuto%d cartões/minutos%d baralho actualizado%d baralhos actualizados%d do grupo.%d dos grupos%d da nota.%d das notas.%d nota adicionada%d notas adicionadas%d nota importada%d notas importadas%d nota actualizada%d notas actualizadas%d revisão%d revisões%d selecionado.%d selecionadas.%s cópia%s dia%s dias%s dia%s dias%s hora%s horas%s hora%s horas%s minuto%s minutos%s minuto.%s minutos.%s minuto%s minutos%s mês%s meses%s mês%s meses%s segundo%s segundos%s segundo%s segundos%s para eliminar:%s ano%s anos%s ano%s anos%sd%sh%sm%smo%ss%sy&Sobre...ExtensõesVerificar base de dados...&Editar&Exportar...&Arquivo&Pesquisar&Ir&Guia&Guia...&Ajuda&Importar&Importar...&Inverter a Selecção&Próximo CartãoAbrir Pasta de Extensões&Preferências...&Cartão Anterior&Reagendar...&Suporte Anki...Cambiar Perfil..&Ferramentas&Anular'%(row)s' tiveram %(num1)d campos, esperados %(num2)dfiltradaaprendizagem(novo)(limite relativo: %d).anki2 arquivos não são projetados para a importação. Se você está tentando restaurar um backup, por favor, consulte a secção dos "backups" do manual do usuário./0d1 101 mês1 ano10AM10PM3AM4AM4PM<-! Sobre o diag -> eAbrir pasta de cópias de segurançaVisitar website%(pct)d%% (%(x)s de %(y)s)%Y-%m-%d @ %H:%M Backups
Anki irá criar um backup de sua coleção cada vez da que está fechado ou sincronizados.Formato de exportação:Procurar:Tamanho da Letra:Tipo de Letra:Em:Tamanho da Linha:Substituir Com:Sincronização Sincronização
Não está habilitado, clique no botão Sincronizar na janela principal para ativar.

Conta necessária A conta gratuita é necessário para manter sua coleção sincronizados. Registe-se para uma conta, insira seus dados abaixo

Anki Atualizado %s foi liberado.

Muito obrigado a todas as pessoas que forneceram sugestões, relatórios de erro e doações.Sobre o AnkiAdicionarAdicionar (atalho: ctrl+enter)Adicionar MédiaAdicionar nova plataforma (Ctrl+N)Adicionar tipo de nota.Adicionar EtiquetasAdicionar novo cartão.Adicionar a:Adicionar: %sAdicionado HojeOutra VezOutra vez hoje.todas as plataformas.Todos os CamposTodos os cartões e media para este perfil serão eliminados. Tem certeza?AnkiBaralho Anki 1.2 (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Baralho Anki 2.0Anki 2.0 Só suporta atualizações automáticas de Anki 1.2. Para carregar de plataformas mais antigas, por favor abra-os no Anki 1.2 para atualizá-los e depois exportá-los para Anki 2.0.Anki é um sistema de aprendizagem espaçado. É grátis e de código aberto.Botões de RespostasRespostasApareceu duas vezes no ficheiro: %sMédiaTempo MédioIntervalo médioRecuarSimplesEnterrarPor defeito, o Anki irá detectar o caracter entre campos, tal como uma tabulação, vírgula, e por aí fora. Se o Anki detectar o caracter incorrectamente, você pode introduzi-lo aqui. Utilize \t para representar uma tabulação.CancelarLista de cartõesTipo de CartãoCartõesTipos de CartõesCentroAlterarMudar %s para:Verificar os ficheiros no directório de médiaFecharFechar e perder introdução actual?ClozeA coleção está corrupta. Por favor consulte o manual.Configurar linguagem da interface e opçõesA estabelecer ligação...MarrarCriadoCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZAcumuladoBase de dados reconstruída e otimizada.Dias estudadosBaralhoPadãoApagarApagar EtiquetasDiálogoDescartar campoS&airFacilidadeFácilEditarIntroduza etiquetas a adicionar:Introduza etiquetas a apagar:Erro ao executar %s.Erro ao executar %sExportarExportar...F1Campo %d do ficheiro é:Mapeamento de camposCamposFil&trosProcurar e Substituir...Procurar e SubstituirPrimeira RevisãoPrevisãoFrenteBomEditor HTMLDifícilJá instalou latex e dvipng?AjudaHorasSe você contribuiu e não está nesta lista, por favor entre em contacto.Se estudou todos os diasIgnorar esta actualizaçãoImportarFalhou a importação. Opções de importaçãoIncluir informação de agendamentoIncluir etiquetasIntervalosExpressão regular inválida.ManterÚltima RevisãoAprenderAprendizagemEsponjaEsquerdaIntervalo mais longoMapear a %sMapear em relação às EtiquetasMarcadoMaduroMinutosMaisRedeTipo de NotaNadaAbrirSenha:PosiçãoPreferênciasA processar...Gravar áudio (F5)A gravar...
Tempo: %0.1fReaprenderReagendarContagem de RevisõesTempo da RevisãoRevisõesDireitaSeleccionar &TudoMostrar RespostaMostrar novos cartões antes das revisõesMostrar novos cartões na ordem adicionadaMostrar novos cartões em ordem aleatóriaAlgumas definições só têm efeito após reiniciar o Anki.Exportação de Supermemo XML (*.xml)SuspenderA sincronizar média....EtiquetasEsse baralho já existe.A divisão de cartões no(s) seu(s) baralho(s).O número de questões a que já respondeu.O número de revisões a fazer no futuro.O número de vezes que pressionou cada botão.O tempo usado para responder às questões.O ficheiro já existe. De certeza que quer reescrevê-lo?Tempo TotalNotas totaisTratar introdução como expressão regularDesfazer %sPor verVersão %sGostaria de o transferir agora?Escrito por Damien Elmes, com adições, tradução, testes e design de:

%(cont)sNovoNovo+Aprenderddiasmapeado em relação a %smapeado quanto às Etiquetasminsanki-2.0.20+dfsg/locale/gl/0000755000175000017500000000000012256137063015116 5ustar andreasandreasanki-2.0.20+dfsg/locale/gl/LC_MESSAGES/0000755000175000017500000000000012203732251016673 5ustar andreasandreasanki-2.0.20+dfsg/locale/gl/LC_MESSAGES/anki.mo0000644000175000017500000017400012252567245020171 0ustar andreasandreas0C3(D)D 0D;DBD"HDkD mDwD8DDDD"D$!E$FE&kEE"EEEE$F :F[FpF0FFF&F FG(G=GRG,iGG*GG,G H$H(5H^HbHfHjHoHsH wHHHHH HHHHH HHH HH II&I6IEITIeIxII0I II I IIIIJJJJJJJJJJJJTJ$K&K,BePeee]e Wf8cff fff)fg!g%g 4gAgGgLg Qg \gjgog wg gggg g!ggg)g0hNhdh4hh!hhhhhi+il Rl^l$clll lllll.lFl;mTm tm4mmm m1m nn=nLn*`n nn nn"n"o +oLoaofouooo o o)ooop+p@p^p}ppppp p pppp<p.q7q =qJqZq_q hq+sqqq qqq q qq r rr&r-r>rRrXrirqrrr r rrrr rr sss s)s?s Ns\s ks xssssss+st#%t!Itkt pt zt<t tt]ta=uu!uuuu,uv#v w ww.w6wEw Tw_w ew qw{www wwwwx x (x3x,Rx#x)xVx8$yE]yyyyy z,!zNz-gz+z8zz {{{2{#D{ h{v{{{{{{ {{{{{|||0|B|^|f| ||i|} } *}7} H}S} h}"v}} }1} }} ~'~ .~ ;~ G~T~d~~-~~~~ ~ ~ * 1 =KVc ,WG  .; CO_qʁ*'!<^6d !?Ȃ . <GM`w  ƃ у ߃ +>[v ~ *Ä!d4  ˅م(ޅ !BX]+"&,0F+w>UF8*(1ӈIO'?tg#܊dee8ˋC(،rty au{M?E K V b!n'ۏ.#&Ry &ʐܐ,! (3UR$8Ց"WBS0$"Dg m y{^ _iqw  ÔȔΔ (0 6@QS# +6 E"Qt vA%֗ -$-R-1$-3F#W'{)͙ 4 8B(S|(Śښ,'.V.m& 3; C OYae lv } $% : G6Q ԝŞrɞ<>2R=#ß! #ĠӠ  7OfB עCd:qCU fs{Ƥ  9 DPY)h ѥ(a lS٦=&6]bz:ThVܫA~ЬRO:ݭ JO$ܮ)!Kj 7  +L\d|$ɰ [* +)  ;1mdm u 'γ޳8A?R^  &4E\|+յ/޵&5M cn&u#Ķ.Ͷ . <,U @5Z3s&θո 18?FMT[bip w ˹ ٹ ) =J_t!պ( /<SY,j-Ļ );K]s75ؼ$,3 `?lAW?Fg i HԿݿ%D ak    '19$Rw5F,N0/(*"!&"H!k ! ! :DDM*3DT\q 0 =Hd#v  -6 R\ b nx/8!(&OHfA+6E|2 '(.:1i'* - BL ep> ."J mw} $H i t~ < , :F fs  !7QWi{,@T cn2#'>.f ]#:b/&Elqy;0 + 0> Qr $ $ /(</e#1c=O[ &"I)]"43 $ . ;)Hr6 #%.BV\ dq $.pH 6)F p |A!&#*=M_+u1 -9&? fr#^ ,9A('`A+  ",A*n) D7),a 8 &? FT[n  ( <1J|%  $#,Hu9ta r~ 2(<W\6.,G:g)OeU*)/-A]*s#<q`l:?z>40sq :GbAU $0B(Qz':  !:AB-'&6< s }"K *E-sRJ$<a'{P  "-/5 ;IOW] w "mlTb&vgjh10RT'_:wCxy zn{|p` &F fF)WN1 nikSxV{IIa?BU^3H}!&baQ*A=Yr$o'/~\[30V7OY(*M.7X m$LDMN> Pv J ZqG\O((=/$G#<F*9B7REpEp4PWCee.RTu G]zO=Q,-D.Z0016Kd'I2S (%@KoD]+yj%~;6)/#-|#bBE&VgJv! t%qr3YUq/:J@h9s8,X~)dn%LM5f@t55H ! ur$j+AQ^W>l;-Z<fC ;KS}4U8dP    : 9"`6{["*c_i2zyl"?Xso'+H+.?g|^ctm\` e},kih< L wc->u_ws2N8a!] x#k,)A[4 Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBury related new cards until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To study outside of the normal schedule, click the Custom Study button below.TodayTotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesreviewssecondsstatsthis pagewhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-08-18 15:33+0000 Last-Translator: Miguel Anxo Bouzada Language-Team: Galician MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Parar (1 de %d) (desactivado) (activado) Ten %d tarxeta. Ten %d tarxetas.%% Acertos%(a)0.1f %(b)s/día%(a)d de %(b)d nota actualizada%(a)d de %(b)d notas actualizadas%(a)dkB enviados, %(b)dkB descargados%(tot)s %(unit)s%d tarxeta%d tarxetas%d tarxeta eliminada.%d tarxetas eliminadas.%d tarxeta exportada.%d tarxetas exportadas.%d tarxeta importada.%d tarxetas importadas.%d tarxeta estudiada en%d tarxetas estudiadas en%d tarxeta/minuto%d tarxetas/minuto%d feixe actualizado.%d feixes actualizados.%d grupo%d grupos%d nota%d notas%d nota engadida%d notas engadidas%d nota importada.%d notas importadas.%d nota actualizada%d notas actualizadas%d repaso%d repasos%d seleccionada%d seleccionadas%s xa existe no seu escritorio. Quere sobrescribilo?copiar %s%s día%s días%s día%s días%s eliminadas.%s hora%s horas%s hora%s horas%s minuto%s minutos%s minuto.%s minutos.%s minuto%s minutos%s mes%s meses%s mes%s meses%s segundo%s segundos%s segundo%s segundos%s para eliminar:%s ano%s anos%s ano%s anos%sd%sh%sm%smo%ss%sy&Sobre...&Complementos&Comprobar a base de datos...&Chapar&EditarExportar...&Ficheiro&Buscar&Ir&Guía&Guía...&Axuda&ImportarImportar...&Inverter a selección&Seguinte tarxeta&Abrir o cartafol de complementos...&Preferencias...&Tarxeta anterior&Reprogramar...&Apoia o Anki...&Cambiar o perfil...Ferramen&tas&Desfacer«%(row)s» ten %(num1)d campos, agardábanse %(num2)d(%s correctas)(fin)(filtrada)(aprendizaxe)(nova)(límite anterior: %d)(seleccione 1 tarxeta)...Os ficheiros .anki2 non foron deseñados para importalos. Se está tentando restaurar dunha copia de seguranza, vexa a sección «Copias de seguranza» do manual de usuario./0d1 101 mes1 ano10AM10PM3AM4AM4PMRecibiuse un erro 504 de tempo de espera esgotado para a pasarela. Tente desactivar temporalmente o seu antivirus.: e%d tarxeta%d tarxetasAbrir o cartafol de copias de seguranzaVisite o sitio web%(pct)d%% (%(x)s de %(y)s)%d-%m-%Y ás %H:%MCopias de seguranza
Anki creará unha copia de seguranza da súa colección cada vez que sexa pechado ou sincronizado.Formato de exportación:Buscar:Tamaño da letra:Tipo de letra:En:Incluír:Tamaño da liña:Substituír con:SincronizaciónSincronización
Actualmente non está activada; prema no botón de sincronización na pantalla principal para activala.

Requírese unha conta

Requírese unha conta gratuíta para manter a súa colección sincronizada. Rexístrese e introduza os seus datos embaixo.

Actualización do Anki

Anki %s está dispoñíbel.

O meu máis sincero agradecemento a todos os que fixeron suxestións, informes de fallos e doazóns.A facilidade dunha tarxeta é o tamaño do intervalo seguinte cando a súa resposta é «ben» nun repaso.Gardouse no seu escritorio un ficheiro chamado «collection.apkg».Interrompido: %sSobre o AnkiEngadirEngadir (atallo: ctrl+intro)Engadir un campoEngadir ficheiros multimediaAñadir un novo feixe (Ctrl+N)Engadir un tipo de notaEngadir reversoEngadir etiquetasEngadir unha nova tarxetaEngadir a:Engadir: %sEngadidaEngadidas hoxeEngadida duplicada con primeiro campo: %sDe novoDe novo hoxeConta de repeticións: %sTodos os feixesTodos os camposTodas as tarxetas ao chou (modo chapón)Van seren eliminadas todas as tarxetas, notas, e ficheiros multimedia deste perfil. Está seguro?Permitir HTML nos camposProduciuse un erro nun complemento
Infórmeo no foro de complementos:
%s
produciuse un erro ao abrir %sProduciuse un erro. Pode ter sido causado por un fallo menor,
tamén é probábel que o seu feixe teña un problema.

Para confirmar que non é un problema co seu feixe, execute Ferramentas > Comprobar a base de datos.

Se isto non soluciona o problema, copie o que segue
nun informe de fallos:Gardouse unha imaxe no seu escritorio.AnkiFeixe Anki 1.2 (*.anki)Anki 2 almacena os seus feixes nun novo formato. Este asistente converterá automaticamente os seus feixes a este formato. Farase unha copia de seguranza dos seus feixes antes de anovalos, polo que se necesita volver á versión anterior do Anki, poderá seguir usándoos.Feixe Anki 2.0Anki 2.0 só admite a anovación automática desde Anki 1.2. Para cargar feixes antigos, ábraos co Anki 1.2 para anovalos, e a seguir importeos ao Anki 2.0.Paquete de feixes do AnkiAnki non foi quen de atopar a liña de separación entre a pregunta e a resposta. Axuste o modelo manualmente para intercambiar a pregunta e a resposta.Anki é un sistema de aprendizaxe espazado intelixente e doado de usar. É de balde e de código aberto.Anki está licenciado baixo a licenza AGPL3. Consulte o ficheiro da licencia na distribución orixinal para obter máis información.Anki non foi quen de cargar o seu antigo ficheiro de configuración. Empregue Ficheiro > Importar para importar os seus feixes desde versións anteriores do Anki.O ID ou o contrasinal de AnkiWeb son incorrectos; tenteo de novo.ID de AnkiWeb:AnkiWeb atopou un erro. Tenteo de novo nuns minutos, se o problema persiste, agradecémoslle que envíe un informe de fallos.AnkiWeb está demasiado concorrido nestes momentos. Tenteo de aquí a uns minutos.AnkiWeb atopase en mantemento. Tenteo de novo nuns minutosRespostaBotóns de respostaRespostasUn antivirus ou unha devasa está evitando que Anki se conecte a Internet.Todas as tarxetas en branco serán excluídas. Se unha nota non ten tarxetas correspondentes, será desbotada. Confirma que quere continuar?Apareceu dúas veces no ficheiro: %sConfirma que quere eliminar %s?Requirese polo menos un tipo de tarxeta.Requirese polo menos un paso.Anexar imaxes/son/vídeo (F3)Reproducir o son automaticamenteSincronizar automaticamente no perfil de apertura/pecheTermo medioTempo medioTempo medio de respostaTermo medio de facilidadeTermo medio nos días estudiadosIntervalo medioReversoVista previa do reversoModelo do reversoCopias de seguranzaBásicaBásica (e tarxeta invertida)Básica (tarxeta invertida opcional)Negriña (Ctrl+B)ExaminarExaminar e instalar...NavegadorNavegador (%(cur)d tarxeta amosada; %(sel)s)Navegador (%(cur)d tarxetas amosadas; %(sel)s)Aparencia do navegadorOpcións do navegadorCompilaciónEngadir etiquetas a esgalla (Ctrl+Maiús+T)Eliminar etiquetas a esgalla (Ctrl+Alt+T)DescartarDescartar a notaDescarta as novas tarxetas relacionadas ata o día seguinteDe xeito predeterminado, Anki detectará o carácter entre campos, como unha marca de tabulación, unha coma ou semellantes. Se o Anki detecta o carácter incorrectamente, pode introducilo aquí. Use \t para representar unha marca de tabulación.CancelarTarxetaTarxeta %dTarxeta 1Tarxeta 2Información da tarxeta (Ctrl+Maiús+I)Lista de tarxetasTipo de tarxetaTipos de tarxetaTipos de tarxeta para %sTarxeta suspendida.A tarxeta era unha samesugaTarxetasTipos de tarxetaNon é posíbel mover tarxetas manualmente a un feixe filtrado.Tarxetas en texto simpleAs tarxetas devolveranse automaticamente aos seus feixes orixinais unha vez as teña repasado.Tarxetas...CentrarCambiarCambiar %s a:Cambiar un feixeCambiar o tipo de notaCambiar o tipo de nota (Ctrl+N)Cambiar o tipo de nota...Cambiar a cor (F8)Cambiar o feixe en función do tipo de notaCambiadoComprobar os ficheiros no directorio multimediaComprobando...EscollerEscoller feixeEscoller o tipo de notaEscoller as etiquetasClonar: %sPecharPechar e perder a información actual?OcoEliminación do oco (Ctrl+Maiús+C)Código:A coleccion esta estragada. Consulte o manual.Dous puntosComaConfigurar o idioma da interface e as opciónsConfirmar o contrasinal:Parabéns! Rematou este feixe polo de agora.Conectando...ContinuarCopiarRespostas correctas en tarxetas antigas: %(a)d/%(b)d (%(c).1f%%)Acertos: %(pct)0.2f%%
(%(good)d de %(tot)d)Non foi posíbel conectar con AnkiWeb. Comprobe a súa conexión de rede e tenteo de novo.Non foi posíbel gravar o son. Instalou lame e sox?Non foi posíbel gardar o ficheiro: %sChaparCrear un feixeCrear un feixe filtrado...CreadoCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Maiús+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Maiús+=Ctrl+Maiús+ACtrl+Maiús+CCtrl+Maiús+FCtrl+Maiús+LCtrl+Maiús+MCtrl+Maiús+PCtrl+Maiús+RCtrl+UCtrl+WCtrl+ZAcumulado%s AcumuladosRespostas acumuladasTarxetas acumuladasFeixe actualTipo de nota actual:Estudo personalizadoSesión de estudo personalizadoPasos personalizados (en minutos)Personalizar tarxetas (Ctrl+L)Personalizar camposCortarBase de datos reconstruida e optimizada.DataDías estudiadosDesautorizarConsola de depuraciónFeixeFeixe preferenteO feixe importarase cando se abra un perfil.FeixesIntervalos decrecentesPredeterminadoAtrasos ata que os repasos se amosen de novo.EliminarEliminar %s?Eliminar tarxetasEliminar feixeEliminar baleirasEliminar a notaEliminar as notasEliminar as etiquetasEliminar as non usadasEliminar campo de %s?Eliminar o tipo de tarxeta «%(a)s», e as súas %(b)s?Eliminar este tipo de nota e todas as súas tarxetas?Eliminar ese tipo de nota non usado?Eliminar os ficheiros multimedia non usados?Eliminar...Eliminada %d tarxeta sen nota.Eliminadas %d tarxetas sen nota.Eliminada %d tarxeta sen modeloEliminadas %d tarxetas sen modeloEliminada %d nota con tipo de nota ausenteEliminadas %d notas con tipo de nota ausenteEliminada %d nota sen tarxetasEliminadas %d notas sen tarxetasEliminada %d nota cunha conta de campos trabucada.Eliminadas %d notas cunha conta de campos trabucada.Eliminado.Eliminado. Reinicie o Anki.Ao eliminar este feixe da lista de feixes devolveranse todas as tarxetas restantes ao seu feixe orixinal.DescriciónDescrición para amosar na pantalla de estudo (só para o feixe actual):DiálogoDesbotar o campoFracasou a descarga: %sDescargar desde AnkiWebDescarga completada. Reinicie o Anki.Descargando desde AnkiWeb...ObrigadasSó as tarxetas obrigadasObrigadas para mañá&SaírFacilidadeFácilBonus por seren fácilIntervalo para fácilEditarEditar %sEditar a actualEditar HTMLEditar para personalizarEditar...EditadaEditando o tipo de letraEdicións gardadas. Reinicie o Anki.BaleiraTraxetas baleiras...Números das tarxetas baleiras: %(c)s Campos: %(f)s Atoparonse tarxetas baleiras. Execute Ferramentas > Traxetas baleiras.Primeiro campo baleiro: %sFinIntroduza o feixe no que quere poñer as %s tarxetas novas, ou deixeo baleiro:Introduza a nova posición da tarxeta (1...%s):Introduza as etiquetas que se engadiran:Introduza as etiquetas que se eliminarán:Produciuse un erro ao descargr: %sProduciuse un erro ao iniciar: %sProduciuse un erro ao executar %s.Produciuse un erro executando %s.ExportarExportar...AdicionalFF1F3F5F7F8O campo %d do ficheiro é:Asignación de camposNome do campo:Campo:CamposCampos para %sCampos separados por: %sCampos...&FiltrosO ficheiro non é correcto. Restaureo desde unha copia de seguranza.Non se atopou o ficheiro.FiltrarFiltro:FiltradoFeixe filtrado %d&Buscar duplicados...Buscar duplicadosBuscar e &substituírBuscar e substituírTerminarPrimeira tarxetaPrimeiro repasoVoltearXa existe o cartafolTipo de letra:RodapéPor razóns de seguranza, non se permite «%s» nas tarxetas. Podes seguir usándoo inserindo a orde nun paquete distinto, e importando ese paquete na cabeceira LaTeX.PrognósticoFormularioAnverso, e reverso opcionalAnverso e reversoAtoparonse %(a)s ao longo de %(b)s.AnversoVista previa do anversoModelo do anversoXeralFicheiro xerado: %sXerado en %sObter compartidosBenIntervalo para pasarEditor de HTMLDifícilInstalou xa latex e dvipng?CabeceiraAxudaMais fácilHistorialInicioDistribución horariaHorasAs horas con menos de 30 repasos non se amosan.Se colaborou e non está nesta lista, contacte con nós.Se tivera estudado todos os díasIgnorar os tempos de resposta maiores deIgnorar as maiúsculasIgnorar as liñas nas que o primeiro campo coincida cunha nota existenteIgnorar esta actualizaciónImportarImportar un ficheiroImportar aínda cando exista algunha nota co mesmo primeiro campoFracasou a importación. Fracasou a importación. Información de depuración: Opcións de importaciónImportación completa.No ficheiro multimedia mais non usado en tarxetas:Incluír os ficheiros multimediaIncluír información de planificaciónIncluir etiquetasAumentar o límite de tarxetas novas para hoxeAumentar o límite de tarxetas novas para hoxe enAumentar o límite de repasos para hoxeAumentar o límite de repasos para hoxe enIncrementar os intervalosInformaciónInstalar un complementoIdioma da interface:IntervaloModificador do intervaloIntervalosCódigo incorrecto.Ficheiro incorrecto. Restáureo desde unha copia de seguranza.Contrasinal incorrecto.Expresión regular incorrectaFoi suspendida.Itálica (Ctrl+I)Produciuse un erro do JS na liña %(a)d: %(b)sIr ás etiquetas con Ctrl+Maiús+TConservarLaTeXEcuación LaTeXEntorno matemático LaTeXPeríodosÚltima tarxetaÚltima revisiónPrimeiro as últimas engadidasAprenderTempo límite para adiantar o estudoAprender: %(a)s, Repasar: %(b)s, Volver estudar: %(c)s, Filtradas: %(d)sAprendendoSamesugasAcción de samesugasLimiar para samesugasEsquerdaLimitar aCargando...Bloquee a conta cun contrasinal, ou deixe o campo en branco:Intervalo máis largoBuscar no campo:Mais difícilAdministrarAdministrar os tipos de nota...Asignar a %sAsignar a etiquetasMarcarMarcar notaMarcar nota (Ctrl+K)MarcadasAntigasIntervalo máximoRepasos máximo/díaRecursos multimediaIntervalo mínimominutosMisturar tarxetas novas e repasosMnemosyne 2.0 Deck (*.db)MáisPeríodos maioresMover as tarxetasMover ao feixe (Ctrl+D)Mover as tarxetas ao feixe:&NotaEste nome xa existe.Nome para o feixe:Nome:RedeNovasNovas tarxetasTarxetas novas no feixe: %sSó tarxetas novasTarxetas novas/díaNome do novo feixe:Intervalo novoNovo nome:Novo tipo de nota:Nome do novo grupo de opcións:Nova posición (1...%d):O seguinte día comeza ásNon hai tarxetas obrigadasNingunha tarxeta coincide cos criterios indicados.Non hai tarxetas baleiras.Hoxe non se estudaron tarxetas antigas.Non se atoparonficheiros perdidos ou sen usar.NotaTipo de notaTipos de notaA nota e a súa única tarxeta foi eliminada.A nota e as súas %d tarxetas foron eliminadas.Nota descartadaA nota foi suspendida.Nota: Non se fai copia de seguranza dos ficheiros multimedia. Cree periodicamente unha copia de seguranza do seu cartafol Anki para estar seguro.Nota: Perdeuse algo no historial. Para obter mais información vexa a documentación do navegador.Notas en texto simpleAs notas requiren polo menos un campo.NadaAceptarPrimeiro vense as máis antigasForzar cambios nunha dirección na próxima sincronizaciónUnha ou mais notas non foron importadas, porque non xeraron ningunha tarxeta. Isto pode ocorrer cando ten campos baleiros, ou cando non asociou o contido do ficheiro de texto aos campos correctos.Só é posíbel reposicionar ás tarxetas novas.AbrirOptimizando...Límite opcional:OpciónsOpcións para %sGrupo de opcións:Opcións…OrdeOrde engadidoOrde das obrigadasSubstituír o modelo do reverso:Substutuir o tipo de letraSubstituír o modelo do anverso:Constrasinal:Os contrasinais non coincidenPegarPegar imaxes do portapapeis como PNGLección Pauker 1.8 (*.pau.gz)PorcentaxePeríodo: %sColocar na fin da cola de novas tarxetasColocar na cola de repaso con intervalos entre:Engada primeiro outro tipo de nota.Teña paciencia; isto puede levar bastante tempo.Conecte un micrófono, e asegúrese de que outros programas non estean usando o dispositivo de son.Edite esta nota e engada algunhas eliminacións de ocos. (%s)Asegúrese de que hai un perfil aberto e de que o Anki non estea ocupado, e tenteo de novo.Instale PyAudioInstale mplayerPrimeiro abra un perfil.Execute Ferramentas >Tarxetas baleirasSeleccione un feixeSeleccione tarxetas dun só tipo de nota.Seleccione algo.Anove á última versión do Anki.Use Ficheiro > Importar para importar este ficheiro.Visite AnkiWeb, anove o seu feixe e tenteo de novo.PosiciónPreferenciasVista previaVista previa da tarxeta seleccionada (%s)Vista previa das tarxetas novasVista previa das tarxetas novas engadidas nos últimosProcesando...Contrasinal do perfil...Perfil:PerfilesRequirese a autenticación no proxyPerguntaÚltima da cola: %dPrimera da cola: %dSaírAo chouOrde ao chouCualificaciónListo para actualizarReconstruírGravar a súa propia vozGravar son (F4)Gravando...
Tempo: %0.1fVolver estudarLembrar a última entrada ao engadirRetirar etiquetasRetirar formatos (Ctrl+R)Retirar este tipo de tarxeta suporá a eliminación dunha ou máis notas. Cree primeiro un novo tipo de tarxeta.Cambiar o nomeCambiar o nome ao feixeReproducir sonReproducir a súa propia vozReposiciónarReposicionar tarxetas novasReposicionar...Requirese unha ou máis destas etiquetas:ReprogramarReprogramarReprogramar tarxetas en función das miñas respostas neste feixeContinuar agoraDirección inversa do texto (RTL)Revertido ao estado anterior a «%s».RepasoNúmero de repasosTempo do repasoAdiantar o repasoAdiantar o repaso porRepasar as tarxetas esquecidas nos últimosRepasar tarxetas esquecidasPorcentaxe de repasos correctos ao longo do día.RepasosRepasos obrigados no feixe: %sDereitaGardar a imaxeÁmbito: %sBuscaBuscar en elementos de formato (lento)SeleccionarSeleccionar &todoSeleccionar ¬asSelecciona as etiquetas a excluír:O ficheiro seleccionado no está en formato UTF-8. Vexa a sección «importación» do manual.Estudio selectivoPunto e comaServidor non atopado. Ou a súa conexión está desactivada ou un antivirus/devasa está impedindo que Anki se conecte a Internet.Definir todos os feixes de embaixo %s con este grupo de opcións?Definir para fotos os feixes secundariosAplicar cor ao texto (F7)A tecla Maiús estaba premida. Omitindo a sincronización automática e a carga de complementos.Cambiar a posición das tarxetas existentesTecla de atallo: %sAtallo: %sAmosar %sAmosar a respostaAmosar os duplicadosAmosar o temporizador de respostasAmosar as novas tarxetas despois dos repasosAmosar as novas tarxetas antes dos repasosAmosar as novas tarxetas na orde engadidaAmosar as novas tarxetas ao chouAmosar o intervalo do próximo repaso enriba dos botóns de respostaAmosar o número de tarxetas restantes durante o repasoAmosar as estatísticas. Tecla de atallo: %sTamaño:Algúns axustes terán efecto despois de reiniciar Anki.Campo ordeadoOrdear segundo este campo no navegadorNon é posíbel cambiar a orde por esta columna. Escolla outra.Sons e imaxesEspazoPosición inicial:Facilidade inicialEstatísticasPaso:Pasos (en minutos)Os pasos deben ser números.Eliminar HTML ao pegar o textoHoxe estudou %(a)s en %(b)s.Estudado hoxeEstudarEstudar un feixeEstudar un feixe...Estudar agoraEstudar segundo o estado ou a etiqueta da tarxetaEstiloEstilo (compartido entre as tarxetas)Subíndice (Ctrl+=)Supermemo XML (*.xml)Superíndice (Ctrl+May+=)SuspenderSuspender tarxetaSuspender notaSuspendidaSincronizar tamén o son e as imaxesSincronizar con AnkiWeb. Tecla de atallo: %sSincronizando a multimedia...Fracasou a sincronización: %sFracasou a sincronización; non hai conexión a Internet.A sincronización require que o reloxo do computador estea correctamente axustado. Axuste o reloxo e tenteo de novo.Sincronizando...TabulaciónSó as etiquetasEtiquetasFeixe de destino (Ctrl+D)Campo de destino:TextoTexto separado por tabuladores ou punto e coma (*)Este feixe xa existeEste nome de campo xa está a ser usado.Este nome xa está a ser usado.A conexión con AnkiWeb esgotou o tempo. Comprobe a conexión de rede e tenteo de novo.A configuración predeterminada non pode ser retirada.O feixe predeterminado non pode ser eliminado.División das tarxetas no(s) seu(s) feixe(s)O primeiro campo está baleiro.O primeiro campo do tipo de nota debe ser asignado a algo.Non se pode usar o seguinte carácter: %sO anverso desta tarxeta está baleiro. Execute Ferramentas > Tarxetas baleiras.As iconas obtivéronse de distintas procedencias; vexa o código fonte do Anki para ver os créditos.A entrada que ven de fornecer produciría unha pregunta baleira en todas as tarxetas.O número de preguntas que ten respondido.O número de repasos obrigados no futuro.O número de veces que ten premido cada botón.A busca solicitada non devolveu ningunha tarxeta. Quere revisalo?O cambio solicitado fará necesario un envío completo da base de datos a próxima vez que sincronice a súa colección. Se ten repasos ou outros cambios pendentes noutro dispositivo que non teñan sido sincronizados aínda, perderanse. Quere continuar?O tempo que levou responder ás preguntas.Completouse a anovación e xa pode comezar a usar o Anki 2.0

Aquí ten o rexistro da anovación:

%s

Ten que haber polo menos un perfil.Non é posíbel ordenar por esta columna, mais pode buscar tipos de tarxeta individuais, como «card:Tarxeta 1».Non é posíbel ordenar por esta columna, mais pode buscar por feixes específicos premendo nun da esquerda.Este ficheiro xa existe. Confirma que quere sobrescribilo?Este cartafol almacena todos os seus datos nunha localización única, para facilitar as copias de seguranza. Para indicarlle ao Anki que use una localización diferente, consulte: %s Este é un feixe especial para estudar fora do horario normal.Isto é unha eliminación de oco {{c1::sample}}.Isto eliminará a súa colección actual e substituiraa cos datos do ficheiro que está a importar. Esta seguro?HoraIntervalos temporais de estudoPara repasarPara examinar complementos, prema no botón Examinar embaixo.

Cando teña atopado un complemento que lle interese, pegue o seu código embaixo.Para importar a un perfil protexido por contrasinal, abra o perfil antes de tentar a importación.Para crear ocos nunha nota existente, primeiro debe cambiala a un tipo de nota de ocos, mediante Editar > Cambiar o tipo de nota.Para estudar fora do horario normal, prema nol botón Estudo personalizado e embaixo.HoxeTotalTempo totalTotal de tarxetasTotal de notasTratar a entrada como expresión regularTipoTipo de resposta: campo descoñecido %sNon é posíbel importar desde un ficheiro de só lectura.ReincorporarSubliñado (Ctrl+U)DesfacerDesfacer %sFormato de ficheiro descoñecido.Sen lerActualizar as tarxetas existentes cando coincida o primeiro campoActualizadas %(a)d de %(b)d notas existentes.Actualización completadaAsistente de anovaciónAnovandoAnovando feixes %(a)s de %(b)s... %(c)sEnviar a AnkiWebEnviando a AnkiWeb...Faltan no cartafol multimedia mais usanse en tarxetas:Usuario 1Versión %sAgardando a que remate a edición.Aviso: os ocos non funcionarán a non ser que cambie o tipo de nota a Ocos.Benvido/aAo engadir, facelo no feixe predeterminadoCando se amose a resposta, reproducir o son da pregunta e da respostaColección enteiraQuere descargalo agora?Escrito por Damien Elmes, con parches, tradución, probas e deseño de:%(cont)sTen un tipo de nota de ocos mais non inseriu ningún oco. Quere continuar?Ten moitos feixes. Vexa %(a)s. %(b)sAínda non gravou a súa voz.Ten que haber polol menos unha columna.Novo/aNovo/a+AprenderOs seus feixesOs seus cambios afectarán a varios feixes. Se quere cambiar unicamente o feixe actual, engada primeiro un novo grupo de opcións.A súa colección atopase nun estado inconsistente. Execute Ferramentas > Comprobar a base de datos, e volva a sincronizar.[sen feixe]copias de seguranzatarxetastarxetas do feixetarxetas seleccionadas porcolecciónddíasfeixevida do feixeaxudaagocharhorashoras pasada a medianoiteperíodosasignado a %sasignado a etiquetasmins.minutosrepasossegundosestatísticasesta páxinatoda a colección~anki-2.0.20+dfsg/locale/ms/0000755000175000017500000000000012256137063015133 5ustar andreasandreasanki-2.0.20+dfsg/locale/ms/LC_MESSAGES/0000755000175000017500000000000012065014111016702 5ustar andreasandreasanki-2.0.20+dfsg/locale/ms/LC_MESSAGES/anki.mo0000644000175000017500000000335012252567246020206 0ustar andreasandreas%pqxz   (B Xe w  itv    ++8d {       Stop%%d selected%d selected%s copy&About...&Cram...&Edit&File&Find&Go&Help&Import&Invert Selection&Next Card&Previous Card&Reschedule...&Tools&UndoOpen backup folderExport format:Find:Font Size:Font:In:Line Size:mapped to %sminsProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:22+0000 Last-Translator: Damien Elmes Language-Team: Malay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: ms Berhenti%%d dipilih%d dipilihsalinan %s&Perihal...&Asak...&Sunting&Fail&Cari&Pergi&Bantuan&Import&Songsangkan Pilihan&Kad Seterusnya&Kad Sebelumnya&Jadual Semula...&Peralatan&Buat SemulaBuka pelipat simpananFormat eksport:Cari:Saiz font:Font:Dalam:Saiz garisan:dipeta kepada %sminitanki-2.0.20+dfsg/locale/th/0000755000175000017500000000000012256137063015127 5ustar andreasandreasanki-2.0.20+dfsg/locale/th/LC_MESSAGES/0000755000175000017500000000000012065014111016676 5ustar andreasandreasanki-2.0.20+dfsg/locale/th/LC_MESSAGES/anki.mo0000644000175000017500000001543712252567246020213 0ustar andreasandreas}   8     * 0 ; A G K Q Y d v                      $ , 8 > D J \ j o w ~             ! . ; B I T X ] i o v                 "+17@IN Vajqx  m&|`18N^t  F6%}%7!57IK[w3$!)!?$a 0' .8W+j-  '.5<CJQX _ l y    $ $ /?!O q{!   )N?3O kx!   5 K!Uw   &Ba 'tOEFi4J} bc d vV*sNL0[+6^j7.%S#58l9:;<,y>?@|G1rI/P\`_fu-"{KCxh3XDm(Hqzk !=o UQnYTM)p]ZewR2$WgA Stop (1 of %d)%%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%d selected%d selected%s copy%s minute%s minutes%s second%s seconds&About...&Edit&Export...&File&Find&Go&Help&Import&Import...&Invert Selection&Next Card&Preferences...&Previous Card&Tools&Undo/1 month:AddAdd TagsAgainAll FieldsAnkiAverageBackBackupsBrowseBrowserBuildCancelCards...CenterChangeChangedChecking...CloseColonCommaConfirm password:Connecting...CopyCreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+UCtrl+ZCumulativeCutDateDeauthorizeDecksDeleteDelete NoteDelete...DescriptionDialogE&xitEasyEditEdit %sEdit...EmptyEndError executing %s.ExportExport...ExtraF1F3F5F7F8FieldsFilter:Find DuplicatesForecastFrontHoursIntervalLearningLeftMinutesPercentagePositionRandomReviewReviewsRightSuspendedTextTotalTotal TimeUnseenddayshoursminuteswProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:13+0000 Last-Translator: Damien Elmes Language-Team: Thai MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) Language: th หยุด (1 จากทั้งหมด %d)%การบันทึก %(a)d จาก %(b)d ได้ปรับปรุงแล้วเลือกอยู่ %d รายการ%s คัดลอก%s นาที%s วินาที&เกี่ยวกับ...&แก้ไข&ส่งออก...&แฟ้ม&ค้นหา&ไ&ปยัง&ช่วยเหลือ&นำเข้า%นำเ&ข้า...%กลับการเลือกเป็นตรงข้าม&นามบัตรถัดไป&ปรับแต่งค่า...&นามบัตรก่อนหน้านี้&เครื่องมือ&เลิกทำ/1 เดือน:เพิ่มเพิ่มแท็กอีกครั้งช่องข้อมูลทั้งหมดAnkiต้นทุนเฉลี่ยย้อนกลับสำรองข้อมูลเรียกดูเบราว์เซอร์สร้างโปรแกรมยกเลิกไพ่...กึ่งกลางเปลี่ยนมีการเปลี่ยนแปลงกำลังตรวจสอบ...ปิดมหัพภาคคู่จุลภาคยืนยันรหัสผ่าน:กำลังเชื่อมต่อ...คัดลอกสร้างเมื่อCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+UCtrl+Zการเพิ่มสะสมตัดวันที่ยกเลิกอนุญาตสำรับลบออกลบบันทึกย่อลบ...คำอธิบายกล่องโต้ตอบ&ออกง่ายแก้ไขแก้ไข %sแก้ไขภาพ...ว่างเปล่าสิ้นสุดเกิดข้อผิดพลาดขณะเรียกใช้ %sส่งออกหมดอายุ...เพิ่มเติมF1F3F5F7F8ช่องข้อมูลตัวกรอง:ค้นหาภาพที่ซ้ำกันประมาณการหน้าชั่วโมงช่วงเวลาการเรียนรู้ซ้ายนาทีร้อยละตำแหน่งสุ่มบทวิจารณ์ตรวจทานขวาถูกแขวนแล้วข้อความทั้งหมดเวลารวมยังไม่อ่านงวันชั่วโมงนาทีสัปดาห์anki-2.0.20+dfsg/locale/hu/0000755000175000017500000000000012256137063015130 5ustar andreasandreasanki-2.0.20+dfsg/locale/hu/LC_MESSAGES/0000755000175000017500000000000012065014111016677 5ustar andreasandreasanki-2.0.20+dfsg/locale/hu/LC_MESSAGES/anki.mo0000644000175000017500000022532112252567246020207 0ustar andreasandreasSL5HGIG PG[GbG"hGG GGG8GGHH"0H$SH$xH&HH"HII*I$GI lIII0III&J )J5J(FJoJJ,JJ*JK,K HKVK(gKKKKKKK KKKKK KKKKK L LL L#L 5L@LXLhLwLLLLL0L LL L MMM*MAMEMMMMMMMMMMMTNVNXN,nN(NN!NOfOO OO O OOOOPePP7/Q gQqQ5QXQYR8mRkR S S)S-S HS RS\S rS SS SSSS S$SS SS T T% TKFTTNT"TU#0VTVYVpV hWvWX'XRXvXwuY7Y %Zw1ZEZ@Z0[7[F[RN[[$\#?\#c\\ \\(\ ] ]] 2]?]X]i] n] {]]]]]]]]]L^T^g^w^}^^^ ^ ^)^'^#______` ` "` ,` 6`A` S```p`` `3``S`0a9a@a Ga Uaaaraaa"aaa&a b!b (b4b Eb Qb[babbbb-bbb(b c5c Tcbckc8pc5cPc70dhdd ddddd dddddddde eee e -e :e Ge Te ae ne {eeee e eee ee eff6fOf`fdff f f ff f/fffg%g7iPviii]i Lj8Xjj jjj)jjkk )k6knRnbnwnn n nnnnnnnnooooop pp$p,p?p OpZp_p spp$ppp ppppp.pFq\quq q4qqq q1q.r>r^rmr*rr JtXt wtt"t"t t u u%u4uHuQu cu mu {u)uuuu v v>v]vbvhvwvv v vvvv<vww w*w:w?w Hw+Swww www w ww wwwx xx2x8xIxQxkxx x xxxx xxxxx x yy .yUr,Ҁ-+8E~ #ȁ  ?H YglsƂ +iF ÃЃ  "2 :1E w  DŽ Ԅ -3ai Å ʅ օVS cm,2GM  LJԇ ܇ 'Ec*'!Ո@6>8u !?ۉ+1 A OZ`s Ŋӊ ي >Qn *֋!%dG ʌӌ، () CdX+؍"&'N0h+>ŎUFZ*(̏1',I\'Ltt#Փde^Ĕ8C(Ȗrd au/dM !Ԛٚ'&>CK`.g&Λ ݛ& ,8e lwU$8R(-V"gWS06$g" {̡H^I5ޣU =GOUi { ʧѧ  !+->@1MOXkM}'˪+/F/v5ܫ96L+b/+-& T a o }٭  9 G Uchnsz  ˮٮ   &4Ea+vůׯ D' lx ""ṉ̃|ұOQ7U3%&)ֳ 2DWeoմAJ\fö1Fx/@ R)^ и 7J Ze/v ͹ B pL+p6ZK!ݼ&8+dRopxQPV_ g uU't#(! ,FJ :' / ;I_d$~  aRj./ 2-1`LT \ h s~% (* S]8q T - 5B Yf$. .4c s 8+I>O 70$ 5 @@J9r@8y  #*18?FMT \ i v  .GX%n! , *4GNKg$-'0CWo?G0,x0 MM0[~O* ,rK{  <[ x " ,L_ 8 -b<O2AYn$$  #&),H Ydkr O ",3E\o   %2; ,J R ^ lx,$ + 8CH_[fW71 iR I!_H:B/Ki(}2-7#? cn 5Mk$&  "0 MYj R&,Ca e pE~ 3M iv #'!)Is{%(+ 1; ?Mk $*:O2=  1?kOuj#16OUXUxA 5 Qr + 1B ^ i#vF/5uGG( &=68V2EU& | &="2EM Vw  ,H \1j Wcw)6 7 EHS!' 8*O6z!;,K P ^l!u qU guC!Wye-ATf&z>=.$MDr<-"H*Hs^4,Ka  (!)J-t   5,L)b(3Q&m<U it 9 &# !J l 2 ,' ,T  N ) [ [l F  // %_  1 P 2 =$}E 8V$ 1R W aoT'|V>Y 52&::a  80N ;F.u )h$<3JpV j W ^ @=!~!$!!!!!S"#F$$^&P)_)~)) ) )))))))* ** &*0*%P*v*{** * * * ****7-]%z&Z(/ }q(UQA1`@:X6G 9c:jJb"#+Tn!S,{~Pk}n%~A*PP=xC.ElY:hq~]3i)VCW?_L[a&85agJ.yT72Y-H c< _Z)IL )Ye^wJ<X\Dv;U8,Fu+OzedONRo|BbU#p.,?(54yvVD#9F s "o7+BG0LH{'ti?,Q!6wM!7-$j[f 'mE6WlD;] d%\G;eCl3"u LrM vqE[/gQF$={I0`K4xxp0#i>FE 1MC"N*us3HtBGw65$2@>t9\A8I;'K:m kz&=^'BN$VRp%|hk d>3*<@X< `ZHfKKr _yaT!SOhsI(QM0f|P c=8+21&544gnSmj -^.WR/b1D2}>/ AN  rRS*@ 9o)OJ?  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-15 18:30+0000 Last-Translator: Adam Language-Team: Hungarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: hu Állj (%d közül 1) (ki) (be) %d kártyát tartalmaz. %d kártyát tartalmaz.%% helyes%(a)0.1f %(b)s/nap%(a)0.1fs (%(b)s)%(b)d jegyzet közül %(a)d frissítve%(b)d jegyzet közül %(a)d frissítve%(a)d kB feltöltve, %(b)d kB letöltve%(tot)s %(unit)s%d kártya%d kártya%d kártya törölve.%d kártya törölve.%d kártya exportálva.%d kártya exportálva.%d kártya importálva.%d kártya importálva.%d kártyát tanultál meg%d kártyát tanultál meg%d kártya/perc%d kártya/perc%d kártyacsomag frissítve.%d kártyacsomag frissítve.%d csoport%d csoport%d jegyzet%d jegyzet%d jegyzet hozzáadva%d jegyzet hozzáadva%d jegyzet importálva.%d jegyzet importálva.%d jegyzet frissítve%d jegyzet frissítve%d ismétlés%d ismétlés%d kiválasztva%d kiválasztva%s már létezik az asztalodon. Felülírjam?%s másolata%s nap%s nap%s nap%s nap%s törölve.%s óra%s óra%s óra%s óra%s perc%s perc%s perc alatt.%s perc alatt.%s perc%s perc%s hónap%s hónap%s hónap%s hónap%s mp%s mp%s másodperc%s másodperc%s törlése:%s év%s év%s év%s év%s n%s ó%s p%s hó%s mp%s év&Névjegy...&Kiegészítők&Adatbázis ellenőrzése&Magolás...Sz&erkesztés&Exportálás...&Fájl&Keresés&Ugrás&Útmutató&Útmutató...&Súgó&Importálás&Importálás...Kijelölés meg&fordításaK&övetkező kártyaKiegészítők mappájának meg&nyitása...&Testreszabás...&Előző kártya&Átütemezés...Az &Anki támogatása...&Másik profilra váltás...&Eszközök&Visszavonás'%(row)s' mezőinek száma %(num1)d, ennyinek kéne lennie: %(num2)d(%s helyes)(vége)(szűrt)(tanulás)(új)(szülőcsomag határértéke: %d)(kérlek, 1 kártyát válassz ki)...Az .anki2 fájlok nem alkalmasak importálásra. Ha biztonsági mentést szeretnél helyreállítani, kérlek, nézd meg az útmutató „Biztonsági mentés” fejezetét./0 n1 101 hónap1 évde. 10este 10éjjel 3éjjel 4du. 4504: átjáró-időtúllépési hiba érkezett. Kérlek, próbáld meg úgy, hogy átmenetileg kikapcsolod a vírusirtódat.:és%d kártya%d kártyaBiztonsági mappa megnyitásaHonlap megtekintése%(pct)d%% (%(y)s közül %(x)s)%Y. %m. %d. @ %H.%MBiztonsági másolat
Bezáráskor és szinkronizáláskor az Anki mindig készít egy biztonsági másolatot a gyűjteményedről.Exportálás formátuma:Keresés:Betűméret:Betűtípus:Ebben:Beillesztés:Sorméret:Csere erre:SzinkronizálásSzinkronizálás
Jelenleg nem üzemel; a főablak „sync” gombjával lehet bekapcsolni.

Felhasználói fiók szükséges

A gyűjteményed szinkronizálásához ingyenes felhasználói fiókra van szükség. Kérlek, regisztrálj magadnak egyet, majd add meg az adatait.

Frissült az Anki

Megjelent az Anki %s verziója.

Hálás köszönet mindenkinek a tanácsokért, a hibajelentésekért és az adományokért!Egy kártya könnyűsége azt jelenti, hogy a továbbiakban mennyi ideig fogod kikérdezéskor „jó”-ként értékelni.A collection.apkg fájlt mentettem az asztalodra.A média szinkronizálása során hiba történt. Ennek megoldásához, kérlek, válaszd az Eszközök > Média ellenőrzése menüpontot, majd végezz egy újabb szinkronizálást.Megszakítva: %sAz Anki névjegyeHozzáadásHozzáadás (gyorsbillentyű: Ctrl+Enter)Mező hozzáadásaMédia hozzáadásaÚj csomag hozzáadása (Ctrl+N)Jegyzettípus hozzáadásaEllenkező irány hozzáadásaCímke hozzáadásaÚj kártya hozzáadásaHozzáadás ehhez:Hozzáadás: %sHozzáadvaMa hozzáadottakElső mezőben egyező változat hozzáadva: %sÚjraMai „újra” értékelésűek„Újra” válaszok száma: %sMinden csomagMinden mezőAz összes kártya véletlenszerű sorrendben (magolás üzemmód)Az ehhez a profilhoz tartozó összes kártya, jegyzet és médiaállomány törlődni fog. Valóban ezt akarod?HTML-formázás engedélyezése a mezőkbenHiba történt egy kiegészítőben.
Kérlek, tedd közzé a kiegészítőkre vonatkozó fórumon:
%s
Az alábbi fájl megnyitása során hiba történt: %sHiba történt. Ezt okozhatja egy ártalmatlan hiba,
vagy a kártyacsomagoddal lehet probléma.

Hogy kiderítsd, nem a kártyacsomagoddal van-e gond, kérlek, futtasd az Eszközök > Adatbázis ellenőrzése opciót.

Ha ez nem oldja meg a problémát, kérlek, az alábbiakat
másold be egy hibajelentésbe:A képet mentettem az asztalodra.AnkiAnki 1.2-ben készült csomag (*.anki)Az Anki 2 új formátumban tárolja a kártyacsomagjaidat. Ez a varázsló automatikusan átalakítja a csomagjaidat ebbe a formátumba. A frissítés előtt biztonsági mentés készül róluk, úgyhogy ha vissza kellene térned az Anki előző változatához, a csomagjaid továbbra is használhatóak lesznek.Anki 2.0-ban készült csomagAz Anki 2.0 csak az Anki 1.2-ből teszi lehetővé az automatikus frissítést. Ennél korábbi csomagot úgy lehet betölteni, ha az Anki 1.2-ben megnyitva frissíted, s ezután importálod az Anki 2.0-ba.Kötegelt Anki-kártyacsomagAz Anki nem találja a kérdés és a válasz közti vonalat. Kérlek, módosítsd kézzel a sablont, hogy váltani lehessen kérdés-válasz között.Az Anki egy barátságos, intelligens, időzítésen alapuló oktatóprogram. Nyílt forráskódú és ingyenes.Az Anki az AGPL3 licenc alatt áll. A további tájékozódáshoz kérlek, nézd meg a forrásdisztribúcióban szereplő licencfájlt.Az Anki nem tudta betölteni a régi konfigurációs fájljaidat. Kérlek, a program előző változataiból származó csomagjaidat a Fájl > Importálás opcióval importáld.Az AnkiWeb-azonosító vagy -jelszó nem megfelelő: kérlek, próbálkozz újra.AnkiWeb-azonosító:Az AnkiWeb hibát észlelt. Kérlek, próbálkozz újra néhány perc múlva, és ha a probléma továbbra is fennáll, kérlek, küldj róla hibajelentést.Az AnkiWeb jelenleg elfoglalt. Kérlek, próbálkozz újra néhány perc múlva.Az AnkiWeb karbantartás alatt áll. Kérlek, próbálkozz újra néhány perc múlva.VálaszVálaszgombokVálaszokAz Anki egy vírusirtó vagy tűzfalprogram miatt nem tud csatlakozni az internethez.Minden olyan kártya törlődni fog, amely nincs hozzárendelve semmihez. Ha egy jegyzethez nem tartozik több kártya, akkor törlődik. Valóban ezt akarod?Kétszer szerepelt ebben a fájlban: %sValóban törölni akarod ezt: %s ?Legalább egy kártyatípus szükséges.Legalább egy lépés szükségesKép/hang/videó csatolása (F3)Hang automatikus lejátszásaAutomatikus szinkronizálás a profil megnyitásakor és bezárásakorÁtlagosÁtlagos időÁtlagos válaszadási időÁtlagos könnyűségÁtlagos időráfordítás a tanulással töltött napokonÁtlagos időközHátlapHátlapképHátlapsablonBiztonsági mentésekAlapAlap (mindkét irányban)Alap (egyik vagy mindkét irányban)Félkövér (Ctrl+B)BöngészőBöngészés és telepítés...BöngészõBöngésző (%(cur)d kártya látható; %(sel)s)Böngésző (%(cur)d kártya látható; %(sel)s)Böngésző-megjelenésBöngészőbeállításokÖsszeállításCímkék csoportos hozzáadása (Ctrl+Shift+T)Címkék csoportos eltávolítása (Ctrl+Alt+T)FélretevésKártya félretevéseJegyzet félretevéseKapcsolódó új kártyák félretevése másnapigKapcsolódó ismétlések félretevése másnapigAz Anki alapértelmezés szerint felismeri a mezők közti karaktert, például a tabulátort, a vesszőt stb. Ha rosszul ismerné fel, akkor itt megadhatod. A tabulátort a \t jelöli.MégsemKártya%d. kártya1. kártya2. kártyaKártyaazonosítóKártya tulajdonságai (Ctrl+Shift+I)Kártya&listaKártyatípusKártyatípusokKártyatípusok ehhez: %sKártya félretéve.Kártya felfüggesztve.Ezt a kártyát mumusként tároltam el.KártyákA kártyák fajtáiA kártyákat nem lehet kézzel a szűrt csomagba tenni.Kártyák egyszerű szövegkéntA kártyák kikérdezés után automatikusan visszakerülnek az eredeti csomagjukba.Kártyák...KözépMódosítás%s módosítása erre:ÁthelyezésJegyzettípus módosításaJegyzettípus módosítása (Ctrl+N)Jegyzet&típus módosítása...Szín módosítása (F8)Csomagváltás a jegyzettípus függvényébenMódosítva&Média ellenőrzése...A médiamappában lévő fájlok ellenőrzéseEllenőrzés...KiválasztásCsomag választásaJegyzettípus kiválasztásaCímkék kiválasztásaKlónozás: %sBezárásBezárod az ablakot és veszni hagyod a beírt adatokat?Lyukas szövegLyukas szöveg (Ctrl+Shift+C)Kód:A gyűjtemény sérült. Kérlek, tekintsd meg az útmutatót.KettőspontVesszőFelület nyelvének és beállításainak módosításaJelszó megerősítése:Gratulálok! Mára végeztél ezzel a csomaggal.Kapcsolódás...FolytatásMásolásHelyes válaszok a veterán kártyákra: %(a)d/%(b)d (%(c).1f%%)Helyes: %(pct)0.2f%%
(%(tot)d közül %(good)d)Nem sikerült csatlakozni az AnkiWebhez. Kérlek, ellenőrizd az internetes kapcsolatodat, és próbálkozz újra.Nem sikerült a hangfelvétel. Van már telepítve Lame és Sox?A fájl mentése sikertelen: %sMagolásCsomag létrehozása&Szűrt csomag létrehozása...LétrehozvaCtrl+óCtrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+üCtrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZKumulatívKumulatív %sVálaszok kumulatív számaKártyák kumulatív számaAktuális csomagAktuális jegyzettípus:Egyéni tanulásEgyéni tanulásmenetEgyéni lépésbeállítás (percben)Kártyák testreszabása (Ctrl+L)Mezőnevek testreszabásaKivágásAdatbázis újraépítve és optimalizálva.DátumTanulással töltött napokLetiltásHibakereső konzolCsomagCsomag felülbírálásaA kártyacsomag importálására egy profil megnyitásakor kerül majd sor.Kártyacsomagokidőközök csökkenő sorrendjébenAlapértelmezésA következő kikérdezésig hátralevő időTörlésTörlöd ezt: %s ?Kártyák törléseKártyacsomag törléseÜresek törléseJegyzet törléseJegyzetek törléseCímke törléseNem használtak törléseTörlöd a mezőt ebből: %s?Töröljem a '%(a)s' kártyatípust és annak %(b)s tartalmát?Törlöd ezt a jegyzettípust és az összes hozzá tartozó kártyát?Törlöd ezt a nem használt jegyzettípust?Töröljem a nem használt médiaállományokat?Törlés...%d jegyzet nélküli kártya törölve%d jegyzet nélküli kártya törölve%d sablon nélküli kártya törölve.%d sablon nélküli kártya törölve.%d jegyzettípus nélküli jegyzet törölve.%d jegyzettípus nélküli jegyzet törölve.%d kártya nélküli jegyzet törölve.%d kártya nélküli jegyzet törölve.%d jegyzet törölve, amelyen a mezők száma tévesen szerepelt.%d jegyzet törölve, amelyeken a mezők száma tévesen szerepelt.Törölve.Törölve. Kérlek, indítsd újra az Ankit.Ha törlöd ezt a csomagot a kártyacsomagok listájából, akkor a fennmaradó kártyák is mind visszakerülnek az eredeti csomagjukba.LeírásA tanulási képernyőn megjelenő leírás (csak az aktuális csomagnál):PárbeszédMező elvetéseA letöltés sikertelen volt: %sLetöltés az AnkiWebrőlA letöltés sikeres volt. Kérlek, indítsd újra az Ankit.Letöltés az AnkiWebről...EsedékesCsak az esedékes kártyákHolnap esedékes&KilépésKönnyűségKönnyűKönnyű válasznál adott bónuszKönnyű válasz időközeSzerkesztés%s szerkesztéseAktuális jegyzet szerkesztéseHTML szerkesztéseSzerkesztéssel testreszabhatóSzerkesztés…SzerkesztveSzerkesztési betűtípusSzerkesztések mentve. Kérlek, indítsd újra az Ankit.Kiürítés&Üres kártyák...Üres kártyák száma: %(c)s Mezők: %(f)s Üres kártyákat talált a program. Kérlek, futtasd az Eszközök > Üres kártyák menüpontot.Üres az első mezője: %sEndAdd meg, melyik csomagba kerüljön a %s nevű új kártya, vagy hagyd üresen:Add meg az új kártya sorrendi helyét (1–%s.):Hozzáadandó címkék:Törlendő címkék:Hiba a letöltés során: %sHiba a program indítása során: %sHiba ennek végrehajtása során: %sHiba %s futtatásakorExportálásExportálás…Egyéb tudnivalókFF1F3F5F7F8A fájl %d. mezője:MezőleképezésMezőnév:Mező:MezőkMezők ehhez: %sMezők határolójele: %sMezők...&SzűrőkA fájl érvénytelen. Kérlek, állítsd vissza az egyik biztonsági mentést.A fájl nem található.SzűrőSzűrés:Szűrt%d. szűrt csomag&Azonosak keresése...Azonosak keresése&Keresés és csere...Keresés és csereBefejezésEls&ő kártyaElső kikérdezésAz első mező megegyezik: %sJavított jegyzettípus: %sÁtfordításA mappa már létezik.Betűtípus:Lábléc'%s' biztonsági okból nem megengedett a kártyákon. Úgy lehet használni, ha a parancsot egy másik csomagba teszed, és ezt a csomagot a LaTeX-fejlécbe importálod.ElőrejelzésŰrlapEgyik vagy mindkét iránybanMindkét irányban%(b)s közül %(a)s találat.ElőlapElőlapképElőlapsablonÁltalánosLétrehozva: %s fájl.Létrehozás ideje: %sMegosztott tartalmakJóElőrelépési időközHTML-szerkesztőNehézTelepítetted már a Latexet és a Dvipng-t?FejlécSúgóLegkönnyebbElőzményHomeÓránkénti lebontásÓrákAzok az órák, amikor 30-nál kevesebb kikérdezés történt, nem szerepelnek az ábrán.Ha te is közreműködtél, és mégsem vagy rajta ezen a listán, kérlek, írj nekem.Ha mindennap tanulnálEnnél hosszabb válaszidő figyelmen kívül hagyása:Kis- vagy nagybetű nem számítHagyja ki azokat a sorokat, amelyek első mezője egyezik egy meglévő jegyzettelFrissítés kihagyásaImportálásFájl importálásaAkkor is importálja, ha egy meglévő jegyzetnek azonos az első mezőjeAz importálás sikertelen volt. Az importálás sikertelen volt. Információ a hiba elhárításához: Beállítások importálásaAz importálás befejeződött.A médiamappában van, de egyetlen kártya sem használja:Ahhoz, hogy a gyűjteményed jól működjön akkor is, ha más eszközre kerül át, szükséges, hogy a számítógéped belső órája pontosan legyen beállítva. A belső óra olyankor is el lehet állítva, ha a rendszered pontosan mutatja a helyi időt. Kérlek, menj a számítógéped időbeállításaira, és ellenőrizd az alábbiakat: - de./du. (AM/PM) - órahiba (csúszás) - év, hónap, nap - időzóna - téli/nyári időszámítás A pontos időtől való eltérés: %s.Médiaállománnyal együttÜtemezési adatokkal együttCímkékkel együttÚj kártyák mai limitjének növeléseÚj kártyák mai limitjének növelése ennyivel:Ismétlőkártyák mai limitjének növeléseIsmétlőkártyák mai limitjének növelése ennyivel:időközök emelkedő sorrendjébenJellemzőkKiegészítő telepítéseFelhasználói felület nyelve:IdőközIdőköz-módosítóIdőközökÉrvénytelen kód.Érvénytelen kódolás; kérlek, más nevet adj meg:Érvénytelen fájl. Kérlek, állítsd vissza az egyik biztonsági mentést.Érvénytelen jelszó.Érvénytelen reguláris kifejezés.Felfüggesztve.Dőlt (Ctrl+I)JavaScript-hiba a %(a)d. sorban: %(b)sCímkékre ugrás: Ctrl+Shift+T.Megőrzendő:LaTeXLaTeX-képletLaTeX matematikai környezetElakadásokU&tolsó kártyaLegutóbbi kikérdezésa legutóbb hozzáadottak előreTanulásElőrehozott tanulás határaTanulás: %(a)s, kikérdezés: %(b)s, újratanulás: %(c)s, szűrtek száma: %(d)sTanulásMumusMumus-szavak kezeléseMumus-szavak küszöbértékeBalLegfeljebbBetöltés…Jelszó a felhasználói fiók lezárásához, illetve hagyd üresen:Leghosszabb időközKeresés ebben a mezőben:Legkevésbé könnyűMűveletek&Jegyzettípusok kezelése...Hozzárendelés ehhez: %sHozzárendelés címkékhezMegjelölésJegyzet megjelöléseJegyzet megjelölése (Ctrl+K)MegjelöltVeteránMaximális időközNapi maximális ismétlések számaMédiaállományMinimális időközPercÚj kártyák és ismétlések vegyesenMnemosyne 2.0-ban készült csomag (*.db)Egyebeka legtöbb elakadásKártya áthelyezéseÁthelyezés másik csomagba (Ctrl+D)Kártyák áthelyezése ebbe a csomagba:&JegyzetEz a név már létezik.Kártyacsomag neve:Név:HálózatÚjÚj kártyákÚj kártyák a csomagban: %sCsak az új kártyákNapi új kártyák számaÚj kártyacsomag neve:Új időközÚj név:Új jegyzettípus:Új beállításcsoport neve:Új sorrendi helye (1–%d.):Új nap kezdete:Egyetlen kártya sem esedékes még.A megadott feltételeknek egyetlen kártya sem felelt meg.Nincs üres kártya.Ma még egyetlen veterán kártyát sem tanultál.Egyetlen hiányzó vagy használaton kívüli fájl sem volt.JegyzettípusJegyzetazonosítóJegyzettípusJegyzettípusokA jegyzet és a hozzá tartozó %d kártya törölve.A jegyzet és a hozzá tartozó %d kártya törölve.Jegyzet félretéveJegyzet felfüggesztveMegjegyzés: a médiaállományról nem készül biztonsági mentés. Kérlek, készíts mentést rendszeresen az Anki-mappádról.Megjegyzés: az előzmények egy része hiányzik. További tájékoztatást a böngésző leírásában találhatsz.Jegyzetek formázatlan szövegkéntEgy jegyzeten legalább egy mezőnek lennie kell.Jegyzetek felcímkézve.SemmiOKa legrégebben látottak előreA legközelebbi szinkronizáláskor kényszerítsen módosítást az egyik irányban.A program egyes jegyzeteket nem importált, mivel nem jött létre belőlük kártya. Ez olyankor fordul elő, ha valamelyik mező üres, illetve ha a szövegfájl tartalmát nem a megfelelő mezőkre képezted le.Csak új kártyáknál módosíthatod a kikérdezés sorrendjét.Egyszerre csak egy kliens férhet hozzá az AnkiWebhez. Ha az előző szinkronizálás nem járt sikerrel, kérlek, próbálkozz újra néhány perc múlva.MegnyitásOptimalizálás...Felső határ (nem kötelező):BeállításokBeállítások ehhez: %sBeállításcsoport:Beállítások…Sorrenda hozzáadás sorrendjébenesedékesség ideje szerintHátlapsablon felülbírálása:Betűtípus felülbírálása:Előlapsablon felülbírálása:Kötegelt Anki-kártyacsomag (*.apkg *.zip)Jelszó:A két jelszó nem egyezik.BeillesztésVágólapon lévő képek beillesztése PNG-kéntPauker 1.8 lecke (*.pau.gz)SzázalékIdőszak: %sÚj kártyák listájának végéreIsmétlőkártyák listájára a megadott határok közti időközzel:Kérlek, adj meg előbb egy új jegyzettípust.Kérlek, légy türelemmel: ez egy kis időbe telhet.Kérlek, csatlakoztass mikrofont a géphez, és győződj meg róla, hogy más program nem használja a hangeszközt.Kérlek, módosítsd ezt a jegyzetet: adj hozzá lyukas szöveget. (%s)Kérlek, győződj meg róla, hogy az egyik profil meg legyen nyitva, az Anki pedig ne legyen elfoglalt, majd próbálkozz újra.Kérlek, telepítsd a PyAudio programot.Kérlek, telepítsd az mplayert.Kérlek, előbb nyiss meg egy profilt.Kérlek, futtasd az Eszközök > Üres kártyák menüpontot.Kérlek, válassz egy csomagot.Kérlek, egyazon jegyzettípusból válassz kártyákat.Kérlek, válassz ki valamit.Kérlek, frissíts az Anki legújabb verziójára.Kérlek, a Fájl > Importálás menüponttal importáld ezt a fájlt.Kérlek, az AnkiWebre belépve frissítsd a kártyacsomagod, majd próbálkozz újra.Sorrendi helyTestreszabásElőnézetKiválasztott kártya előnézete (%s)Új kártyák előnézeteAz elmúlt időszakban hozzáadott új kártyák előnézete:Feldolgozás…Profil jelszava...Profil:ProfilokProxy-hitelesítés szükséges.KérdésSor vége: %dSor eleje: %dKilépésvéletlenszerűenVéletlenszerű sorrendÉrtékelésFrissítésre készÚjraépítésSaját hang felvételeHangrögzítés (F5)Felvétel...
Idő: %0.1fRelatív elmaradásÚjratanulásLegutóbbi szöveg megjelenítése hozzáadáskorCímke eltávolításaFormázás törlése (Ctrl+R)Ha törlöd ezt a kártyatípust, akkor egy vagy több jegyzet is törlődni fog. Kérlek, hozz létre előbb egy új kártyatípust!ÁtnevezésCsomag átnevezéseHang lejátszása újbólSaját hang lejátszásaSorrendmódosításÚj kártyák sorrendjének módosítása&Sorrendmódosítás...Az alábbi címkék közül legalább egy szerepeljen:ÁtütemezésÁtütemezésKártyák átütemezése az e csomagban adott válaszaimnak megfelelőenFolytatás mostJobbról balra írt szöveg (RTL)'%s' előtti állapotba visszaállítvaKikérdezésKikérdezések számaKikérdezésre fordított időElőzetes kikérdezésElőzetes kikérdezés erre az időszakra:Az elmúlt időszakban elfelejtett ismétlőkártyák:Elfelejtett kártyák ismétléseKikérdezés sikerességének aránya a nap egyes óráibanKikérdezésekEsedékes ismétlőkártyák a csomagban: %sJobbKép mentéseHatókör: %sKeresésKeresés a formázásban (lassú)Válasszunk&Mindent kijelöl&Jegyzet kiválasztásaKizárandó címkék:A kiválasztott fájl nem UTF-8 formátumú. Kérlek, nézd meg az útmutató importálásra vonatkozó részét.Célzott tanulásPontosvesszőA szerver nem érhető el. Vagy megszakadt az internetkapcsolatod, vagy pedig egy vírusirtó vagy tűzfalprogram akadályozza az Anki webes csatlakozását.%s alatti összes csomagra is ez a beállításcsoport vonatkozzon?Beállítás minden alcsomagra isSzövegszín megadása (F7)A Shift gomb le van nyomva. Az automatikus szinkronizálás és a kiegészítők betöltése elmarad.Meglévő kártyák eltolásaGyorsbillentyű: %sGyorsbillentyű: %s%s megjelenítéseVálasz mutatásaAzonosak kijelzéseIdőmérés kijelzése válaszadáskorElőbb az ismételendő kártyákat mutassa, aztán az újakatElőbb az új kártyákat mutassa, aztán az ismételendőketAz újakat a hozzáadás sorrendjében mutassaAz újakat véletlenszerűen mutassaKövetkező ismétlés idejének kijelzése a válaszgombok fölöttHátralévő kártyák számának kijelzése kikérdezéskorStatisztikák kijelzése. Gyorsbillentyű: %sMéret:Egyes kapcsolódó vagy félretett kártyákat későbbre halasztottunk.Egyes beállítások csak az Anki újraindítása után lépnek életbe.Egyes frissítéseket a program figyelmen kívül hagyott, mert a jegyzettípus megváltozott:Rendezési mezőRendezéskor ezt a mezőt vegye alapul a böngészőE szerint az oszlop szerint nem lehet rendezni. Kérlek, válassz másikat.Képek és hangokSzóközKiindulási helyzet:Kiindulási könnyűségStatisztikákLépés:Lépések (percben)A lépéseknek számoknak kell lenniük.HTML-formázás törlése beillesztéskorA mai tanulás eredménye %(a)s, %(b)s alatt.Ma tanultakTanulásTanulócsomagTanuló&csomag...Kezdjük!Tanulás a kártyák állapota vagy címkéje szerintStílusStílus (az összes kártyára vonatkozóan)Alsó index (Ctrl+Ó)XML-be exportált Supermemo-fájl (*.xml)Felső index (Ctrl+Ü)FelfüggesztésKártya felfüggesztéseJegyzet felfüggesztéseFelfüggesztveHang- és képanyag szinkronizálása isSzinkronizálás az AnkiWebbel. Gyorsbillentyű: %sMédia szinkronizálása...A szinkronizálás sikertelen volt: %sA szinkronizálás sikertelen volt: nincs internetkapcsolat.A szinkronizáláshoz be kell állítani a pontos időt a számítógép óráján. Kérlek, állítsd be, majd próbálkozz újra.Szinkronizálás...TabulátorAzonosak felcímkézéseCsak címkeCímkékCélcsomag (Ctrl+D)Kívánt mező:SzövegTabulátorral vagy pontosvesszővel határolt szöveg (*)Ez a csomag már létezik.Ez a mezőnév már használatban van.Ez a név már használatban van.Az AnkiWebbel való kapcsolat időtúllépés miatt megszakadt. Kérlek, ellenőrizd az internetkapcsolatodat, majd próbálkozz újra.Az alapértelmezett beállítás nem törölhető.Az alapértelmezett csomag nem törölhető.A csomagjaidban lévő kártyák megoszlásaAz első mező üres.A jegyzettípus első mezőjének kapcsolódnia kell a kártyák tartalmához.Az alábbi karakter nem használható: %sEnnek a kártyának üres az előlapja. Kérlek, futtasd az Eszközök > Üres kártyákat.Az ikonok több forrásból származnak; alkotóik listája az Anki kódjában található.A megadott szöveg üres kérdést eredményezne az összes kártyán.Megválaszolt kérdések számaA továbbiakban esedékes kikérdezések számaAz egyes gombok lenyomásának számaA rendszered ideiglenes mappájának nincsenek megfelelő engedélyei, és az Anki ezeket nem tudja automatikusan javítani. A további tájékozódáshoz, kérlek, keresd meg az Anki-útmutatónak az ideiglenes mappára („temp folder”) vonatkozó részét.A megadott fájl nem érvényes .apkg állomány.A megadott keresésnek egyetlen kártya sem felelt meg. Szeretnéd módosítani?A kívánt módosításhoz a teljes adatbázist fel kell tölteni, amikor legközelebb szinkronizálod a gyűjteményt. Ha más eszközön olyan változtatást végeztél, amit még nem szinkronizáltál, akkor az most el fog veszni. Akarod folytatni?A kérdések megválaszolásával eltöltött időA frissítés elkészült: mostantól fogva az Anki 2.0-t használhatod.

Alább olvasható a frissítési napló:

%s

Van még új kártya, de elérted a napi limitet. Növelheted a limitet a beállításoknál, de kérlek, tartsd szem előtt, hogy minél több új kártyát vezetsz be, annál megterhelőbb lesz a rövid távú ismétlés.Legalább egy profilnak lennie kell.E szerint az oszlop szerint nem lehet rendezni, viszont kereshetsz konkrét kártyatípusokra, például 'card:1-es kártya'.E szerint az oszlop szerint nem lehet rendezni, viszont kereshetsz konkrét kártyacsomagokra, ha baloldalt rákattintasz valamelyikre.Úgy tűnik, ez nem érvényes .apkg fájl. Ha ezt a hibaüzenetet egy AnkiWebről letöltött fájlból kaptad, a letöltés valószínűleg sikertelen volt. Kérlek, próbáld újra, és ha a probléma továbbra is fennáll, próbálkozz egy másik böngészővel.A fájl már létezik. Biztosan felül szeretnéd írni?A biztonsági másolatok könnyebb mentése végett ebben a mappában, egy helyen szerepel minden Ankival kapcsolatos adat. Más hely beállításához lásd: %s Ez egy speciális csomag, amely a szokásos ütemezésen kívüli tanulásra szolgál.Ez egy {{c1::minta}} lyukas szöveg.Ez a művelet törli a meglévő gyűjteményed, és a most importált fájlból származó adatokkal írja felül. Valóban ezt akarod?Ez a varázsló végigvezet az Anki 2.0 frissítésének folyamatán. A zökkenőmentes frissítéshez, kérlek, olvasd el figyelmesen az alábbiakat. IdőIdőkeretIsmételendőA kiegészítők közti böngészéshez kattints az alábbi „böngészés” gombra.

Ha találtál téged érdeklő kiegészítőt, kérlek, másold be a kódját ide alulra.Jelszóval védett profilba való importálás előtt, kérlek, nyisd meg a profilt!Ha egy meglévő jegyzetet lyukas szövegként (cloze) szeretnél használni, előbb át kell állítani „lyukas szöveg” típusra a Szerkesztés > Jegyzettípus módosítása menüponttal.Ha meg akarod most nézni, kattints a lenti „Félretevés megszüntetése” gombra.A szokásos ütemezésen kívüli tanuláshoz kattints alább az Egyéni tanulás gombra.MaA mai kikérdezési limitet elérted, de vannak még kikérdezendő kártyák. Az optimális memorizálás érdekében hasznos lehet a beállítások között megnövelned a napi limitet.ÖsszesenIdőráfordítás összesenKártyák összesenJegyzetek összesenA bevitt szöveg reguláris kifejezésként értendőTípusVálasz megadása: ismeretlen %s mezőCsak olvasható fájlból nem lehetséges az importálás.Félretevés megszüntetéseAláhúzott (Ctrl+U)VisszavonásVisszavonás: %sIsmeretlen fájlformátum.MegtanulatlanMeglévő jegyzet frissítése, ha első mezője egyezik%(b)d meglévő jegyzet közül %(a)d frissítveA frissítés befejeződöttFrissítővarázslóFrissítés%(b)s gyűjtemény %(a)s csomagjának frissítése... %(c)sFeltöltés az AnkiWebreFeltöltés az AnkiWebre...Egyes kártyák hivatkoznak rá, de a médiamappában nem található:1. felhasználó%s verzióVárakozás a szerkesztés befejezéséreFigyelem: a lyukas szöveg addig nem működik, amíg a fenti típust be nem állítod Lyukas szövegre.Üdvözöllek!Bővítéskor az aktuális csomag legyen az alapértelmezésVálasz kijelzésekor kérdés és válasz hangfelvételének lejátszásaHa készen állsz a frissítésre, kattints az alábbi gombra. Ennek során a böngésződben fog megnyílni a frissítési útmutató. Kérlek, olvasd el figyelmesen, mivel az előző Anki-verzióhoz képest sok minden megváltozott.A csomagjaid frissítésekor az Anki megpróbál minden képet és hangot átvenni a régi csomagokból. Ha egyéni DropBox mappát vagy egyéni médiamappát használtál, a frissítés során nem biztos, hogy sikerül megtalálni a médiaállományaidat. Fogsz kapni egy jelentést a frissítés folyamatáról. Ha úgy látod, hogy a média nem került a helyére, akkor a további teendőket a frissítési útmutatóban találod.

Az AnkiWeb most már lehetővé teszi a média közvetlen szinkronizálását. Ehhez nincs szükség külön telepítésre, és az Anki a kártyáiddal együtt a médiaállományaidat is szinkronba hozza az AnkiWebbel való szinkronizálás során.Teljes gyűjteménySzeretnéd most letölteni?Készítette Damien Elmes. Javítások, fordítások, tesztelés és design:

%(cont)sVan egy lyukasszöveg-jegyzettípusod, de még nem hoztál létre lyukas szöveget. Folytatod?Sok kártyacsomagod van. Kérlek, nézd meg ezeket: %(a)s. %(b)sMég nem vetted fel a hangodat.Legalább egy oszlopnak lennie kell.FrissFrissen tanultA kártyacsomagjaidA módosításaid több kártyacsomagot is érintenek. Ha csak az aktuális csomagot szeretnéd módosítani, kérlek, hozz létre előbb ehhez egy új opciócsoportot.A gyűjteményfájlod sérültnek tűnik. Ez olyankor fordulhat elő, ha a fájlt másolják vagy átmozgatják, miközben az Anki meg van nyitva, illetve hogyha a gyűjtemény valamely hálózaton vagy felhő- (cloud-) meghajtón van tárolva. Kérlek, nézz utána az útmutatóban, hogyan lehet automatikus mentésből helyreállítani.A gyűjteményed ellentmondásos állapotban van. Kérlek, futtasd az Eszközök > Adatbázis ellenőrzése menüpontot, majd végezd el újból a szinkronizálást.A gyűjteményed vagy egy médiafájl túl nagy a szinkronizáláshoz.A gyűjteményed feltöltése az AnkiWebre sikeresen megtörtént. Ha bármely más eszközt is használsz, kérlek, szinkronizáld most ezeket, és a letöltést válaszd majd arra a gyűjteményre vonatkozóan, amit az imént töltöttél fel erről a gépről. A későbbi kikérdezések és a hozzáadott kártyák ezt követően automatikusan be lesznek illesztve ebbe az állományba.Az itteni és az AnkiWeben tárolt kártyacsomagjaid oly mértékben eltérnek, hogy nem lehet egyesíteni őket, így az egyiken lévő csomagokat felül kell írni a másikon lévőkkel. Ha a letöltést választod, az Anki letölti a gyűjteményt az AnkiWebről, és minden olyan változás el fog veszni, amit a számítógépeden végeztél a legutóbbi szinkronizálás óta. Ha a feltöltést választod, az Anki feltölti a gyűjteményedet az AnkiWebre, és minden olyan változás el fog veszni, amit az AnkiWeben vagy más eszközödön végeztél az ezzel a géppel való legutóbbi szinkronizálás óta. Miután minden eszköz szinkronba került, a későbbi kikérdezések és hozzáadott kártyák automatikusan be lesznek illesztve.[nincs csomag]megelőző változat másolatakártyakártyát a csomagbólkártya, kiválasztásuk alapja:gyűjteménynnapcsomagcsomag élettartamamásodpéldánysúgóelrejtóraórával éjfél utánelakadáshozzárendelve ehhez: %shozzárendelve ehhez: Címkékpercperchókikérdezésmásodpercstatisztikákez az oldalhétteljes gyűjtemény~anki-2.0.20+dfsg/locale/oc/0000755000175000017500000000000012256137063015115 5ustar andreasandreasanki-2.0.20+dfsg/locale/oc/LC_MESSAGES/0000755000175000017500000000000012065014111016664 5ustar andreasandreasanki-2.0.20+dfsg/locale/oc/LC_MESSAGES/anki.mo0000644000175000017500000000704212252567246020172 0ustar andreasandreasMg "&*. 2<BHNRX`gmqw }    %( /< AMRW^z       # (  ( 5 F U j z               - 3 8 @ H P W l r y                  !& H O Y ] a i p z    !  @$<F8H= 9&E'(+L; 0*,BJI!4 >.-3A#?)M%C6:1" 5K D/2G7 Stop%d selected%d selected%s copy%s day%s days%s hour%s hours%s minute%s minutes%s month%s months%s second%s seconds%s year%s years%sd%sh%sm%ss%sy&About...&Edit&File&Find&Go&Help&Import&Tools&UndoAddAddedAgainAverage TimeBasicBuryCancelCenterChangeCloseConnecting...CreatedCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZDeleteDialogE&xitEasyEditExportExport...F1FieldsFirst ReviewGoodHTML EditorHardHelpImportInvalid regular expression.KeepLeftMoreNetworkNothingOpenPassword:PreferencesProcessing...ReviewReviewsRightSelect &AllSupermemo XML export (*.xml)SuspendTagsTotal TimeVersion %sdaysProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:21+0000 Last-Translator: Cédric VALMARY (Tot en òc) Language-Team: Occitan (post 1500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: Arrestar%d seleccionada%d seleccionadasCòpia de %s%s jorn%s jorns%s ora%s oras%s minuta%s minutas%s mes%s meses%s segonda%s segondas%s an%s ans%sd%sh%sm%ss%sy&A prepaus...&Editar&Fichièr&Recercar&Anar&Ajuda&Importar&Aisinas&AnullarApondreApondudaTornamaiDurada mejanaBasicBuryAnullarCentrarCambiarTamparConnexion en cors...CreatCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Maj+FCtrl+ZSuprimirBóstia de dialòg&QuitarAisitEditarExportarExportar...F1CampsPrimièra revisionPlanEditor HTMLDurAjudaImportarExpression racionala pas valabla.GardarEsquèrraMaiRetPas resDobrirSenhal :PreferénciasTractament en cors...ContrarotlarRevisionsDrechaSeleccionar &totSupermemo exportat en XML (*.xml)SuspendreEtiquetasDurada totalaVersion %sjornsanki-2.0.20+dfsg/locale/zh_CN/0000755000175000017500000000000012256137063015515 5ustar andreasandreasanki-2.0.20+dfsg/locale/zh_CN/LC_MESSAGES/0000755000175000017500000000000012065014111017264 5ustar andreasandreasanki-2.0.20+dfsg/locale/zh_CN/LC_MESSAGES/anki.mo0000644000175000017500000020356112252567246020576 0ustar andreasandreasV|5xGyG GGG"GG GGG8G%H>HOH"`H$H$H&HH"I6IIIZI$wI III0IJ#J&2J YJeJ(vJJJ,JJ* K6K,KK xKK(KKKKKKK KKKKL LLL%L)L 0L:L@L HLSL eLpLLLLLLLL0L M%M +M 6MAMGMZMqMuMNNN NNN N%N)N-NT1NNN,N(NN!O5OfMOO OO O OPP#P8PeOPP7_Q QQ5QXQYCR8RkR BS NSYS]S xS SS S SS SSSS S$ST T+T ;T ET%PTKvTTNT"&UIU#`VVVV WWEXWXRXv.YwY7Z UZwaZEZ@[`[g[v[R~[[T\#o\#\\ \\(]9] A]N] b]o]]] ] ]]]]]^^^/^L7^^^^^^^ ^ ^)_'+_S_```#`*`1`9` R` \` f`q` ```` `3``S a`aiapa wa aaaaa"abb&b EbQb Xbdb ub bbbbbb-bc cc(-cVc5hc ccc8c5cP)d7zddd dddde ee$e+e2e9e@eGeNeUe\ece je we e e e e e eeee e eff $f1f DfQffffffff f f ff f/ g=gCgXg%`gg g g g g g g g gg,h(4h]h{h hFhNhP0i>iPijj]8j j8jj jjk)kDk`kdk skkkk k kkk k kkkk k!kl#l)2l0\lll4l!llm'm=mVmjm{m mmmmmmmmm m mmm mm nn, nMn_nfnnnwnnnnnn n nnN oXoloqooooEpNpSpnppp ppppp ppp qq$qBqIq Nq[qcqhqyq.qFqqr .r4:rorr r1rrrrs*sEs tt uu"=u"`u uuuuuuu u v v)5v_vqvvw(w=w[wzwwwww w wwww<w+x4x :xGxWx\x ex+pxxx xxx x xx x yy#y*y;yOyUyfynyyy y yyyy yy zzz z&zU!Fw*(1D,I/y'it#de{8ؖC(r &au /M Û!ϛ'<C[`h}.&ڜ &+=,U U $86o(Js"WS0S$"̢ Ң ޢ{e^f5ŤU Zdlr  èȨͨӨ%(08 >HJ[] )6=DUW`s%˫ ܫ'EX p | Ǭ Ԭ2 & 6BK^ gqɭϭ߭  #7 N Y g r } îѮ!5L[ r }4Ư ϯٯ&`* ǰ ҰMݰ+/E+]%ͱQ7 KYn} ²Hв2޳>N9[Ef* " ѵ޵  *7 J W cm} Ͷ 0]|R">'Nv{m R2XW޻g6' Ƽjм4;1p :oh-ܾ !? FS fs  !ȿ! & 5*?jz  (   + > KXj} *? 5?FM\l! $'7>N a nz$ !' %A3Q54R7a    '.5<CJQX_ f s   7DWs$   9 V `m!t   3!.U(' ##)'#Q)u c(>/n u  $ 1>E N [f v  &1"67=u  (247:=@C c p }  $  + <I Zgn ~$     #07H\ l z & 2 ]@0! (95o 0XDW p}!!$   &4;KRb$z1J[k  #C6z  '  &3: P]m t   0=Y s ~    1EYi%!'   $,QdTtM0Pcgn0%pd   $ . 9C J Wdw&   (3"O"r'K= [G%( I `.1 ( GTp   %C \!i l %8K gt+ < #0Bb i v !  % 2=Dc juM|6;% A O ] g t-->l E+< A!K*m &(O_fv $!  0 = JT pK 0 : GQX q%$HNk+/Z86! (+B1 [M(O7J#{9<.v`pw~ uNf3B#fm  !:A] } *) ' 4 A)Nx- }u'|8 WdY}X30dq8[-kudv}    3:AELPW^ bo 7.^(}'Z)2 q+UTD4`CV=X9 J :d=k"Jb#$+Wo!VS,~Sn~n&B+PQ>yF1ElY  ;ht~`r6l,"YFWB`O [a)88 !dgM/z U:3Z0I f=_])LL *\h_xK<Y\Dw>V;/Fv.OzfeRQUo|EeX&p1-B+84yvWE&<G t %p:.CH3OK|*ti?/R$9zP$80'j^g 'p!H6Zm  G;]d(_G>eCo3%x MrP yF\0jTI'@{I3cN7{xq1#j?IH4ND"N*uv6HwBJw75%5AAu9]D;L<*K:m k{)@^(EO$VSs%}il gA4-?C[?a[KiNLu!b|bT"TRksJ(QM0fc=9,52&675hqSnm#-a.XR/c1G2}>2#AQ  sU-@<r,PM@  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaCompress backups (slower)Configure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-12-12 11:47+0000 Last-Translator: Jason Chen Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-13 05:54+0000 X-Generator: Launchpad (build 16869) Language: 停止 (%d分之1) (关) (开) 有 %d张卡片%% 正确%(a)0.1f %(b)s/天%(a)0.1f 秒 (%(b)s)更新了%(b)d条笔记中的%(a)d条上传%(a)dkB, 下载%(b)dkB%(tot)s %(unit)s%d张卡片删除了%d张卡片导出了%d张卡片导入了%d张卡片学习了%d张卡片,用时%d张卡片/分钟上传了%d个记忆库%d种组合%d条笔记添加了%d条笔记导入了%d条笔记更新了%d条笔记%d 次复习选中 %d 个%s已经在你的桌面上了,要覆盖它么?%s 复制%s 天%s天%s个月%s个月%d 卡片打开备份文件夹访问网页%(pct)d%% (%(x)s 源于 %(y)s)%Y-%m-%d @ %H:%M备份
每次关闭和同步之后Anki都会对你的数据进行备份导出格式查找字体大小:字体:选择字段:包含:行大小:替换:同步同步
尚未启用,点击主界面的同步按钮启用。

需先注册

你需要一个免费帐号来同步你的数据. 请注册 一个帐号,并在下方填写详细资料。

Anki有更新

Anki %s 发布了。

<忽略><非unicode文本><在这里输入进行搜索,点击回车键显示记忆库>向所有提出过建议,报告过bug以及提供过捐助的人们致谢。卡片的难易程度衡量了你再次回答“犹豫/想起”的时间间隔的大小。一个名为collection.apkg的文件已经保存在了你的桌面上同步媒体文件时出现问题。请使用 工具>检查媒体 后再次同步以纠正这种情况失败: %s关于Anki添加添加(快捷键:ctrl+enter)添加字段添加多媒体文件添加新的记忆库添加笔记类型反向添加添加标签添加新的卡片添加到:添加:%s已添加今天添加的添加第一字段%s的副本生疏/错误今天再来一次重复计数: %s所有的记忆库所有字段所有卡片的顺序为随机的 (补习模式)该本地帐户下所有的卡片、笔记、多媒体文件都会被删除,你确定么?允许在字段中使用HTML一个插件发生了错误。
请把它报告在插件的论坛上:
%s
当打开 %s 时出现一个错误发生了一个错误。 它可能是由一个无害的漏洞造成的,
或者你的记忆库可能有一个问题。

为了确认这不是你的记忆库导致的问题,请运行 工具 > 检查数据库.

如果这不能修复这个错误,请把下列信息复制到
漏洞报告窗口:一张图片保存到了你的桌面上AnkiAnki 1.2版记忆库(*.anki)Anki 2 使用新的格式存储您的记忆库。 这个向导能自动 转换您的记忆库格式,并会自动备份您的记忆库,确保当 您需要恢复到旧版本的Anki时,记记库依然可用。Anki 2.0 版记忆库Anki 2.0仅支持1.2及以后版本的记忆库。如果要使用更早版本的记忆库,请先使用Anki 1.2更新至1.2版本,再导入到Anki 2.0。Anki 记忆库包Anki无法区分问题与答案。请手动调整模版以明确问题与答案。Anki是一个基于重复学习原理的记忆软件,简单易用,免费并开源。Anki以AGPL3协议发布. 请查看源代码分布中的协议文件获得更多信息.Anki无法载入您的旧版本配置文件,请使用 文件>导入 导入您以前版本的记忆库用户名或密码错误,请重试。用户名Anki网络遇到了一个错误,请稍后重试。如果问题仍然存在,请填写一份bug报告。Anki服务器目前十分繁忙,请稍后重试。AnkiWeb在维护中,请几分钟后再试一遍答案回答按钮答案杀毒软件或防火墙正在阻止Anki连接到因特网所有孤立的卡片都会被删除,没有保存到卡片中的笔记也会丢失,您确定要继续么?在文件%s中出现了两次您确定要删除%s?至少需要一个卡片类型请至少选择一个难易度添加 图片、影音文件为附件(F3)自动播放音频打开本地帐户时自动同步平均平均用时平均回答用时平均难度学习数日的平均值平均间隔背面背面预览背面模版备份基础基础的(和相反的卡片)基础(任意相反的卡片)粗体(Ctrl+B)浏览浏览&&安装浏览器浏览器 (显示 %(cur)d 卡片; %(sel)s)浏览器外观浏览器选项Build批量增加标签批量移除标签 (Ctrl+Alt+T)本次不复习搁置卡片搁置笔记搁置相关新卡片到隔日搁置相关复习到隔日默认情况下,Anki将会检测各字段之间的字符,例如 制表符,逗号等等。如果Anki未能正确检测字符,你 可以在这里输入字符。用“\t“代表制表符。取消卡片卡片 %d卡片1卡片2卡片 ID卡片信息卡片列表窗口卡片类型卡片类型%s的卡片类型已搁置的卡片暂停的卡片子卡片为记忆难点卡片卡片类型不能手动移动卡片到过滤记忆库纯文本卡片卡片在复习完后将会自动回到原始的记忆库中。卡片…居中更改将%s改为:改变记忆库改变笔记类型改变笔记类型(Ctrl+N)改变笔记类型…更改颜色 (F8)根据笔记类型改变记忆库已更改检查媒体(&M)...检查媒体文件目录中的文件正在检查...选择选择记忆库选择笔记类型玄子标签克隆:%s关闭关闭并放弃当前的输入吗?填空题删除完形填空 (Ctrl+Shift+C)代码:集合已经损坏。请查阅手册。冒号逗号压缩备份(较慢)设置界面语言和选项确认密码:恭喜!你目前已经完成了这个记忆库。正在连接...继续复制熟练卡片的正确答案:%(a)d/%(b)d (%(c).1f%%)正确: %(pct)0.2f%%
(%(good)d of %(tot)d)无法连接到AnkiWeb。请确认你的网络连接没问题,然后再试一遍我发记录语音。你已经安装过lame和sox吗?不能保存文件: %s强记模式创建记忆库创建筛选的记忆库…创建时间Ctrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+Z累计总和 %s累计回答累计卡片当前记忆库现在的笔记类型:当前学习当前学习进程当前步伐 (以分钟计)自定义卡片 (Ctrl+L)自定义区域剪切数据库已重建并且被优化。日期已学习的日期解除授权调试控制台:记忆库覆盖记忆库当一个配置文件打开时记忆库将会被导入。记忆库降低间隔默认延迟直到复习再次出现。删除删除 %s ?删除卡片删除记忆库删除空白删除笔记删除笔记删除标签删除未使用从 %s 删除区域?确定删除'%(a)s'卡片类型和它的%(b)s吗?删除这个笔记类型以及所有的卡片?删除这个未被使用的笔记类型?确定删除未用多媒体文件吗?删除...已删除 %d 没有笔记的卡片.已删除 %d 模板丢失的卡片.已删除 %d 笔记类型丢失的笔记.已删除 %d 没有卡片的笔记.删除了 %d 个有错误统计的笔记.已删除.已删除. 请重启Anki.从记忆库列表删除这个记忆库将会把所有剩余卡片移动回原始记忆库中去。描述用以显示在学习屏幕上的描述(仅限当前记忆库)对话放弃字段下载失败: %s从 AnkiWeb 下载下载成功. 请重启 Anki.从 AnkiWeb 下载...到期仅到期卡片明天到期退出(&X)难度系数顺利/正确简单奖励简单间隔编辑编辑%s编辑当前编辑HTML自定义编辑编辑...已编辑编辑字体编辑已保存. 请重启 Anki.空空卡片...空卡片数量: %(c)s 区域: %(f)s 发现了空卡片。请运行工具>空卡片。第一区域空: %s结束打开记忆库以放入 %s 张新卡片, 或者留空:键入新卡片位置 (1...%s):输入要添加的标签:输入要删除的标签:下载错误: %s启动时出错: %s执行 %s 错误。运行 %s 出错导出导出...额外的FF1F3F5F7F8文件的第%d字段是:字段对应字段名:字段:字段%s 的区域区域分割由: %s区域...过滤(&T)文件不合法. 请从备份恢复.文件已丢失.过滤器过滤器:已过滤筛选记忆库%d查找重复(&D)查找重复查找替换(&P)查找替换结束第一张卡片首次学习第一个区域匹配的: %s修正了%d 张无效属性的卡片固定的笔记种类: %s翻文件夹已存在.字体:底部出于安全考虑, '%s' 不允许出现在卡片中. 你依然可以通过把命令放在不同的包中使用, 然后通过在LaTeX文件头中导入包的方式来替代.预测表格正向&可选的反向正向&反向在 %(b)s 中找到 %(a)s 。正面正面预览正面模版总体生成文件: %s已在 %s 上生成获取记忆库犹豫/想起毕业间隔HTML编辑器困难/模糊LaTeX和dvipng已经安装好了吗?头部帮助最高减轻历史首页每小时的分析小时少于 30 次/h 复习的小时数将不会显示.如果你做出了贡献而你的名字却没有出现在这个列表里,请联系我们。如果你每天学习忽略回答时间长于忽略大小写忽略第一区域与已知笔记相符的记录忽略这次更新导入导入文件导入,即使已经存在有同样第一字段的笔记导入失败。 导入失败. 调试信息: 导入选项导入成功。在媒体文件夹但没有被任何卡片使用为了保证你的集合在不同设备间工作正常, Anki 需要计算机内部时钟被正确设置。 即使系统显示正确的当地时间,内部时钟依旧可能是错的。 请进入计算机的时间设置并检查以下选项: - 上午/下午 - 时钟漂移 - 年,月,日 - 时区 - 夏时制 和正确时间的差异: %s.包含媒体文件包含学习进度信息包含标签增加今天的新卡片上限增加了今天的新卡片上限增加今天的复习卡片上限增加了今天的复习卡片上限增加间隔信息安装插件界面语言:间隔间隔修饰符间隔代码非法。无效编码,请重命名。文件不合法. 请从备份恢复.密码错误。在卡片中发现无效属性。请使用 工具>检查数据库,如果该问题仍存在,请到网站寻求帮助。无效的正则表达式已经被暂停.斜体 (Ctrl+I)JS 错误在行 %(a)d: %(b)s用Ctrl+Shift+T跳到标签保留LaTeXLaTeX 公式LaTeX数学环境失误次数最后一张卡片最近的复习最后一个添加为第一学习先学习的上限学习: %(a)s, 复习: %(b)s, 重新学习: %(c)s, 已过滤: %(d)s正在进行的课程记忆难点记忆难点动作难点阈值左对齐限制为正在载入...用密码锁定帐户,或者留空:最长间隔寻找栏目:最低简化管理管理笔记类型…对应到 %s对应到标签标记标记笔记标记笔记 (Ctrl+K)标记熟练最大间隔最大复习数/天媒体最小间隔分钟混合新卡片和复习Mnemosyne 2.0 记忆库 (*.db)更多最多失误数移动卡片移动到记忆库 (Ctrl+D)移动卡片到记忆库:笔记(N&)姓名存在.记忆库名字:名称:网络新建新卡片记忆库中的新卡片: %s仅新卡片新卡片/天新记忆库名称:新间隔新名称:新笔记类型:新选项组名称:新位置 (1...%d):下一天开始还没有卡片到期.没有卡片满足你提供的标准.没有空卡片.今天没有到期卡片被学习没有找到未使用或缺失的文件笔记笔记 ID笔记类型笔记类型笔记及它的%d张卡片被删除.已搁置的笔记暂停的笔记注意: 媒体文件没有被备份. 为了安全请定期备份你的Anki文件夹.注意: 部分历史已经丢失. 更多详细信息请查看浏览器文档.纯文本格式的笔记笔记需要至少一个字段.已标注的笔记无确定优先查看最旧的在下一次同步时, 强制单方向的改变.因其无法生成卡片,一个或多个笔记没有导入。这种情况通常是因为您把卡片的一栏空了出来或相应的文字无法映射到对应的卡片的栏目中。只有新卡片可以被重新定位.一次只能用一个用户登录AnkiWeb,如果之前的同步失败,请在几分钟后重试。打开优化中...可选限制:选项%s 选项选项组:选项...顺序增加顺序到期顺序忽略背面模版覆盖字体:忽略正面模版打包的Anki 记忆库 (*.apkg *.zip)密码:密码不匹配粘贴把剪切板图像保存为PNGPauker 1.8 课件 (*.pau.gz)百分比周期: %s放到新卡片队列队尾放入复习队列的时间间隔:请先加入另一个笔记类型.请耐心; 这可能需要一定时间.请连接一个麦克风, 并保证其他程序没有在使用音频设备.请编辑这个笔记并且添加一些填空的留白。(%s)请确保打开了一个配置文件并且Anki没有处于繁忙中,然后再试一次。请安装PyAudio请安装mplayer请先打开一个个人配置文件.请运行 工具>空卡片请选择一个记忆库.请选择同一种笔记类型的卡片.请选择一些东西.请升级到最新版本的Anki.请使用 文件>导入 来导入这个文件.请访问AnkiWeb, 升级你的记忆库并重试.位置偏好设置预览预览选择的卡片 (%s)预览新卡片预览加到最后的新卡片处理中...个人配置文件密码...个人配置文件:个人配置文件需要代理授权.问题队尾: %d队首: %d退出随机随机顺序评分准备升级重建录制自己的声音录制音频(F5)录音中...
时间: %0.1f按照相对过期程度重新学习当添加时记住上一次输入移除标签移除格式 (Ctrl+R)移除这个卡片类型将会导致一个或多个卡片被删除。请先建立一个新的卡片类型。重命名重命名记忆库重新播放音频重新播放自己的声音重新定位重新定位新卡片重新定位...需要这些标签中的一个或者多个:重新计划重新安排进度基于我在此记忆库中的回答重新定制卡片计划现在恢复文字反向(RTL)返回到"%s"之前的状态。复习评论计数复习时间提前复习提前复习按复习最后忘记的卡片复习忘记的卡片当天每小时的复习成功率复习记忆库中到期的复习: %s右对齐保存图像范围: %s搜索用格式搜索(耗时长)选择全选(&A)选择笔记(&N)选择排除的标签:选择的文件不是UTF-8格式的。请查看帮助文档的导入部分。选择性学习分号服务器没有找到。或者你的链接是中断的,或者杀毒软件/防火墙软件正在阻止Anki链接Internet。将所有%s下的子记忆库设置到这个选项组?对所有子记忆库设置设置前景色 (F7)Shift键被按住。跳过自动同步以及插件加载。改变已存在卡片状态快捷键: %s快捷键: %s显示 %s显示答案显示重复显示回答计时器在复习后显示新卡片先学习新卡片,再复习按创建顺序学习新卡片按随机顺序学习新卡片在回答按钮上显示下一次复习时间在复习的时候显示剩余的卡片计数显示统计. 快捷键: %s大小:一些相关或搁置卡片会被推迟到下一学习周期进行。某些设置将在Anki重新启动后生效一些更新被忽略,因为笔记的类型已经更改:排序域在浏览器中按照此域排序不支持本列排序, 请选择另一列.声音和图片间隔开始位置:开始简化统计步幅:步伐 (以分钟计)步伐必须是数字.粘贴文字时去除HTML标签今天学习在%(b)s内学习了%(a)s.今天学习的学习学习记忆库学习记忆库...现在学习按照卡片状态或者标签学习样式格式刷(卡片格式共享)下标 (Ctrl+=)Supermemo XML (*.xml)上标 (Ctrl+Shift+=)今后不复习暂停卡片暂停笔记已暂停同时同步音频和图像同步到AnkiWeb. 快捷键:%s同步媒体文件...同步失败: %s同步失败; 网络离线.同步需要计算机的时钟设置正确. 请检查时钟设置并重试.正在同步...选项卡复制标签仅标记标签目标记忆库 (Ctrl+D)目标栏目:文字按tab或者分号分隔的文本 (*)这个记忆库已存在.卡片该面的文字已被使用。这个名字已被使用.链接到AnkiWeb 超时。 请检查你的网络连接,再试一次。默认配置不能被删除.默认记忆库不能被删除.牌组中的记忆库类型.第一字段为空.笔记类型的第一字段必须被对应.下列字符不能被使用: %s卡片正面为空, 请运行 工具>空卡片.这些图标是来自于不同的来源;请查阅Anki 源代码 以了解具体情况。您的输入可能会使所有卡片的问题为空。已经回答的问题的数量。将来到期的复习的数目按下每个按钮的次数.系统临时文件夹的权限设置不正确,Anki不能自动更改他们。请搜索在帮助手册中搜索"临时文件夹"以获取更多信息。提供的文件不是正确 . apkg文件。您的搜索不能匹配任何卡片。您愿意修改一下您的请求的改变需要在下次同步你的集合时上传整个数据库. 如果你还有在其他设备上未同步的复习或者其他改变, 他们将会丢失, 是否继续?答题用时更新完毕,您可以开始使用Anki 2.0了。

更新日志如下:

%s

您仍有新的卡片可以学习,但是已经达到 当日限值。您可以在选项中增加限值,但请 注意,您学习的新卡片越多,您所需的短期 复习量就越大。必须有至少一个个人配置文件.本列不能被排序, 但是你能搜索单个卡片类型, 如 'card:Card 1'.本列不能被排序, 但是你能单击左侧搜索指定的记忆库。这个文件不是可用的.apkg文件。如果您是从AnkiWeb下载的这个文件,有可能是您的下载失败了,请重试。如果问题依旧存在,请换一个不同的浏览器重试。文件已存在.确定要覆盖吗?包含您所有Anki数据的文件夹只存放在单一位置 以便备份。若需Anki使用其他位置, 请看: %s 这是一个在正常计划外学习的特殊记忆库。这是一个 {{c1::示例}} 的完形填空。这将会删除你现有的集合并将它替换为你导入的文件中的集合. 是否确认?在Anki 2.0的升级过程中,该向导将引导您。 为了成功升级,请仔细参阅下面的说明。 时间时间框的时间限制待复习欲浏览 插件,请点击下面的浏览器按钮。

。请将您中意的插件的代码复制到下面。如果需要导入密码保护的文件,请在导入之前打开该文件。要为现存的笔记制作一个完形填空,你需要先把笔记更改成完形填空的类别,通过编辑>更改笔记类型。欲现在查看,请点击“取消搁置”按钮在正常计划外学习, 请单击下面的自定义学习按钮.今天达到了今天的复习限制, 但是仍有卡片等待被复习. 为了最佳化记忆, 可以考虑在设置中增大每日限制.总计总计用时所有卡片所有笔记以正则表达式输入类型键入答案:未知域 %s不能从只读文件中导入.取消搁置下划线文本 (Ctrl+U)撤销撤销 %s未知的文件类型.未看当卡片一面相同时更新已有笔记更新了 %(b)d 中 %(a)d 的已有笔记升级完成升级向导正在升级升级记忆库 %(b)s分之%(a)s.. %(c)s上传到AnkiWeb正在上传到AnkiWeb...卡片中有使用但媒体文件夹未找到用户1版本 %s等待编辑完成.警告,在你把上方的笔记类型改成"完型填空"之前,你的完形填空的填空内容将不会发挥功能。欢迎当添加时,默认是当前记忆库当答案显示后, 重新播放问题和答案的音频若您已准备好升级,请点击同意按钮以继续。升级 向导会在您的浏览器打开。因与之前Anki版本有 诸多变化,故请仔细阅读。当您的牌组更新时,Anki会尝试从旧的牌组中复制所有声音 和图像。若您使用了自己的Dropbox文件夹或媒体文件夹, 更新过程中有可能无法确定您媒体的位置。稍后您会收到更新报告, 若您发现媒体未被复制,请参阅更新指南以获得更多的指导。

Ankiweb现在支持直接同步媒体。当您需要同步到Ankiweb时, 不需要额外安装,Anki可以同时同步卡片和媒体。全部集合你想现在就下载?Damien Elmes开发, 以下人员参与制作补丁、翻译、测试和设计:

%(cont)s你有一个完形填空的笔记但是还没有制作任何填空内容。继续执行?您有许多牌组尚未学习,请看%(a)s. %(b)s你还没有录制你的声音.必须至少有一列.年轻新的+学习中的你的记忆库你的改变将会影响到很多记忆库. 如果你只想要改变当前记忆库, 请先添加一个选项组.您的牌组文件已损坏。可能是因为您在Anki打开时移动或复制了该文件,或者文件储存于网络或云端服务器。请参阅相关手册以了解如何使用自动备份来保存牌组。你的集合处于不一致的状态. 请运行 工具>检查数据库, 然后再次同步.集合或者媒体文件过大而不能同步你的集合成功上传到了 AnkiWeb. 如果你使用任何其他设备的话, 请现在同步他们, 并选择下载你刚刚从这台电脑上上传的集合. 将来的复习和和加入的卡片将会自动合并.您现在的牌组与Ankiweb上的牌组有些许不同而不能合并,所以必须覆盖其中的一个牌组。 如果您选择下载,那么Anki会从Ankiweb上下载对应的牌组,而您电脑上的牌组最后一次同步后的更改将会丢失。 如果您选择上传,那么Anki会上传您的牌组,而您在Ankiweb或其他设备最后一次同步后的更改将会丢失。 当所有设备完成同步后,之后的复习和增加的卡片会自动的合并到一起。[没有记忆库]备份卡片记忆库中的卡片卡片选择按集合天天记忆库记忆库寿命复制帮助隐藏小时点 (凌晨)失误次数对应到%s对应到标签分钟分钟月复习秒状态此页周全部集合~anki-2.0.20+dfsg/locale/gu/0000755000175000017500000000000012256137063015127 5ustar andreasandreasanki-2.0.20+dfsg/locale/gu/LC_MESSAGES/0000755000175000017500000000000012065014111016676 5ustar andreasandreasanki-2.0.20+dfsg/locale/gu/LC_MESSAGES/anki.mo0000644000175000017500000001173412252567245020206 0ustar andreasandreas^ "1BHNTX^fv}      $ * 1 ; G N T Y ^ f n t x                    % , 1 9 > D K W \ a i t }         n   " "    2 A P )l  !      0=Pfw , ,<i (&6Tg ).4Daz}#   +5M ] jt   #."Ad t /)( &C J\.+7B: <[=>*86N!9L? Z0EOTR-AWF@;D,"5$X]%'Q4SUVY#M13HG2I PK^  Stop%%d selected%d selected%s copy%s day%s days%s hour%s hours&Edit&File&Find&Go&Help&Import&Preferences...&Tools&Undo(new)/:AddAdd TagsAgainAverageBackBrowseBrowserCancelCards...CenterChangeChangedChecking...CloseColonCommaConnecting...CopyCreatedCutDateDecksDeleteDelete...DescriptionDialogE&xitEasyEditEdit %sEdit...EmptyEndError executing %s.Error running %sExportExport...ExtraF1F3F5F7F8Filter:Find DuplicatesFind and ReplaceFooterForecastFormFrontGeneralGoodHTML EditorHardHeaderHelpHistoryHomeHoursImportImport FileInfoLeftMinutesPercentagePositionRandomReviewRightTextTotalTotal TimeUnseenhoursminutesProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:29+0000 Last-Translator: Damien Elmes Language-Team: Gujarati MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: gu ભંધ કરો%%d પસંદ થયેલ%s નકલ%s દિવસ%s દિવસો%s કલાક%s કલાકોસંપાદન (&E)ફાઇલ (&F)શોધો (&F)જાઓ (&G)મદદ (&H)આયાત કરો (&I)પ્રાથમિકતાઓ (&P)...સાધનો (&T)પાછું લાવો (&U)(નવુ)/:ઉમેરવુંટેગ્સ ઉમેરોફરીસરેરાશપાછાબ્રાઉઝબ્રાઉઝરરદ કરોપત્તાં...કેન્દ્રબદલોબદલાયેલચકાસી રહ્યા છીએ...બંધ કરોમહાવિરામઅલ્પવિરામજોડાઈ રહ્યા છીએ...કૉપિ કરોબનાવાયેલકાપોતારીખપત્તાની થપ્પીઓડિલીટ કરોકાઢી નાખો...વર્ણનસંવાદ&બહાર નીકળોસહેલુંફેરફાર કરો%s ફેરફાર કરોફેરફાર...ખાલીઅંત કરો%s ચલાવવામાં ભૂલ.%s ચલાવવામાં ક્ષતિનિકાસનિકાસ કરો...વધારાનુંF1F3F5F7F8ફિલ્ટર:નકલી શોધોશોધો અને બદલોફુટરઅંદાજસ્વરૂપઆગળસામાન્યસરસHTML સંપાદકઅઘરુંહેડરમદદઇતિહાસહોમકલાકઆયાતફાઈલ આયાત કરોજાણકારીડાબુંમિનીટોટકાવારીજગ્યારેન્ડમઉપરછલ્લી સમજજમણુંલેખનકુલકુલ સમયજોયેલ નથીકલાકોમિનિટોanki-2.0.20+dfsg/locale/mr/0000755000175000017500000000000012256137063015132 5ustar andreasandreasanki-2.0.20+dfsg/locale/mr/LC_MESSAGES/0000755000175000017500000000000012065014111016701 5ustar andreasandreasanki-2.0.20+dfsg/locale/mr/LC_MESSAGES/anki.mo0000644000175000017500000006500212252567246020207 0ustar andreasandreas{ "  "1$T$y&0 >F&U |(,*B,W(     1<Tds0  ,%(R{    7 V`Xs    ". 4K?N"#) M R i a!o!"R "7s" "w"E/#u#|######## $6$(O$x$ $$ $$$$ $ $$%% %?%F%N%T%Y%& &&&-& 4&B&&J& q&}&&&&&(& &&&&&' ' ' !'.'5'9'>'D' K' W' a'm' t'''''''''''' '( ( ( ((6(=(F(M(U(i(y(( ((((( (($(() )))F)e)x) )))*)) )**"*(*1*7* <* F*R*Y*a*f* n*!x**** * ** * ***+ +'+D+K+ Q+ ]+i+++6++,5,=,N,S,8X,, ,!,,,,, -" -W.------------ ----// //@/>0@0<O0%0g0m1[11E22+3?3337 4#D4h414%4=4%5=>5%|5=557686A6J6P6Y6'_666#666 6 77 67.W7$7:7)7!8:28m8$8o89 )9595D9z9~9 9 99999A9E:9^:0::$:;;**;'U;4};;'<<:d<<c= =H==)=>8>I>Y>p>>>We??>]@@okCC*CD!FG)HHI&JAJ LLLL?M`PM]MGNTWN,NxNROeO2O%OJO.&PUP1ePPP P)P>P7QTQjQ zQ-QS+SS T'TCTNSTTTTGT!-U!OUzqU&UV%#VIVPVWV^V eV rVV VV.VV&VW)W9W&IWpW WWWWWOW_DX/X/XY"$Y GYTY>WY"YYYYY0Y(-Z7VZ/Z.ZZZ![2[+E[ q[q~[[ \\ &\ 0\:\B\],3]1`])]]Wa^,^E^ ,_9_I_ \_ f_s____ ___`` ``# a1aMa]a/maaCaOa5Mb5bb b!bbTcascHcdadOeme<e eeze _flfWfffggjg+h h i i i4'i#\i)iii iiiij utDZh]3'-!I"> # $C*%\EVYvS/1+LQr?6 4Ad7i}@zO U Pc `k=THqJ[j&.ygB_eb {)sw M2  0p5WN~lG<mKRnF(;:af9xX8|,o^ Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)dkB up, %(b)dkB down%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d note%d notes%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s year%s years%s year%s years%sd%sh%sm%ss%sy&About...&Cram...&Edit&Export...&File&Find&Go&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(new)(please select 1 card).../0d1 101 month1 year: and%d card%d cardsOpen backup folderVisit websiteExport format:Find:Font Size:Font:In:Include:Line Size:Replace With:

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.About AnkiAddAdd (shortcut: ctrl+enter)Add TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki is a friendly, intelligent spaced learning system. It's free and open source.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAppeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)BrowseBrowserBuildBuryBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCard ListCenterChangeChange %s to:ChangedCheck the files in the media directoryChecking...ChooseCloseClose and lose current input?ColonCommaConfigure interface language and optionsConnecting...CopyCreatedCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+Shift+LCtrl+ZCutDateDecksDeleteDelete TagsDelete...DescriptionDialogDiscard fieldE&xitEasyEditEdit...EmptyEndEnter tags to add:Enter tags to delete:Error executing %s.Error running %sExportExport...ExtraF1Field %d of file is:Field mappingFieldsFil&tersFilterFilter:Find &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst ReviewFooterForecastGeneralGoodHTML EditorHardHave you installed latex and dvipng?HeaderHelpHistoryHomeHoursIf you have contributed and are not on this list, please get in touch.Ignore this updateImportImport FileImport failed. Import optionsIn media folder but not used by any cards:Include scheduling informationInclude tagsInvalid regular expression.KeepLaTeXLearningLeechLeftMap to %sMap to TagsMarkedMinutesMoreNetworkNew CardsNo unused or missing files found.NothingOpenOptionsPassword:PercentagePositionPreferencesProcessing...RandomRecord audio (F5)Recording...
Time: %0.1fRescheduleReverse text direction (RTL)ReviewRightSelect &AllShow AnswerShow new cards before reviewsShow new cards in order addedShow new cards in random orderSome settings will take effect after you restart Anki.Strip HTML when pasting textSupermemo XML export (*.xml)SuspendSyncing Media...TagsTextThis file exists. Are you sure you want to overwrite it?TotalTotal TimeTreat input as regular expressionUndo %sUnseenUsed on cards but missing from media folder:Version %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sdayshelphidehourshours past midnightmapped to %smapped to Tagsminsminutesmosecondsthis pagew~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-09-05 06:23+0000 Last-Translator: sabretou Language-Team: Marathi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: mr थांबा (%d मधून १) (बंद) (चालू) %d पत्ता आहे. %d पत्ते आहेत.%% अचूक%(a)dकि.बा. अप, %(b)dकि.बा. डाउन%d पत्ता%d पत्ते%d पत्ता काढून टाकला.%d पत्ते काढून टाकले.%d पत्ता निर्यात केला.%d पत्ते निर्यात केले.%d पत्ता आयात केला.%d पत्ते आयात केले.%d पत्त्यांचा एवढ्या वेळात अभ्यास केला:%d पत्त्यांचा एवढ्या वेळात अभ्यास केला:%d पत्ता/मिनिट%d पत्ते/मिनिट%d टीप%d टिपा%d निवडला%d निवडले%s आधिच आपल्या डेस्कटॉपवर अस्तित्वात आहे. उपरिलेखन करावे का?%s प्रत%s दिवस%s दिवस%s दिवस%s दिवस%s काढून टाकले.%s तास%s तास%s तास%s तास%s मिनीट%s मिनीट%s मिनीट%s मिनीट%s महिना%s महिने%s महिना%s महिने%s सेकंद%s सेकंद%s सेकंद%s सेकंद%s वर्ष%s वर्ष%s वर्ष%s वर्ष%sदि%sता%sम%sसे%sवआन्की विषयी (&A)...कोंबा (&C)...संपादन (&E)एक्सपोर्ट (&E)...फाइल (&F)शोधा (&F)जा (&G)मदत (&H)आयात करा (&I)इम्पोर्ट (&I)...निवडणूक उलट करा (&I)पुढचा पत्ता (&N)&अॅड-ऑन्स फोल्डर उघडा...प्राधान्यता (&P)...आधला पत्ता (&P)पुन्ह अनुसूचित करा (&R)...साधने (&T)पूर्ववत करा (&U)'%(row)s' मध्ये %(num1)d रकाने होते, %(num2)d अपेक्षीत होते(%s अचूक)(अंत)(नवीन)(कृपया १ पत्ता निवडा).../०दि१ १०1 महिना१ वर्ष: आणि%d पत्ता%d पत्तेबॅकअप संचिका उघडासंकेतस्थळ पाहानिर्यात स्वरूप:शोधा:फॉन्ट अकार:फॉन्ट:आत:समाविष्ट करा:ओळींचा आकार:याने अदलाबदल करा:

आन्की अद्ययावत केले

आन्की %s प्रकाशीत झालं आहे.

<दुर्लक्ष केले><युनिकोड नसलेलं पाठ्य>ज्यांनी सूचना, बग अहवाल व देणग्या पुरवल्या त्या सर्वांचे हार्दिक धन्यवाद.आन्की विषयीजोडाजोडा (शोर्टकट: कंट्रोल+एंटर)टॅग जोडानवीन पत्ता जोडाह्यात जोडा:जोडा: %sजोडलेआज जोडलेपुन्हासर्व रकानेया प्रोफाईलचे सर्व पत्ते, नोट व मीडिया डिलीट केले जातील. आपली खात्री आहे का?फील्डांमध्ये एचटीएमएल अनुमत कराएका अॅडऑनमध्ये त्रुटी आढळली.
अॅडऑन फोरमवर हे पोस्ट करा:
%s
%s उघडण्यात त्रुटी आढळलीत्रुटी आढळली. असं एका छोट्याश्या बगमुळे झालं असेल,
किंवा आपल्या डेकमध्ये एखादी समस्या असू शकते.

आपल्या डेकमध्येच समस्या नाही आहे याची पुष्टी करण्यास, साधनं > डेटाबेस तपासा चालवा.

जर याने समस्या सोडवली गेली नाही, तर खालील मजकूर कॉपी करून
एका बग रिपोर्टमध्ये पाठवा:चित्र आपल्या डेस्कटॉपवर संचयीत केलं गेलं.आन्कीआन्की १.२ डेक (*.anki)आन्की आपल्या डेक्सना एका नवीन स्वरूपात साठवतो. हा विजार्ड आपोआप आपल्या डेक्सना त्या स्वरूपात रूपांतर करून देईल. उन्नतीकरण करण्याआधी आपले डेक बॅकअप केले जातील. अर्थात जर आपल्या आन्कीच्या एखाद्या पूर्वीच्या आवृत्तीचा वापर करू लागला, तरीही आपले डेक वापरण्यायोग्य राहतील.आन्की २.० डेकआन्की २.० फक्त आन्की १.२ पासून स्वयंचलित उन्नतीकरणचे समर्थन करतो. जुने डेक लोड करण्यास, त्यांना आन्की १.२मध्ये उघडून त्यांचे उन्नतीकरण करा, व मग त्यांना आन्की २.० मध्ये आयात करा.आन्की डेक पॅकेजआन्की एक स्नेहभावाचे व हुशार अंतरदेउन शिकण्याची प्रणाली आहे. हे मोफत व मुक्त स्रोतोचे आहे.आन्कीवेब आयडी किंव्हा पासवर्ड चुकीचा होता; पुन्हा प्रयत्न करून बघा.आन्कीवेब आयडी:आन्कीवेबमध्ये त्रुटी आढळली. काही मिनिटांनंतर पुन्हा प्रयत्न करून बघा. जर समस्या टिकून राहिली, तर कृपया बग रिपोर्ट नोंदवा.आन्कीवेब यावेळी खूपच व्यस्त आहे. कृपया काही मिनिटांनंतर पुन्हा प्रयत्न करा.उत्तरउत्तर बटणउत्तरंफाईलमध्ये दोनदा आढळलं: %sतुम्हाला नक्की %s डिलीट करायचं आहे का?कमीतकमी एक कार्ड प्रकार आवश्यक आहे.कमीतकमी एक पाऊल आवश्यक आहे.चित्र/ऑडियो/विडियो संलग्न करा (F3)आपोआप ऑडिओ वाजवाप्रोफाईल उघड/बंद केल्यावर आपोआप समक्रमीत करासरासरीसरासरी वेळमध्यामान उत्तर वेळमध्यमान सहजताशिकलेल्या दिवसांचे मध्यमानमध्यमान मध्यांतरमागीलमागील पुर्वावलोकनमागील साचाबॅकअपमूळमूळ (व उलट पत्ता)मूळ (वैकल्पिक उलट पत्ता)तपासणी कराब्राउझरबिल्डगाडामुलभूत मघ्ये, आन्की रकाना ते रकाना मधील टॅब, स्वल्पविराम वगैरे सारख्या अक्षराचा तपास लावेल. जर आन्की त्या अक्षराला चुकीच्या पद्धतीने तपास लावत असेल तर ते आपण इथे प्रविष्ट करु शकतात. टॅब दर्शित करण्यासाठी \t वापरा.रद्द करापत्त्यांची यादीकेंद्रबदलवा%s ला बदलवून करा:बदललेमिडीया संचयीकेतील फाइल तपासातपासत आहे.....निवडाबंद कराबंद करून वर्तमान आदान गमवा?अपूर्णविरामस्वल्पविरामअंतराफलकाच्या भाषेची व पर्यायांची संरचना कराजोडणी करत आहे...नक्कलनिर्माण कलेलेCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+Shift+LCtrl+Zकापादिनांकपत्त्यांचे गठ्ठेकाढून टाकाटॅग काढून टाकाहटवा...वर्णनसंवादरकाना रद्द करानिर्गमन (&x)सोपेसंपादित करासंपादन...रिकामेसमाप्तजोडण्यासाठी टॅग प्रविष्ट करा:काढून टाकण्यासाठी टॅग प्रविष्ट करा:%s चालवताना त्रुटी.%s चालू करण्यात दोषनिर्यात करानिर्यात करा...अगाऊF1फाइल मधील %d रकाना आहे:रकाना मांडणेरकानेगाळण (&t)गाळणीचाळणी:प्रतिलिपि शोधा (&D)...प्रतिलिपि शोधाशोधून अदलाबदल करा (&p)...शोधून अदलाबदल करापहिले पुनरावलोकनतळटीपहवामानसर्वसामान्यचांगलेएचटीएमएल संपादककठीणतुम्ही लॅटेत व dvipng प्रतिष्ठपीत केले आहेत का?शिर्षटीपमदतइतिहासगृहतासजर तुम्ही योगदान केल्याशिवाय या यादीत नसाल, तर आम्हाला कळवा.हा अद्ययावत दुर्लक्ष कराआयात कराफाइल प्राप्त कराआयात अपयशी राहिले. पर्याय आयात कराहे कोणत्याही पत्त्याने न वापरल्याशीवाय मिडीया संचयीकेत आहेत:अनुसूचानाची माहिती समाविष्ट कराटॅग समाविष्ट कराअवैध रेग्यूलर एक्सप्रेशन.ठेवालॅटेकशिक्षणजळूडावी%s ला मांडाटॅगना मांडाचिन्हाकृतमिनिटेअधिकनेटवर्कनवीन पत्तेकोणत्याही विनावापरलेल्या किंव्हा गायब असलेल्या फाइल सापडल्या नाही.काही नाहीउघडापर्यायपरवलीचा शब्द:टक्केवारीस्थानपसंतीविश्लेषण करत आहे...यादृच्छिकऑडीयो ध्वनिमुद्रित करा (F5)ध्वनिमुद्रित करत आहे...
वेळ: %0.1fपुन्हा अनुसूचित कराविपरीत पाठ्य दिशा (RTL)समीक्षाउजवीसर्व निवडा (&A)उत्तर दाखवानवीन पत्ते पुनरावलोकनाधी दाखवानवीन पत्ते जोडण्याच्या क्रमात दाखवानवीन पत्ते विनाक्रमी दाखवाकाही संयोजना फक्त आन्की पुन्हा सुरु केल्यानंतर लागू होतील.पाठ्य चिटकवताना एचटीएमएल काढून टाकासुपरमेमो एक्सएमएल निर्यात (*.xml)निलंबित करामिडीया ताळमेळ करत आहे...टॅगपाठ्यही फाइल अस्तित्वात आहे. खोडून पुन्हलेखन करावे?एकूणअकूण वेळआदानला रेग्यूलर एक्सप्रेशन माना%s मागे घ्यान पाहिलेलेपत्त्यांवर वापरलेले पण मिडीया संचयीकेतून गायब असलेले:%s आवृत्तीतुम्हाला हे अत्ता डाउनलोड करायचे आहे का?डेमियन एल्म्सने लिहिलेले, व या सर्वानपासून पॅच, भाषांतर, चाचणी आणी डिझाइन:

%(cont)sदिवसमदतलपवातासमध्यरात्रीनंतर तास%s ला मांडलेटॅगना मांडलेमिनिटंमिनिटेमकाओसेंकदहे पानw~anki-2.0.20+dfsg/locale/pt_BR/0000755000175000017500000000000012256137063015522 5ustar andreasandreasanki-2.0.20+dfsg/locale/pt_BR/LC_MESSAGES/0000755000175000017500000000000012065014111017271 5ustar andreasandreasanki-2.0.20+dfsg/locale/pt_BR/LC_MESSAGES/anki.mo0000644000175000017500000020637312252567246020607 0ustar andreasandreas7I3DD DDD"DD DD8EKEdEuE"E$E$E&EF"9F\FoFF$F FFF0GAGIG&XG GG(GGG,GH*1H\H,qH HH(HHHHHHH H II%I.I 4I?IEIKIOI VI`IfI nIyI IIIIIIIJJ0 J >JKJ QJ \JgJmJJJJ(K*K-K2K:KAKFKKKOKSKTWKKK,K(KL!9L[LfsLL LL M M'M7MIM^MeuMM7N NN5NXOYiO8O O PPP 2P SCSZS RT`TTURUvUw_V7V WwWEW@WX!X0XR8XXY#)Y#MYqY YY(YY YZ Z)ZBZSZ XZ eZsZ{ZZZZZZZLZ>[Q[a[g[[[ [[m\t\y\\\\ \ \ \\\\\ ]3 ]A]SU]]]] ] ]]]^^",^O^&W^ ~^^ ^^ ^ ^^^^^ _-_@_F_(L_u_5_ ___8_5`PH`7``` ``aa a 'a2aCaJaQaXa_afamata{aa a a a a a a a aaaa b bb2b CbPb cbpbbbbbbb b b cc c/,c\cbcwc%cc c c c c c c c dd,&d(Sd|dd dFdNePOe>ePe0f9f]Wf f8ff gg#g)9gcggg gggg g ggg g gggh h!hl DlRlalil|l lll ll$lll llm mm.#mFRmmm m4mn&n -n19nkn{nnn*n nn o#o"Co"fo ooooooo p p)pDpVprppppppppq q q$q7q=q<Oqqq qqqq q+qqr r)r0r Er Or[r `rjr}rrrrrrrrrs s ss5sIs Os\sksqsys }sss ss s ssstt1t+Gtst#t!tt t t<t u-u]=uauu!v3v;v>v,Pv}v#Ewiw nw|wwww ww w wwwx x#x:x@x^x {x xx,x#x)yV+y8yEyzz/zLziz,zz-z+z8{X{ a{m{u{{#{ {{{{{|"| 3|A|F|M|]|d|u|}||||| ||i }u} |} }} }} }"}} }1 ~ <~G~ d~~ ~ ~ ~~~~-~&.F L Wah  V (2,G Z{  ρ (*G'r!6‚ !?&fv| Ճ  $ / =GbjԄ ܄ *!L]!pd  )7(<e X+"@&c0+ՇUFW*(Ɉ1I$n'^t#d ep֌8͍C(ڎrv auMvđʑk q | !'ْ&;.Bq &“ԓ, +UJ$8͔( "W>S0$"@c i u{^\Ue Ş͞Ӟ  $*>EYot|  "ˡ? "Kn--Ģ-/ ,P.}'У'' Ha. &Ȥ (7L,c(ʥ.!&0W`d m{  Ŧ ͦڦ   2Ddv  ç4ͧ   *1B\`*,/4;AGMRWi]ǩɩ2ݩ+<![}x); S `k{v85 )F>Zm?N Ѯ%9M ` m {-į ʯׯ/`Fc#'?'gϳ\E*H̶'XKLU iFsL(k*! >^ erɺϺ$.Sdkm8*>&i \e m x 'ƽֽ.7MIU " 1?Rn(%ſ* =GNl#7 )%46 ky=3_T['   *;BIPW^elsz  * >L`u )! 0=T\<v  )9 H Uct.3&' EPPWeK_V & \4 B0*[ r|   *4<-N|3O%>GB, " .CW `lrtwz} FUt{'-AHP  6"Ils  " * 0 <GOg6mS!6FX;5&\u6$, .6,e/  % ;F>Y%"5<BRdjzJ  "/BU ^ h0v   &2GOVh# *IO`qw|  =Vk*+>8 = JUX/^mL$#@`3!U [iz 5 <I1O )0,8@byoiL'2G8f4>D. s },-# 8 BLir  - 8Yjy + @Mi)y = "%'MVk}"+. /9R Z hs!| "zjz? "LoV)  )4EX+x*8*@39t!J$06Dg 0Pn} ,%%# IU^p%%+ q5  /0$InY1*4Av2+XKL&*)AV+Jv"}z2%?0l2L R _iOB["' $*'/6W <!: V+b2 (Y1 &DJ1#CRgs5. d#  KS$"nG           ' . 4 = C ] o            &:V u9M jEXT !_Yevwx&z{6j4A'~,kqa'U;l+2N;,y(GP`\/Gp.;n77zV>i bD }"?A*1h=a,SfQ#K?EN=2pH@7$(0f4[w@&U g< Ft* sJIr$=\*CtFyTw]X1`2m Z]>8c,}- .01+)/ <6 LRV_/#G)@C~r_Jm8gS b^.$4<Y5 uoLED:eqr7aQM|Q#MqF\i3OX>9Ivf/W td+%Ro p[ 0KB8NOnY1"{3%'9im5^+gKI6u4x-5&Uy0Aj #!)P]O|ken6:CWokx3".-^`"Wd!ZH$PRl*5}hBHJ(SD2 s['{BL(-h!%)c?Z3%z|ld ~sbc   T v Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.Underline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: Anki 0.9.7.7 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-10 04:33+0000 Last-Translator: Celio Alves Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) X-Poedit-Country: BRAZIL Language: X-Poedit-Language: Português Parar (1 de %d) (desligado) (ligado) Há %d cartão. Há %d cartões.%% Certo%(a)0.1f %(b)s/dia%(a)d de %(b)d nota atualizada%(a)d de %(b)d notas atualizadas%(a)dkB enviados, %(b)dkB baixados%(tot)s %(unit)s%d cartão%d cartões%d cartão excluído.%d cartões excluídos.%d cartão exportado.%d cartões exportados.%d cartão importado.%d cartões importados.%d cartão estudado em%d cartões estudados em%d cartão por minuto%d cartões por minuto%d baralho atualizado.%d baralhos atualizados%d grupo%d grupos%d nota%d notas%d nota adicionada%d notas adicionadas%d nota importada.%d notas importadas.%d nota atualizada%d notas atualizadas%d revisão%d revisões%d selecionado%d selecionados%s já existe no seu computador. Sobrescrever?%s cópia%s dia%s dias%s dia%s dias%s excluído.%s hora%s horas%s hora%s horas%s minuto%s minutos%s minuto.%s minutos.%s minuto%s minutos%s mês%s meses%s mês%s meses%s segundo%s segundos%s segundo%s segundos%s para excluir:%s ano%s anos%s ano%s anos%sdia(s)%sh%smin(s)%smês(meses)%ss%sy&Sobre...&Complementos&Conferir Banco de Dados...&Intensivo...&Editar&Exportar...&Arquivo&Procurar&Ir&Guia&Guia...&Ajuda&Importar&Importar...&Inverter seleção&Próximo Cartão&Abrir Pasta de Complementos...&Preferências...Cartão &anterior&Reagendar...&Suporte Anki...&Trocar Perfil&Ferramentas&Desfazer'%(row)s' tem %(num1)d campos, de %(num2)d esperados(%s certo)(fim)(filtrado)(estudando)(novo)(limite pai: %d)(Favor, selecione 1 card)...Os arquivos .anki2 não são projetados para serem importados. Se você estiver tentando restaurar uma cópia de segurança, por favor, consulte a seção "Cópias de segurança" do manual do usuário./0d1 101 mês1 ano10:0022:003:004:0016:00504 erro de tempo limite de portal recebido. Por favor, tente desabilitar temporariamente seu antivírus.: e%d cartão%d cartõesAbrir pasta de backupVisite o site%(pct)d%% (%(x)s de %(y)s)%Y-%m-%d @ %H:%MBackups
Anki criará uma cópia de segurança da sua coleção a cada vez que ela for fechada ou sincronizada.Formato a exportar:Encontrar:Tamanho da FonteFonteEm:Incluir:Tamanho da LinhaSubstituir Por:SincronizaçãoSincronização
Não ativada agora; clique no botão de sincronização na janela principal para ativá-la.

Requer conta

Uma conta grátis é necessária para manter sua coleção sincronizada. Por favor, registre-se e então entre com seus detalhes abaixo.

Anki atualizado

Anki %s foi lançado.

Um muito obrigado a todas as pessoas que nos deram sugestões, avisos de bugs e doações.A dificuldade do cartão diz o tamanho do próximo intervalo quando você responder "bom" na revisão.Um arquivo chamado collection.apkg foi salvo no seu computador.Abortado: %sSobre o AnkiAdicionarAdicionar (atalho: ctrl+enter)Adicionar CampoAdicionar MídiaCriar Novo Baralho (Ctrl+N)Adicionar Tipo de NotaAdicionar InvertidoAdicionar etiquetasCriar novo cartãoAdicionar a:Adicionar: %sAdicionadoAdicionado hojeDuplicata adicionada com o primeiro campo: %sErreiRepetir HojeContagem de repetições: %sTodos os BaralhosTodos os CamposTodas as cartas em ordem aleatória (cram mode)Todos os cartões, notas e mídia para este usuário serão excluídos. Você está certo disso?Permitir HTML em camposUm erro ocorreu em um complemento.
Por favor, publique isto no fórum do complemento:
%s
Ocorreu um erro ao abrir %sUm erro ocorreu. Deve ter sido causado por um erro inofensivo, ou seu deck pode ter um problema. Para confirmar, não é um problema com seu deck, por favor, vá a Ferramentas > Conferir Banco de Dados. Se isso não resolver o problema, por favor, copie o seguinte em um relatório de problemas.Uma imagem foi salva em seu computador.AnkiBaralho Anki 1.2 (*.anki)O Anki 2 armazena seus baralhos em um novo formato. Seus baralhos serão convertidos automaticamente para este formato. Antes, será criada uma cópia de segurança deles, pois, se você precisar voltar à versão anterior do Anki, seus baralhos continuarão funcionando.Baralho Anki 2.0O Anki 2.0 só consegue ser atualizado automaticamente da versão Anki 1.2. Para carregar baralhos antigos, por favor, abra-os no Anki 1.2 para atualizá-los e só então importe-os para o Anki 2.0.Pacote Anki BaralhoO Anki não conseguiu encontrar a linha entre a questão e a resposta. Por favor, ajuste o modelo manualmente para alternar entre a questão e a resposta.Anki é um sistema de aprendizagem amigável e inteligente. É gratuito e de código aberto.Anki é licenciado sobre a licença AGPL3. Por favor, veja o arquivo de licença na fonte de distribuição para maiores informações.O Anki não conseguiu carregar seu antigo arquivo de configuração. Por favor, use Arquivo>Importar para importar seus baralhos das versões anteriores do Anki.O Usuário AnkiWeb ou senha está incorreto; por favor, tente outra vez.Usuário AnkiWeb:AnkiWeb encontrou um erro. Por favor, tente outra vez em alguns minutos, e se o problema persistir, por favor, reporte a falha.O AnkiWeb está sobrecarregado no momento. Por favor, tente outra vez em alguns minutos.AnkiWeb está em manutenção. Por favor tente novamente em alguns minutos.RespostaBotões de RespostaRespostasO antivirus ou firewall está bloqueando o Anki de acessar a internet.Todos os cartões em branco serão excluídos. Se uma nota não tiver cartão referente, será descartada. Você tem certeza que quer continuar?Aparece 2 vezes no arquivo: %sVocê tem certeza que deseja excluir %s?Pelo ao menos um tipo de card é requeridoAo menos um passo é necessário.Anexar imagem/áudio/vídeo (F3)Tocar áudio automaticamenteSincronizar automaticamente ao abrir/fechar perfil de usuárioMédiaTempo médioTempo médio de respostaDificuldade médiaMédia dos dias estudadosIntervalo médioVersoVisualizar o VersoModelo do VersoCópias de segurançaBásicoBásico (e cartão invertido)Básico (cartão invertido opcional)Negrito (Ctrl+B)PainelConhecer &e Instalar...Painel de CartõesPainel de Cartões (%(cur)d cartão exibido; %(sel)s)Painel de Cartões (%(cur)d cartões exibidos; %(sel)s)Aparência do PainelOpções do Painel de CartõesCriarAdicionar Etiquetas em Lote (Ctrl+Shift+T)Remover Etiquetas em Lote (Ctrl+Alt+T)OcultarOcultar NotaPor padrão, Anki detecta o caractere entre os campos, como um tab, vírgula, etc. Se Anki estiver detectando incorretamente, você pode digitá-lo aqui. Use \t para representar tab.CancelarCartãoCartão %dCartão 1Cartão 2Informações do Cartão (Ctrl+Shift+I)Lista de CartõesTipo do CartãoTipos de CartãoTipos de Cartão para %sCartão suspenso.Cartão era um sanguessuga.CartõesTipos de CartõesOs cartões não podem ser movidos manualmente dentro de um baralho filtrado.Cartões em Texto SimplesOs cartões voltarão automaticamente aos seus baralhos originais depois da revisão.Cartões...CentroAlterarMudar %s para:Mudar BaralhoMudar Tipo de NotaMudar Tipo de Nota (Ctrl+N)Mudar Tipo de Nota...Mudar cor (F8)Mudar baralho dependendo do tipo de notaAlteradoVerificar arquivos na pasta de mídiaVerificando...EscolherEscolher BaralhoEscolher Tipo de NotaEscolha etiquetas.Clone: %sFecharFechar e perder este cartão?Omissão de PalavrasOmissão de Palavras (Ctrl+Shift+C)Código:A coleção está corrompida. Por favor, veja o manual.Dois pontosVírgulaConfigurar idioma de interface e opçõesConfirmar senha:Parabéns! Você terminou este baralho por enquanto.Conectando...AvançarCopiarResposta correta em cartões antigos: %(a)d/%(b)d (%(c).1f%%)Certo: %(pct)0.2f%%
(%(good)d de %(tot)d)AnkiWeb não pôde ser conectado. Por favor, verifique sua conexão à rede e tente outra vez.Não foi possível gravar o áudio. O codec lame e o programa sox estão instalados?Não foi possível salvar o arquivo: %sFiltradosCriar BaralhoCriar Baralho Filtrado...CriadoCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZAcumuladoAcumulado %sRespostas AcumuladasCartões AcumuladosBaralho AtualTipo de nota atual:Estudo PersonalizadoSessão de Estudo PersonalizadoPersonalizar passos (em minutos)Personalizar Cartões (Ctrl+L)Personalizar CamposRecortarBanco de dados reconstruído e otimizado.DataDias estudadosDesautorizarConsole de depuraçãoBaralhoSubstituição de BaralhoO baralho será importando quando um usuário for escolhido.BaralhosMais distantes a estudar/revisarPadrãoIntervalos entre as revisões.ExcluirExcluir %s?Excluir CartõesExcluir BaralhoExcluir VaziosExcluir NotaExcluir NotasApagar EtiquetasExcluir InutilizadoExcluir campo de %s?Apagar o '%(a)s' tipos de cartão, e os %(b)s?Excluir este tipo de nota e todos os seus cartões?Excluir este tipo de nota inutilizado?Apagar mídia não utilizada?Excluir...Excluído %d cartão com nota faltando.Excluído %d cartões com nota faltando.Excluído %d cartão com o modelo perdido.Excluídos %d cartões com o modelo perdido.Foi excluída %d nota com tipo de nota faltando.Foram excluídas %d notas com tipo de nota faltando.Foi excluída %d nota sem cartões.Foram excluídas %d notas sem cartões.Apagar nota com erro na contagem do campo.Apagar notas com erro na contagem do campo.Excluído.Excluído. Por favor, reinicie o Anki.Ao excluir esse baralho da lista, todos os cartões restantes voltarão ao baralho original.DescriçãoDescrição para mostrar na tela de estudo (apenas baralho atual):Caixa de DiálogoDescartar campoFalha no download: %sBaixar do AnkiWebBaixado com sucesso. Por favor, reinicie o Anki.Baixando do AnkiWeb...A RevisarApenas cartões devidos.A Revisar amanhãSai&rDificuldadeFácilBônus por ser FácilIntervalo fácilEditarEditar %sEditar AtualEditar HTMLEditar para personalizarEditar...EditadoFonte de EdiçãoEdições salvas. Por favor, reinicie o Anki.Devolver CartõesCartões Vazios...Números dos cartões vazios: %(c)s Campos: %(f)s Cartões vazios encontrados. Por favor, vá até Ferramentas > Cartões vazios.Primeiro campo vazio: %sFimAbra o baralho para colocar %s novos cartões nele, ou deixe em branco:Digite a nova posição do cartão (1...%s):Digite as etiquetas a adicionar:Digite as etiquetas a apagar:Erro no download: %sErro durante a inicialização: %sErro ao executar %s.Erro ao executar %sExportarExportar...ExtraFF1F3F5F7F8Campo %d do arquivo é:Mapeamento de campoNome do campo:Campo:CamposCampos para %sCampos separados por: %sCampos...Fil&trosO arquivo está inválido. Por favor, restaure a cópia de segurança.O arquivo não foi localizado.FiltroFiltro:FiltradoBaralho Filtrado %dEncontrar &Duplicatas...Encontrar DuplicatasAchar e &Substituir...Localizar e substituirTerminarPrimeiro CartãoPrimeia RevisãoVirarA pasta já existe.Fonte:RodapéPor segurança, '%s' não é permitido nos cartões. Você ainda pode, em vez disso, usá-lo colocando o comando em um pacote diferente e importando o pacote no cabeçalho LaTeX.PrevisãoFormulárioNormal e Opção de InverterNormal e InvertidoEncontrar %(a)s através de %(b)s.FrenteVisualizar a FrenteModelo da FrenteGeralArquivo gerado: %sGerado em %sObter CompartilhadoBomRepetir 'Bom' emEditor HTMLDifícilVocê instalou o latex e o dvipng?CabeçalhoAjudaMais fácilHistóricoInícioDistribuição por horaHorasHoras com menos que 30 revisões não foram mostradas.Se você tiver contribuído e não estiver nessa lista, por favor entre em contato.Se você estudou todos os diasIgnorar resposta dada acima deIgnorar maiúsculas / minúsculasIgnorar linhas onde o primeiro campo corresponda a uma nota existente.Ignorar esta atualizaçãoImportarImportar ArquivoImportar mesmo que existam notas com o primeiro campo igualImportação falhou. Importação falhou. Informações para depuração: Opções de importaçãoImportação completa.Na pasta Mídia, mas não utilizado em nenhum cartão:Incluir mídiaIncluir informações de agendamentoIncluir etiquetasAumentar o limite de cartões novos por hojeAumentar o limite de cartões novos de hoje emAumentar o limite de cartões a revisar hojeAumentar o limite de cartões a revisar hoje emMais próximos a estudar/revisarInformaçõesInstalar ComplementoIdioma da Interface:IntervaloModificar o intervaloIntervalosCódigo inválido.Arquivo inválido. Por favor, restaure a cópia de segurança.Senha inválida.Expressão regular inválida.Isto foi suspenso.Itálico (Ctrl+I)Erro JavaScript na linha %(a)d: %(b)sIr para etiquetas com Ctrl+Shift+TManterLaTeXEquação LaTeXMatemática LaTeXErrosÚltimo CartãoRevisão mais recenteCriados há menos tempoAprenderAprender além do limiteAprendidos: %(a)s, Revisados: %(b)s, Reaprendidos: %(c)s, Filtrados: %(d)sAprendizagemSanguessugasAção sanguessugaLimite sanguessugaEsquerdaLimitar aCarregando...Trave a conta com uma senha, ou deixe em branco:Maior intervaloOlhar o campo:Mais difícilGerenciarGerenciar Tipos de Notas...Mapear para %sMapear para EtiquetasMarcarMarcar NotaMarcar Nota (Ctrl+K)MarcadoMaduroIntervalo máximorevisões máximas/diaMídiaIntervalo mínimoMinutosMisturar cartões novos e a revisarBaralho Mnemosyne 2.0 (*.db)MaisMais respostas erradasMover CartõesMover para o Baralho (Ctrl+D)Mover cartões para o baralho:N&otaNome já existe.Nome para o deckNome:RedeNovosNovos CartõesNovos cartões no baralho: %sSomente cartões novos.Novos cartões/diaNovo nome do baralho:Novo intervaloNovo nome:Novo tipo de nota:Novo nome do grupo de opções:Nova posição (1...%d):Novo dia começa àsNenhum card é devido ainda.Nenhum cartão atende aos seus critérios.Não há cartões vazios.Hoje não foram estudados cartões antigos.Todos os arquivos foram localizados e estão sendo utilizados.NotaTipo de NotaTipos de NotaA nota e seu %d cartão foram excluídos.A nota e seus %d cartões foram excluídos.A nota ficará oculta até o Anki ser reaberto.Nota suspensa.Nota: A mídia não tem backup. Por favor, copie periodicamente sua pasta Anki por segurança.Nota: Algo no histórico foi perdido. Para mais informações, por favor, veja a documentação do navegador.Notas em Texto PuroAs notas requerem ao menos um campo.NadaOKMais antiga data do primeiro estudoNa próxima sincronização, obrigar mudanças em uma direção.Uma ou mais notas não foram importadas porque não elas não geraram cartões. Talvez por terem campos vazios ou porque você não mapeou o conteúdo do arquivo texto para os campos corretos.Somente os cartões novos podem ser reposicionados.AbrirOtimizando...Limite opcional:OpçõesOpções para %sGrupo de opções:Opções...OrdemCriados há mais tempoRevisões mais próximasSubstituir modelo do verso:Substituir frente:Substituir modelo da frente:Senha:Senha erradaColarColar imagens da área de transferência como PNGPauker Lição 1.8 (*.pau.gz)PorcentagemPeríodo: %sColocar no fim da fila de novos cartões.Colocar na fila de revisão com intervalo entre:Por favor, crie outro tipo de nota primeiro.Por favor, tenha paciência; isto pode demorar um pouco.Por favor, conecte um microfone e certifique-se que outros programas não estejam usando o áudio.Por favor, clique em Editar abaixo, marque alguma palavra e clique em Omissão de Palavras (Ctrl+Shift+C). (%s)Certifique-se que um perfil de usuário está aberto e o Anki não está travado, então tente outra vez.Por favor, instale PyAudioPor favor, instale mplayerPor favor, primeiro escolha o usuário.Por favor, vá até Ferramentas > Cartões Vazios.Por favor, escolha um baralho.Por favor, escolhar cartões de somente um tipo de nota.Por favor, selecione algo.Por favor, atualize o Anki para a versão mais nova.Por favor, use Arquivo -> Importar para importar este arquivo.Por favor, visite o AnkiWeb, atualiza seu baralho e tente outra vez.PosiçãoPreferênciasPré-visualizaçãoPré-vizualizar os cartão selecionado (%s).Visualizar cartões novosVisualizar cartões novos criados por últimoProcessando...Senha do usuário...Usuário:UsuáriosRequer autenticação proxy.PerguntaÚltimo da fila: %dPrimeiro da fila: %dSairAleatórioOrdem aleatóriaClassificaçãoPronto para AtualizarRecriarGravar Própria VozGravar áudio (F5)Gravando...
Tempo: %0.1fReaprenderNão apagar depois que adicionarRemover EtiquetaRemover formatação (Ctrl+R)Remover este tipo de cartão causaria a exclusão de uma ou mais notas. Por favor, crie um novo tipo de cartão primeiro.RenomearRenomear BaralhoRepetir ÁudioRepetir Própria VozReposicionarReposicionar Novos CartõesReposicionar...Deve ter pelo menos uma dessas etiquetas:ReagendadoReagendarReagendar cartões baseado nas minhas respostas neste baralhoResumir AgoraDireção do texto invertida (RTL)Retornar para o estado antes de '%s'.RevisãoContagem de revisãoTempo de RevisãoAntecipar a revisãoAntecipar a revisão dos próximosRevisar os cartões esquecidos nos últimosRevisar os cartões esquecidosRever a taxa de sucesso para cada hora do dia.RevisõesA revisar no baralho: %sDireitaSalvar ImagemEscopo: %sProcurarProcurar com formatação (lento)SelecionarSelecionar &TudoSelecionar &NotasExcluir cartões com as etiquetas:O arquivo selecionado não encontra-se no formato UTF-8. Por favor, veja no manual como fazer a importação corretamente.Estudo SeletivoPonto e vírgulaServidor não encontrado. Ou sua conexão caiu, ou um programa antivírus/firewall está impedindo o Anki de acessar a internet.Definir todos os baralhos abaixo %s com este grupo de opções?Definir para todos os sub-baralhosDefinir cor de fundo (F7)A tecla Shift foi pressionada. Ignorando o carregamento e sincronização automático.Alterar posição dos cartões existentesTecla de Atalho: %sAtalho: %sMostrar %sMostrar RespostaMostrar DuplicatasMostrar cronômetro de respostaMostrar novos cartões depois das revisõesMostrar novos cartões antes das revisõesMostrar novos cartões na ordem em que foram adicionadosMostrar novos cartões em ordem aleatóriaMostrar tempo da próxima revisão acima dos botões de respostaMostrar contador de cartões restantes durante a revisãoMostrar estatísticas. Atalho: %sTamanho:Algumas configurações só surtirão efeito quando você reiniciar o AnkiClassificar CampoClassificar os cartões no Painel por este campoNão é possível classificar esta coluna. Por favor, escolha outra.Sons e ImagensEspaçoPosição inicial:Multiplicador de diasEstatísticasPasso:Passos (em minutos)Passos devem ser números.Extrair HTML quando colar textoEstudado hoje %(a)s em %(b)s.Estudados HojeEstudarEstudar BaralhoEstudar Baralho...Estudar AgoraEstudando pelo status do cartão ou etiquetaEstiloEstilo (compartilhado entre cartões)Subscrito (Ctrl+=)Exportação em Supermemo XML (*.xml)SobrescritoSuspensoSuspender CartãoSuspender NotaSuspensoSincronizar áudios e imagens tambémSincronizar com o AnkiWeb. Atalho: %sSincronizando Mídia...Falha na sincronização: %sFalha na sincronização; internet offline.A sincronização requer que o relógio do seu computador esteja correto. Por favor, corrija-o e tente outra vez.Sincronizando...TabSomente EtiquetasEtiquetasBaralho Alvo (Ctrl+D)Campo alvo:TextoTexto separado por tabs ou ponto e vírgula (*)Este baralho já existe.Este nome de campo já está em uso.Este nome já está em uso.A conexão ao AnkiWeb expirou. Por favor, confira sua conexão à rede e tente outra vez.A configuração padrão não pode ser excluída.O baralho padrão não pode ser excluído.Como os cartões se dividem no(s) seu(s) baralho(s).O primeiro campo está vazio.O primeiro campo do tipo de nota deve ser mapeado.O seguinte caracter não pode ser usado: %sOs ícones foram obtidos de várias fontes; por favor, veja a fonte Anki para créditos.A entrada que você forneceu criaria questões vazias em todos os cartões.Quantas questões você já respondeu.Quantas revisões agendadas para o futuro.Quantas vezes você escolheu cada botão.A pesquisa não encontrou nenhum cartão. Gostaria de alterá-la?A alteração solicitada exigirá que o banco de dados completo seja enviado na próxima sincronização. Se houver revisões ou outras mudanças em outro aparelho que ainda não tenham sido sincronizadas aqui, elas serão perdidas. Continuar?O tempo gasto para responder às questões.Atualização concluída. Você já pode começar a usar o Anki 2.0.

Abaixo, um relatório da atualização:

%s

Há mais cartões novos disponíveis, mas o limite diário foi atingido. Você pode aumentar o limite nas opções, porém, tenha em mente que quanto mais cartões novos você estudar, maior será sua carga de revisão a curto prazo.Deve existir ao menos um usuário.Não se pode classificar por esta coluna, mas você pode procurar por tipos de cartão individuais, como em 'card:Cartão 1'.Não se pode classificar por esta coluna, mas você pode procurar por baralhos específicos clicando em algum à esquerda.Este arquivo não parece ser um arquivo válido .apkg. Se você está recebendo este erro de um arquivo baixado do AnkiWeb, provavelmente o download falhou. Por favor, tente novamente, e se o problema persistir, tente com um navegador diferente.Este arquivo existe. Gostaria de sobreescrevê-lo?Esta pasta armazena todos os seus dados Anki em um único local para facilitar o backup. Se quiser que o Anki use um local diferente, por favor, veja: %s Este é um baralho especial para estudar fora da agenda normal.Isto é uma {{c1::sample}} omissão de palavras.Isto apagará sua coleção existente e substituirá os dados pelos do arquivo importado. Você tem certeza?Este assistente irá guiá-lo através do processo de atualização para o Anki 2.0. Para uma atualização tranquila, por favor leia as seguintes páginas cuidadosamente. TempoTempo limiteA RevisarPara conhecer os complementos, clique no botão Painel.

Quando você encontrar um complemento que goste, cole seu código abaixo.Para importar para um usuário protegido com senha, abra o seu perfil primeiro.Para omitir palavras em uma nota existente, você precisa mudá-la para o tipo Omissão de Palavras, via Editar>Mudar Tipo de Nota.Para estudar sem interferir na agenda normal, clique no botão Estudo Personalizado abaixo.HojeO limite de revisão de hoje foi alcançado, porém ainda existem cartões a serem revistos. Para melhorar sua memória, considere aumentar o limite diário nas opções.TotalTempo TotalTotal de cartõesTotal de notasTratar texto como expressão regularTipoTipo de resposta: campo desconhecido %sNão é possível importar de arquivo somente leitura.Sublinhado (Ctrl+U)DesfazerDesfazer %sFormato de arquivo desconhecido.Não vistosAtualizar notas existentes quando o primeiro campo coincidirAtualização concluídaAssistente de atualizaçãoAtualizandoAtualizando baralho %(a)s de %(b)s... %(c)sEnviar para o AnkiWebEnviando para o AnkiWeb...Usado em cartões mas faltando na pasta de mídia:Usuário 1Versão %sAguardando pela edição para finalizar.Atenção, exclusões cloze não funcionarão até que você mude o tipo no topo de ClozeBem-vindoAo criar, o padrão é o baralho atualQuando mostrar resposta, tocar os áudios da questão e da resposta.Quando você estiver pronto para atualizar, clique no botão Confirmar. Um guia abrirá no seu navegador enquanto a atualização ocorre. Por favor, leia-o cuidadosamente, pois muita coisa mudou desde a versão anterior do Anki.Quando seus baralhos forem atualizados, o Anki vai tentar copiar todos os sons e imagens dos baralhos antigos. Se você usava uma pasta personalizada do DropBox ou de mídia, a atualização pode não conseguir localizar seus arquivos. Mais tarde, um relatório de atualização será mostrado a você. Se você perceber que a mídia não foi copiada, por favor, veja o guia de atualização para mais instruções.

O AnkiWeb agora suporta sincronismo direto de mídia. Nenhuma configuração especial é necessária e a mídia será sincronizada, com seus cartões, para o AnkiWeb.Coleção inteiraGostaria de fazer o download agora?Escrito por Damien Elmes, com patches, tradução, testes e design por:

%(cont)sVocê tem uma exclusão de nota do tipo Close, mas não foram feitas quaisquer exclusões do tipo Close. Confirma?Você tem muitos decks. Por favor, veja %(a)s. %(b)s.Você ainda não gravou sua voz.É preciso ter ao menos uma coluna.JovemJovem+NovoSeus BaralhosSuas mudanças afetam múltiplos decks. Se você quer modificar apenas o deck atual, por favor, adicione novas opções de grupo primeiro.Seu arquivo de coleção parece estar corrompido. Isto pode ter acontecido quando o arquivo foi copiado ou movido enquanto o Anki estava aberto, ou quando a coleção foi gravada utilizando a rede doméstica ou rede nas nuvens. Favor, leia o manual para obter maiores informações para restaurar através de um backup automático.Sua coleção está em um estado inconsistente. Por favor, vá até Ferramentas > Verificar Banco de Dados e sincronize novamente.Sua coleção foi enviada com sucesso ao AnkiWeb. Se você usa outros aparelhos, por favor, sicronize-os agora e escolha baixar a coleção que você acabou de enviar do seu computador. Depois de fazer isso, as revisões futuras e os cartões adicionados serão incorporados automaticamente.Seus baralhos aqui e no AnkiWeb diferem tanto que não podem ser mesclados, então é necessário que um deles sobrescreva o outro. Se você escolher baixar, o Anki trará a coleção do AnkiWeb e todas as mudanças que você tiver feito desde a última sincronização serão perdidas. Se você escolher enviar, o Anki copiará sua coleção para o AnkiWeb e todas as mudanças que você tenha feito no AnkiWeb ou em outros aparelhos desde a última sincronização serão perdidas. Depois que todos os aparelhos estiverem sincronizados, as futuras revisões e os cartões adicionados serão mesclados automaticamente.[sem baralho]cópias de segurançacartõescartões do deckcartões selecionados porcoleçãoddiasbaralhosempreajudaesconderhorashoras além da meia-noiterespostas erradasmapeado para %smapeado para Etiquetasminsminutosmêsrevisõessegundosestatísticasesta páginawcoleção completa~anki-2.0.20+dfsg/locale/eo/0000755000175000017500000000000012256137063015117 5ustar andreasandreasanki-2.0.20+dfsg/locale/eo/LC_MESSAGES/0000755000175000017500000000000012065014110016665 5ustar andreasandreasanki-2.0.20+dfsg/locale/eo/LC_MESSAGES/anki.mo0000644000175000017500000016402512252567245020200 0ustar andreasandreas t0A A AA"A"(AKA MAWA8jAAAA"A$B$&B&KBrB"BBBB$B C;CPC0hCCC&C CC(CD2D,IDvD*DD,D DE(E>EBEFEJEOESE WEaEjE}EE EEEEE EEE EE EEFF%F4FEFXF_F0eF FF F FFFFFFGGGGGGGGGGGG,G(GH!XSrXXXX X XXY"Y6Y"IYlYtY&Y YY YY Y YYYZZ9Z-?ZmZsZ(yZZ5Z ZZ[5[P<[7[[[ [[\ \\ \&\7\>\E\L\S\Z\a\h\o\v\ }\ \ \ \ \ \ \ \\\\ \ ]]&] 7]D] W]d]y]]]]]] ] ] ] ^ ^/ ^P^V^k^%s^^ ^ ^ ^ ^ ^ ^ ^ ^_,_(G_p__ _F_N_PC`>```]` Xa8daa aaa)ab"b &b3b9b>b Cb Nb\bab ib vbbbb b!bbb)bc%c4)c!^cccccccc ddddddd"d%d Ad Od[dbd idwd dd,dddddd ee.eCe Te _eleqeeeeEfNfSfnfff fffff fff gg$gBgIg Ng[gcghgyg.gFggh .h4:hohh h1hhhhi*i EiSi rii"i"i ijj j/jCjLj ^j hj)vjjjjjjkk#k2kBk Ik Skaktkzk<kkk kkkk l+l:lKl Zlflml l ll llllllllm m&m@m Em Qm\mrmm mmmmm mm mm m nnn5nLn+_nn!nn n n<n o!o]1oaoo!p'p/pAp# q-q 2q@qPqXqgq vqq q q qqqqq q rr,4r#ar)r8rEr.sEs\syss,ss-s+ t8Ltt tt#t ttttu#u,u =uKuPuWugunuuuuuuu uuivv v vv vv v"vw w1w FwQw nw {w wwww-wxx(x .x 9xCxJxjx qx }xxx x,xxx y;y LyXyhyzyyyy*y'z!Ezgz6mz z!z?z{!{'{ 7{ E{P{V{i{{ {{ { { {{{{| | -| :| D|*e|||!|d| ;}F}J}S}X} m}{}(}} }}X}+X~"~&~~0~UFo*(1 I<'vt#8#\Cr0&+ >Ha˅u-/Mӆ!'ȇ · ه !'6^e}.Ո &&8,P} $8ۉ(")WL0$Ս" # / :DLR doqv{ˎЎ؎ێ Ð ː ֐ 0#%.OB&ʑ3ݑ75I5 ?֒)/:3j7֓:?HYjzȔݔ5L]nsx}  ŕ Εە  $ 7%D jw Ö@̖  +5<\x|"+29@FLRT/X8&! i! ƙ ՙ %r79Q IBi6C "6Uf| ѝ؝ - XNM"/*R} i~ilE;zMMȤ /O9~&("Or5æ  %"3Vfk~ !ڧ Xs%#Ĩ Щש ݩ   # -8I\n =Rܪ /9@HYj|« 19HO_p ' Ŭެ4"%'M1a 4P<5r ®ɮЮ ׮$+2 9 F S ` m z  ɯܯ3Ogv0~ Űа12; R+\ ѱ ޱ2*8]'# IR6KEճ %%lK A´ 6-Iw ε " 5 @J7Y 1F%Flҷ  !$'*!-O bmt { 7 3I[w ˹ ӹ޹ ۺ  $19>Q `'j   ƻһ+ػSX#n9ܼ:L&^3ݽ*).T*.ݾ * >J3YͿ( +I R_qC #& > I U3b   !6>F[ s!$CI_sy~  11Hz1 O*Bs\X)"?bh)Cmv  ! +L T,`.'5:SU"/1+Jv3>HFNW2s )19IR gq#^ lt   '> J'W)%-5RZ jw!~ 9;W$t#"$);%e3/#3 O(\: "%=ct | !  $&@g4p FTXlu 2\ )}*)/VJ>&&2.Da+wC #5Dz? ~MX^ p{P{f8Tpx + 9#Fj$o$   6K` u.7  (G&PBwH `7s$$  '4;QY[aiou  61 .YBMc. e3sTn^`&}bbYl7  h   #afjSd]( p>sto;),ZKp i8',z|P9*dRqIvPa>o< 3EYD= W[qrKO6gM%X\uK/QE:CH G!S{dzQCh^e @;pVwxw=u!iyP[nX$5l_'oV-O_/}F s0B$-f<*b9m|xC~:mIL/GkX Z: u!+J0N*myW]g+#~`%A A=w[}kyOzf$G4>N7vjFH`?@+Zr<{ "I8J~qnv\RtrkW)92|U5R#{^cSBD1TQlNE'TUat8V&MjHAJ"D&@\LL5c?(?] )4xe3Uh12;_ "%7.gi,-642(0F Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.About AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst CardFirst ReviewFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards matched the criteria you provided.No empty cards.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOldest seen firstOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder duePassword:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Review CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selective StudySemicolonSet all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift position of existing cardsShortcut key: %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied TodayStudyStudy DeckStudy Deck...Study NowStylingStyling (shared between cards)Supermemo XML export (*.xml)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour Decks[no deck]backupscardscards selected bycollectionddaysdeckhelphourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-10-26 23:39+0000 Last-Translator: Dan Campbell Language-Team: Esperanto MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: eo Halti (1 el %d) (elŝaltite) (enŝaltite) Ĝi enhavas %d karton. Ĝi enhavas %d kartojn.%% ĝusta%(a)0.1f %(b)s/tago%(a)d el %(b)d noto estas ĝisdatigita%(a)d el %(b)d notoj estas ĝisdatigitaj%(a)d kB alŝutita, %(b)d kB elŝutita%(tot)s %(unit)s%d karto%d kartoj%d karto estas forigita.%d kartoj estas forigitaj.%d karto estas eksportita.%d kartoj estas eksportitaj.%d karto estas importita.%d kartoj estas importitaj.%d karto estis lernata en%d kartoj estis lernataj en%d karto/minuto%d kartoj/minuto%d kartaro estas ĝisdatigita.%d kartaroj estas ĝisdatigitaj.%d grupo%d grupoj%d noto%d notoj%d noto estas aldonita%d notoj estas aldonitaj%d noto estas importita.%d notoj estas importitaj.%d noto estas ĝisdatigita%d notoj estas ĝisdatigitaj%d ripeto%d ripetoj%d elektita%d elektitaj%s jam ekzistas sur via labortablo. Ĉu anstataŭigi ĝin?%s kopio%s tago%s tagoj%s tago%s tagoj%s forigita(j).%s horo%s horoj%s horo%s horoj%s minuto%s minutoj%s minuto.%s minutoj.%s minuto%s minutoj%s monato%s monatoj%s monato%s monatoj%s sekundo%s sekundoj%s sekundo%s sekundoj%s estas forigenda(j):%s jaro%s jaroj%s jaro%s jaroj%s t%s h%s m%s mo%s s%s j&Pri...&Aldonaĵoj&Kontroli datumbazon...&Studegi...&Redakti&Eksporti...&Dosiero&Trovi&Ek&Gvidlibro&Gvidlibro...&Helpo&Importi&Importi...&Inversigi elekton&Sekva karto&Malfermi dosierujon de aldonaĵoj...&Preferoj...&Antaŭa karto&Replani...&Subteni Anki’on…Ŝanĝi &profilon...&Iloj&Malfari'%(row)s' havis %(num1)d kampojn, anstataŭ la atendita %(num2)d(%s ĝusta)(fino)(filtrita)(lernado)(nova)(limigo de patraj kartaroj: %d)(bonvole elektu unu karton)....anki2 dosieroj ne estas planitaj al importo. Se vi ŝatus restaŭri el sekurkopio, bonvolu vidi la ĉapitron “Backups” (Sekurkopioj) en la gvidlibro./0 t1 101 monato1 jaro10 atm10 ptm3 atm4 atm4 ptm:kaj%d karto%d kartojMalfermi la sekurkopian dosierujonViziti la retpaĝaron%(pct)d%% (%(x)s el %(y)s)%H:%M, %d-%m-%YSekurkopioj
Anki kreos sekurkopion de via kolekto ĉiutempe ĝi estas fermata aŭ sinkronigata.Eksportoformato:Trovi:Tipara Grado:Tiparo:En:Inkluzive:Grandeco de linio:Anstataŭigi per:SinkronigoSinkronigo
Nuntemple ne enabligita; klaku la Sinkronigo-butonon en la ĉefa fenestro por enabligi ĝin.

Konto necesas

Senkosta konto necesas por teni vian kolekton sinkronigita. Bonvolu ensaluti por konto, poste entajpu viajn indikojn malsupre.

Anki ĝisdatigita

Anki %s estas eldonita.

Dankegon al ĉiuj kiuj donis sugestojn, cimraportojn kaj donacojn.La facileco de iu karto estas la longeco de la sekva intertempo dum vi respondas "Bona" je ripeto.Dosiero nomita collection.apkg estas konservita sur via labortablo.Pri AnkiAldoniAldoni (fulmoklavo: Ctrl+Enter)Aldoni kamponAldoni aŭdvidaĵonAldoni novan kartaron (Ctrl+N)Aldoni nototiponAldoni malan direktonAldoni etikedojnAldoni novan kartonAldoni al:Aldoni: %sAldonitaAldonita hodiaŭDenoveHodiaŭaj Denove markitajDenove-nombro: %sĈiuj kartarojĈiuj kampojĈiuj kartoj laŭ hazarda ordo (rapida studo)Ĉiuj kartoj, notoj, kaj aŭdvidaĵoj al ĉi tiu profilo estos forigitaj. Ĉu vi certas?Permesi HTML-on en kampojOkazis eraro en aldonaĵo.
Bonvolu sciigi la aldonaĵo-forumon:
%s
Okazis eraro dum malfermo de %sOkazis eraro. Eble ĝin kaŭzis malgrava cimeto,
aŭ eble estas problemo pri via kartaro.

Por kontroli, ĉu temas pri kartaro-problemo, bonvolu uzi la menueron Iloj > Kontroli datumbazon.

Se tio ne solvis la problemon, bonvolu kopii la jenan tekston
en cimraporton:Bildo estas konservita sur via labortablo.AnkioAnki 1.2 kartaro (*.anki)Anki 2 konservas viajn kartarojn en nova aranĝo. Ĉi tiu asistanto aŭtomate konvertos viajn kartarojn al tiu aranĝo. Viaj kartaroj estos sekurkopiitaj antaŭ la ĝisdatigo, do se vi necesos reveni al la antaŭa versio de Anki, viaj kartaroj ankoraŭ estos uzeblaj.Anki 2.0 kartaroAnki 2.0 nur ebligas aŭtomatan ĝisdatigon el Anki 1.2. Por ŝargi malnovajn kartarojn, bonvolu malfermi ilin en Anki 1.2 por ĝisdatigo, kaj poste importu ilin al Anki 2.0.Pakaĵa Anki-kartaroAnki ne trovis la dividon inter la demando kaj la respondo. Bonvolu permane adapti la ŝablonon por ŝanĝi demandon kaj respondon.Ankio estas amikeca, inteligenta interspaca lernsistemo. Ĝi estas senkosta kaj la kodo estas malfermita.Anki ne povis ŝargi vian malnovan agordan dosieron. Bonvolu uzi Dosiero > Importi por importi viajn kartarojn el antaŭaj Anki-versioj.AnkiWeb-identeco aŭ -pasvorto estis malĝusta; bonvolu provi denove.AnkiWeb-identeco:Eraro okazis ĉe AnkiWeb. Bonvolu provi denove post kelkaj minutoj, kaj se la problemo daŭros, bonvolu sendi cimraporton.AnkiWeb estas nuntempe tro okupata. Bonvolu provi denove post kelkaj minutoj.RespondoRespondobutonojRespondojKontraŭvirusilo aŭ fajroŝirmilo malebligas, ke Anki konektu al la interreto.Ĉiuj kartoj mapitaj al nenio estos forigitaj. Se noto ne havas restantajn kartojn, ĝi perdiĝos. Ĉu vi vere volas daŭrigi?Troviĝis duoble en dosiero: %sĈu vi certas ke vi volas forigi %s-n?Bezoniĝas almenaŭ unu kartotipo.Almenaŭ unu paŝo necesas.Aldoni bildon/sonon/videon (F3)Aŭtomate ludi sononAŭtomate sinkronigi je fermo aŭ malfermo de profiloMeznombroAveraĝa tempoMeza respondotempoMeza facilecoMeza tempo al tagoj kiam vi studisMeza intertempoReenDorso-antaŭmontroDorso-ŝablonoSekurkopiojBazaBaza (en ambaŭ direktoj)Baza (en unu aŭ ambaŭ direktoj)Grasa teksto (Ctrl+B)FoliumiFoliumi &kaj instali...FoliumiloFoliumilo (%(cur)d karto videblas; %(sel)s)Foliumilo (%(cur)d kartoj videblas; %(sel)s)Foliumila aspektoFoliumilo-opciojKunmetiAmase aldoni etikedojn (Ctrl+Shift+T)Amase forigi etikedojn (Ctrl+Alt+T)EntombiguEntombigi kartonEntombigi notonLaŭnorme Anki detektos la signojn inter kampoj, kiel ekzemple tabulatoron, komon, ktp. Se Anki malkorekte detektas signon, vi povas enmeti ĝin ĉi tie. Uzu \t por reprezenti tabulatoron.NuligiKarto%d-a karto1-a karto2-a kartoKartoinformo (Ctrl+Shift+I)&KartlistoKartotipoKartotipojKartotipoj al %sKarto entombigita.Karto paŭzigita.La karto estis sangosuĉanto.KartojKartotipojOni ne povas permane alilokigi kartojn en filtritan kartaron.Kartoj estos aŭtomate remetitaj al siaj originalaj kartaroj post vi ripetos ilin.Kartoj...CentreŜanĝiŜanĝi %s-n al:Ŝanĝi kartaronŜanĝi nototiponŜanĝi nototipon (Ctrl+N)Ŝanĝi noto&tipon...Ŝanĝi koloron (F8)Ŝanĝi kartaron laŭ nototipoŜanĝitaVérification du &média...Kontroli la dosierojn en la aŭdvidaĵo-dosierujoKontrolante...ElektiElekti kartaronElekti nototiponElekti etikedojnKlonado: %sFermiĈu fermi kaj perdi nunan enmetitaĵon?TrutekstoTruteksto (Ctrl+Shift+C)Kodo:Kolekto estas difektita. Bonvolu vidi la gvidlibron.DupunktoKomoAgordi interfacan lingvon kaj opciojnKonfirmu pasvorton:Gratulon! Vi finis ĉi tiun kartaron por hodiaŭ.Konektado...DaŭrigiKopiiĜusta: %(pct)0.2f%%
(%(good)d el %(tot)d)Ne povis konekti al AnkiWeb. Bonvolu kontroli vian retkonekton kaj provu denove.Ne povis registri sonon. Ĉu vi instalis lame'on kaj sox'on?Ne povis konservi dosieron: %sStudegoKrei kartaronKrei filtritan kartaron...KreitaCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZAkumulaAkumula %sAkumulaj respondojAkumulaj kartojAktuala kartaroAktuala nototipo:Propra lernadoKrei lernadan seanconPropraj paŝoj (en minutoj)Adapti kartojn (Ctrl+L)Adapti kampojnEltondiLa datumbazo estas rekunmetita kaj optimumigita.DatoTagoj de lernadoMalrajtigiSencimiga konzoloKartaroAnstataŭigi kartaronLa kartaro importiĝos kiam profilo malfermiĝos.Kartarojmalkreskaj intertempojDefaŭltaIntertempoj ĝis ripetoj denove montriĝas.ForigiĈu forigi %s-n?Forigi kartojnForigi kartaronForigi malplenajnForigi notonForigi notojnForigi etikedojnForigi neuzitajnĈu forigi la kampon el %s?Ĉu forigi la kartotipon '%(a)s' kaj ĝiajn %(b)s?Ĉu forigi ĉi tiun nototipon kaj ĉiujn ĝiajn kartojn?Ĉu forigi ĉi tiun neuzitan nototipon?Ĉu forigi neuzatajn aŭdvidaĵojn?Forigi...Forigis %d karton kies noto mankis.Forigis %d kartojn kies notoj mankis.Forigis %d karton kun mankanta ŝablono.Forigis %d kartojn kun mankanta ŝablono.%d noto sen nototipo estas forigita.%d notoj sen nototipo estas forigitaj.%d noto sen karto estas forigita.%d notoj sen karto estas forigitaj.Forigita.Forigita. Bonvolu restartigi Anki'on.Forigo de ĉi tiu kartaro el la kartaro-listo remetos ĉiujn restantajn kartojn al siaj originalaj kartaroj.PriskriboPriskribo kiu montriĝu sur studekrano (nur por aktuala kartaro):DialogujoForĵeti kamponElŝuto malsukcesis: %sElŝuto el AnkiWebElŝuto sukcesis. Bonvolu restartigi Anki'on.Elŝutante el AnkiWeb...LimdatoEnda morgaŭ&ForlasiFacilecoFacilaFacileca premioIntertempo de facila respondoRedaktiRedakti %s-nRedakti aktualanRedakti HTML'onRedakti por adaptiRedakti...RedaktitaRedakta tiparoRedaktoj estas konservitaj. Bonvolu restartigi Anki'on.MalplenigiMalplenaj kartoj...Nombro de malplenaj kartoj: %(c)s Kampoj: %(f)s Malplena unua kampo: %sFinoEntajpu kartaron por enmeti %s novajn kartojn, aŭ lasu ĝin malplena:Entajpu novan kartopozicion (1...%s):Entajpu aldonotajn etikedojn:Entajpu forigotajn etikedojn:Eraro elŝutante: %sEraro dum lanĉo: %sEraro ruligante %s-n.Eraro lanĉante %s-nEksportiEksporti...KromaĵojFF1F3F5F7F8Kampo %d de dosiero estas:Akordigo de kampojKamponomo:Kampo:KampojKampoj por %sKampoj apartigitaj per: %sKampoj...&FiltrilojLa dosiero malvalidas. Bonvolu rekreu ĝin el savkopio.Dosiero mankis.FiltriloFiltrilo:Filtrita%d-a filtrita kartaroTrovi &duoblaĵojn...Trovi duoblaĵojnSerĉi kaj &anstataŭigi...Serĉi kaj anstataŭigi&Unua kartoUnua ripetoRenversiLa dosierujo jam ekzistas.Tiparo:PaĝopiedoPor sekureco, '%s' ne estas permesita sur kartoj. Tamen vi povas uzi ĝin se vi metas la komandon en alian pakaĵon, kaj vi importas tiun pakaĵon en la LaTex-kapon.PrognozoFormularoUnu aŭ ambaŭ direktojAmbaŭ direktojMi trovis %(a)s-n en %(b)s.AntaŭoFronto-antaŭmontroFronto-ŝablonoĜeneralaKreita dosiero: %sKreita je %sPartumoBonaGradiga intertempoHTML-redaktiloMalfacilaĈu vi instalis latex'on kaj dvipng'on?PaĝokapoHelpoPlej alta facilecoAntaŭaĵoHejmoHora disigoHorojHoroj kun malpli ol 30 ripetoj ne videblas.Bonvolu kontakti nin, se vi kontribuis, sed via nomo ne troviĝas en ĉi tiu listo.Se vi lernus ĉiutageIgnori respondotempon pli longan olIgnori uskleconIgnori liniojn kie la unua kampo laŭas ekzistantan notonIgnori ĉi tiun ĝisdatigonEnportiEnporti dosieronEnporti eĉ se ekzistanta noto havas la saman unuan kamponEnporto fiaskis. Enporto fiaskis. Sencimigaj informoj: Opcioj de enportoEnporto finiĝis.En aŭdvidaĵo-dosierujo, sed ne uzita de iu karto:Inkluzivi aŭdvidaĵojnInkluzivi lerntempajn informojnInkluzivi etikedojnKreskigi hodiaŭan limigon de novaj kartojKreskigi hodiaŭan limigon de novaj kartoj perKreskigi hodiaŭan limigon de ripetokartojKreskigi hodiaŭan limigon de ripetokartoj perkreskaj intertempojInformojInstali aldonaĵonInterfaca lingvo:IntertempoIntertempo-modifiloIntertempojNevalida kodo.Malvalida dosiero. Bonvolu rekreu ĝin el savkopio.Nevalida pasvorto.Nevalida regulesprimo.Ĝi estas paŭzigita.Kursiva teksto (Ctrl+I)Ĝavoskripto-eraro en linio %(a)d: %(b)sKonserviLaTeXLaTeX-formuloLaTeX matematika ĉirkaŭaĵoStumbloj&Lasta kartoPlej lasta ripetoplej laste aldonitaj unuafojeLernuAntaŭlerna limigoPor lerni: %(a)s, ripeti: %(b)s, relerni: %(c)s, filtrilaĵo: %(d)sLernadoSangosuĉantoFarendaĵo en kazo de sangosuĉantoSojlo de sangosuĉantojMaldekstraLimigi ĝisŜargante...Ŝlosu konton kun pasvorto, aŭ lasu ĝin malplena:Plej longa intertempoSerĉi en kampo:Plej malalta facilecoAdministriAgordu nototipojn...Mapi al %sMapi al etikedojMarkiMarki notonMarki noton (Ctrl+K)MarkitaMaljunaMaksimuma intertempoMaksimumaj ripetoj/tagoAŭdvidaĵoMinimuma intertempoMinutojMiksi novajn kartojn kaj ripetojnMnemosyne 2.0 kartaro (*.db)Pliplej multaj stumblojAlilokigi kartojnAlilokigi en kartaron (Ctrl+D)Alilokigi kartojn en kartaron:&NotoLa nomo jam ekzistas.Nomo de la kartaro:Nomo:RetoNovaNovaj kartojNovaj kartoj en kartaro: %sNovaj kartoj/tagoNomo de la nova kartaro:Nova intertempoNova nomo:Nova nototipo:Nomo de nova opciogrupo:Nova pozicio (1...%d):Sekva tago komencas jeNeniu karto laŭis la kriteriojn kiujn vi enigis.Neniu malplena karto.Neniu neuzata aŭ mankanta dosiero estis trovita.NotoNototipoNototipojNoto kaj ĝia %d karto estas forigita.Noto kaj ĝia %d kartoj estas forigitaj.Noto estas entombigita.La noto estas paŭzigita.Noto: aŭdvidaĵoj ne estas sekurkopiitaj. Bonvolu krei regulan sekurkopion de via Ankio-dosierujo por esti sekura.Noto: iom da historio mankas. Por pli da informoj, bonvolu vidi la foliumilo-dokumenton.Notoj en plata tekstoNotoj bezonas almenaŭ unu kampon.Nenioplej frue viditaj unuafojeUnu aŭ pli da notoj ne estas importitaj, ĉar ili ne kreis kartojn. Ĝi povas okazi kiam ĉeestas malplena kampo aŭ kiam vi ne akordigis la enhavon en la tekstodosiero al la ĝustaj kampoj.Nur novaj kartoj povas esti repoziciitaj.MalfermiOptimumigado...Malnepra limigo:OpciojOpcioj al %sOpciogrupo:Opcioj...Ordoordo de aldonoordo de endecoPasvorto:Pasvortoj ne laŭasAlgluiAlglui tondejajn bildojn kiel PNGLeciono de Pauker 1.8 (*.pau.gz)ElcentoPeriodo: %sMeti ĝin al la fino de vico de novaj kartojMeti ĝin en ripetovicon kun intertempo inter:Bonvolu aldoni alian nototipon antaŭe.Bonvolu esti pacienca; ĝi povas daŭri iom da tempo.Bonvolu redakti ĉi tiun noton kaj aldoni trutekston. (%s)Bonvolu kontroli ke profilo malfermas kaj Anki ne estas okupata, tiam provu denove.Bonvolu instali PyAudio'nBonvolu instali mplayer'onBonvolu malfermi profilon antaŭe.Bonvolu uzi la menueron Iloj > Malplenaj kartojBonvolu elekti kartaron.Bonvolu elekti kartojn el nur unu nototipo.Bonvolu elekti ion.Bonvolu ĝisdatigi al la plej lasta versio de Anki.Bonvolu uzi Dosiero > Importi-n por importi ĉi tiun dosieron.Bonvolu viziti AnkiWeb'on, ĝisdatigi vian kartaron, poste provi denove.PozicioPreferojAntaŭmontri novajn kartojnAntaŭmontri novajn kartojn aldonitajn en la lastaLaborante...Profil-pasvorto...Profilo:ProfilojRajtigo de prokurilo necesas.DemandoFino de la vico: %dKomenco de la vico: %dForlasihazardeHazardigi ordonPritaksoPreta por ĝisdatigoRekunmetiRegistri sian sononRegistri sonon (F5)Registrado...
Tempo: %0.1fRelerniMemori lastan enigon kiam aldonanteForigi etikedojnForigi aranĝon (Ctrl+R)Forigo de ĉi tiu kartotipo forigus unu aŭ pli notojn. Bonvolu krei antaŭe novan kartotipon.AlinomiAlinomi kartaronReludi sononReludi sian voĉonRepoziciiRepozicii novajn kartojnRe&poziciiNepri unu aŭ pli el ĉi tiuj etikedoj:ReplaniReplaniReplani kartojn laŭ miaj respondoj donitaj en ĉi tiu kartaroDaŭrigi nunDekstre-maldekstren tekstodirekto (RTL)Nombro da ripetojTempo de ripetoRipeti antaŭeRipeti antaŭe alRipeti kartojn forgesitajn en la lasta(j)Ripeti forgesitajn kartojnSukceso-proporcio al horoj de la tagoRipetojRipetoj endaj en kartaro: %sDekstraKonservi bildonAmplekso: %sSerĉiSerĉi ene de aranĝo (malrapida)Elekti&Elekti ĉiujnElekti ¬ojnElektu etikedojn por ekskludi:Selektiva lernadoPunktokomoĈu agordi ĉiujn kartarojn sub %s al ĉi tiu opciogrupo?Agordi al ĉiuj subkartarojAgordi malfonan koloron (F7)Ŝovi pozicion de ekzistantaj kartojFulmoklavo: %sMontru la respondonMontri duoblaĵojnMontri tempomezurilon por respondojMontri novajn kartojn post ripetojMontri novajn kartojn antaŭ ripetojMontri novajn kartojn laŭ ordo de aldonoMontri novajn kartojn en hazarda ordoMontri tempon de sekva ripeto super respondobutonojMontri nombron de restantaj kartoj dum ripetadoMontri statistikojn. Fulmoklavo: %sGrando:Kelkaj agordoj efektivos nur post relanĉo de Anki.Ordiga kampoOrdigi per ĉi tiu kampo en la foliumiloOrdigado je ĉi tiu kolono ne eblas. Bonvolu elekti alian.Sonoj kaj bildojSpacetoKomenca pozicio:Komenca facilecoStatistikojPaŝo:Paŝoj (en minutoj)Paŝoj devas esti nombroj.Forigi HTML'on kiam algluante tekstonHodiaŭ lernitajLernadoLernkartaro&Lernkartaro...Lernu nunStiloStilo (kunhava inter kartoj)Supermemo XML eksportaĵo (*.xml)ProkrastiPaŭzigi kartonPaŭzigi notonPaŭzigitaSinkronigi ankaŭ sonojn kaj bildojnSinkronigi kun AnkiWeb. Fulmoklavo: %sSinkronigo de aŭdvidaĵoj...Sinkronigo malsukcesis: %sSinkronigo malsukcesis; interreto estas nekonektita.Sinkronigo necesas ke la horloĝo ĉe via komputilo estu agordita. Bonvolu agordi la horloĝon kaj provu denove.Sinkronigo...TabAldoni nur etikedonEtikedojCelkartaro (Ctrl+D)Celkampo:TekstoTeksto apartigita de tabeliloj aŭ punktokomoj (*)Tiu kartaro jam ekzistas.Tiu kamponomo jam estas uzata.Tiu nomo jam estas uzata.La konekto al AnkiWeb transtemplimiĝis. Bonvolu kontroli vian retkonekton kaj provi denove.La apriora agordo ne povas esti forigita.La apriora kartaro ne povas esti forigita.Dividiĝo de kartoj en via(j) kartaro(j).La unua kampo estas malplena.La unua kampo de la nototipo devas esti mapita.Piktogramoj estis akiritaj el variaj fontoj; bonvolu vidi la Anki-fonton por kreditoj.La enigo vi aldonis farus malplenan demandon sur ĉiuj kartoj.Nombro da demandoj kiujn vi respondis.Nombro de ripetoj endaj en la estonto.Nombro de fojoj kiam vi premis specifajn butonojn.La aldonita serĉo ne laŭis iun karton. Ĉu vi ŝatus revizii ĝin?La petita modifo necesos tutan alŝuton de la datumbazo kiam vi venontfoje sinkronigos vian kolekton. Se vi havas ripetojn aŭ aliaj ŝanĝojn atendantajn ĉe alia aparato kiuj ankoraŭ ne estis sinkronigitaj, ili perdiĝos. Ĉu vi ŝatus daŭrigi?Tempo vi necesis por respondi la demandojn.La ĝisdatigo finiĝis, kaj nun vi pretas uzi Anki 2.0-n.

Sube troviĝas protokolo de la ĝisdatigo:

%s

Ĉeestas ankoraŭ pli da kartoj, sed la taga limigo estis atingita. Vi povas kreski la limigon ĉe la opcioj, sed bonvolu teni en la kapo ke ju pli kartojn vi enkondukas, des pli ŝarĝanta via mallongdaŭra ripetado estos.Devas esti almenaŭ unu profilo.Tiu dosiero ekzistas. Ĉu vi volas anstataŭigi ĝin?Ĉi tiu dosierujo konservas ĉiujn viajn Anki-datumojn ĉe unu loko, por simple fari sekurkopiojn. Por ke Anki uzu alian lokon, bonvolu vidi: %s Ĉi tiu estas speciala kartaro por lerni krom la normala plano.Ĉi tio forigos vian ekzistantan kolekton kaj anstataŭigos ĝin per la datumoj en la dosiero kiun vi importas. Ĉu vi certas?Ĉi tiu asistanto gvidos vin tra la procezo de la ĝisdatigo de Anki 2.0. Por la glata ĝisdatigo, bonvolu legi la sekvajn paĝojn atente. TempoTempokadra limigoPor ripetiPor foliumi aldonaĵojn, bonvolu alklaki la Foliumi butonon ĉi-sube.

Se vi trovas aldonaĵon kiun vi ŝatas, bonvolu alglui ĝian kodon ĉi-sube.Antaŭ importante en pasvort-protektitan profilon, bonvolu malfermi la profilon.Por krei trutekston ĉe ekzistanta noto, unuafoje vi devas ŝanĝi ĝin al truteksto-tipo, ĉe Redakti > Ŝanĝi nototipon.Por vidi ilin nun, klaku la ĉi-suban butonon Eltombigi.Por lerni krom la normala plano, bonvolu alklaki la butonon Propra lernado malsupre.HodiaŭLa hodiaŭa ripetlimigo estas atingita, sed ankoraŭ ĉeestas ripetendaj kartoj. Por memori optimume, bonvolu pripensi la altigon de la taga limigo ĉe la opcioj.SumoSuma tempoKartoj entuteNotoj entuteTrakti enigon kiel regulan esprimonTipoEntajpu respondon: nekonata kampo %sNe povas importi el nurlega dosiero.EltombigiSubstreki tekston (Ctrl+U)Malfari&Malfari %snNekonata dosierformato.NeviditaĜisdatigi ekzistantan noton kiam la unua kampo laŭasĜisdatigo finiĝis.Ĝisdatiga asistantoĜisdatigoĜisdatigante kartaron %(a)s el %(b)s... %(c)sAlŝuti al AnkiWebAlŝutante al AnkiWeb...Uzita sur kartoj sed mankanta el aŭdvidaĵo-dosierujo:1-a uzantoVersio %sAtendante por fino de redakto.BonvenonĈe aldono, apriori al aktuala kartaroKiam respondo videblas, egale reludi demandan kaj respondan sonon.Kiam vi pretas por la ĝisdatigo, alklaku la Fari butonon por daŭrigi. La ĝisdatiga gvidilo malfermos en via retumilo dum la ĝisdatigo daŭras. Bonvolu legi ĝin atente, ĉar multo ŝanĝiĝis depost la antaŭa Anki-versio.Kiam viaj kartaroj estos ĝisdatigitaj, Anki provos kopii ĉiujn sonojn kaj bildojn el la malnovaj kartaroj. Se vi uzis propran DropBox-dosierujon aŭ propran aŭdvidaĵan dosierujon, la ĝisdatiga procezo eble ne trovos viajn aŭdvidaĵojn. Poste raporto de ĝisdatigo montriĝos al vi. Se vi rimarkos ke aŭdvidaĵoj ne kopiiĝis kie ili devus, bonvolu vidi la ĝisdatigan gvidilon por pli da informoj.

AnkiWeb nun ebligas direktan sinkronigon de aŭdvidaĵoj. Neniu specifa agordo necesas, kaj aŭdvidaĵoj sinkroniĝos kune kun viaj kartoj kiam vi sinkronigos ilin al AnkiWeb.Tuta kolektoĈu vi volas elŝuti ĝin nun?Verkita far de Damien Elmes, kun flikaĵoj, tradukaĵo, testado, kaj fasonado far de:

%(cont)sVi havas multege da kartaroj. Bonvolu legi %(a)s. %(b)sVi ankoraŭ ne registris vian sonon.Oni devas havi almenaŭ unu kolonon.JunaJuna + lernataViaj kartaroj[neniu kartaro]sekurkopiojnkartojkartoj elektitaj laŭkolektottagojkartarohelpohorojhoroj post noktomezostumblojmapita al %smapita al Etikedojminutojminutojmoripetojsekundojstatistikojĉi tiun retpaĝonstuta kolekto~anki-2.0.20+dfsg/locale/lv/0000755000175000017500000000000012256137063015135 5ustar andreasandreasanki-2.0.20+dfsg/locale/lv/LC_MESSAGES/0000755000175000017500000000000012065014111016704 5ustar andreasandreasanki-2.0.20+dfsg/locale/lv/LC_MESSAGES/anki.mo0000644000175000017500000000342112252567246020207 0ustar andreasandreas%pqxz !'-1 7BQX ^k} y  ""$4 C NY`h p}      Stop%%d selected%d selected%s copy%s day%s days%s hour%s hours%s minute%s minutes%s month%s months%s second%s seconds%s year%s years&About...&Cram...&Edit&File&Find&Go&Help&Next Card&Previous Card&Tools&UndoFind:Line Size:Replace With:AddedBasicCenterProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:23+0000 Last-Translator: Damien Elmes Language-Team: Latvian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: lv Apturēt%%d izvēlēti%s kopēt%s diena%s dienas%s stunda%s stundas%s minūte%s minūtes%s minūšu%s mēnesis%s mēneši%s sekunde%s sekundes%s sekunžu%s gads%s gadi&Par programmu&Iekalt...&Rediģēt&Fails&Atrast&Doties&Palīdzība&Nākamā Kartīte&Iepriekšējā Kartīte&Rīki&AtsauktAtrast:Rindiņas izmērs:Aizstāt Ar:PievienotsPamataCentrētanki-2.0.20+dfsg/locale/cs/0000755000175000017500000000000012256137063015121 5ustar andreasandreasanki-2.0.20+dfsg/locale/cs/LC_MESSAGES/0000755000175000017500000000000012065014110016667 5ustar andreasandreasanki-2.0.20+dfsg/locale/cs/LC_MESSAGES/anki.mo0000644000175000017500000016473512252567245020212 0ustar andreasandreas4L0h@i@ p@{@@"@@ @@8@AA-A">A$aA$A&AA"AB'B8B$UB zBBB0BBC&C 7CCC(TC}CC,CC*CD,)D VDdD(uDDDDDDD DDDDD DDDEE EEE &E1E CENEfEvEEEEEE0E EF F FF%F8F]]]]] Q^8]^^ ^^^)^^_ _,_2_7_ <_ G_U_Z_ b_ o_y___ _!___)_``4"`!W`y``````` `a aaaaaaa :a HaTa[a bapa aa,aaaaaabb'bcGcLcgcycc ccccc ccc dd$d;dBd GdTd\dadrd.xdFdde 'e43ehe{e e1eeeee*f >fLf kfxf"f"f ffgg(gj JjUjkjj jjjj jj jj j jjkk6k+Ikuk!kk k k<k k l]layll!lmm+m#mn n*n:nBnQn `nkn qn }nnnn nnnn o o"o,Ao#no)oVo8pELppppp,p q-9q+gq8qq qqq#q r-rArJrSrrr{r rrrrrrrrrrss =sIsidss s ss s t t"-tPt Xt1ct tt tt t t t uu:u-Quuuu u uuuu u uvVvqv v,vvv v ww "w.w>wPwmwww*w'w!x=x6Cx zx!x?xxxx y y&y,y?yVysy yy y y yyyy z z !z .z 8z*Yzzz!zdz /{:{>{G{L{ a{o{(t{{ {{X{+L|"x|&||0|U }Fc}*}(}1}I0~z~'jt#8PC($rMCH [eauJM ƅ ҅!ޅ'#Kchp.̆ ۆ& ,6c ju$8(Ո"W2$"ҋ ؋  $&+ 0:?EY`tÌŌ Ǝ,ю  t$ʏ;D!Cf5/O `&DPV>,&’1$9: t@@#^GʔC.?9U ˕   , < H T_s#ϖ @\k s 24; @JPV\afkmD4Ƙ <RT™љ ,=|RϚ? Û[ћe-aD :DL jw̝ݝ ! '2C TQb)̞  ΠuNġLadâP( y Q$#ɤ">+jsΥ  "-9g } B]u-~+ ا!ɨ  / N XAcR #+:I^|- Ҫ)ܪ ,@O0X8 "$04e w6`=Xqz  ǭҭ " ) 6 C P ] j w  ׮&A_ w2ůկ0FN j1t ɰڰ$:2M, AȲm #c:J #*8c | ׵   ! BMV#] -ζG6R qȷ !$'*E Xek p|9  +ASi { ǹй  غ ޺ 2FM dp$y ̻ջۻ7>/n)Eͼ )4CF%ֽ>'!7Y%k'*, -7O`i *ſֿ )"LU[lI08ASf lv0 &?H[ w"!9Kk   !/ De|:= ' 1 ?nMg7Q))  % 6 DQZn& %#-I.w9]G>Y$?7W,:K ^ ju}-!0E NX kv /$7W  "3R0f G  @L_p'$%7> OZ"a M 5'*]# '"%J*p*:9 ; \6f'F-4J `kq%2 ( ;I+Nz !%18Ki  #<K0PX%,!Rt0RM0!~!)TAGj^&u1=t%l\E fvSwY ` n{%$5(.7RAa, #4> s9=) A#%e!  #* ;FL^c|  xd^|$NB'.MQvS,=|] "b,#%mA.01`E7P>MC$iF"`X{c9efg'I'^`-?2Q6tOV:hx/ps\RUKk h  ys]I6-T&&d+blrtqq1~@r x-4J/La{bC;k& =f~@NeiK:^5u88}lONce! i@9AVR<Z>43;FQ5m(nZDDh?y< _ >u fpU"D 2 08j 9oyOa (<Zv./~2sH:n}7E_u+  B%S=;J}M,oG(cEP*#p)6#n*[H\XH]gjowS?gLR{$wB*%k_)L!Wz)0TWKA+P3Fjq[|X\JzGYGtrT!mdY 4Vz5 7waCl3YvUI1[W Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.About AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...CopyCorrect: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete this note type and all its cards?Delete this unused note type?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst CardFirst ReviewFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name:NetworkNewNew CardsNew cards in deck: %sNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards matched the criteria you provided.No empty cards.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOldest seen firstOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Password:Passwords didn't matchPastePaste clipboard images as PNGPercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonSet all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift position of existing cardsShortcut key: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStylingStyling (shared between cards)Supermemo XML export (*.xml)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.Underline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour Decks[no deck]backupscardscards selected bycollectionddaysdeckdeck lifehelphourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatswwhole collection~Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-06-04 08:48+0000 Last-Translator: Petr Kvasil Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: Zastavit (1 z %d) (zakázat) (povolit) Má %d kartu. Má %d karty. Má %d karet.%% Správně%(a)0.1f %(b)s/den%(a)d z %(b)d poznámek aktualizována%(a)d z %(b)d poznámek aktualizovány%(a)d z %(b)d poznámek aktualizovánoNahráno: %(a)dkB, staženo: %(b)dkB%(tot)s %(unit)s%d karta%d karet%d karetvymazána %d karta.vymazáno %d karet.vymazáno %d karet.exportována %d karta.exportováno %d karet.exportováno %d karet.importována %d karta.impotováno %d karet.importováno %d karet.naučena %d kartanaučeny %d kartynaučeno %d karet%d karta/minutu%d karty/minutu%d karet/minutu%d balík aktualizován.%d balíky aktualizovány.%d balíků aktualizováno.%d skupina%d skupiny%d skupiny%d poznámka%d poznámky%d poznámek%d poznámka přidána%d poznámek přidáno%d poznámky přidány%d poznámka importována.%d poznámek importováno.%d poznámky importovány.%d poznámka aktualizována.%d poznámek aktualizováno.%d poznámky aktualizovány.%d opakování%d opakování%d opakování%d vybrána.%d vybrány.%d vybráno.%s již existuje na vašem počítači. Přepsat?%s kopie%s den%s dny%s dní%s den%s dny%s dní%s vymazáno.%s hodina%s hodiny%s hodin%s hodina%s hodiny%s hodin%s minuta%s minuty%s minut%s minuta.%s minuty.%s minut.%s minuta%s minuty%s minut%s měsíc%s měsíce%s měsíců%s měsíc%s měsíce%s měsíců%s sekunda%s sekundy%s sekund%s sekunda%s sekundy%s sekund%s k vymazání:%s rok%s roky%s let%s rok%s roky%s let%sdnů%shod%smin%směs%ss%sr&O Anki...&Rozšíření&Zkontrolovat databázi...&Biflovat...&Upravit&Export...&Soubor&Najít&Jdi na&Příručka&Příručka...&Nápověda&Importovat&Import...&Invertovat výběr&Následující karta&Otevřít složku rozšíření...&Předvolby...&Předchozí karta&Přeplánovat...Podpořte &Anki...Přepnout pro&fil...Nás&troje&Zpět'%(row)s' mělo %(num1)d polí, namísto očekávaných %(num2)d(%s správně)(konec)(filtrováno)(učí se)(nové)(rodičovský limit: %d)....anki2 soubor není určen pro import. Pokud se snažíte o obnovu ze zálohy, viz kapitola 'Zálohy' v uživatelském manuálu./0 dní1 101 měsíc1 rok10.0022.003.004.005.00: a%d karta%d karty%d karetOtevřít složku se zálohamiNavštivte web%(pct)d%% (%(x)s z %(y)s)%Y-%m-%d v %H:%MZálohy
Anki výtváří zálohu kolekce při zavření a synchronizaci.Formát pro Export:Najít:Velikost písma:Písmo:V:Zahrnout:Velikost řádku:Nahradit:SynchronizaceSynchronizace
Neni momentálně povolena; pro zapnutí kliknětě na tlačítko "Synchronizace" v hlavním okně.

Je vyžadován účet

Pro synchronizaci vaši kolekce je vyžadován účet (dostupný zdarma). Zaregistrujte si účet a pak zadejte své údaje níže.

Anki aktualizováno

Byla vydána Anki verze %s.

Velký dík všem lidem, kteří dodávali nápady, hlásili chyby a darovali finanční prostředky.Snadnost karty je délka příštího intervalu, pokud při zkoušení odpovíte "dobře".Soubor s názvem collection.apkg byl uložen do vašeho počítače.O Anki...PřidatPřidat (zkratka: ctrl+enter)Přidat polePřidat médiaPřidat nový balík (Ctrl+N)Přidat typ poznámkyPřidat rub kartyPřidat štítkyPřidat novou kartuPřidat k:Přidat: %sPřidánoDnes přidánoZnovuDnes znovuPočet Znovu: %sVšechny balíkyVšechna poleVšechny karty, poznámky a média tohoto profilu budou smazány. Jste si jistý?Povolit HTML v políchObrázek byl uložen na váš počítač.Ankibalík Anki 1.2 (*.anki)Anki 2 ukládá balíky v novém formátu. Tento průvodce do něj automaticky konvertuje vaše balíky. Ty budou předtím zálohovány, takze pokud se budete chtít vrátit k předchozí verzi Anki, vaše balíky budou stále použitelné.Anki 2.0 balíkAnki 2.0 podporuje pouze automatickou aktualizaci z Anki 1.2. Potřebujete-li nahrát starší balíky, otevřete je nejdříve v Anki 1.2 a pak je importujte do Anki 2.0.Balík AnkiAnki nebyl schopen načíst váš starý konfigurační soubor. Upravte šablonu ručně pro přepínání otázky a odpovědi.Anki je přátelský, inteligentní systém pro opakování s prodlevami. Je zdarma a má otevřené zdrojové kódy.Anki se nepodařilo nahrát váš starý konfigurační soubor. Prosím použijte z menu Soubor>Import pro import vašich balíků z předešlé verze Anki.Přihlašovací jméno nebo heslo byly nesprávné, zkuste to prosím znova.Uživatelské jménoNastal problém s AnkiWebem. Prosím zkuste to později a pokud problém přetrvá, nahlašte chybu.AnkiWeb je momentálně příliš vytížený. Zkuste to prosím znovu později.OdpověďTlačítka odpovědíOdpovědiBrána firewall nebo antivirový software brání Anki k připojení k Internetu.Karty mapované na prázný cíl budou smazány. Nezbývají-li už v poznámce žádné karty, bude poznámka ztracena. Opravdu chcete pokračovat?Duplicitní kartičky: %sJste si jist, že chcete vymazat %s?Je vyžadován alespoň jeden krok.Připojit obrázek/zvuk/video (F3)Automaticky přehrát zvukAutomaticky synchronizovat při otevření a zavření profiluPrůměrPrůměrný časPrůměrný čas odpovědiPrůměrná snadnostPrůměr za studijní dnyPrůměrný intervalBackNáhled rubušabloba rubuZálohyZákladníZákladní (plus obrácená karta)Základní (plus volitelná obrácená karta)Tučný text (Ctrl+B)ProhlížetProcházet && Instalovat...ProhlížečProhlížeč (zobrazena %(cur)d karta; %(sel)s)Prohlížeč (zobrazeny %(cur)d karty; %(sel)s)Prohlížeč (zobrazeno %(cur)d karet; %(sel)s)Zobrazení v prohlížečiMožnosti prohlížečeSestavitHromadné přidání štítků (Ctrl+Shift+T)Hromadné odebrání štítků (Ctrl+Alt+T)PřeskočitPřeskočit poznámkuAnki implicitně detekuje znak oddělující pole, jako je tabulátor či čárka. Pokud ho Anki detekuje špatně, můžete ho vložit sem. \t představuje tabulátor.StornoKartaKarta %dKarta 1Karta 2Informace o kartě (Ctrl+Shift+I)Seznam karetTyp kartyTypy karetTypy karet pro %sKarta odloženaKarta zařazena mezi pijavice.KartičkyTypy karetKarty nemůžou být ručně převedeny do filtrovaného balíku.Karty jako prostý textPo zopakování budou karty automaticky vráceny do jejich originálního balíku.Karty...Na středZměnitZměnit %s na:Změnit balíkZměň typ poznámkyZměň typ poznámky (Ctrl+N)Změna typu poznámkyZměna barvy (F8)Změň balík v závislosti na typu poznámkyZměněnoZkontrolovat soubory v adresáři médiíKontroluje se...ZvolitVybrat BalíkVyber typ poznámkyNaklonovat: %sZavřítZavřít a zrušit momentálně vkládaná data?VynechatDoplňovačka (Ctrl+Shift+C)Kód:Kolekce je poškozena. Nahlédněte prosím do manuálu.DvojtečkaČárkaNastavit jazyk a volby prostředíPotvrdit heslo:Gratuluji! Tento balík máte pro dnešek hotov.Připojování...KopírovatSprávně: %(pct)0.2f%%
(%(good)d z %(tot)d)Nepodařilo se připojit na AnkiWeb. Zkontrolujte prosím své připojení a zkuste to později.Nepodařilo se nahrát zvuk. Máte nainstalovány lame a sox?Nelze uložit soubor: %sBiflovatVytvořit balíčekVytvořit filtrovaný balík...VytvořenoCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZSouhrnněKumulativní %sKumulativní odpovědiKumulativní kartySoučasný balíkSoučasný typ poznámkyVlastní studiumVlastní studijní sezeníVlastní pokrok (v minutách)Vlastní karty (Ctrl+L)Upravit poleVyjmoutDatabáze byla zrekonstruována a optimalozována.DatumStudováno dníZrušit oprávněníLadící konzoleBalíkPřeskočit balíkBalík bude importován při otevření profilu.BalíkySnižujícího se intervaluVýchozíProdleva, než budou opakování znova ukázány.SmazatOdstranit %s?Vymazat kartyOdstranit balíkVymazat prázdnéOdstranit poznámkuOdstranit poznámkySmazat štítkyVymaž nepoužívanéVymazat pole z %s?Vymazat tento typ poznámky a všechny jeho karty?Vymazat tento nepoužívaný typ poznámek?Smazat...Vymazána %d karta s chybějící poznámkou.Vymazány %d karty s chybějící poznámkou.Vymazáno %d karet s chybějící poznámkou.Vymazána %d karta s chybějící šablonou.Vymazány %d karty s chybějící šablonou.Vymazáno %d karet s chybějící šablonou.Smazána %d poznámka s chybějícím typem poznámky.Smazány %d poznámky s chybějícím typem poznámky.Smazáno %d poznámek s chybějícím typem poznámky.Vymazána %d poznámka s chybějícími kartičkami.Vymazány %d poznámky s chybějícími kartičkami.Vymazáno %d poznámek s chybějícími kartičkami.Smazáno.Smazáno. Prosím restartujte Anki.Vymazáním tohoto balíku se všechny zbývající karty vrátí do jejich originálního balíku.PopisekPopis pro zobrazení na studijní obrazovce (pouze pro aktuální balík):DialogZrušit poleStahování se nezdařilo: %sStáhnout z AnkiWebuStahování úspěšné. Restartujte Anki.Stahuje se z AnkiWebu...K opakováníZítra ke zkoušeníU&končitObtížnostJednoduchéBonus za jednoduchostInterval jednoduchostiUpravitUpravit %sUpravit tuto kartuUpravit HTMLUpravte, chcete-li přizpůsobitUpravit...UpravenoPísmoÚprava uložena. Restartujte Anki.VyprázdnitPrázdné karty...Počet prázdných karet: %(c)s Pole: %(f)s Prázdné první pole: %sKonecZadejte balík pro umístění %s nových karet, nebo nechte prázdné:Pozice nové karty (1...%s)Zadejte štítky k přidání:Zadejte štítky k odstranění:Chyba při stahování: %sChyba při spuštění: %sChyba při vykonávání %s.Chyba při běhu %sExportovatExportovat...NavícFF1F3F5F7F8Pole %d souboru je:Přiřazení políJméno pole:Pole:PolePole pro %sPole rozděleny pomocí: %sPole...&FiltrySoubor je neplatný. Prosím proveďte obnovu ze zálohy.Soubor nebyl nalezen.FiltrovatFiltr:FiltrovánoFiltrovaný balík %dNajít &duplikáty...Najít duplikátyNajít a na&hradit...Najít a nahraditPrvní kartaPrvní opakováníPřeklopitAdresář již existuje.Písmo:ZápatíZ bezpečnostních důvodů není v kartách povoleno '%s'. Můžete to ale použít tak, že příkaz zadáte to jiného balíku a ten místo toho importujete do LaTeX záhlaví.PředpověďFormulářLíc & volitelný RubLíc & RubNalezeno %(a)s mezi %(b)s.FrontNáhled líceŠablona líceZákladníVygenerovaný soubor: %sVygenerováno v %sStáhnout sdílenéDobréInterval postupováníHTML editorTěžkéMáte nainstalovaný latex a dvipng?ZáhlavíNápovědaNejvyšší jednoduchostHistorieDomůHodinové rozděleníHodinHodiny s méně než 30 opakováními nejsou zobrazeny.Pokud jste přispěli a nejste na seznamu, ozvěte se prosím.Při každodenním studiuIgnorovat odpovědi trvající déle nežIgnorovat velikost písmenIgnorovat řádky, kde první pole odpovídá existující poznámce.Ignorovat aktualizaciImportovatImportovat souborImportovat, i když existující poznámka má stejné první pole.Import selhal. Import selhal. Informace o ladění: Importovat nastaveníImport kompletníVe složce s médii, ale nepoužívané v žádných kartách:Zahrnout médiaZachovat informace o plánováníZahrnout štítkyZvýšit dnešní limit nových karetZvýšit dnešní limit nových karet oZvýšit dnešní limit opakovaných karetZvýšit dnešní limit opakovaných karet oZvyšujícího se intervaluInformaceInstalace rozšířeníJazyk rozhraní:IntervalModifikátor intervaluIntervalyNeplatný kód.Vadný soubor. Prosím obnovte ze zálohy.Neplatné heslo.Neplatný regulární výraz.Odložení provedeno.Text kurzívou (Ctrl+I)Chyba JavaScriptu na řádku %(a)d: %(b)sZachovatLaTeXRovnice v LaTeXuMatem. proměnná LaTeXuChybPoslední kartaPoslední zkoušeníPoslední přidané nejdříveUčeníUčit se navícUčit se: %(a)s, Opakovat: %(b)s, Přezkoušet: %(c)s, Filtrováno: %(d)sUčeníPijaviceAkce pro pijavicePráh pro pijaviceVlevoOmezit naNahrává se...Zabezpečte účet heslem nebo nechte prázdné:Nejdelší intervalHledat v poli:Nejnižší jednoduchostSpravovatSpráva typů poznámekPřiřadit na %sPřiřadit ke štítkůmOznačitOznačit poznámkuOznačit poznámku (Ctrl+K)OznačenéZraléMaximální intervalMaximum opakování na den.MédiaMinimální intervalMinutSmíchat nové karty a opakováníMnemosyne 2.0 balík (*.db)VíceNejvíce zapomínanýchPřemístit kartuPřemístit do balíku (Ctrl+D)Přemístit karty do balíku:Poz&námkyNázev již existuje.Název:SíťNovéNové kartyNových karet v balíku: %sNových karet na denNázev nového balíkuNový intervalNový název:Nový typ poznámky:Nový název skupiny nastavení:Nová pozice (1...%d):Další den začíná vŽádná karta neodpovídá kritériu, které jste zadali.Žádné prázdné karty.Nenalezeny žádné nepoužívané nebo chybějící soubory.PoznámkaTyp poznámkyTyp poznámekPoznámka a její karta %d smazána.Poznámka a její karty %d smazány.Poznámka a její karty %d smazány.Poznámka přeskočena.Poznámka odložena.Upozornění: Média se nezálohují. Prosím vytvořte si pravidelné zálohy vašeho adresáře Anki.Poznámka: Část historie chybí. Více v dokumentaci.Poznámka jako prostý textPoznámky vyžadují alespoň jedno pole.NicNejstarší zobrazit nejdříveJedna nebo více poznámek nebylo importováno, protože z nich nevznikly žádné karty. To se stává, pokud máte prázdná pole nebo pokud jste nenamapovali obsah v textovém souboru na správná pole.Přemístěny mohou být jen nové karty.OtevřítOptimalizuje se...Případný limit:MožnostiMožnosti pro %sSkupina volebMožnosti...PořadíPořadí přidáníPořadí opakováníPřepsat šablonu rubuPřepsat typ písmaPřepsat šablonu líceHeslo:Hesla nesouhlasíVložitVložit obrázek ze schránky jako PNGProcentaObdobí: %sVložit na konec fronty nových karetVložit do fronty na opakování s rozestupy:Nejprve prosím přidejte jiný typ poznámky.Buďte prosím trpěliví, může to nějakou dobu trvat.Prosím, připojte mikrofon a ujistěte se, že jiný program nepoužívá audio zařízení.Upravte prosím tuto poznámku a přidejte nějaké doplňovačky. (%s)Zajistěte, aby byl profil otevřen a aby Anki nebyl zaneprázdněn. Pak to zkuste znovu.Prosím nainstalujte PyAudioProsím nainstalujte mplayerProsím nejdříve otevřete profil.Prosím vyberte balík.Prosím, vyberte karty pouze od jednoho typu poznámky.Prosím proveďte výběr.Stáhněte si prosím aktuální verzi Anki.Prosím použijte Soubor>Import pro import tohoto souboru.Prosím navštivte AnkiWeb, aktualizujte váš balík a potom zkuste znovu.UmístěníPředvolbyNáhledNáhled nových karetNáhled nových karet přidaných nejpozdějiZpracovává se...Heslo profilu...Profil:ProfilyJe vyžadována proxy autorizace.OtázkaKonec fronty: %dZačátek fronty: %dUkončitNáhodněNáhodné řazeníHodnoceníPřipraveno k aktualizaciZnovu sestavitNahrát vlastní zvukNahrát zvuk (F5)Nahrává se...
Čas: %0.1fZnovu učenéPři přidávání si pamatovat poslední vstupOdstranit štítkyOdebrat formátování (Ctrl+R)Odstranění tohoto typu poznámek způsobí, že jedna nebo více poznámek budou smazány. Nejdříve vytvořte nový typ karet.PřejmenovatPřejmenovat balíkPřehrát zvukPřehrát vlastní zvukZměnit pořadíZměnit pořadí nových karetZměnit pořadí...Vyžadujte jeden nebo více z těchto štítků:PřeplánovatPřeplánovatPřeplánování karet založené na mých odpovědích v tomto balíkuPokračovatText zprava doleva (RTL)Navráceno ke stavu před '%s'.OpakováníPočet opakováníČas opakováníOpakovat dopředuOpakovat dopředu oZopakujte karty zapomenuté v minulýchOpakovat zapomenuté kartyProcento úspěšnosti podle hodiny.Počet opakováníPlánované opakování v balíku: %sVpravoUložit obrázekOblast: %sHledatHledat ve formátování (pomalé)VybratVybrat &všeVybrat poz&námkyVynechat štítky:Vybraný soubor není ve formátu UTF-8. Blíže viz manuál kapitola Import.Vlastní studiumStředníkPřesunout všechny balíky pod %s do téhle skupiny?Nastav pro všechny podřízené balíčkyNastavení barvy písma (F7)Změnit pozici existujících karetZkratka: %sZobrazit %sZobrazit odpověďZobrazit duplikátyZobrazovat čas odpovědiZobrazit nové karty až po opakováníZobraz nové karty před opakovánímZobrazit nové karty v pořadí přidáníZobrazit nové karty v náhodném pořadíZobrazovat čas do příštího opakování nad tlačítkyZobrazovat počet zbývajících karet během opakováníZobrazit statistiky. Zkratka: %sVelikost:Některá nastavení se projeví až po restartu Anki.Setřídit poleSetřídit prohlížeč dle tohoto poleTřízení dle toho sloupce není podporováno. Vyberte prosím jiný.Obrázky a zvukyMezeraPočáteční pozice:Úvodní jednoduchostStatistikyKrok:Kroky (v minutách)Kroky musí být v číslechOdstranit HTML při vkládání textuDnes k opakování %(a)s - odhadovaný čas %(b)s.Dnes nastudovánoStudovatStudijní balíkyStudovat balík...Studovat teďStylNastavení vzhledu (sdílené mezi kartami)Supermemo XML export (*.xml)OdložitOdložit kartuOdložit poznámkuOdloženéSynchronizovat i obrázky a zvukySynchronizovat s AnkiWeb. Zkratka: %sSynchronizují se média...Synchronizace selhala: %sSynchronizace neúspěšná; internet v režimu off-lineSynchronizace vyžaduje, abyste měli správně nastaven čas. Přenastavte ho prosím a zkuste to znovu.Synchronizuje se...TabulátorJen štítekŠtítkyCílový balík (Ctrl+D)Cílové pole:TextText oddělený tabulátory nebo středníky (*)Tento balík už existuje.Takové pole už existuje.Název je již používán.Spojení s AnkiWebem vypršelo. Zkontrolujte prosím své připojení a zkuste to znova.Vychozí konfiguraci nelze odstranit.Výchozí balík nelze odstranit.Rozdělení karet na balíky.První pole je prázdné.První pole typu poznámky musí být zobrazeno.Ikony pocházejí z různých zdrojů, informace najdete ve zdrojovém kódu Anki.Data, která jste zadali, by způsobila prázdnou otázku na všech kartách.Počet správně zodpovězených.Počet opakování do příště.Kolikrát jste vybrali každou odpověď.Zadaná vyhledávací kritéria neodpovídají žádným kartám. Chcete je upravit?Požadovaná změna způsobí kompletní nahrání databáze na server při příští synchronizaci Vaší sbírky. Máte-li změny nebo naplánované zkoušení na jiném zařízení, které ještě nebyly synchronizovány, budou ztraceny. Chcete pokračovat?Čas na zodpovězení.Aktualizace dokončena, můžete začít používat Anki 2.0.

Hlášení o aktualizaci: %s

Zbývají vám další nové karty, ale byl dosažen denní limit. Můžete ho zvýšit, ale mějte na paměti, že čím víc nových karet naráz, tím víc opakování.Musí existovat alespoň jeden profil.Soubor již existuje. Opravdu ho chcete přepsat?V této složce jsou všechna Vaše Anki data na jednom místě, aby se dala jednoduše zálohovat. Chcete-li nastavit Anki na jinou složku, podívejte se sem: %s Toto je speciální balík pro studium mimo normální plán.Toto je {{c1::sample}} doplňovačka.Tímto se smaže vaše současná kolekce a nahradí se daty ze souboru, který importujete. Jste si jistý?Tento průvodce vás provede aktualizací na Anki 2.0. Čtěte prosím instrukce pečlivě. ČasLimit pro časový boxK opakováníChcete-li procházet doplňky, klikněte na tlačítko Procházet.

Pokud jste našli doplněk, který se vám líbí, prosím vložte kód doplňku do pole Kód.Potřebujete-li importovat do profilu chráněného heslem, musíte tento profil nejdříve otevřít.Chcete-li přidat doplňovačku do existující poznámky, musíte její typ nejdřív změnit na Doplňovačku pomocí: Editovat->Změnit typ poznámky.Chcete-li studovat mimo normální plán, klikněte na tlačítko Vlastní studium.DnesByl dosažen denní limit, ale stále vám zbývají karty k opakování. Zvažte zvýšení denního limitu pro lepší zapamatování.CelkemCelkový časCelkem karetCelkem poznámekPokládat vstup za regulární výrazTypNapište odpověd: neznámé pole %sNelze importovat ze souboru s právy jen pro čtení.Podtrhni text (Ctrl+U)ZpětZpět %sNeznámý formát souboru.NenastudovanéAktualizovat existující poznámku, když je první pole stejnéAktualizace dokončenaPrůvodce aktualizacíAktualizuje seAktualizuje se balík %(a)s z %(b)s... %(c)sNahrát na AnkiWeb...Nahrává se na AnkiWeb...Použito v kartách, ale chybí ve složce s médii:Uživatel 1Verze %sČeká se na dokončení změn.VítejtePři přidávání standardně nastaven aktuální balíkPři zobrazení odpovědi přehrát audio otázky i odpovědiPokud jste připraveni na aktualizaci, potvrďte ji kliknutím na tlačítko. Během aktualizace se vám v prohlížeči otevře příručka. Pečlivě si ji prosím přečtěte, protože oproti minulé verzi je v Anki mnoho změn.Po aktualizaci balíků se Anki pokusí zkopírovat obrázky a zvuky ze starých balíků. Pokud jste používali vlastní složku pro DropBox nebo média, je možné, že se je nepodaří najít. To zjistíte později v hlášení. Pokud média nebudou správně zkopírovány podívejte se prosím do příručky pro aktualizaci.

AnkiWeb nyní podporuje přímou synchronizaci médií. Není třeba zádné speciální nastavení, média budou synchronizována společně s kartami.Celá kolekceChcete ji stáhnout nyní?Napsal Damien Elmes, s patchi, překlady a návrhy od:

%(cont)sZatím jste nezaznamenali svůj hlas.Je třeba alespoň jeden sloupec.MladéMladé a novéVaše balíky[žádný balík]zálohykartykaret setříděných podlekolekcednídny/dníbalíkstáří balíkunápovědahodinhodin po půlnocichybpřiřazeno na %spřiřazeno na Štítkyminutminutměsopakovánísekundstatstýdnůcelá sbírka~anki-2.0.20+dfsg/locale/mn/0000755000175000017500000000000012256137063015126 5ustar andreasandreasanki-2.0.20+dfsg/locale/mn/LC_MESSAGES/0000755000175000017500000000000012065014111016675 5ustar andreasandreasanki-2.0.20+dfsg/locale/mn/LC_MESSAGES/anki.mo0000644000175000017500000002461212252567246020205 0ustar andreasandreasL ` a h               # ) / 3 = C K ] h w   0 (   " /:L aXk  R S`fk' .8? F&T{(   ! (6<AFK^t {    FWjq     ( - 7 CQc   6If nx8 ! "W*       !,5>GP_~   '+@ ` l0x<# ;L!c9 xB\c w    8&-5?c=lUp     # 2 -C -q    % #  ! !2!P!j!!"! !!!+b""#")":"!+#4M########$#$ 5$B$Y$b$q$ $$2$$%&% ;%H%c%H%@%J &rV&)&&'/'K'gZ''V')(<(0P(( ) )%#)/I)y)$%#Y57+V)d>Fqvs&M}|x6 ef/ul"kK*.E{r?8ZL-_hnbWz[B3=]4CXD ,Gm9P:o1N~ <c wiOjS(02tU@^'JHa`A;R T!g pQIy\ Stop%d selected%d selected%s copy%s day%s days%s hour%s hours%s minute%s minutes%s month%s months%s second%s seconds%s year%s years%sd%sh%sm%ss%sy&About...&Cram...&Edit&File&Find&Go&Guide...&Help&Import&Invert Selection&Next Card&Previous Card&Reschedule...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)dOpen backup folderExport format:Find:Font Size:Font:In:Line Size:Replace With:A big thanks to all the people who have provided suggestions, bug reports and donations.About AnkiAddAdd TagsAdd: %sAddedAgainAll FieldsAnkiAnki is a friendly, intelligent spaced learning system. It's free and open source.Average TimeBasicBuryBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCard ListCenterChangeChange %s to:Check the files in the media directoryCloseClose and lose current input?Configure interface language and optionsConnecting...CreatedCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZDeleteDelete TagsDialogDiscard fieldE&xitEaseEasyEditEnter tags to add:Enter tags to delete:ExportExport...F1Field %d of file is:Field mappingFieldsFil&tersFind and Re&place...Find and ReplaceFirst ReviewGoodHTML EditorHardHelpIf you have contributed and are not on this list, please get in touch.Ignore this updateImportImport failed. Import optionsInclude scheduling informationInclude tagsInvalid regular expression.KeepLapsesLeechLeftMap to %sMap to TagsMarkedMatureMoreNetworkNothingOpenPassword:PreferencesProcessing...Record audio (F5)Recording...
Time: %0.1fRescheduleReviewReviewsRightSelect &AllShow AnswerShow new cards before reviewsShow new cards in order addedShow new cards in random orderSome settings will take effect after you restart Anki.Supermemo XML export (*.xml)SuspendSuspendedSyncing Media...TagsThis file exists. Are you sure you want to overwrite it?Total TimeTreat input as regular expressionUndo %sVersion %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYoungdaysmapped to %smapped to TagsminsProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:23+0000 Last-Translator: Damien Elmes Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: mn X-Poedit-Bookmarks: -1,132,-1,-1,-1,-1,-1,-1,-1,-1 Зогс%d-г сонгосон%s хуулах%s өдөр%s цаг%s минут%s сар%s секунд%s жил%sөдөр%sцаг%sсар%sсек%sжил&Тухай...&Оройтож бэлтгэх&Засварла&Файл&Хайлт&Оч&Гарын авлага...&ТусламжИ&мпорт&Сонголтыг чанх эсрэг&Дараагийн карт&Өмнөх карт&Дахин төлөвлөх...&Багаж&Буцаа'%(row)s' had %(num1)d fields, expected %(num2)dНөөшийн хавтсыг нээхЭкспорт формат:Хайлт:Фонт Хэмжээ:Фонт:Байрлал:Мөрийн Хэмжээ:Дараатай нь нөхөөсөнд явах:Санал өгөх, алдаа мэдэгдэх, хандив өгсөн хүмүүст маш их баярлалаа.Анкигын тухайНэмШошгыг нэмНэм: %sНэмсэнДахиадБүх талбаруудАнкиАнки гэдэг ухаалаг, хэрэглэгчид ойлгомжтой давталтын систем. Үүнийг үнэгүй болон нээлттэй эхийн программ.Цагийн дундажҮндсэнБулахАнки стандарт процессоор талбарын хооронд тэмдгийг илрүүлнэ, жишээ нь, таслал, цэгтэй таслал, гэх мэт. Анки тэмдгийг буруу илрүүлбэл энд оруулна уу. Таб бол \t хэрэглэнэ уу.ХүчингүйКартын ЖагсаалтТөвдӨөрчлөх%s-с дараагийн нь өөрчлөх:Медиа каталогийн файлуудыг шалгахХааХааж одоогийн оруулалтыг хаях уу?програмын харагдах байдлын хэл бас тохиргоонуудыг өөрчлөхХолбож байна...ҮүсгэсэнCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZУстгаШошгыг устгахДиалогТалбарыг устга&ГарахАмрын түвшинАмарханЗасварлаНэмэхийн шошгыг оруулах:Устгахын шошгыг оруулах:ЭкспортЭкспорт...F1Файлын талбар %d :Талбарын тааруулахТалбарууд&ШүүлтүүрХайж &орлуулах...Хайж орлуулахЭхлэхийн давталтСайнHTML хэлний редакторХэцүүТусламжТа Анкит өргөсөн харин нэрээ дэмжигчийн жагсаалтад байхгүй надад мэдэгдэнэ уу.Энэ шинэчлэлийг үл тоохИмпорт хийИмпорт дампуурсан. Импортын тохиргоонуудТөлөвлөлтийн мэдээллийг хамрахШошгуудыг оруулахХүчингүй байнгын илэрхийлэлХадгалахЦаг алдалтАшиглагчЗүүн%s-тай тааруулахШошготой холбоТэмдэглэсэнХуучин ньЦааш үзэхСүлжээЮу ч байхгүйНээхНууц үг:ТохируулалтуудГүйцэтгэж байна...Дуу хураах (F5)Дуу хурааж байна...
Цаг: %0.1fДахин төлөвлөхДавталтДавталтуудБаруун&Бүгдийг сонгоХариулт үзүүлэхШинэ картыг бүх хуучин картын өмнө үзэхШинэ картыг нэмсэн дарааллаар үзэхШинэ картыг санамсаргүй дарааллаар үзэхЗарим тохируулгууд Анкиг дахин асаахийн дараа үр дүн нь гарна.Supermemo XML-руу экпорт (*.xml)ТүдгэлзэхТүдгэлзсэнМедиа түдгэлзүүлж байна...ШошгуудЭнэ файл аль хэзээний байна. Та үүнийг дарж бичих мөн уу?Нийт цагБичсэн хэрэг байнгын илэрхийлэлтээр хэрэглэнэ%s-г тайлах%s хувилбарТа одоо татах гэсийн юм уу?Зохиолч: Дамиан Элмэс. Зам гаргагч, орчуулагч, шалгагч, өөр зохиолчид:

%(cont)sЗалууөдрүүд%s-тай тааруулсанШошгууд-той тааруулахминутуудanki-2.0.20+dfsg/locale/el/0000755000175000017500000000000012256137063015114 5ustar andreasandreasanki-2.0.20+dfsg/locale/el/LC_MESSAGES/0000755000175000017500000000000012065014110016662 5ustar andreasandreasanki-2.0.20+dfsg/locale/el/LC_MESSAGES/anki.mo0000644000175000017500000006570612252567245020203 0ustar andreasandreast @!A! H!S!Z!"`!! !!8!!!"""$9"$^"&""""""#$-# R#s##0###&# $$(,$U$j$,$$*$$,% .%<%(M%v%z%~%%%% %%%%% %%%%% %%% % & &&&>&N&]&l&}&&& && & &&&&&&&&&&&&&&,'(A'j'!''' '' ' (( (2(G(7^( (5(X(8/) h)s) w) )) )) )))) )) )) * *K*j*#*** **R* 2+E>+++R++# ,-, L,m, u,, ,,, ,,,,, --%---@-P-U-\-a-i-p-w- - - --- ---- - -..).<. D.P. W.c. t.~.....(..5. //5 /V/ m/y//// ///////////0 0 0 #0 00 =0 J0 W0 d0q0x00 0 0000 0 00/0111 1 (1 51 A1 M1 Z1 f1t1(1 111 111 2)!2K2g2k2q2v2 {222 2 2222 2!22333&3<3P3a3 h3r3x3z3}3333 333 33 33333344 +464M4S4Z4c4h4n4v4}44444 4444444 5 55 5)5 .595@5 U5 _5k5 p5z5555 55 5555 55 5566 6 %60686=6E6 T6 _6i66 6 6666666 6 77 7 #7-7827k7 q7|77 77"7W7$"8G8I8N8S8X8^8r88888888g::::3:: ::x;";;;O;?+<Gk<W<3 =[?==+=W=U=>[>3>1#?pU???5?0@K@/a@@@5@@3A7OAOAAA-B?BCBGBKBPBTBXBkB0}BBBB BC C C,C=CMC_C&tCC5CC"D *D KD"lDDDD DDDDE E E E E(E/E6EM$XM}M#0NTN!NOm3O5OSO<+P<hP PP*P$P6QOQXQ%pQ Q;Q$QR/RIR#^R#R RR R R R R2R&SFS^S!vS SSSS SST*(T-ST"TTTT!T,U/U@UQUbUrU UFU9UiV VV<VEV'gg gg'h8h Qh\hvhh{h i$iDiXipii:iiHtjj jjjj.j=$k bk mkxkkkkQ*xI KzlbzL#DP g'1AP~,N3-S.>XV<01 kpj!$YFDkVM-#ULOJYC("6nHG(Z: 3]t7cq86^f+w7Bh9|T EA|Hs%[+C)Eo5eO)dt'm\/{X:n^=9%?b<,xw 4>}a;_4KR0uQW28s*[.@edSy~mj"_ NcTyvp!ZR`;2@Biav W]h}J?{F&luU$`M& G5Ioi fq r\/= gr Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo(%s correct)(end)(filtered)(learning)(new).../1 101 month1 year10AM10PM3AM4AM4PM: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MExport format:Find:Font Size:Font:In:Include:Line Size:Replace With:Synchronisation

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A file called collection.apkg was saved on your desktop.About AnkiAddAdd FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2.0 DeckAnki Deck PackageAnki is a friendly, intelligent spaced learning system. It's free and open source.AnkiWeb ID:AnkiWeb is too busy at the moment. Please try again in a few minutes.Answer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Appeared twice in file: %sAre you sure you wish to delete %s?At least one step is required.Attach pictures/audio/video (F3)AverageAverage TimeAverage answer timeAverage easeAverage for days studiedBackBack PreviewBackupsBasicBasic (and reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser AppearanceBrowser OptionsBuryCancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCardsCards TypesCards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type...Change colour (F8)ChangedChecking...ChooseChoose DeckChoose Note TypeClone: %sCloseClozeCode:ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...CopyCorrect: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't save file: %sCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCurrent DeckCustomize FieldsCutDateDays studiedDebug ConsoleDeckDeck will be imported when a profile is opened.DecksDefaultDeleteDelete %s?Delete CardsDelete DeckDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete this note type and all its cards?Delete...Deleted.Deleted. Please restart Anki.DescriptionDialogDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueE&xitEaseEasyEasy bonusEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...EndEnter tags to add:Enter tags to delete:Error executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile was missing.FilterFilter:FilteredFind DuplicatesFind and Re&place...First CardFolder already exists.Font:FooterForecastFormFrontGeneralHeaderHelpHistoryHoursIf you studied every dayImportImport FileInfoInstall Add-onInterface language:IntervalLaTeXLaTeX equationLast CardLatest ReviewLearnLearningLeftLoading...ManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMinutesMoreMove CardsN&oteName exists.Name:NetworkNewNew CardsNew deck name:New name:New note type:Next day starts atNoteNote TypeNote TypesNothingOpenOptionsOptions for %sOptions...Password:Passwords didn't matchPastePercentagePeriod: %sPlease install PyAudioPlease install mplayerPlease open a profile first.PositionRandomReviewReview CountReviewsRightStudy NowSuspendedTextThis file exists. Are you sure you want to overwrite it?TotalTotal TimeUndo %sUnseenVersion %sWhole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou haven't recorded your voice yet.ddaysdeckhelphoursmapped to %smapped to Tagsminsminutessecondsstatswhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-09-16 18:26+0000 Last-Translator: Yannis Kaskamanidis Language-Team: WUG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: el Τερματισμός (1 από %d) (κλειστό) (ανοιχτό) Έχει %d κάρτα. Έχει %d κάρτες.%% Σωστά%(a)0.1f %(b)s/ημέρα%(a)d από %(b)d σημείωση ενημερώθηκε%(a)d of %(b)d σημειώσεις ενημερώθηκαν%(a)dkB πάνω, %(b)dkB κάτω%(tot)s %(unit)s%d κάρτα%d κάρτες%d κάρτα διαγράφτηκε.%d κάρτες διαγράφτηκαν.%d κάρτα εξήχθη.%d κάρτες εξήχθησαν.%d κάρτα εισάχθηκε.%d κάρτες εισάχθηκαν.%d κάρτα μελετήθηκε στο%d κάρτες μελετήθηκαν στο%d κάρτα/λεπτό%d κάρτες/λεπτό%d τράπουλα ενημερώθηκε.%d τράπουλες ενημερώθηκαν.%d ομάδα%d ομάδες%d σημείωση%d σημειώσεις%d σημείωση προστέθηκε%d σημειώσεις προστέθηκαν%d σημείωση εισήχθηκε.%d σημειώσεις εισήχθησαν.%d σημείωση ενημερώθηκε%d σημειώσεις ενημερώθηκαν%d αναθεώρηση%d αναθεωρήσεις%d επιλεγμένη%d επιλεγμένες%s υπάρχει ήδη στην επιφάνεια εργασίας σου. Να αντικατασταθεί;%s αντίγραφο%s ημέρα%s ημέρες%s ημέρα%s ημέρες%s διαγράφτηκε.%s ώρα%s ώρες%s ώρα %s ώρες %s λεπτό%s λεπτά%s λεπτό%s λεπτά%s λεπτό %s λεπτά %s μήνας%s μήνες%s μήνας%s μήνες%s δευτερόλεπτο%s δευτερόλεπτα%s δευτερόλεπτο%s δευτερόλεπτα%s για διαγραφή:%s χρόνο%s χρόνια%s έτος%s έτη%sd%sh%sm%smo%ss%sy&Σχετικά...&Πρόσθετα&Έλεγχος Βάσης Δεδομένων...&Ξεψάχνισμα...&Επεξεργασία&Εξαγωγή...&Αρχείο&Αναζήτηση&Προς&Οδηγός&Οδηγός...&Βοήθεια&Εισαγωγή&Εισαγωγή...&Αντιστροφή επιλογής&Επόμενη Κάρτα& Άνοιγμα φακέλου πρόσθετων...&Προτιμήσεις...&Προηγούμενη Κάρτα&Επανασχεδιάστε...&Υποστήξη του Anki...& Εναλλαγή Προφίλ...&Εργαλεία&Αναίρεση(%s σωστά)(τέλος)(φιλτραρίστηκε)(μάθηση)(νέο).../1 101 μήνας1 έτος10ΠΜ10ΜΜ3ΠΜ4ΠΜ4ΜΜ: και%d κάρτα%d κάρτεςΆνοιγμα φακέλλου backupΕπισκεφτείτε τον ιστοχώρο%(pct)d%% (%(x)s από %(y)s)%Y-%m-%d @ %H:%MΕξαγωγή φορμάτ:Βρείτε:Μέγεθος Γραμματοσειράς:Γραμματοσειρά:Εντός:Συμπερίληψη:Μέγεθος Γραμμής: Αντικαταστείστε με :Συγχρονισμός

Το Anki αναβαθμίστηκε

Κυκλοφόρησε το Anki %s.

<αγνοήθηκε><πληκτρολογήστε εδώ για αναζήτηση. Πατήστε enter για προβολή της τρέχουσας τράπουλας>Ένα μεγάλο ευχαριστώ σε όλους τους ανθρώπους που παρείχαν προτάσεις, αναφορές σφαλμάτων και δωρεές.Ένα αρχείο με όνομα collection.apkg έχει αποθηκευτεί στην επιφάνεια εργασίας σου.Σχετικά με το AnkiΠρόσθεσεΠροσθήκη ΠεδίουΠροσθήκη πολυμέσωνΠροσθήκη Νέας Τράπουλας (Ctrl+N)Προσθήκη Τύπου ΣημείωσηςΠροσθήκη ΕτικετώνΠροσθήκη νέας κάρταςΠροσθήκη στο:Προσθέστε: %sΠροστέθηκεΠροστέθηκε σήμεραΞανάΞανά σήμεραΕπανακαταμέτρηση: %sΌλες οι ΤράπουλεςΌλα τα πεδίαΌλες οι κάρτες, σημειώσεις, και αρχεία πολυμέσων γι΄αυτό το προφίλ θα διαγραφούν. Είστε σίγουρος;Επιτρέψτε HTML στα πεδίαΜια εικόνα έχει σωθεί στην επιφάνεια εργασίας σου.AnkiAnki 1.2 Τράπουλα (*.anki)Anki 2.0 ΤράπουλαAnki Πακέτο ΤράπουλαςAnki είναι ένα φιλικό, έξυπνο και σε τμήματα σύστημα εκμάθησης. Είναι ελεύθερο και ανοιχτού κώδικα.Αναγνωριστικό AnkiWeb:Το AnkiWeb είναι πολύ απασχολημένο αυτή τη στιγμή. Παρακαλούμε δοκιμάστε πάλι σε μερικά λεπτά.Κουμπιά ΑπαντήσηςΑπαντήσειςΛογισμικό antivirus ή firewall εμποδίζει το Anki να συνδεθεί στο Internet.Εμφανίζεται δις στο αρχείο: %sΕίστε βέβαιος ότι επιθυμείτε να διαγράψετε %s;Τουλάχιστον ένα βήμα απαιτείται.Επισύναψη εικόνων/ήχου/βίντεο (F3)ΜέσοςΜέσος ΧρόνοςΜέσος χρόνος απάντησηςΜέσος όρος ευκολίαςΜέσος όρος για ημέρες μελέτηςΠίσωΠροβολή ΠίσωΑντίγραφα ΑσφαλείαςΒασικόΒασική (και αντεστραμμένη κάρτα)Έντονο κείμενο (Ctrl+B)ΕξερεύνησηΠεριήγηση && Εγκατάσταση...ΠεριηγητήςΕμφάνιση ΠεριηγητήΕπιλογές περιηγητήΜπέριΑκύρωσηΚάρταΚάρτα %dΚάρτα 1Κάρτα 2Πληροφορίες Κάρτας (Ctrl+Shift+I)Κατάλογος ΚάρταςΤύπος ΚάρταςΤύποι ΚαρτώνΤύποι Καρτών για %sΚάρτεςΤύποι ΚαρτώνΚάρτες...ΚεντράρισμαΑλλαγήΑλλαγή %s σε:Αλλαγή ΤράπουλαςΑλλαγή Τύπου ΣημείωσηςΑλλαγή Τύπου Σημείωσης...Αλλαγή χρώματος (F8)ΤροποποιήθηκεΈλεγχος...ΕπιλογήΕπιλογή ΤράπουλαςΕπιλογή Τύπου ΣημείωσηςΚλώνος: %sΚλείσιμοΚλείσιμοΚωδικός:Άνω κάτω τελείαΚόμμαΟρισμός γλώσσας διεπαφής και επιλογώνΕπιβεβαίωση κωδικού πρόσβασης:Συγχαρητηρία! Ολοκληρώσατε αυτή την τράπουλα για την ώρα.Γίνεται σύνδεση…ΑντιγραφήΣωστό: %(pct)0.2f%%
(%(good)d από %(tot)d)Δεν μπόρεσα να αποθηκεύσω το αρχείο: %sΔημιουργία ΤράπουλαςΔημιουργία Φιλτραρισμένης Τράπουλας...ΔημιουργήθηκεCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZΑθροιστικόΤρέχουσα ΤράπουλαΠροσαρμογή ΠεδίωνCutΗμερομηνίαΗμέρες μελέτηςΚονσόλα ΑποσφαλμάτωσηςΤράπουλαΗ Τράπουλα θα εισαχθεί μόλις δημιουργηθεί ένα προφίλ.ΤράπουλεςΠροεπιλογήΔιαγραφήΔιαγραφή %s;Διαγραφή ΚαρτώνΔιαγραφή ΤράπουλαςΔιαγραφή ΣημείωσηςΔιαγραφή ΣημειώσεωνΔιαγραφή ΕτικετώνΔιαγραφή ΑχρησιμοποίητωνΔιαγραφή πεδίου από %s;Διαγραφή αυτού του τύπου σημείωσης και όλων των καρτών τους;Διαγραφή...ΔιαγράφτηκεΔιαγράφτηκε. Παρακαλούμε επανεκκινήστε το Anki.ΠεριγραφήΠλαίσιο διαλόγουΗ λήψη απέτυχε: %sΛήψη από το AnkiWebΕπιτυχής λήψη. Παρακαλώ κάντε επανεκίννηση στο AnkiΛήψη από το AnkiWeb...ΛόγωΈ&ξοδοςΕυκολίαΕύκολοΕύκολο bonusΕπεξεργασίαΕπεξεργασία %sΕπεξεργασία ΤρέχοντοςΕπεξεργασία HTMLΕπεξεργασία για προσαρμογήΕπεξεργασία...ΕπεξεργάστηκεΕπεξεργασία ΓραμματοσειράςΟι επεξεργασίες αποθηκεύτηκαν. Παρακαλώ επανεκκινήστε το Anki.ΚενόΚενές Κάρτες...ΤέλοςΕισαγωγή ετικετών για προσθήκη:Εισαγωγή ετικετών για διαγραφή:Σφάλμα κατά την εκτέλεση του %s.Σφάλμα κατά την εκτέλεση του %sΕξαγωγήΕξαγωγή...ΠρόσθετοFF1F3F5F7F8Όνομα πεδίου:Πεδίο:ΠεδίαΠεδία για %sΠεδία χωρισμένα με:%sΠεδία...ΦίλτραTo αρχείο έλειπε.ΦιλτράρισμαΦιλτράρισμα:ΦιλτραρισμένοΕύρεση ΔιπλώνΕύρεση και ΑνικατάστασηΠρώτη ΚάρταΟ φάκελος υπάρχει ήδη.ΓραμματοσειράΥποσέλιδοΠρόγνωσηΦόρμαΜπροστάΓενικάΕπικεφαλίδαΒοήθειαΙστορικόΏρεςΑν μελετούσες κάθε μέραΕισαγωγήΕισαγωγή ΑρχείουΠληροφορίεςΕγκατάσταση ΠρόσθετουΓλώσσα Διεπαφής:Διάστημα ανανέωσηςLatexΕξίσωση LaTeXΤελευταία ΚάρταΤελευταία ΑναθεώρησηΜάθετεΕκμάθησηΑριστεράΦόρτωση...ΔιαχείρισηΔιαχείριση Τύπων ΣημειώσεωνΧάρτης στο %sΧάρτης σε ΕτικέτεςΕπισήμανσηΕπισήμανση ΣημειώσηςΕπισήμανση Σημείωσης (Ctrl+K)ΕπισημάνθηκεΛεπτάΠερισσότεραΜετακίνηση ΚαρτώνΣ&ημείωσηΤο Όνομα υπάρχειΌνομα:ΔίκτυοΝέοΝέες ΚάρτεςΝέο όνομα τράπουλαςΝέο όνομα:Τύποι ΣημείωσηςΗ επόμενη μέρα αρχίζει στιςΣημείωσηΤύπος σημείωσηςΤύποι ΣημειώσεωνΤίποτεΆνοιγμαΕπιλογέςΕπιλογές για %sΕπιλογές...Κωδικός:Οι κωδικοί δεν συμφώνησανΕπικόλλησηΠοσοστόΠερίοδος: %sΠαρακαλώ εγκατέστησε το PyAudioΠαρακαλώ εγκαταστήστε mplayerΠαρακαλώ ανοίξτε πρώτα ένα προφίλΤοποθεσίαΤυχαίαΕπιθεώρησηΕπισκόπηση μετρήσεωνΕπιθεωρήσειςΔεξιάΜελέτησε τώραΣε αναστολήΚείμενοΤο αρχείο υπάρχει. Είσαι σίγουρος ότι θέλεις να το αντικαταστήσεις;ΣύνολοΣυνολικός χρόνοςΑναίρεση %sΜη ανοιγμέναΈκδοση %sΠλήρης συλλογήΘα θέλατε να το κατεβάσετε τώρα;Γραμμένο από τον Damien Elmes, με επιδιορθώσεις , μετάφραση , τέστ και σχεδιασμό από :

%(cont)sΔεν έχετε ηχογραφήσει τη φωνή σας ακόμαdημέρεςτράπουλαβοήθειαώρεςσε αντιστοιχία προς %sσε αντιστοιχία προς Ετικέτεςλεπτάλεπτάδευτερόλεπταστατιστικάσύνολο συλλογής~anki-2.0.20+dfsg/locale/ar/0000755000175000017500000000000012256137063015116 5ustar andreasandreasanki-2.0.20+dfsg/locale/ar/LC_MESSAGES/0000755000175000017500000000000012065014110016664 5ustar andreasandreasanki-2.0.20+dfsg/locale/ar/LC_MESSAGES/anki.mo0000644000175000017500000002733612252567245020202 0ustar andreasandreas  '/>Odw    + =H`p0( 8 N[ m z X 4=EK Q [fk R   &(85a      (.38=L_u |    Fbu|   $, 1 ; GUg   6Mj r|8 ! "W3  i t EINSES2? #2: BL\ o }$ 3 M a m :y     C !2!R!a!y! !!! !!g" w"+""" """ #"#"+#N#zh### $! $-%C% _%k% r%}%2% %9%6 &HB&&& &&&&& && &'''0'D'M' c' m'x' ''('$' '((*(?( U(b(r({(((( (( (( m))))&)*#*@* G*R*X*a*v* * * * *****+-+L+ b+o+~+++@+B+@6,Pw, , , ,,-W0--4- - --'-d'...#. .MFx}3r7t# =2[yIG]^@~j-VB`Sv%Ep u6Lz{4N5kOd|<;l g9 XQ+ZPCf\"oi80wDH!R.na*:qeA)_h/m &U' >KJWsb,(?Y$T1c Stop (1 of %d)%%(tot)s %(unit)s%d note%d notes%d selected%d selected%s copy%s day%s days%s hour%s hours%s minute%s minutes%s month%s months%s second%s seconds%s year%s years%sd%sh%sm%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(new)/0d1 month1 yearOpen backup folder%Y-%m-%d @ %H:%MExport format:Find:Font Size:Font:In:Line Size:Replace With:A big thanks to all the people who have provided suggestions, bug reports and donations.About AnkiAddAdd New Deck (Ctrl+N)Add TagsAdd: %sAddedAgainAll DecksAll FieldsAnkiAnki 1.2 Deck (*.anki)Anki 2.0 DeckAnki is a friendly, intelligent spaced learning system. It's free and open source.Average TimeBasicBuryBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCard ListCards...CenterChangeChange %s to:Check the files in the media directoryCloseClose and lose current input?Configure interface language and optionsCongratulations! You have finished this deck for now.Connecting...Create DeckCreatedCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZDeckDecksDeleteDelete DeckDelete TagsDialogDiscard fieldE&xitEaseEasyEditEmpty Cards...Enter tags to add:Enter tags to delete:ExportExport...F1Field %d of file is:Field mappingFieldsFields...Fil&tersFind and Re&place...Find and ReplaceFirst ReviewGoodHTML EditorHardHelpIf you have contributed and are not on this list, please get in touch.Ignore this updateImportImport failed. Import optionsInclude scheduling informationInclude tagsInvalid regular expression.KeepLapsesLeechLeftMap to %sMap to TagsMarkedMoreNetworkNothingOpenPassword:PreferencesProcessing...Record audio (F5)Recording...
Time: %0.1fRescheduleReviewReviewsRightSelect &AllShow AnswerShow new cards before reviewsShow new cards in order addedShow new cards in random orderSome settings will take effect after you restart Anki.Supermemo XML export (*.xml)SuspendSuspendedSyncing Media...TagsThis file exists. Are you sure you want to overwrite it?Total TimeTreat input as regular expressionTypeUndo %sVersion %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sdaysmapped to %smapped to TagsminsProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-05-19 12:09+0000 Last-Translator: عادل الصاعدي Language-Team: Arabic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5; X-Launchpad-Export-Date: 2013-12-11 05:43+0000 X-Generator: Launchpad (build 16869) Language: ar ايقاف (1 of %d)%%(tot)s %(unit)sملاحظة %d%d ملاحظات%d ملاحظات%d ملاحظات%d ملاحظات%d ملاحظات%d تم اختياره%d تم اختياره%d تم اختياره%d تم اختياره%d تم اختياره%d تم اختياره%s نسخ%s يوم%s يوميومين (%s)%s ايام%s يوما%s يوم%s ساعة%s ساعة%s ساعة%s ساعات%s ساعة%s ساعة%s دقيقة%s دقيقة%s دقيقة%s دقائق%s دقيقة%s دقيقة%s شهر%s شهور%s شهور%s شهور%s شهور%s شهور%s ثانية%s ثانية%s ثانية%s ثواني%s ثانية%s ثانية%s سنة%s سنة%s سنة%s سنوات%s سنة%s سنة%sd%sh%sm%ss%sy&عن&الاضافات&فحص البيانات...&Cram...&تحرير&تصدير...&ملف&بحث&اذهب&تعليمات&تعليمات...&مساعدة&استورد&إستيراد...&أعكس الإختيار&البطاقة التالية&فتح مجلد الاضافات...&التفضيلات...&البطاقة السابقة&اعادة جدولة...&دعم آنكي...&أدوات&تراجع'%(row)s' لديه%(num1)d حفول, متوقعة %(num2)d(جديد)/0d1 شهر1 سنةفتح مجلد النسخ الاحتياطي%Y-%m-%d @ %H:%Mصيغة التصدير:بحث:حجم الخط:الخط:في:حجم السطر:استبدل مع:شكرا جزيلا لكل الاشخاص الذين زودونا بإقتراحاتهم،تقارير الاخطاء وكذلك تبرعاتهمحول آنكيإضافةاضافة مجموعة جديدة (Ctrl+N)إضافة سمات Tagsاضافة: %sاُضيفتمرة أخرىكل المجموعاتجميع الحقولآنكيمجموعة آنكي 1.2 (*.anki)مجموعة آنكي 2.0آنكي خفيف, ذكي في نظام التعليم المتباعد. وكذلك مجاني و مفتوح المصدر.معدل الوقتأساسالطلبافتراضيا؛ سيكتشف أنكي Anki الرموز بين الحقول مثل التاب tab، الفاصلة، و البقية. إذا كان كشف أنكي Anki عن هذه الرموز خاطئا؛ تستطيع إدخالها هنا استخدم \t لتمثل التاب tab.إلغاء الأمرقائمة البطاقاتكروت...وسطتعديلتغيير %s الى:فحص الملفات في مجلد الوسائطإغلاقاغلاق وخسارة المدخلات الحالية?تعديل واجهة اللغات و الخياراتتهانينا لقد انتهيت من هذه المجموعة الآنجاري الإتصال...مجموعة جديدةإنشاءCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+Zمجموعةمجموعاتحذفحذف مجموعةحذف الوسومحوارتجاهل الحقل&خروجتسهيلسهلتحريرالكروت الفارغة...اختر سمات Tags لإصافتها:اختر سمات Tags لحذفها:تصديرتصدير....F1حقل %d من الملف يكون:تخطيط الحقلالحقولالحقول...Fil&tersبحث و استبد&ال...بحث و استبدلاول مراجعةجيدHTML محررصعبمساعدةاذا كنت مساهم في البرنامج وإسمك غير موجود في القائمة ، الرجاء اتصل بنا.تجاهل هذا التحديثاستيرادفشل الااستيراد خيارات الاستيراداشمل معلومات الجدولةاشمل السمات Tagsتعبير عادي غير صالححفظهفواتLeechيسارخريطة إلى %sخريطة السمات Tagsمعلّمالمزيدالشبكةﻻ شيءافتحكلمة السر:التفضيلاتمعالجة...تسجيل الصوت (F5)يتم التسجيل...
الوقت: %0.1fاعادة جدولةمراجعةمراجعاتيميناختر ال&كلاظهر الإجابةاظهر البطاقات الجديدة قبل المراجعةاظهار البطاقات الجديدة بحسب الاضافةاظهار البطاقات الجديدة بشكل عشوائيبعض الإعدادات سوف تفعل بعد إعادة تشغيل آنكي.Supermemo XML تصدير (*.xml)تعليقموقوفمزامنة الوسائط...الوسوم Tagsهذا الملف موجود. هل أنت متأكد أنك تريد استبداله؟الوقت الكليعامل المدخلات كأي تعبير عاديالنوعتراجع %sاﻻصدارة %sهل ترغب بتحميله الآن؟البرمجة بواسطة Damien Elmes, و نقح, ترجم, اختبر وصمم من:

%(cont)sاياممخطط إلى %sمخطط إلى الوسومدقائقanki-2.0.20+dfsg/locale/sv/0000755000175000017500000000000012256137063015144 5ustar andreasandreasanki-2.0.20+dfsg/locale/sv/LC_MESSAGES/0000755000175000017500000000000012065014111016713 5ustar andreasandreasanki-2.0.20+dfsg/locale/sv/LC_MESSAGES/anki.mo0000644000175000017500000012040712252567246020222 0ustar andreasandreas2<#.. / //"/;/ =/G/8Z////"/$/$0&;0b0"0000$0 1+1@10X111&1 11(1 2"2,92f2*y22,2 22(3.32363:3?3C3 G3Q3Z3m3v3 |33333 333 33 33344$454H4O40U4 44 4444;5=5@5E5M5T5Y5^5b5f5j5l5,5(55!56f166 66 6 66677e3777C8 {858X8Y98n9 999 9 99 9 : ::':/: 5:A: G: S: ]:Kh::#::: ; <<R<w=7y= =w=E5>{>>R>>h?#?? ??(@)@ 1@>@ R@_@x@@ @ @@@@@@@L@;AKAQAoA tA~A:BABFBNBUB\B uB B BBBBB B3BSCbCkCrC yC CCCCC"CD&D 7DCD JDVD gDqDwDDDD-DDD(D"E54E jExE5}EPE7FKTKhKyK KKKK KK K KKKKLL%L5LJL [L fLsLzLL LLL LL LL$LLLMMM.MFNMMM MMM MNN*NJN iNvN N NNNNNNN N OO(O.O3O+SiYSS S SS S T TT7T >T KT-WTT TTT T,TT U&U 7UCUUUrUUU*U'U! V6BV yV!V?VV VWW+WHW fW tW W WWWW W W*WX.X!AXdcX XXXX(XY")Y&LY*sY(Y1Y'Yt!ZZ#[8[[b\g\ z\\]] ] ] ]!]]]^.^6^=^ N^&X^,^ ^^^^(_a"aWbnb tb b bbb bbbb bbbbbb c c%c-c5c=c?cAc>e FeQeWe#^ee eeLeeff")f(Lf(uf,ff0fg,g.Jg4yg4ggh/hBhKh'[h hh*hhh+h%i-;iii-ii i%iiijj jjj !j+j Cj Pj Zjhjoj vjj jj j jj jjjkk*k 9kEkNk=Vk kk kkkkSlUlXl]lflllslzlllll+l9l m!,mNmfmm nn)n :nDnVnknnfnn8o oFoQ+pf}p=p"q *q 5qVqgq!xqqqq qqq rr rr ,rX7rr$rrr2r#t9tjtXuIu9vJvMv w-wP2ww!;x)]xxxx-x yy(y?yVyvyyyyyyyyz zR$zwzzzzzz{{{{{{ {{ {{ ||1| 6|9@|`z||||| }}%}D}]}*o}}&}}} }} ~ ~,~A~H~a~+f~~ ~2~~6~ %139Um:  !/6= DO`gnu| ̀ ڀ  # 0=M]mƁ &! 0>R3Z 0  ,AS5e, ȃ Ӄ&ރ   *E3]Ƅ ̄؄   & :H?_"#…+/ I S`fi  džц*9NU]f ‡$ɇ"1)D[߈  )?6P% Չ   &,; KX!k 2 #4;Aa i!ً  1Ndw,ÌbҌ5 MW#l ؍ %%6\u Ŏ͎ ֎5Qck 1C Tby(͐ Ԑߐ! <"Qt  ֑)$!.F.uE>0o $ؓ  (3!8 Zf"w%ה3]% -Օ$&8)U*&~іP"_FɘUY v ךޚ-GKg  ++ * BM8?x^.?QY[aix! '@  2" m V0i~HQ[18h9FJ*V';7Ap9)njnaDLuR1%[$R)o$!,"-b"`.Y0$<.1i= 3Pp} S F=^akB#!h52B#;cYxO/%ztN|l#c,HWu (w/&zQIG)\b~x / 2@!C]rMdZe&(N:]XMmEC->: fJ&<Z5S%g 4_\(kG>sleOo{+ wg6._+L^Is?'q0UfK,U4*tD*8d7{XTA6T|W} qvE j rv`yK3 -yP+ ? Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(new)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.About AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.Answer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser OptionsBuildBulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...CopyCorrect: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete NoteDelete NotesDelete TagsDelete UnusedDelete this note type and all its cards?Delete this unused note type?Delete...Deleted.Deleted. Please restart Anki.DescriptionDialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...E&xitEaseEasyEasy bonusEditEdit %sEdit CurrentEdit HTMLEdit to customizeEditing FontEmpty Cards...Empty first field: %sEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error executing %s.Error running %sExportExport...ExtraF1Field %d of file is:Field mappingFieldsFields for %sFields...Fil&tersFile was missing.FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst CardFirst ReviewFooterForecastFrontFront PreviewFront TemplateGeneralGet SharedGoodHTML EditorHardHave you installed latex and dvipng?HeaderHelpHistoryHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore this updateImportImport FileImport failed. Import optionsIn media folder but not used by any cards:Include scheduling informationInclude tagsIncreasing intervalsIntervalsInvalid code.Invalid regular expression.Italic text (Ctrl+I)KeepLaTeXLaTeX equationLaTeX math env.Last CardLatest ReviewLearn ahead limitLeechLeftLimit toLock account with password, or leave blank:Longest intervalMap to %sMap to TagsMarkMark NoteMarkedMatureMaximum reviews/dayMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove cards to deck:NetworkNewNew CardsNew cards/dayNew deck name:New name:New note type:New options group name:New position (1...%d):Next day starts atNo empty cards.No unused or missing files found.Note TypeNote TypesNote: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNothingOldest seen firstOnly new cards can be repositioned.OpenOptionsOptions group:OrderOrder addedOrder duePassword:PercentagePlace at end of new card queuePlease be patient; this can take a while.Please open a profile first.Please select a deck.PositionPreferencesProcessing...Profile Password...Profile:ProfilesRandomRandomize orderReady to UpgradeRecord audio (F5)Recording...
Time: %0.1fRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckRepositionReposition New CardsReposition...RescheduleResume NowReverse text direction (RTL)ReviewReview CountReview TimeReview success rate for each hour of the day.RightSave ImageSearchSearch within formatting (slow)Select &AllSet all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shortcut key: %sShow AnswerShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSome settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesStatisticsSteps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudy DeckStudy Deck...Study NowStylingSupermemo XML export (*.xml)SuspendSuspend CardSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...Tag OnlyTagsTextText separated by tabs or semicolons (*)That deck already exists.The default deck can't be deleted.The division of cards in your deck(s).The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This file exists. Are you sure you want to overwrite it?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.Today's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnderline text (Ctrl+U)Undo %sUnseenUpgrade CompleteUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUsed on cards but missing from media folder:Version %sWaiting for editing to finish.WelcomeWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYoungYoung+LearnYour Decks[no deck]backupscards selected bycollectionddaysdeckdeck lifehelphourshours past midnightlapsesmapped to %smapped to Tagsminsminutesreviewssecondsw~Project-Id-Version: anki 0.9.9.8.4 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-02-13 07:16+0000 Last-Translator: Anders Hagward Language-Team: Swedish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) X-Poedit-Country: SWEDEN Language: sv X-Poedit-Language: Swedish Stopp (1 av %d) (av) (på) Den har %d kort. Den har %d kort.%% Korrekta%(a)0.1f %(b)s/dag%(a)d av %(b)d anteckning uppdaterad%(a)d av %(b)d anteckningar uppdaterade%(a)dkB upp, %(b)dkB ner%(tot)s %(unit)s%d kort%d kort%d kort raderat.%d kort raderade.%d kort exporterat.%d kort exporterade.%d kort importerat.%d kort importerade.%d kort pluggat under%d kort pluggade under%d kort/minut%d kort/minut%d kortlek uppdaterad.%d kortlekar uppdaterade.%d grupp%d grupper%d anteckning%d anteckningar%d anteckning tillagd%d anteckningar tillagda%d anteckning importerad%d anteckningar importerade%d anteckning uppdaterad%d anteckningar uppdaterade%d granskning%d granskningar%d vald%d valda%s finns redan på ditt skrivbord. Skriv över?%s-kopia%s dag%s dagar%s dag%s dagar%s borttagen.%s timme%s timmar%s timme%s timmar%s minut%s minuter%s minut.%s minuter.%s minut%s minuter%s månad%s månader%s månad%s månader%s sekund%s sekunder%s sekund%s sekunder%s att ta bort:%s år%s år%s år%s år%s dag%s tim.%s min%smo%s sek%s år&Om...&Tillägg&Kontrollera databas...&Hårdplugga&Redigera&Exportera...&Arkiv&Hitta&Gå till&Guide&Guide...&Hjälp&Importera&Importera...&Invertera markering&Nästa kort&Öppna mapp för tillägg...&Inställningar...&Föregående kort&Ändra schema...&Stöd Anki...&Byt profil&Verktyg&Ångra'%(row)s' hade %(num1)d fält, förväntat antal är %(num2)d%s korrekt(slut)(filtrerad)(ny)....anki2-filer är inte till för importering. Om du försöker återställa från en säkerhetskopia, vänligen leta upp 'Backups'-sektionen i manualen./0d1 101 månad1 årkl. 10kl. 22kl. 3kl. 4kl. 16: och%d kort%d kortÖppna mappen för säkerhetskopiorBesök webbsajt%(pct)d%% (%(x)s av %(y)s)%Y-%m-%d @ %H:%MSäkerhetskopior
Anki kommer att skapa en säkerhetskopia av din samling varje gång programmet avslutas eller synkroniseras.Exportformat:Sök:Typsnittsstorlek:Typsnitt:I:Inkludera:Linjestorlek:Ersätt med:SynkroniseringSynkronisering
Inte aktiverat; klicka på knappen Synka i huvudfönstret för att aktivera.

Konto krävs

Ett gratis konto krävs för att hålla din samling synkroniserad. Registrera ett konto och ange sedan dina detaljer nedan.

Ny version av Anki

Anki %s har släppts.

Ett stort tack till alla som har kommit med förslag, felrapporter och donationerEtt korts lätthet är storleken på nästa intervall när du svarar "bra" under en granskning.En fil som heter collection.apkg sparades på ditt skrivbord.Om AnkiLägg tillLägg till (genväg: ctrl+enter)Lägg till FältLägg till mediaLägg Till En Ny Kortlek (Ctrl+N)Lägg till anteckningstypLägg till etiketterLägg till nytt kortLägg till:Lägg till: %sTillagdTillagt idagIgenIgen idagAlla kortlekarAlla fältAlla kort, anteckningar och media för den här profilen kommer tas bort. Är du säker?Tillåt HTML i fältenEn bild sparades på ditt skrivbord.AnkiKortlek för Anki 1.2 (*.anki)Anki 2 lagrar dina kortlekar i ett nytt format. Den här guiden kommer automatiskt konvertera dina kortlekar till det formatet. Dina kortlekar kommer säkerhetskopieras innan uppgraderingen, så om du behöver återgå till den tidigare versionen av Anki kommer dina kortlekar fortfarande vara användbara.Kortlek för Anki 2.0Anki 2.0 stödjer endast automatisk uppgradering från Anki 1.2. För att ladda äldre kortlekar, öppna dem i Anki 1.2 för att uppgradera dem och importera dem sedan i Anki 2.0.Anki är ett vänligt, intelligent tidsfördelat inlärningssystem. Det är fritt och med öppen källkod.Anki lyckades inte ladda din gamla config-fil. Vänligen använd Arkiv > Importera för att importera dina kortlekar från tidigare versioner av Anki.ID:t eller lösenordet för AnkiWeb var felaktigt; var god försök igen.ID för AnkiWeb:AnkiWeb stötte på ett problem. Vänligen försök igen om några minuter. Om problemet kvarstår, vänligen skicka in en buggrapport.AnkiWeb är för upptaget just nu. Vänligen försök igen om några minuter.SvarsknapparSvarAnki kommer inte åt internet på grund av antivirus- eller brandväggsmjukvara.Alla kort som inte är förknippade med någonting kommer att raderas. Om en anteckning inte har några kvarvarande kort kommer den att tas bort. Är du säker att du vill fortsätta?Hittades två gånger i filen: %sÄr du säker på att du vill ta bort %s?Åtminstone ett steg krävs.Infoga bilder/ljud/video (F3)Spela upp ljud automatisktSynka automatiskt när profil öppnas/stängsGenomsnittGenomsnittlig TidGenomsnittlig svarstidGenomsnittlig lätthetMedelvärde för dagar studeratGenomsnittligt intervallBaksidaFörhandsvisning för BaksidaMall för BaksidaSäkerhetskopiorGrundläggandeFet text (Ctrl+B)BläddraBläddra && InstalleraBläddrareBläddrare (%(cur)d kort visat; %(sel)s)Bläddrare (%(cur)d kort visade; %(sel)s)BläddraralternativByggMassborttagning Av EtiketterBegravBegrav AnteckningSom förval identifierar Anki vilket tecken som används för att skilja fält åt, som tabbsteg, komma osv. Om Anki gör ett felaktigt val av tecken, så kan du ange rätt tecken här. Använd \t för tabbsteg.AvbrytKortKort %dKort 1Kort 2Kortinformation (Ctrl+Shift+I)KortlistaKorttypKorttyperKorttyper för %sKort uteslutet.Kortet var en utsugare.KortKorttyperKort kan inte flyttas manuellt till en filtrerad kortlek.Korten kommer automatiskt bli återförda till sina originalkortlekar efter att du granskat dem.Kort...CentreraÄndraÄndra %s till:Byt kortlekÄndra anteckningstypÄndra Anteckningstyp (Ctrl+N)Ändra anteckningstyp...Ändra färg (F8)Ändra kortlek beroende på anteckningstypÄndradeKontrollera filerna i mediebiblioteketKontrollerar...VäljVälj KortlekVälj AnteckningstypKlona: %sStängStäng och gå miste om nuvarande inmatning?StängClozetest (Ctrl+Shift+C)Kod:Samlingen korrupt. Var vänlig se manualen.KolonKommateckenAnpassa gränssnittets språk och andra alternativBekräfta lösenordet:Grattis! Du är klar med den här kortleken för idag.Ansluter...KopieraRätt: %(pct)0.2f%%
(%(good)d av %(tot)d)Kunde inte ansluta till AnkiWeb. Kontrollera nätverksanslutningen och försök igen.Kunde inte spela in ljud. Har du installerat lame och sox?Kunde inte spara fil: %sRåpluggaSkapa KortlekSkapadCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZAckumuleradeKumulativ %sKumulativa SvarKumulativa KortAktuell kortlekAktuell anteckningstyp:Egen PlaneringAnpassad StudiesessionAnpassade steg (i minuter)Skräddarsy kort (Ctrl+L)Anpassa FältKlippDatabasen återuppbyggd och optimerad.DatumDagar studeratAvauktoriseraFelsökningskonsollKortlekKortleken kommer importeras när en profil öppnas.KortlekarMinskande intervallerStandardSenareläggningar innan repetitioner körs igen.Ta bortTa bort %s?Ta bort kortTa bort kortlekTa bort anteckningTa Bort AnteckningarTa bort etiketterTa bort oanvändaTa bort den här anteckningstypen och alla dess kort?Ta bort den här oanvända anteckningstypen?Ta bort...Borttaget.Borttaget. Var god och starta om Anki.BeskrivningDialogrutaKassera fältNedladdning misslyckad: %sLadda ner från AnkiWebNedladdningen lyckades. Var god och starta om Anki.Laddar ner från AnkiWeb...&AvslutaInlärningsgradLättEnkel bonusRedigeraRedigera %sRedigera aktuellRedigera HTMLRedigera för att anpassaRedigeringstypsnittTomma kort...Tomt första fält: %sSkriv in kortlek att lägga nya %s-kort i, eller lämna blankt:Skriv in ny kortposition (1...%s):Skriv in etiketter att lägga till:Skriv in vilka etiketter som skall tas bortFel vid exekvering av ‌%s.Fel vid körning av ‌%sExporteraExportera...ExtraF1Fält %d i fil är:FälthopparningFältFält för %sFält...Fil&terFil saknades.FiltreradFiltrerad kortlek %dSök &dubbletterSök dubbletterSök och &ersättSök och ersättFörsta kortetFörsta RepetitionenSidfotPrognosFramsidaFörhandsvisning för FramsidaMall för FramsidaAllmäntHämta deladBraHTML-redigerareSvårtHar du installerat LaTeX och dvipng?SidhuvudHjälpHistorikSammanställning per timmeTimmarTimmar med mindre än 30 repetitioner visas inte.Om du har bidragit men inte finns med på denna lista, kontakta oss.Om du skulle studera varje dagIgnorera svarstider längre änIgnorera skiftlägeHoppa över denna uppdateringImporteraImportera filImport misslyckades. ImportalternativFinns i mediafoldern men används inte av något kort:Inkludera schemaläggningsinformationInkludera etiketterÖkande intervallerIntervallerOgiltig kod.Ogiltigt reguljärt uttryck.Kursiv text (Ctrl+I)LagraLaTeXLaTeX-ekvationLaTeX math env.Sista kortetSenaste RepetitionGräns för inlärning i förvägUtsugarkortVänsterBegränsa tillLås kontot med ett lösenord eller lämna blankt:Längsta intervallMappa till %sPara ihop med etiketterMärkMärk anteckningMärktMognaMaximalt antal repetitioner/dagMinuterBlanda nya kort och repetitionerKortlek för Mnemosyne 2.0 (*.db)MerFlest försökFlytta kort till kortlek:NätverkNyaNya kortNya kort/dagNytt namn på kortlek:Nytt namn:Ny anteckningstyp:Namn på ny alternativgrupp:Ny position (1...%d):Nästa dag börjarInga tomma kortInga oanvända eller saknade filer hittades.AnteckningstypAnteckningstypObservera: En del av historiken saknas. För mer information, se dokumentationen för bläddraren.Anteckningar i Ren TextIngentingÄldsta sedda förstEndast nya kort kan positioneras omÖppnaAlternativAlternativgrupp:OrdningOrdnade efter tilläggsdatumOrdnade efter nästa repetitionLösenord:ProcentandelPlacera i slutet av kön med nya kortHa tålamod; det här kan ta ett tag.Öppna en profil först.Välj en kortlek.PositionInställningarBehandlar...Lösenord för profil...Profil:ProfilerSlumpmässigtSlumpa ordningRedo att uppgraderaSpela in ljud (F5)Spelar in...
Tid: %0.1fKom ihåg senaste inmatningTa bort etiketterTa bort formatering (Ctrl+R)Om det här kortet tas bort kommer en eller flera anteckningar också tas bort. Skapa en ny korttyp först.Byt namnByt namn på kortlekPositionera omPositionera om nya kortPositionera om...Schemalägg igenÅteruppta nuByt textriktning (RTL)RepeteraAntal RepetitionerRepetitionstidKorrekt besvarade repetitioner per timmeHögerSpara bildSökSök inom formatering (långsamt)Markera &allaLåt alla kortlekar under %s använda denna alternativgrupp?Ställ in för alla underkortlekarVälj förgrundsfärg (F7)Genväg: %sVisa svarVisa svarstimerVisa nya kort efter repetitionerVisa nya kort före repetitionerVisa nya kort i den ordning de lades tillVisa nya kort i slumpmässig ordningVisa ny repetitionstid ovanför svarsknapparnaVisa återstående antal kort under repetitionVisa statistik. Genväg: %sVissa inställningar blir aktiva först efter att du startat om Anki.SorteringsfältSortera efter detta fältDen här kolumnen går inte att sortera efter. Välj en annan.Ljud och bilderStatistikSteg (i minuter)Steg måste vara siffrorTa bort HTML vid inklistring av textPluggat %(a)s under %(b)s idag.Pluggat idagStudera kortlekStudera kortlek...Studera nuStilXML-export för Supermemo (*.xml)ÅsidosättÅsidosätt kortSynkronisera även ljud och bilderSynkronisera med AnkiWeb. Genväg: %sSynkroniserar media...Synkning misslyckades: %sSynkningen misslyckades; ej ansluten till Internet.Synkning kräver att klockan i din dator ställs om korrekt. Ställ om den och försök igen.Synkar...Tagga baraEtiketterTextText separerad med tabbar eller semikolon (*)Kortleken finns redan.Standardkortleken kan inte tas bort.Kortuppdelningen i din(a) kortlek(ar).Antalet frågor du besvarat.Antalet frågor att repetera i framtiden.Antalet gånger du tryckt på varje knapp.Tiden det tagit att besvara frågorna.Uppgraderingen har avslutats och du kan börja använda Anki 2.0.

Nedan följer en logg för uppdateringen:

%s

Det finns flera nya kort tillgängliga, men gränsen för antalet nya kort du får studera per dag är nådd. Du kan ändra detta i inställningarna för den här gruppen, men ha i åtanke att antalet repetitioner per dag kommer öka den närmsta tiden om du gör detta.Det måste finnas minst en profil.Denna fil finns redan. Är du säker på att du vill skriva över den?Den här guiden kommer hjälpa dig genom uppgraderingsprocessen för Anki 2.0. För en problemfri uppgradering, läs följande sidor noga. TidTidsgräns för tidsfönsterAtt repeteraFör att bläddra bland tilläggen, klicka på knappen nedan.

När du hittat ett tillägg du gillar, klistra in dess kod nedan.Gränsen för hur många kort du får repetera per dag är nådd, men det finns fortfarande kort att repetera. För optimal inlärning överväg att öka gränsen i inställningarna för den här gruppen.TotaltSammanlagd TidTotalt antal kortTotalt antal anteckningarBehandla inmatning som ett reguljärt uttryckTypSkriv svar: okänt fält %sUnderstruken text (Ctrl+U)Ångra %sOseddaUppgradering färdigUppgraderarUppgraderar kortlek %(a)s av %(b)s... %(c)sAnvänds på kort men saknas i mediamappen:Version %sVäntar på att redigeringen ska avslutas.VälkommenNär du är redo att uppgradera, klicka på knappen Commit för att fortsätta. Uppgraderingsguiden kommer öppnas i din webbläsare medan uppgraderingen pågår. Läs den noggrant då mycket har ändrats sedan den senaste versionen av Anki.När dina kortlekar är uppgraderade kommer Anki försöka kopiera eventuella ljud och bilder från de gamla lekarna. Om du använder en egen DropBox-mapp eller annan egen mapp kommer kanske inte uppgraderingsprocessen hitta dina media. Senare kommer en rapport från uppgraderingen visas. Om du märker att media som borde kopierats inte kopierades, läs uppgradersguiden för vidare instruktioner.

AnkiWeb stödjer nu direkt mediasynkning. Inga speciella inställningar krävs och media kommer synkroniseras tillsammans med dina kort när du synkar med AnkiWeb.Hela samlingenVill du hämta hem den nu?Skrivet av Damien Elmes, med patchar, översättning, uttestning och utformning av:

%(cont)sUngaUnga+NyaDina kortlekar[ingen kortlek]säkerhetskopioroch använd urvalsamlingddagarkortlekkortlekens livhjälptimmartimmar efter midnattförsökparades ihop med %sparade i hop med etiketterminminuterrepetitionersekunderw~anki-2.0.20+dfsg/locale/nb/0000755000175000017500000000000012256137063015113 5ustar andreasandreasanki-2.0.20+dfsg/locale/nb/LC_MESSAGES/0000755000175000017500000000000012065014111016662 5ustar andreasandreasanki-2.0.20+dfsg/locale/nb/LC_MESSAGES/anki.mo0000644000175000017500000004757712252567246020211 0ustar andreasandreas!$ ,@A HSZ"` 8"($K$p&""$? d0& !-(>g|,*, @N(_     -8P`o~0    "9=T,N({!fd z     e U! !5 "X?"Y"8" +# 7#B#F# a# k#u# ## #### ## # # #K#D$Y$^$V%R%w-&7& &w&Ea''''R'((#(#(( )>)(W)) )) )))))))) )******** + + +%+7+G+ M+3Y+S++++ +&,-,3,(Q, z,,,,,, ,,, ,, ,,,,,,-&- --7-:- V-d-k-t-- -- ---F- ..#.3.B. a.n..... . ....... . . .// 1/9&>T`>j>A ? b?n?v?? ?????? @ @'@0@?@ E@Q@ c@Qm@@@@A`]ByB28C kCrwCAC,D 1D=DTBDD %E%FElEEEE+E FF#F:FTF eFsFxF FFFFFGGGGGGG GG GG GH H6HMNHHHH H%HH(H*I ?I MIWI^IeIlI sIIIII IIIII(I,J /J 9JFJIJ bJnJsJzJJJJJ JJJJK ;KEK`KqKKKKKKK KKKLL L LL%L .L H} n8)j.=/R &1|2ZT\ qV"zrCw vFQ'{d$p  <t 4P6J?^ABK5  DLleg~Ym-+9!I*cu:(7G NE Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAnkiAnki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeBackupsBasicBrowseBrowse && Install...BrowserBrowser OptionsBuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.CardsCards TypesCards can't be manually moved into a filtered deck.Cards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Check the files in the media directoryCloseClose and lose current input?Configure interface language and optionsConnecting...CreatedCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZDeleteDelete TagsDialogDiscard fieldE&xitEaseEasyEditEnter tags to add:Enter tags to delete:ExportExport...F1Field %d of file is:Field mappingFieldsFil&tersFind and Re&place...Find and ReplaceFirst ReviewGoodHTML EditorHardHelpIf you have contributed and are not on this list, please get in touch.Ignore this updateImportImport failed. Import optionsInclude scheduling informationInclude tagsInvalid regular expression.KeepLapsesLeechLeftMap to %sMap to TagsMarkedMatureMoreNetworkNothingOpenPassword:PreferencesProcessing...Record audio (F5)Recording...
Time: %0.1fRescheduleReviewReviewsRightSearchSelect &AllShow AnswerShow new cards before reviewsShow new cards in order addedShow new cards in random orderSome settings will take effect after you restart Anki.Supermemo XML export (*.xml)SuspendSuspendedSyncing Media...TagsThis file exists. Are you sure you want to overwrite it?Total TimeTreat input as regular expressionUndo %sVersion %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYoungdayshidehourshours past midnightmapped to %smapped to Tagsminsminutesmosecondsstatsthis pagewwhole collectionProject-Id-Version: ankiqt 0.9.9.7.9 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-10-27 11:52+0000 Last-Translator: Lars Lem Language-Team: Norwegian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) X-Poedit-Country: Norway Language: no X-Poedit-Language: Norwegian Stopp (1 av %d) (av) (på) Den har %d kort. Den har %d kort.%% Riktig%(a)0.1f %(b)s/dag%(a)0.1fs(%(b)s)%(a)d av %(b)d notat oppdatert%(a)d av %(b)d notater oppdatert%(a)dkB opp, %(b)dkB ned%(tot)s %(unit)s%d kort%d kort%d kort slettet.%d kort slettet.%d kort eksportert.%d kort eksportert.%d kort importert.%d kort importert.%d kort studert på%d kort studert på%d kort/minutt%d kort/minutt%d kortstokk oppdatert.%d kortstokker oppdatert.%d gruppe%d grupper%d notat%d notater%d notat lagt inn.%d notater lagt inn.%d notat importert.%d notater importert.%d notat oppdatert.%d notater oppdatert.%d repetering%d repeteringer%d valgt%d valgt%s eksisterer allerede på skrivebordet ditt, overskrive det?%s-kopi%s dag%s dager%s dag%s dager%s slettet.%s time%s timer%s timer%s timer%s minutt%s minutter%s minutt.%s minutter.%s minutt%s minutter%s måned%s månedermåned%s måneder%s sekund%s sekunder%s second%s seconds%s som skal slettes:%s år%s år%s år%s år%s dag%s tim.%s min%smd.%s sek%s år&Om...&Tillegg&Skjekk databasen...&Råpugge...&Rediger&Eksporter…&Fil&Søk&Start&Guide&Manual...&Hjelp&Importer&Importer...&Invertere markering&Neste kort&Åpne Add-ons mappen...&Innstillinger...&Forrige kort&Endre plan...&Støtt Anki...&Bytt profil...&VerktøyA&ngre'%(row)s' hadde %(num1)d felt, forventet %(num2)d(%s korrekt)(slutt)(filtrert)(lært)(ny)(parent grense:%d)(velg 1 kort)....anki2 filer er ikke laget for å bli importert. Viss du forsøker å gjennopprette ifra sikkerhetskopi, se seksjonen om 'Backup' i brukermanualen/0d1 101 måned1 år10:0022:0003:0004:0016:00504 gateway timeout error received. Prøv å slå av antivirusprogrammet ditt mens du bruker Anki.%d kort%d kortÅpne folder for sikkerhetskopierBesøk websiden%(pct)d%% (%(x)s av %(y)s)%Y-%m-%d @ %H:%MBackups
Anki vil lage en backup av dine ting hver gang den lukkes eller synkroniseres.Eksportformat:Finn:Fontstørrelse:Font:I:Linjestørrelse:Erstatt med:SynkroniseringSynkronisering
Ikke aktivert; trykk på synk-knappen i hovedvinduet for å aktivere.

Konto nødvendig

En gratis konto er nødvendig for å synkronisere dine ting. Registrer deg for en konto, og skriv inn dine data under.En stor takk til alle som har bidratt med forslag, feilrapporteringer og donasjoner.Et korts vanskelighetsgrad er hvor lenge til neste visning når svaret ditt er "lett" under øving.En fil med navn collection.apkg ble lagret på skrivebordet ditt.Avbrutt: %sOm AnkiLegg tilLegg til (shortcut: ctrl+enter)Legg til feltLegg til mediaLegg til ny stokk (Ctrl+N)Legg til notattypeLegg til etiketterLegg til nytt kortLegg til:Legg til: %sLagt tilLagt til i dagIgjenGjenta idagAlle kortstokkeneAlle feltAlle kortene, notatene og media for denne profilen vil bli slettet. Er du sikker?Tillat Html i teksten.AnkiAnki 2 lagrer kortstokkene dine i et nytt format. Denne veiviseren vil automatisk konvertere dine stokker til dette formatet. Stokkene blir først sikkerhetskopiert, så hvis du vil gå tilbake til det gamle formatet, kan stokkene dine fortsatt brukes.Anki kunne ikke finne linja mellom spørsmål og svar. Prøv å forandre formen manuelt og bytte plasseringen av spørsmål og svar.Anki er et vennlig og intelligent intervallbasert læresystem. Det er gratis og med åpen kilde.Anki klarte ikke å laste din gamle config-fil. Velg Fil>Importer for å importere stokkene dine fra forrige Ankiversjon.AnkiWeb ID eller passord var ugyldig; prøv igjen.AnkiWeb ID:AnkiWeb opplevde en feil. Prøv igjen om noen minutter, og hvis det fortsatt er en feil, sender du en feilrapport.AnkiWeb er for øyeblikket opptatt. Prøv igjen om noen minutter.SvarSvarknapperSvarDitt antivirusprogram eller brannmuren hindrer Anki i å koble seg opp mot internettKort som ikke har koblinger, vil bli slettet. Hvis et notat ikke har kobling til noe kort, fjernes det. Er du sikker på at du vil fortsette?Ble funnet to steder i filen: %sEr du sikker på at du vil slette %s?Du må ha minst en korttype.Minst ett steg er nødvendig.Legg til bilder/lyd/video (F3)Lyd avspilles utomatiskAutomatisk synk når profilen åpnes/lukkesMiddelsGjennomsnittstidGjennomsnitlig svartidMiddels vanskelighetsgradSikkerhetskopierGrunnleggendeFinnFinne && installereNettleserAlternativer for nettleserGravleggGrunn til skjulingI utgangspunktet vil Anki oppdage tegnet mellom feltene, slik som tabulator, komma osv. If Anki ikke oppdager tegnet på riktig måte, kan du angi det her. Bruk /t for å angi tabulator.AvbrytKortKort %dKort %dKort 2Kort IDKort info (Ctrl+Shift+I)KortlisteKorttypeKorttyperKorttyper for %sFjernede kortKortKorttyperKortene kan ikke flyttes til en sortert stokk manuelt.Kortene vil bli flyttet tilbake til sine stokker etter at du har studert dem.Kort...SentrerEndreEndre %s til:Kontrollere filene i mediebiblioteketLukkLukk vinduet og mist ulagret inntasting?Tilpass Ankis språk og endre alternativerKobler til...OpprettetCtrl+FCtrl+NCtrl+PCtrl+QCtrl+Skift+FCtrl+ZSlettTa bort etiketterDialogForkast felt&AvsluttInnlæringsgradLettRedigerSkriv inn etiketter som skal legges til:Skriv inn hvilke etiketter som skal tas bortEksporterEksporter...F1Felt %d i fil er:FeltkoblingFeltFiltreSøk og &erstattSøk og erstattFørste repetisjonBraHTML-redigeringVanskeligHjelpVennligst ta kontakt dersom du har bidratt og ikke står på denne listen.Hopp over denne oppdateringenImportereKlarte ikke å importere. ImportalternativInkluder planlegginginformasjonInkluder etiketterUgyldig regular expression.BeholdFeilLeechVenstreKoble til %sKoble til etiketterMerketGamleMerNettverkIngentingÅpnePassord:InnstillingerBehandler...Spill inn lyd (F5)Opptak...
Tid: %0.1fLag ny planRepeterRepetisjonerHøyreSøkMarker &altVis svarVis nye kort før repetisjonerVis nye kort i den rekkefølgen de ble lagt tilVis nye kort i tilfeldig rekkefølgeVisse innstillinger blir aktive først etter at du har restartet Anki.Supermemo XML-eksportering (*.xml)DeaktiverDeaktivertSynkroniserer media...EtiketterDenne filen finnes allerede. Er du sikker på at du vil erstatte den?Total tidBehandle input som regular expressionAngre %sVersjon %sVil du laste det ned nå?Skrevet av Damien Elmes, med feilkorreksjoner, oversettelse, testing og utforming av:

%(cont)sUngdagerskjultimertimer etter midnattkoblet sammen med %skoblet sammen med etiketterminutterminuttermd.sekunderstatistikkdenne sidenuhele samlingenanki-2.0.20+dfsg/locale/ja/0000755000175000017500000000000012256137063015106 5ustar andreasandreasanki-2.0.20+dfsg/locale/ja/LC_MESSAGES/0000755000175000017500000000000012065014111016655 5ustar andreasandreasanki-2.0.20+dfsg/locale/ja/LC_MESSAGES/anki.mo0000644000175000017500000023626512252567246020176 0ustar andreasandreasV|5xGyG GGG"GG GGG8G%H>HOH"`H$H$H&HH"I6IIIZI$wI III0IJ#J&2J YJeJ(vJJJ,JJ* K6K,KK xKK(KKKKKKK KKKKL LLL%L)L 0L:L@L HLSL eLpLLLLLLLL0L M%M +M 6MAMGMZMqMuMNNN NNN N%N)N-NT1NNN,N(NN!O5OfMOO OO O OPP#P8PeOPP7_Q QQ5QXQYCR8RkR BS NSYS]S xS SS S SS SSSS S$ST T+T ;T ET%PTKvTTNT"&UIU#`VVVV WWEXWXRXv.YwY7Z UZwaZEZ@[`[g[v[R~[[T\#o\#\\ \\(]9] A]N] b]o]]] ] ]]]]]^^^/^L7^^^^^^^ ^ ^)_'+_S_```#`*`1`9` R` \` f`q` ```` `3``S a`aiapa wa aaaaa"abb&b EbQb Xbdb ub bbbbbb-bc cc(-cVc5hc ccc8c5cP)d7zddd dddde ee$e+e2e9e@eGeNeUe\ece je we e e e e e eeee e eff $f1f DfQffffffff f f ff f/ g=gCgXg%`gg g g g g g g g gg,h(4h]h{h hFhNhP0i>iPijj]8j j8jj jjk)kDk`kdk skkkk k kkk k kkkk k!kl#l)2l0\lll4l!llm'm=mVmjm{m mmmmmmmmm m mmm mm nn, nMn_nfnnnwnnnnnn n nnN oXoloqooooEpNpSpnppp ppppp ppp qq$qBqIq Nq[qcqhqyq.qFqqr .r4:rorr r1rrrrs*sEs tt uu"=u"`u uuuuuuu u v v)5v_vqvvw(w=w[wzwwwww w wwww<w+x4x :xGxWx\x ex+pxxx xxx x xx x yy#y*y;yOyUyfynyyy y yyyy yy zzz z&zU!Fw*(1D,I/y'it#de{8ؖC(r &au /M Û!ϛ'<C[`h}.&ڜ &+=,U U $86o(Js"WS0S$"̢ Ң ޢ{e^f5ŤU Zdlr  èȨͨӨ%(08 >HJ[]/ 8 B L.V7$&*9-d-֬*&*9-d*֭N 5 BLb ~ Į ڮ +5K R\ cmt{&˯   +:IXj|& Ͱٰ #&JYlk ر  ,2_c*,/4<AGMSY_ $=E,!Ҵmĵ۵ +9ͶQ"aK͸RN oz-ں! .:J c nyI  3?L!063ٿ޿]Xk`~q/mhS qhZat-1313e,?" )6I_ r'*:V<f$" 0=P6c3  $%JZm)! K'*sN %8'T|H 6Sf!m* 0  9QD 39B/ r 43z^t1$+Pfm t  $ 1>ELSZl|!*%A Z9d  E >H^f'0FBw]90R =FU=hR;`KF ,) VGw2'! = IS$Z* '  %A; } 5[&&MT=4EM00 .57:=@C6F} W00 )9Qah~1U"9*@ k yt {1$+BTmt 8 !7:>ry3$9N^' Q%P8v$RC\$r-*-*1\r'y!CWA*:&aw}U! w! o`s '* R\cs -  &9!Xz 4!3Uq(0 H=<T 4 >K^7q!!}*%?P'<9M 6DTj -B$U z; !!<?$|L,y//03`:'H$@Jenb3*0 0!=_s$   0 0:Pe' '!0%$V2{N5H/a)$ ? [ 8b     B    2 J g    U 'M u  * &4 [  u   ! 6 6*83c<6A  McXDKM9f]  )?FN9m22 )0I e3r# (/BU\@{"TP 8QXt B*9-@n7 :B!}*Z"%aH6/f'$O~;5  6hDxEf!!Z"1"##x$$$$$Z%%a&'''g( n({(($((/(9 )C)S) c)p)!))T)@*A*$]**F**#+U$+z++-+l+ 7,<D,K,E,#.71$P1u1x2M}22*233/3B3 45r6f#782;G;Z;!j;;;;; ; ;; ;;; ;<< 2<S<W<^<e<{<<<<<< 7.^(}'Z)2 q+UTD4`CV=X9 J :d=k"Jb#$+Wo!VS,~Sn~n&B+PQ>yF1ElY  ;ht~`r6l,"YFWB`O [a)88 !dgM/z U:3Z0I f=_])LL *\h_xK<Y\Dw>V;/Fv.OzfeRQUo|EeX&p1-B+84yvWE&<G t %p:.CH3OK|*ti?/R$9zP$80'j^g 'p!H6Zm  G;]d(_G>eCo3%x MrP yF\0jTI'@{I3cN7{xq1#j?IH4ND"N*uv6HwBJw75%5AAu9]D;L<*K:m k{)@^(EO$VSs%}il gA4-?C[?a[KiNLu!b|bT"TRksJ(QM0fc=9,52&675hqSnm#-a.XR/c1G2}>2#AQ  sU-@<r,PM@  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaCompress backups (slower)Configure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: Anki Japanese Translation v0.2 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-12-09 06:40+0000 Last-Translator: luminousspice Language-Team: Jarvik7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: ja_JP 停止 (1 / %d) (無効) (有効) %d 枚のカードが含まれています。%% 正解%(a)0.1f %(b)s/日%(a)0.1f 秒 (%(b)s)%(b)d 件中 %(a)d 件のノートを更新しました%(a)dkB アップ, %(b)dkB ダウン%(tot)s %(unit)s%d 枚のカード%d 枚のカードを削除しました。%d 枚のカードを書き出しました。%d 枚のカードを読み込みました。%d 枚のカードをカード %d 枚/分%d 個の単語帳を更新しました。%d グループ%d 個のノート%d 個のノートを追加しました。%d 個のノートを読み込みました。%d 個のノートを更新しました。%d 枚の復習カード%d 枚を選択%s は既にデスクトップ上に存在します。上書きしますか。%s コピー%s 日間%s 日間%s を削除しました。%s 時間%s 時間%s 分間%s 分学習しました。%s 分間%s か月%s か月%s 秒%s 秒%s を削除します:%s 年間%s 年間%s 日%s 時間%s 分%s か月%s 秒%s 年Anki について (&A)アドオン (&A)データベースをチェック (&C)詰め込み学習 (&C)編集 (&E)書き出す (&E)ファイル (&F)検索 (&F)移動 (&G)ガイド (&G)ガイド (&G)ヘルプ (&H)読み込む (&I)読み込む (&I)選択を反転 (&I)次のカード (&N)アドオンフォルダを開く (&O)設定 (&P)前のカード (&P)スケジュールを変更 (&R)Anki への支援 (&S)プロファイルを変える (&S)ツール (&T)元に戻す (&U)「%(row)s」には %(num1)d 個のフィールドがありました。予想では %(num2)d 個でした。(%s 正解)(終了)(フィルター)(学習中)(新規)(元の最大出題数は %d)(カードを一枚選択してください)....anki2 ファイルは読み込み用に設計していません。バックアップの復元をしたい場合は、ユーザーマニュアルの 'Backups' の項目を参照してください。/0d1 101か月1年10:0022:0003:0004:0016:00504 Gateway timeout エラーを受け取りました。お使いになっているアンチウィルスソフトを一時的に使用停止してから試してください。:%d 枚のカードバックアップフォルダを開くホームページを閲覧%(pct)d%% (%(x)s / %(y)s)%Y-%m-%d @ %H:%Mバックアップ
Anki はコレクションは閉じた時と同期した時にバックアップを作成します。ファイルの形式検索文字列フォントサイズフォント対象:対象:行のサイズ:置換文字列同期同期
現在有効になっていません。有効にするにはメインウィンドウの同期ボタンを押してください。

アカウントが必要です

コレクションを同期するには無料のアカウントが必要です。登録 して、下の項目を入力して下さい。

Anki アップデート

Anki %s がリリースされました。

<無視されています><ここに入力すると検索します; enter を押すと現在の単語帳を表示します>提案、バグ報告、寄付を下さった方々に感謝致します。カードの易しさとは、復習で [普通] を選んだ時に設定する次回の復習間隔の相対値です。collection.apkg というファイルをデスクトップに保存しました。メディアの同期中に問題が発生しました。この問題を修正するには、[ツール] から [データベースをチェック] を実行してから、再度同期してください。中断: %sAnki について追加追加(ショートカット: ctrl+enter)フィールドを追加メディアを追加単語帳を新規追加 (Ctrl+N)ノートタイプを追加Add Reverseタグを追加カードを新規追加追加先:追加: %s追加今日追加したカード最初のフィールドが重複したノートを追加しました: %sもう一回今日間違えたカード忘却回数: %s全ての単語帳全てのフィールド全てのカードを無作為に選択 (詰め込みモード)このプロファイルのカードやノート、画像や音声など、全ては削除されます。よろしいですか?フィールドに HTML を使うアドオンの中でエラーが発生しました。
次のアドオンフォーラムに記事を投稿してください:
%s
%s を開いた時にエラーが発生しました。エラーが発生しました。
無害なバグが原因か、お使いになっている単語帳に問題があるのかもしれません。

単語帳に問題がないことを確かめるには、 [ツール] > [データベースをチェック] を実行してください。

それでも、問題が解消しない場合は、
下記の内容をコピーしてバグレポートしてください:画像をデスクトップに保存しました。AnkiAnki 1.2 単語帳 (*.anki)Anki 2 は単語帳を新しい形式で保存します。このウィザードは自動的に単語帳を新しい形式に変換します。アップグレードの前に単語帳はバックアップしますので、前のバージョンの Anki に戻す必要がある場合でも、自分の単語帳を使い続けることができます。Anki 2.0 単語帳Anki 2.0 は、Anki 1.2 からの自動アップグレードのみをサポートしています。古い単語帳を読み込むには、一旦 Anki 1.2 で開いてアップグレードしてから、Anki 2.0 に読み込んでください。Anki 単語帳パッケージAnki は質問と答えの間に罫線を見つけられませんでした。質問と答えを切り替えるには、テンプレートを手動で調整してください。Anki は、誰でも使える知的な分散学習システムです。しかも無料でオープンソース。Anki は、AGPL3 ライセンスの下で使用許諾しています。更に詳しい情報をご覧になりたい方は、配布ソースコードの中の LICENSE ファイルをご覧ください。Anki は古い設定ファイルを読み込めませんでした。以前のバージョンの Anki から単語帳を読み込むには、メニューバーの [ファイル] から [読み込む] を選択してください。AnkiWeb の ID 又は パスワード が間違っています。もう一度入力してください。AnkiWeb ID:AnkiWeb にエラーが発生しました。しばらくしてからもう一度実行してください。エラーが続く場合はバグレポートを送信してください。AnkiWeb は現在非常に混雑しています。しばらくしてからもう一度実行してください。AnkiWeb はメンテナンス中です。しばらくしてからもう一度実行してください。解答答えたボタン答えた回数アンチウィルスソフトまたはファイアウォールソフトが原因で、Anki がインターネットに接続できません。Nothing に設定したカードは削除されます。ノートにカードが残っていない場合は、そのノートが失われます。それでも処理を続行しますか。%s は二回ファイルに出てきました本当に %s を削除してもよいですか?最低一つのカードタイプが必要です。最低でも一つのステップが必要です。画像/音声/ビデオ を添付する (F3)音声を自動再生するプロファイルを開閉する際に自動的に同期する平均平均時間平均所要時間易しさの平均値学習日の平均平均間隔Back裏面のプレビュー裏面のテンプレートバックアップ基本基本 (裏面カード付き)基本 (裏面カードを任意選択)太字 (Ctrl+B)ブラウザー検索とインストールブラウザーブラウザー(%(cur)d 枚のカード表示;%(sel)s)ブラウザーの表示設定ブラウザーオプション作成タグを一括追加 (Ctrl+Shift+T)タグを一括削除 (Ctrl+Alt+T)延期するカードを延期ノートを延期関連する新規カードを翌日まで延期する関連カードの復習を翌日まで延期する既定では、Anki はフィールドを区切るタブやカンマなどの文字を認識します。 もし Anki がこのような文字をうまく識別できないときは、ここで入力してください。 タブを使う時は \t と入力します。キャンセルカードカード %dカード 1カード 2カード IDカードの情報(Ctrl+Shift+I)カード一覧カードタイプカードタイプノート「%s」が使用するカードカードを延期しました。カードを保留しました無駄なカードでした。カードカードの種類手動ではカードをフィルター単語帳に移動できません。テキストファイル形式のカードカードは復習が済んだら元の単語帳に自動的に戻ります。カード...中央揃え変更%s を以下に変更:単語帳を変更ノートタイプを変更ノートタイプを変更(Ctrl+N)ノートタイプを変更...色を塗る (F8)カード追加の時、ノートタイプによって単語帳を選択変更日メディアをチェックメディアフォルダにあるファイルを検査チェック中...選択単語帳を選択して下さいノートタイプを選択して下さいタグを選択クローン: %s閉じる閉じて現在の入力を破棄しますか。穴埋め穴埋め (Ctrl+Shift+C)コード:コレクションが壊れています。マニュアルをご覧ください。コロンコンマ圧縮バックアップ (時間が掛かります)インターフェイス言語とオプションを設定パスワード確認:おめでとう!この単語帳の学習は終わりました。接続中...継続コピー熟知なカードの正解: %(a)d/%(b)d (%(c).1f%%)正解: %(pct)0.2f%%
(%(good)d / %(tot)d)AnkiWeb に接続できません。ネットワーク接続を確認してから、もう一度実行してください。録音できません。lame と sox がインストール済みか確認してください。ファイル %s を保存できませんでした詰め込み学習単語帳を作成フィルター単語帳を作成...カードの登録日Ctrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+Z合計合計時間 [%s]合計解答数カードの合計枚数現在の単語帳現在のノートタイプ:カスタム学習カスタム学習セッションカスタム学習ステップ(分間)カードの設定 (Ctrl+L)フィールドの設定カットデータベースを再構築し最適化しました。日付学習日数認証解除デバッグコンソール単語帳単語帳を指定プロファイルを開いた時に単語帳を読み込みます。単語帳間隔が大きい順Default次に復習する予定削除%s を削除しますか?カードを削除する単語帳を削除白紙を削除するノートを削除ノートを削除するタグを削除未使用のファイルを削除する%s からフィールドを削除しますか?カードタイプ '%(a)s'とその %(b)s を削除しますか。このノートタイプとその全てのカードを削除してもよろしいですか?この未使用ノートタイプを削除しますか。未使用のメディアを削除しますか。削除...ノートがない %d 枚のカードを削除しました。テンプレートがない %d 枚のカードを削除しました。ノートタイプを設定していない %d 個のノートを削除しました。カードがない %d 個のノートを削除しました。間違ったフィールド数を持つ %d 個のノートを削除しました。削除しました。削除しました。Anki を再起動してください。この単語帳を削除すると、残りのカードは全て元の単語帳へ戻します。説明学習画面に表示する説明 (現在選択中の単語帳のみ):ダイアログフィールドを取り消すダウンロードは失敗しました:%sAnkiWeb からダウンロードダウンロードできました。Anki を再起動して下さい。AnkiWeb からダウンロードしています...期日復習期日に達したカードのみ明日が期日のカード終了 (&X)易しさ簡単簡単と答えた時のボーナス簡単と答えた時に設定する間隔編集%s を編集現在のカードを編集HTML を編集編集してカスタマイズする。編集...編集日フォントを編集編集を保存しました。Anki を再起動して下さい。空にする白紙...白紙カードの数: %(c)s フィールド: %(f)s 白紙が見つかりました。[ツール] から [白紙] を実行してください。最初のフィールドが空白:%s終了新規の %s 枚のカードを追加する単語帳を入力してください。空白のままにしておくこともできます。新規カードの位置を入力してください (1...%s):タグを追加する:タグを削除する:%s をダウンロードした時にエラーが発生しました。起動中にエラーが発生しました: %s%s 実行中にエラーが発生しました。%s を実行中にエラー書き出す書き出す...追加FF1F3F5F7F8ファイルの%d番目のフィールドは:フィールドの割り当てフィールド名:フィールド:フィールド%s のフィールド%sで区切ったフィールドフィールド...フィルター (&T)ファイルが壊れています。バックアップから復元してください。ファイルが見つかりませんでした。フィルターフィルター:フィルターフィルター単語帳の %d重複を検索する (&D)...重複を検索検索と置換 (&P)…検索と置換終了最初のカードへ最初の復習最初のフィールドが一致しました: %s無効なプロパティを持っている %d 枚のカードを修正しました。修正したノートタイプ: %s反転使用済みのフォルダー名です。フォント:フッターセキュリティ上の理由から'%s' をカードに使用できません。使用するには、別のパッケージにこの命令を配置して、代わりの LaTeX ヘッダを持たせたパッケージで読み込みます。予測フォーム表面と任意選択の裏面表面と裏面%(b)s の中に %(a)s が見つかりました。Front表面のプレビュー表面のテンプレート一般生成ファイル: %s作成日時: %s共有単語帳を取得普通学習後に設定する間隔HTML エディタ難しいlatex と dvipng はインストール済みですか。ヘッダーヘルプ易しさの最大値履歴Home時間ごとの分析時間復習が 30 件以下の時間帯は表示しません。貢献して頂いたのに名前がこの一覧に記載されていない方は、どうぞご連絡下さい。毎日学習した場合統計情報に利用する解答時間の最大値大文字小文字を区別しない最初のフィールドが既存のノートと一致する行は無視するこのアップデートを無視する読み込むファイルを読み込む最初のフィールドが既存のノートと同じであっても読み込む読み込みは失敗しました。 読み込みを失敗しました。デバッグ情報: 読み込みオプション読み込みが完了しました。カードに未使用で、メディアフォルダーに存在するファイル:デバイス間で移動したコレクションが正しく動作するために、コンピュータの内蔵時計を正確に設定する必要があります。お使いになっているシステムが現地時間を正しく表示している場合でも、内蔵時計が間違っていることがあります。 お使いになっているコンピュータの時刻設定で次の項目を確認してください。 - 午前/午後 - 時刻同期 - 年月日 - 時間帯 - 夏時間 正確な時刻からのずれ: %s 秒メディアを同梱スケジュール情報を含めるタグを含める今日の新規カードの上限を上げる今日の新規カードの上限に追加今日の復習カードの上限を上げる今日の復習カードの上限に追加間隔が小さい順情報アドオンをインストールするインターフェースの言語間隔間隔の調整間隔コードが不正です。無効なエンコードです。名前を変更してください:ファイルが壊れています。バックアップから復元してください。パスワードが間違っています。カードに無効なプロパティを設定しています。[ツール] から [データベースをチェック] を実行してください。それでもこの問題が解決しない場合は、サポートサイトでご質問ください。無効な正規表現。保留しました。イタリック (Ctrl+I)JS エラー 行 %(a)d: %(b)sCtrl+Shift+T でタグフィールドに移動します。保存ファイル数LaTeXLaTeX インライン数式LaTeX ディスプレイ数式忘却最後のカードへ直近の復習追加時期が新しい順学習先取り学習の限度学習: %(a)s枚、復習: %(b)s枚、再学習: %(c)s枚、フィルター: %(d)s枚学習中無駄無駄なカードの処理無駄なカードになる回数左寄せ最大枚数読み込み中...パスワードでアカウントをロックします。空白のままにしておくこともできます。間隔の最大値対象フィールド:易しさの最小値ノートタイプの管理ノートタイプを管理...%s に割り当てるタグに割り当てるマークノートをマークノートをマークする(Ctrl+K)マーク熟知間隔の上限一日あたりの復習上限メディア間隔の下限分間新規カードと学習カードを混ぜるMnemosyne 2.0 単語帳 (*.db)もっと忘却回数が多い順カードを移動単語帳を変える (Ctrl+D)カードを単語帳に移動:ノート (&O)使用済みの名前です。単語帳名:名前:ネットワーク新規新規カード単語帳に入っている新規カード: %s 枚新規カードのみ一日の新規カードの上限新しい単語帳の名前新しい間隔新しい名前:変更先ノートタイプ:新しいオプショングループ名:新しい位置 (1...%d):一日の開始: 午前期日に達したカードはありません。指定した条件に一致するカードはありませんでした。白紙はありません。今日は熟知なカードを学習しませんでした。未使用のファイル、行方不明のファイルはありませんでした。ノートノート IDノートタイプノートタイプノートと %d 枚のカードを削除しました。ノートを延期しました。ノートを保留しました。注意: メディア(画像/音声/ビデオ)はバックアップしてません。安全のために Anki フォルダーを定期的にバックアップしてください。注意: いくつかの履歴が消失しています。詳しい情報はユーザーマニュアルをご覧ください。テキストファイル形式のノートノートには最低一つのフィールドが必要です。ノートにタグを付けました。NothingOK初回表示が古い順次回の同期は、一方向に変更を強制実行するカードが生成されないため、ノートを読み込みませんでした。これは、フィールドが空欄の時、あるいはテキストファイルの内容が正しい項目に関連付けられていない時に発生します。新規カードだけが表示順を変更できます。AnkiWeb に接続できるのは、一度に一つのクライアントだけです。前回の同期に失敗している場合は、しばらくしてからもう一度実行してください。開く最適化しています...追加条件:オプション%s のオプションオプショングループオプション...順番追加した順番復習期日が古い順解答のテンプレート:フォント:質問のテンプレート:Anki 単語帳パッケージ (*.apkg *.zip)パスワード:パスワードが一致しません貼り付けクリップボード画像を PNG 形式で貼り付けるPauker 1.8 Lesson (*.pau.gz)パーセント期間: %s新規カードの最後に設定次の期間内に復習を設定まず別のノートタイプを追加してください。しばらくお待ちください。マイクを接続して、他のプログラムがオーディオデバイスを使用していないことを確認してください。このノートを編集して、穴埋めを追加してください。(%s)プロファイルが開いていて、Anki は処理中でないことを確認してから、もう一度実行してください。PyAudio をインストールしてくださいmplayer をインストールしてくださいまずプロファイルを開いてください。[ツール] から [白紙] を実行してください。単語帳を選択してください。一つのノートタイプからカードを選択してください。何かを選択してください。Anki に最新バージョンにアップグレードしてください。このファイルを読み込むには、 [ファイル] から [読み込む] を実行してください。AnkiWeb で単語帳をアップグレードしてから、もう一度実行してください。位置設定プレビュー選択したカードをプレビューする (%s)新規のカードをプレビューする最新の追加カードをプレビューする処理中...プロファイルパスワードプロファイル:プロファイルプロキシ認証が必要です。質問最後: %d先頭: %d終了無作為ランダムに並べ替える評価アップグレードの準備ができました再構築自分の声を録音録音する(F5)記録中...
時間: %0.1f期日超過が相対的に大きい順再学習追加の際に直前の入力を残すタグを削除書式設定を外す(Ctrl+R)このカードタイプを削除すると、一つ以上のノートも削除することになります。まずは新しいカードタイプを追加してください。名前を変更単語帳名を変更オーディオを再生自分の声を再生並び替える新規カードの表示順番を並び替える新規カードを並び替える...次のタグの中から1つ以上を指定する:スケジュール変更次の解答時刻を再計算この単語帳の解答に基づいてカードをスケジュールし直す学習し続ける右から左入力 (RTL)「%s」より前の状態に戻りました。復習復習した回数学習した時間先取りして復習する先取りする日数忘れたカードを復習する: 過去忘却したカードを復習する時間帯ごとの正解率復習単語帳内の復習期日に達したカード: %s 枚右寄せ画像として保存範囲: %s検索書式済みの内容の中まで検索 (速度が低下します)選択枚数全てを選択 (&A)ノートを選択 (&N)除外するタグの選択:選択したファイルは UTF-8 形式ではありません。マニュアルの Importing (読み込み) に関する項目をご覧ください。選択学習セミコロンサーバーが見つかりませんでした。接続が中断しているか、アンチウィルスソフトまたはファイアウォールソフトが Anki のインターネット接続を遮断しています。下の単語帳 %s を全部このオプショングループに設定しますか。全てのサブ単語帳に設定する文字色 (F7)シフトキーを押したまま起動しましたので、自動的な同期とアドオンの読み込みを省略しました。既存のカードの順序を移動するショートカットキーは「%s」ショートカット: %s%s を表示解答を表示重複を表示する解答タイマーを表示する復習カードの後に新規カードを学習する復習カードの前に新規カードを学習する新規カードを追加順に表示する新規カードを無作為に選んで表示する次回の復習時期を解答ボタンの上に表示する復習の際にカードの残り枚数を表示するグラフを表示する。ショートカットキーは「%s」サイズ:以後のセッションに先送りした関連カードや延期したカードがあります。Anki を再起動した後に有効になる設定があります。ノートタイプを変更したため無視した更新があります。ソートフィールドこのフィールドでブラウザーを並び替えるこの列で並び替えることはできません。別の列を選択してください。音声と画像スペース開始位置:易しさの初期値統計間隔:学習ステップ(分間)学習ステップは数字で指定してください。HTML を外してテキストをペーストする今日は %(a)s を%(b)s で学習しました。今日学習したカード学習単語帳を学習する単語帳を学習する...学習するカードの状態やタグを選んで学習する書式書式 (カード間で共有)下付き文字 (Ctrl+=)Supermemo 用の XML 形式 (*.xml)上付き文字 (Ctrl+Shift+=)保留カードを保留ノートを保留保留音声と画像も同期するAnkiWeb と同期する。ショートカットキーは「%s」メディアを同期中...同期できませんでした: %s同期できませんでした。インターネットに接続していません。同期するにはお使いのコンピュータの時計を正しく設定する必要があります。時計を正しく設定してから、もう一度実行してください。同期中...タブ重複にタグを付けるタグを付けるだけタグ対象単語帳(Crtl+D)対象フィールド:テキストテキスト(タブ区切りまたはセミコロン区切り) (*)その単語帳は既に存在します。そのフィールド名は既に使用しています。その名前は既に使用しています。AnkiWeb への接続がタイムアウトしました。お使いのネットワーク接続を確認してから、もう一度実行してください。既定の設定「Default」は削除できません。既定の単語帳「default」は削除できません。単語帳内のカードの内訳最初のフィールドが空欄です。ノートタイプの最初のフィールドは割り当てなくてはなりません。次の文字は使えません: %sこのカードの表面が空です。[ツール] から [白紙] を実行してください。アイコンは様々なソースから取得しました。著作権表示については Anki のソースをご覧ください。追加するカードは全て白紙になります。質問に答えた回数復習期日が来るカードの枚数各ボタンを押した回数お使いになっているシステムの temp フォルダ (一時フォルダ) のパーミッションが間違っています。Ankiは自動的に訂正できません。更に詳しい情報をご覧になるには、Anki マニュアルを 'temp folder' で検索してください。指定したファイルは正当な .apkg ファイルではありません。指定した検索項目は、どのカードにも一致しませんでした。検索項目を変えてみてください。要求した変更を行うには、次回のコレクションの同期の際にデータベースの完全なアップロードが必要です。他の端末で復習やその他の変更を行ってまだ同期が済んでいない場合、これらの変更は失われます。処理を続けますか。解答にかかった時間アップグレードが完了しました。Anki 2.0をお使いいただけます。

更新ログは次の通りです:

%s

新規カードはまだ残ってますが、今日の最大出題数に達しました。 最大出題数を増やすこともできますが、更にカードを追加すると それだけ短期的に復習の負荷が掛かることに注意してください。最低限一つのプロファイルが必要です。この列は並び替えできませんが、カードタイプで絞り込めます。例 'card:Card 1'この列で並び替えることはできませんが、左側のパネルから単語帳を一つ選択するとその単語帳で絞り込むことができます。このファイルは、正当な .apkg ファイルではないようです。このエラーが AnkiWeb からダウンロードしたファイルで発生した場合、ダウンロードが失敗した可能性があります。再度ダウンロードしても、この問題が続くようであれば、別のブラウザーからもう一度実行してください。このファイルは既に存在します。上書きしますか。このフォルダーは、全ての Anki データを保存する唯一の場所です。これによってバックアップが簡単になります。別の場所を設定するには次の情報をご覧ください: %s これは標準のスケジュールから外れて学習する特別な単語帳です。これは {{c1::sample}} 穴埋め問題です。この処理は、既存のコレクションを削除したり、読み込みファイルのデータで置換したりします。実行しますか。このウィザードは、Anki 2.0 へのアップグレード手順をご案内します。 円滑なアップグレードのために、続くページを注意してお読みください。 時間タイムボックスの制限時間復習下の [ブラウザー] ボタンを押すと、アドオンの一覧を表示します。

気に入ったアドオンのコードを下に入力してください。パスワードで保護されたプロファイルに読み込むには、読み込みの前にプロファイルを開いてください。既存の単語帳に穴埋め問題を作るには、まずノートタイプを穴埋め (cloze) に変更する必要があります。[編集] から [ノートタイプを変更] を選択します。今すぐ表示するには、下にある [延期を解除] ボタンを押してください。標準のスケジュールから外れて学習するには、下の [カスタム学習] ボタンを押してください。今日復習カードはまだ残ってますが、今日の出題上限に達しました。 適正な記憶力に見合った、一日の制限値まで引き上げることを検討してください。合計合計時間カードの合計枚数ノートの合計枚数入力条件に正規表現を使う種類解答キー入力: 不明なフィールド %s読み込み専用ファイルは読み込めません。延期を解除下線 (Ctrl+U)元に戻す元に戻す - %sファイルの種類が不明。新規最初のフィールドが一致した場合、既存のノートを更新する。%(b)d 件中 %(a)d 件の既存のノートを更新しましたアップグレード完了アップグレードウィザードアップグレード中%(b)s 個の中から %(a)s 個目をアップグレード中... %(c)sAnkiWeb にアップロードAnkiWeb にアップロード中...カードに使用中で、メディアフォルダーに存在しないファイル:ユーザー 1バージョン %s編集が終わるのを待っています。注意: 穴埋め問題は上部にある種類の設定を穴埋め(Cloze)するまで機能しません。ようこそカード追加の時、現在の単語帳を既定にする解答を表示する時に、質問と解答の音声を両方再生するアップグレードをする場合には、 commit ボタンを押して続行してください。 アップグレード処理の間に、ブラウザーにアップグレード ガイドが表示されます。 Anki は前のバージョンから多く変更点がありますので、注意してお読みください。単語帳をアップグレードする際に、Anki は古い単語帳から音声データや画像データをコピーします。カスタムの DropBox フォルダーやメディア フォルダーをお使いの場合には、アップグレード処理でメディアファイルを見つけられない場合があります。後ほどアップグレードの報告が表示されます。必要なメディア ファイルがコピーされていないことに気づいた時には、アップグレード ガイドをご覧ください。詳しい手続をご紹介しています。

AnkiWeb ではメディア ファイルの直接同期に現在対応しています。特別な設定をしなくても、カードと一緒にメディア ファイルを AnkiWeb へ同期します。コレクション全体今ダウンロードしますか?Damien Elmes が作成しました。パッチ、翻訳、テスト、デザインで次の方々から貢献いただきました:

%(cont)s穴埋め問題のノートタイプがありますが、穴埋め問題を作っていません。続行しますか。たくさんの単語帳があります。%(a)s をご覧ください。%(b)sまだ録音してません。最低でも一つの列は必要です。未熟未熟+学習中自分の単語帳この変更は複数の単語帳に影響が及びます。現在の単語帳のみに変更を加えたい時には、まず最初にオプショングループを新規追加してください。お使いになっているコレクションは、壊れているようです。Anki を開いている時にコレクションファイルをコピーしたり、移動したりした場合や、ネットワークやクラウドドライブにコレクションファイルを保存している場合に発生することがあります。自動バックアップ (automatic backup) から復元する方法はマニュアルで説明しておりますのでご覧ください。お使いになっているコレクションは一貫性が失われています。[ツール] から [データベースをチェック] を実行してから、再度同期してください。お使いになっているコレクションかメディアファイルが大きすぎて同期できません。コレクションを AnkiWeb にアップロードしました。 他のデバイスを使っている場合は、直ちにそのデバイスで同期して、このコンピュータからアップロードしたコレクションをダウンロードしてください。この処理の後は、復習やカードの追加は自動的に統合します。この単語帳は AnkiWeb 上の単語帳との違いが大きくなり、統合できなくなりました。どちらか一方で残りを上書きする必要があります。 ダウンロードを選択すると、AnkiWeb からコレクションをダウンロードします。前回の同期以降にこのコンピュータ上で行った変更は失われます。 アップロードを選択すると、AnkiWeb にコレクションをアップロードします。前回の同期以降に AnkiWeb 上や他のデバイスで行った変更は失われます。 全てのデバイスで同期した後は、復習やカードの追加は自動的に統合します。[単語帳未決定]バックアップ枚のカード選択中の単語帳から取得枚。出題方法:コレクション日日単語帳全期間重複ヘルプ隠す時間時(4 なら 04:00に設定)回%s に割り当てるタグ に割り当てる分分間か月枚の復習カード秒統計このページ週コレクション全体~anki-2.0.20+dfsg/locale/ru/0000755000175000017500000000000012256137063015142 5ustar andreasandreasanki-2.0.20+dfsg/locale/ru/LC_MESSAGES/0000755000175000017500000000000012065014111016711 5ustar andreasandreasanki-2.0.20+dfsg/locale/ru/LC_MESSAGES/anki.mo0000644000175000017500000021600312252567246020216 0ustar andreasandreas|/P?Q? X?c?j?"p?? ??8??@@"&@$I@$n@&@@"@@A A$=A bAAA0AAA&A B+B(CLC(]CCCCCCC CCCCC CCCCC CDD DD +D6DND^DmD|DDDD0D DD D DE E E7E;EEEEEEEEEEETELFNF,dF(FF!FFfGzG GG G GGGGGeH{H7%I ]IgI5zIXIY J8cJ J JJJ J JJ J KK K,K4K_P\___]_ 2`8>`w` ~```)``` a aaa a (a6a;a Ca PaZalata {a!aaa)a0ab0b44b!ibbbbbbbc ccc!c$c'c*c-c0c Lc Zcfcmc tcc cc,cccccdd)d9dNd _d jdwd|ddddddddd d ee e3e CeNeSe gese$xeee eeeee.eF fPfif f4fff f1f"g2gRgag*ug gg gg"g"h @hahvh{hhhh h h)hh i)i@iUisiiiiii i iii<i1j:j@jEj Nj+Yjjj jjj j jj jjk kk$k8k>kOkWkqkk kkkk kkkkk kll (l6l El Rl\lklll+ll!l m m m<%m bmom]mam?n!Snun}nn#nn nnnnn n o oo1o7oUo ro }oo,o#o)oV"p8ypppppq-,q+Zq8qq q qqqqrr "r0r5rErLr]rervrrrr rrir]s ds ps}s s s"s s ssst t t t't.t 5t AtOtVgtt tt[upu uuu uuuuv.vLv*kv'v!vv6v w!(w?Jwwww w wwwwwx 4xBx Hx Sx axkxsxxxx x x x x* y6yGy!Zyd|y yyyyy z!z(&zOz izzXz+z"*{&M{t{U{*{(|18|Ij|'|t|#Q}8u}C}(}r~~ ~~a u/M(v| !ǀ̀'16>S.Z &ځ,1 8Cb$j"WÂ0$L"q  Ӄރ 3INVYai oy{ y t 7R:&;7ks߈uki-k1jˋ6jA'5iX!!*L#`#-0֎Q/Y/33!9Yy Ðِ * K Uaq ‘.$65l&)Ԓ!,K> Γ *;R0V ĕ˕;VԖ*+$V{%Bh!Ә !*L>JA U\ &05Aw#1*#6,R%@#*3'^Z@ء8nG3 ʨj R^]  Ĭ|ѬN52;hE4@/`z &7^8~ װ..@^6o5ܱ #!:"$+G s?9 f)pgizŶ7ٶ/G#a#5߷t -Xl|$Ĺ+'=RZD& >_y9ݻ6%-ɼhؼ(AejнBWW3[9 /6=DKRY`gn u   :V#r-:7,7dM'* H)U^ <(L@#?+Y [I]LTDET?P !Y:, &;b1!-!? ^W C M&=|e!&%:#`S  #,:g x vQ q ~*!"5Tr'  4"Dg *;  5DYj /% 8RC4\:":t %_F! #QU"IxIN <[')+ >o_A0D,Z+' ##;2_&7 NYsv*!)%Kq3,&/Vk)|1' Q!n'/8 (#6%Z /( '5]x7#/#iS8f ]j~0OoQ)!BK !T&$@ex $ FdKdWVf2q2E4;ROk"9Xh w $ ,,$Ch5A44iO'j<.O'%w!= !#.R al{3%0-=2Pd#,PT"\wUn*_H BuPK0% !?T\7yG8%2 Xc{ "'$#7[{PK5/2ed4! :$Ej t>7B7zRv Q D !`  Q' Ty B ~ 4  D x pNB ~5pHY hs[?"ub#! +/Aqm'!>;S Yw1^87RX;vC #9W"h   &#)+My A^[s)'On#Wh:<P^T?(D_f &u~f vpMb{PqgkmN*NSC+/cvwxyC'/!;JXrfBiyGKKi6T .$D\w$4,-Li._{Q01E1(ZEcT%bz#0MYE 8a;maz_JkYo* >21+;R"j&-F,@em\`Hev`6=%NhWs6jr2hyBq]V z l/@gtX -:)OonM#rX<F5WHR<| |IxZ3LtH   u gK GO78~(5&~d!bs?w[l3VeQUdFtcP}AlG^2J{}%R +Q@8S.\UA>$ Y>j99p!:"=7xp Unk943I="0]?),4aB7C' Id}qDuZ|`V*5[LoS] Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst CardFirst ReviewFlipFolder already exists.Font:FooterForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards matched the criteria you provided.No empty cards.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOKOldest seen firstOnly new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderPassword:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please install PyAudioPlease install mplayerPlease open a profile first.Please select a deck.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesProcessing...Profile Password...Profile:ProfilesQuestionQueue bottom: %dQueue top: %dQuitRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition...Require one or more of these tags:RescheduleResume NowReverse text direction (RTL)ReviewReviewsRightSave ImageScope: %sSearchSelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set for all subdecksSet foreground colour (F7)Shift position of existing cardsShortcut key: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStylingSubscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The icons were obtained from various sources; please see the Anki source for credits.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There must be at least one profile.This file exists. Are you sure you want to overwrite it?This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?TimeTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayTotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.WelcomeWhen adding, default to current deckWhole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour Decksbackupscardscards from the deckcollectionddaysdeckdeck lifehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: 0.9.9.8.4 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-15 12:50+0000 Last-Translator: Aleksej Language-Team: JKL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: ru Стоп (1 из %d) (выкл.) (вкл.) Содержит %d карточку. Содержит %d карточки. Содержит %d карточек.%% правильных%(a)0.1f %(b)s в день%(a)d из %(b)d записей обновлена%(a)d из %(b)d записей обновлены%(a)d из %(b)d записей обновлены%(a)d КБ отправлено, %(b)d КБ принято%(tot)s %(unit)s%d карточка%d карточки%d карточек%d карточка удалена.%d карточки удалены.%d карточек удалено.%d карточка экспортирована.%d карточки экспортировано.%d карточек экспортированы.%d карточка импортирована.%d карточки импортированы.%d карточек импортировано.%d карточка просмотрена за%d карточки просмотрены за%d карточек просмотрено за%d карточка в минуту%d карточки в минуту%d карточек в минуту%d колода обновлена.%d колоды обновлены.%d колод обновлено.%d группа%d группы%d групп%d запись%d записи%d записей%d запись добавлена%d записи добавлено%d записей добавлено%d запись импортирована.%d записи импортированы.%d записей импортировано.%d запись обновлена%d записи обновлены%d записей обновлено%d просмотр%d просмотра%d просмотров%d выбрана%d выбраны%d выбрано%s уже существует на рабочем столе. Перезаписать?%s (копия)%s день%s дня%s дней%s день%s дня%s днейУдалено: %s.%s час%s часа%s часов%s час%s часа%s часов%s минуту%s минуты%s минут%s минуту.%s минуты.%s минут.%s минуту%s минуты%s минут%s месяц%s месяца%s месяцев%s месяц%s месяца%s месяцев%s секунда%s секунды%s секунд%s секунду%s секунды%s секунд%s к удалению:%s год%s года%s лет%s год%s года%s лет%s д.%s ч%s мин.%s мес.%s с%s г.&О программе…&Дополнения&Тест базы данных&Зубрить...&Редактирование&Экспортировать…&Файл&Найти&Переход&Руководство&Руководство…&Справка&Импорт&Импортировать…&Инвертировать выделение&Следующая карточка&Открыть папку с дополнениями&Настройки…&Предыдущая карточка&Изменить расписание...&Поддержать Anki…&Сменить профиль…&Инструменты&Отменить'%(row)s' содержит %(num1)d полей, ожидающих %(num2)d(%s правильных)(конец)(отфильтровано)(обучение)(нов.)(лимит у вышестоящей: %d)(пожалуйста, выберите 1 карточку)...Файлы .anki2 не предназначены для импортирования. Если Вы пытаетесь восстановить из резервной копии, обратитесь, пожалуйста, к разделу «Backups» руководства пользователя./0 д.1 101 месяц1 год10 ч.22 ч.3 ч.4 ч.16 ч.Получена ошибка 504. Время прохождения через шлюз истекло. Попробуйте временно отключить антивирус.: и%d карточку%d карточки%d карточекОткрыть папку с резервными копиямиПосетить сайт%(pct)d %% (%(x)s из %(y)s)%Y-%m-%d @ %H:%MРезервные копии
Anki делает резервную копию коллекции при каждом закрытии и синхронизации.Формат экспорта:Что найти:Размер шрифта:Шрифт:Где искать:Содержит:Высота линий:Заменить на:СинхронизацияСинхронизация
Сейчас выключена; для включения кликните кнопку синхронизации в главном окне.

Нужна учётная запись

Для синхронизирования Вашей коллекции необходима учётная запись. Пожалуйста, получите учётную запись, после чего введите ниже её данные.

Anki обновлена

Была выпущена Anki %s.

<текст не в Unicode><введите сюда условия поиска, или нажмите Ввод, чтобы вывести содержимое текущей колоды>Большое спасибо всем людям, помогавшим проекту идеями, сообщениями об ошибках и пожертвованиями.Лёгкость карточки — размер следующего интервала при оценке «в самый раз» при повторении.Файл, названный collection.apkg, сохранён на рабочий стол.Прервано: %sОб AnkiДобавитьДобавить (комбинация: Ctrl + Enter)Добавить полеДобавить медиафайлДобавить новую колоду (Ctrl+N)Добавление типа записиДобавить переворотДобавить меткиДобавить новую карточкуДобавить в:Добавить: %sДобавленоДобавленные сегодняДобавлен дубликат с первым полем: %sНе помнюНе вспомненные сегодняКоличество забытых: %sВсе колодыВо всех поляхВсе карточки в случайном порядке (режим зубрёжки)Все карточки, записи и медиафайлы этого профиля будут удалены. Вы уверены?Разрешить использование HTML в поляхПроизошла ошибка в дополнении.
Пожалуйста, напишите на форуме дополнений:
%s
Возникла ошибка при открытии %sИзображение сохранено на рабочий стол.AnkiКолода Anki 1.2 (*.anki)Anki 2 хранит колоды в новом формате. Этот мастер автоматически преобразует ваши колоды. Их резервные копии будут сохранены до обновления, и если вам придётся вернуться на старую версию Anki, ваши колоды останутся доступными.Колода Anki 2.0Anki 2.0 поддерживает автоматическое обновление только с Anki 1.2. Для загрузки более старых колод, пожалуйста, откройте их в Anki 1.2 для обновления, а затем импортируйте в Anki 2.0.Пакет колод AnkiAnki не обнаружила линию между вопросом и ответом. Пожалуйста, чтобы поменять их местами, отредактируйте шаблон вручную.Anki — это дружелюбная, интеллектуальная обучающая система, основанная на методе «интервалов и повторений». Полностью бесплатная, с открытым исходным кодом.Anki распространяется под лицензией AGPL3. Смотрите файл лицензии в дистрибутиве для более точной информации.Anki не смогла загрузить Ваш старый файл конфигурации. Пожалуйста, используйте Файл>Импортировать, чтобы импортировать Ваши колоды от предыдущих версий Anki.AnkiWeb ID или пароль неверны; пожалуйста, попытайтесь ещё раз.AnkiWeb ID:AnkiWeb обнаружил ошибку. Пожалуйста, попробуйте ещё раз через несколько минут, и если эта проблема повторится, отправьте сообщение об ошибке.AnkiWeb занят в данный момент. Пожалуйста, повторите попытку через несколько минут.На AnkiWeb ведутся профилактические работы. Пожалуйста, попробуйте еще раз через несколько минут.ОтветКнопки ответаОтветыАнтивирус или межсетевой экран не даёт Anki подключиться к Интернету.Все неприкрепленные карты будут удалены. Если запись не имеет карт, она будет потеряна. Вы уверены, что вы хотите продолжить?Дважды встречается в файле: %sВы уверены, что хотите удалить %s?Должен быть хотя бы один тип карточки.Должен быть хотя бы один шаг.Прикрепить картинки/аудио/видео (F3)Автоматически озвучиватьАвтоматически синхронизировать при открытии или закрытии профиляВ среднемСреднее времяСреднее время ответаСредняя лёгкостьСреднее по не пропущенным днямСредний интервалОтветПример оборотной стороныШаблон оборотной стороныРезервные копииОсновнаяОсновная (+ обратные карточки)Основная (обратные по выбору)Жирный (Ctrl+B)ОбзорОбзор и установка…ОбозревательОбозреватель (%(cur)d карточка показана; %(sel)s)Обозреватель (%(cur)d карточки показаны; %(sel)s)Обозреватель (%(cur)d карточек показано; %(sel)s)Вид в обозревателеНастройки обозревателяСборкаМассовое добавление меток (Ctrl+Shift+T)Массовое удаление меток (Ctrl+Alt+T)ОтложитьОтложить записьОткладывать связанные новые карточки до следующего дняОткладывать повторения связанных карточек до следующего дняПо умолчанию, Anki будет обнаруживать знаки между полями, такие как символ табуляции, запятая, и т.д. Если Anki определит символ неправильно, Вы можете ввести его здесь. Используйте \t для отображения TAB.ОтменитьКарточкаКарточка %dКарточка 1Карточка 2ID карточкиИнформация о карточке (Ctrl+Shift+I)Список карточекТип карточкиТипы карточекТипы карточек для %sКарточка исключенаКарточка была «приставучей».КарточекТипы карточекВручную переместить карточки в колоду на основе фильтра нельзяКарточки в простой текстКарточки будут автоматически возвращены в исходные колоды после того, как Вы их просмотрите.Карточки…В центреИзменитьИзменить %s на:В другую колодуПоменять тип записиСменить тип записи (Ctrl+N)Поменять тип записи…Выбрать цвет (F8)Изменить колоду в зависимости от типа записиИзмененаПроверить директорию с медиа-файламиПроверка...ВыбратьВыбор колодыВыбор типа записиВыберите тэгиКлонировать: %sЗакрытьЗакрыть и потерять данный ввод?ПропускиЗаполнение пропусков (Ctrl+Shift+C)Код:Коллекция повреждена. Пожалуйста, обратитесь к руководству пользователя.ДвоеточиеЗапятаяВыбор языка интерфейса и других опций для этой программыПодтверждение пароля:Поздравляем! Вы завершили эту колоду на текущий момент.Подключение...ПродолжитьКопироватьПравильно: %(pct)0.2f%%
(%(good)d из %(tot)d)Невозможно подключиться к AnkiWeb. Пожалуйста, проверьте подключение к сети и повторите попытку.Не удалось записать аудио. Вы установили lame и sox?Не удалось сохранить файл: %sЗубрёжкаСоздать колодуСоздать фильтрованную колоду…СозданаCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZСовокупное числоВсего %sВсего ответовВсего карточекТекущая колодаТекущий тип записи:Дополнительное обучениеСеанс дополнительного обученияНастраиваемые шаги (в минутах)Настройка карточек (Ctrl+L)Настроить поляВырезатьБаза данных перестроена и оптимизирована.ДатаДней обученияОтменить авторизациюКонсоль отладкиКолодаПереопределить колодуКолода будет импортирована после открытия профиля.КолодыОт большего интервала к меньшемуПо умолчаниюЗадержки перед следующим показом обзоровУдалитьУдалить %s?Удалить карточкиУдалить колодуУдалить пустыеУдалить записьУдалить записиУдалить меткиУдалить неиспользуемыеУдалить поле из %s?Удалить этот тип записи и все карточки этого типа?Удалить этот неиспользуемый тип записи?Удалить неиспользуемую графику (картинки / ролики)?Удалить...Удалена %d карточка с отсутствующей записью.Удалены %d карточки с отсутствующей записью.Удалено %d карточек с отсутствующей записью.Удалена %d карточка с отсутствующим шаблоном.Удалены %d карточки с отсутствующим шаблоном.Удалено %d карточек с отсутствующим шаблоном.Удалена %d запись с отсутствующим типом записи.Удалены %d записи с отсутствующим типом записи.Удалено %d записей с отсутсвующим типом записи.Удалена %d запись без карточек.Удалены %d записи без карточек.Удалено %d записей без карточек.Удалена %d карточка с неверным числом полей.Удалены %d карточки с неверным числом полей.Удалено %d карточек с неверным числом полей.Удалено.Удалено. Пожалуйста перезапустите Anki.Удаление этой колоды из списка колод вернёт все оставшиеся карточки в их исходные колоды.ОписаниеОписание, отображаемое на экране обучения (только для текущей колоды):ДиалогОтвергнуть полеОшибка загрузки: %sПолучить с AnkiWebУспешно загружено. Пожалуйста, перезапустите Anki.Загрузка с AnkiWeb...ПораЗапланировано на завтра&ВыходЛёгкостьОчень легкоБонус для лёгкихИнтервал для «легко»РедактированиеРедактирование %sРедактирование параметровРедактирование HTMLВыбрать, чтобы настроитьРедактировать...ОтредактированоШрифт в редактореПравки сохранены. Пожалуйста, перезапустите Anki.ОчиститьПустые карточки…Номера пустых карточек: %(c)s Поля: %(f)s Найдены пустые карточки. Пожалуйста, выберите меню Инструменты > Пустые карточки....Пустое первое поле: %sEndУкажите колоду, в которую помещать новые карточки %s, или оставьте поле пустым:Введите новую позицию карты (1...%s):Введите любые метки для добавления их ко всем выделенным карточкам:Введите имя существующей метки для её удаления со всех выделенных карточек:Ошибка загрузки: %sОшибка при запуске: %sОшибка выполнения %s.Ошибка при работе %sЭкспорт, колоды в любой другой удобный форматЭкспорт...ДополнительноFF1F3F5F7F8Поле %d из файла:Составление карты полейИмя поля:Поле:ПоляПоля для %sПоля разделены: %sПоля...&ФильтрыФайл повреждён. Пожалуйста, восстановите его из резервной копии.Файл отсутствуетФильтрФильтр:ОтфильтрованоФильтрованная колода %dНайти &Дубликаты...Найти дубликаты&Найти и заменить...Найти и заменитьПервая карточкаУвидена впервыеПеревернутьПапка уже существует.Шрифт:Нижняя строкаПрогнозФормаЛицевая и обратная по выборуЛицевая и обратнаяНайдено %(a)s из %(b)sВопросПример лицевой стороныШаблон лицевой стороны (вопроса)ОбщиеСоздан файл: %sСоздан на %sСкачатьВ самый разИнтервалHTML РедакторТрудноУ Вас установлен LaTeX и dvipng?ЗаголовокСправкаНаибольшая лёгкостьИсторияHomeПо времени сутокЧасовНе показаны часы с меньше, чем 30 повторениямиЕсли Вы внесли свой вклад в развитие программы, но не находитесь в этом списке, пожалуйста, свяжитесь с нами.Если бы Вы учились ежедневноНе учитывать время ответа болееБез учёта регистраИгнорировать строки, где первое поле соответствует существующей записиПроигнорировать это обновлениеИмпортИмпорт файлаИмпортировать, даже если существующая запись содержит такое же первое полеНеудавшийся импорт. Ошибка иморта. Отладочная информация: Настройки импортаИмпортировано.Есть в папке для медиафайлов, но не используются ни в одной из карточек:Включая медиафайлыДобавить в экспорт информацию об расписанииВместе с меткамиУвеличить сегодняшний лимит на новые карточкиУвеличить сегодняшний лимит на новые наУвеличить сегодняшний лимит повторенийУвеличить сегодняшний лимит повторений наОт меньшего интервала к большемуСведенияУстановка дополненияЯзык интерфейса:ИнтервалМодификатор интервалаИнтервалыНедопустимый код.Файл повреждён. Пожалуйста, восстановите из резервной копии.Неверный пароль.Неправильное регулярное выражение.Исключено.Курсив (Ctrl+I)Ошибка JS в строке %(a)d: %(b)sПерейти к тегам (Ctrl+Shift+T)Хранить доLaTeXФормула LaTeXВыключная формула LaTeXЗабытаПоследняя карточкаПоследний просмотрОбратно порядку добавленияИзучениеИзучаемых: %(a)s, повторённых: %(b)s, переучиваемых: %(c)s, отфильтрованных: %(d)sОбучениеПриставучиеСлеваОграничить доЗагрузка...Установите пароль на открытие профиля, или оставьте поле пустым:Самый длинный интервалПосмотрите в поле:Наименьшая лёгкостьНастроитьУправление типами записей…Подключить к %sОтображение для заметокОтметитьПометить записьОтметить запись (Ctrl+K)ОтмеченныеРазвитыеМаксимальный интервалМаксимум просмотров в деньНосительМинимальный интервалМинутПеремешать изучение новых карт и повторенияКолода Mnemosyne 2.0 (*.db)ЕщёПереместить карточкиПереместить в колоду (Ctrl+D)Переместить карточки в колоду:&ЗаписьИмя уже существует.Название для колоды:Наименование:СинхронизацияНовыеНовые карточкиНовые карточки в колоде: %sТолько новые карточкиНовых карточек в деньИмя для колодыНовый интервалНовое имя:Новый тип записи:Имя для новой группы настроек:Новая позиция (1…%d):Следующий день начнется сКарточек, соответствующих заданным критериям, не найденоПустых карточек не обнаружено.Не обнаружено отсутствующих или неиспользуемых файлов.ЗаписьТип записиТипы записиЗапись и %d карточка удалены.Запись и %d карточки удалены.Запись и %d карточек удалены.Запись отложена.Запись исключенаВнимание: вставленные в карточки файлы не копируются. Пожалуйста, делайте на всякий случай резервные копии своей папки Anki.Примечание: Часть истории отсутствует. Для получения дополнительной информации смотрите документацию браузера.Записи в простой текстЗаписи необходимо хотя бы одно поле.НичегоОКСначала старейшиеМожно изменять позиции только новых карточек.ОткрытьОптимизация...Опциональный лимит:НастройкиНастройки для %sГруппа настроек:Настройки...ПорядокПароль:Пароли не совпадаютВставитьВставлять изображения из буфера как PNGУрок Pauker 1.8 (*.pau.gz)ПроцентыПериод: %sПоместить в конец очереди новых карточекПоместить в очередь на повторение с интервалами между:Пожалуйста, сначала добавьте другой тип записи.Пожалуйста подождите, это может занять некоторое время.Пожалуйста, подсоедините микрофон и убедитесь, что другие программы не используют это аудиоустройтво.Пожалуйста, отредактируйте эту запись, добавив несколько пропусков для заполнения. (%s)Пожалуйста, установите PyAudioПожалуйста, установите mplayerПожалуйста, вначале откройте профиль.Пожалуйста, выберите колоду.Пожалуйста, выберите что-нибудь.Пожалуйста установите последнюю версию Anki.Для импортирования этого файла, пожалуйста, используйте Файл>Импортировать.Пожалуйста, посетите AnkiWeb, обновите вашу колоду, затем попытайтесь ещё раз.ОчередьНастройкиОбработка данных...Пароль профиля…Профиль:ПрофилиВопросКонец очереди: %dНачало очереди: %dВыйтиВ случайном порядкеОценкаПодготовка к обновлениюПерестроитьЗаписать свой голосЗаписать звук (F5)Началась запись...
Время: %0.1fПереучиваемыеПомнить последние введённые данныеУдалить меткиУдалить форматирование (Ctrl+R)Удаление этого типа карточки привело бы к удалению одной или более записей. Пожалуйста, создайте сначала новый тип карточки.ПереименоватьПереименовать колодуПовторное воспроизведение аудиоВоспроизвести свой голосПереместитьОчередь…Требуется одна или несколько из этих меток:Изменить расписаниеПродолжить сейчасНаправление текста справа-налевоПовторениеОтветовСправаСохранить картинкуОхват: %sПоискВыбрать&Выделить всёВыбрать &записиВыберите исключаемые метки:Выбранный файл не в кодировке UTF-8. Пожалуйста, прочтите раздел об импорте в руководстве.Выборочное обучениеТочка с запятойСервер не найден. Либо соединение разорвано, либо антивирус или файервол блокируют подключение Anki к интернету.Назначить всем подколодамНазначить цвет текста (F7)Сдвигать позиции других карточекНа клавиатуре: %sПоказать %sПоказать ответПоказать дубликатыПоказывать время ответаПоказывать новые карточки после повторенийПоказывать новые карточки перед повторениямиПоказывать новые карточки в порядке их добавленияПоказывать новые карточки в случайном порядкеПоказывать время следующего повторения над кнопками ответаПоказывать при просмотре число оставшихся карточекПосмотреть статистику. На клавиатуре: %sРазмер:Некоторые параметры вступят в силу только после перезапуска Anki.Поле сортировкиСортировать в обозревателе по этому полюСортировка по данной колонке не поддерживается. Пожалуйста, выберите другую колонку.Музыка & ИзображенияПробелПервая позиция:Исходная лёгкостьСтатистикаШаг:Шаги (в минутах)Шаги указываются в виде чисел.Удалять HTML-разметку при вставке текстаСегодня просмотрено: %(a)s за %(b)s.Просмотрено сегодняУчитьУчить колодуУчить колоду...УчитьТаблица стилейНижний индекс (Ctrl+=)Экспорт в Supermemo XML (*.xml)Верхний индексИсключитьВыключить карточкуВыключить записьИсключённыеСинхронизировать также звуки и изображенияСинхронизировать с AnkiWeb. На клавиатуре: %sСинхронизация медиа-данных...Синхронизация не удалась: %sСинхронизация не удалась; нет подключения к Интернету.Синхронизация требует правильности часов Вашего компьютера. Пожалуйста, настройте часы и попробуйте снова.Выполняется синхронизация…Символы табуляциитолько пометитьМеткиЦелевая колода (Ctrl+D)Целевое поле:ТекстТекст, разделённый символами табуляции или точками с запятой (*)Колода с таким названием уже есть.Заданное имя уже используетсяЗаданное имя уже используетсяОшибка времени ожидания при подключении к AnkiWeb. Пожалуйста, проверьте ваше соединение и повторите попытку.Стандартные настройки не могут быть удалены.Стандартные настройки не могут быть удаленыРаспределение карточек в колоде (-ах).Первое поле пусто.Значки получены из различных источников; атрибуцию ищите, пожалуйста, в исходных текстах.Количество вопросов, на которые вы ответили.Число повторений, запланированных на будущее.Сколько раз Вы нажали каждую кнопку.Нет карточек, удовлетворяющих условиям поиска. Желаете задать новые?Время, затраченное на ответыОбновление завершено, и вы можете приступить к использованию Anki 2.0.

Ниже приведён журнал обновления:

%s

Должен остаться хотя бы один профиль.Этот файл уже существует. Вы уверены, что хотите перезаписать его?Это специальная колода для обучения вне обычного расписания.Вот {{c1::пример}} заполнения пропуска.Это действие удалит существующую коллекцию, заменив её данными из импортируемого файла. Вы уверены?ВремяПроверитьДля просмотра дополнений, нажмите кнопку «Обзор».

Найдя понравившееся дополнение, пожалуйста, вставьте его код ниже.Прежде чем импортировать в защищённый паролем профиль, откройте его.Чтобы добавить заполнение пропусков к существующей записи, вы прежде должны изменить её тип на «пропуски», выбрав Редактировать>Поменять тип записи.Чтобы увидеть их сейчас, нажмите кнопку «Вернуть отложенные»Для обучения сверх обычного расписания, нажмите кнопку 'Дополнительное обучение' ниже.СегодняВсегоОбщее времяВсего карточекВсего записейТрактовать текущий ввод как регулярное выражениеТипНапишите ответ: неизвестное поле %sНе удалось импортировать из доступного только для чтения файла.Вернуть отложенныеПодчёркнутый (Ctrl+U)ОтменаОтменить - %sНеизвестный формат файла.НевиданныеОбновлять существующие записи, когда первое поле совпадаетОбновление завершеноМастер обновленийОбновлениеОбновление колоды %(a)s из %(b)s... %(c)sЗагрузить на AnkiWebЗагрузка на AnkiWeb…Использовано в карточках, но отсутствует в папке для изображений и звуков:1-й пользовательВерсия %sОжидание окончания правки.Добро пожаловатьПо умолчанию помещать создаваемое в текущую колодуВся коллекцияВы желаете скачать его сейчас?Автор — Damien Elmes; патчами, переводом, тестированием и оформлением помогали:

%(cont)sУ вас много колод. Пожалуйста, посмотрите %(a)s. %(b)sВы ещё не записали своего голосаВы должны иметь хотя бы один столбец.СвежиеСвежие+ИзучаемыеВаши колодырезервных копийкарточкикарточки из колодыколлекцияд.днейпакетвсё времясправкаскрытьчасовчасов после полуночизабыванийотображать на %sотображать на меткиминмин.мес.повторенийсекундстатистикаэту страницунед.вся коллекция~anki-2.0.20+dfsg/locale/fr/0000755000175000017500000000000012256137063015123 5ustar andreasandreasanki-2.0.20+dfsg/locale/fr/LC_MESSAGES/0000755000175000017500000000000012065014111016672 5ustar andreasandreasanki-2.0.20+dfsg/locale/fr/LC_MESSAGES/anki.mo0000644000175000017500000022414712252567245020206 0ustar andreasandreasUl5hGiG pG{GG"GG GGG8GH.H?H"PH$sH$H&HH"I&I9IJI$gI III0I JJ&"J IJUJ(fJJJ,JJ*J&K,;K hKvK(KKKKKKK KKKKK K LLLL L*L0L 8LCL UL`LxLLLLLLL0L MM M &M1M7MJMaMeMMMMMN NNNNNT!NvNxN,N(NN!O%Of=OO OO O OOPP(Pe?PP7OQ QQ5QXQY3R8RkR 2S >SISMS hS rS|S S SS SSSS S$S T TT +T 5T%@TKfTTNT"U9U#PVtVyVV WW5XGXRXvYwY7 Z EZwQZEZ@[P[W[f[Rn[[D\#_\#\\ \\(])] 1]>] R]_]x]] ] ]]]]]]^ ^^L'^t^^^^^^ ^ ^)^'_C__` ```!`)` B` L` V`a` s```` `3``S`PaYa`a ga uaaaaa"aaa&b 5bAb HbTb eb qb{bbbbb-bbb(c,c5>c tccc8c5cPc7Pddd ddddd dddeeeee$e+e2e9e @e Me Ze ge te e e eeee e eee ef f'fWiPiii]j lj8xjj jjj)jk6k:k IkVk\kak fk qkkk k kkkk k!kkk)l02lclyl4}l!llllm,m@mQm Xmbmhmjmmmpmsmvmym m mmm mm mm,m#n5nqOq.UqFqqq r4rErXr _r1krrrrr*rs tt tt"u"6u Yuzuuuuuu u u u) v5vGvvvvw1wPwUw[wjwzw w wwww<wx x xx-x2x ;x+Fxrxx xxx x xx xxxxyy%y+yz KzUzdz|zzz+zz#z!{>{C{ K{ U{<`{ {{]{a|z|!| ||||,|}#}k}`~ e~s~~~~ ~~ ~ ~~~~! 2<SYw  ,#)VD8EԀ1He,Ł-ށ+ 88q z# ߂ 2; LZ_fv}Ճ i9 Ä Ԅ߄ "% -18 ju  Dž Ӆ-&T\t z  Ɇ׆VF V`,%G@  Lj ψۈ8V*u'!ȉ@618h !?Ί$ 4 BMSf} Ƌ ̋ ׋  1Da| *Ɍ!d: ƍˍ ( 6WXr+ˎ"&A0[+>UFM*(1,ؑIO'?tgܓ#ȔdeQ8Cw(rWژߘ au/WM՚ۚ| !Ư̈̀'16>S.Z& М&ڜ,+X _jUߝ$8 E( I"ZW}Sա0)$Z" {;^<5ѤUڥ 0:BH\ ny{ Ĩب  1:3n w ( «ΫG#@du+))ެ)(2.[ 'ѭ+%%@5f * ,1F.])Ư0ݯ #.0_cgkpt x 4 ŰҰ ۰  - 3 =Jbr ıұB<K Q\ lw <>AFMRX^chanгҳ24)O"y~ 3TfҵFc \ȷ[%0%V ""*M^"rԺ  8) bl *k޻ J`k1̼6ľɾ( '`sUp~JFN K)-% )9cA# ->DU frz%  c]u *, >0Zgou~&  +ELL^E &;M!f'2ARZl'G T`4hD B&8i`E-Iw   + 6 A L W b mx  $&(!Oq3 4IQ k@w (< T^2xA'# 9[FEdIMg  c' 4$ +*"Vy} " ): Uaj51;B]La*'' H"d! $$-4C ^ h9t %;QZj%~9  *7 "A^z  +JSX nyA[$;)`7<=8Y<%'(*P'{* " >J&Y5 ,& 5?EUfm} L #/8Qg n y@'7NVf . 0+=i!~&  %Dc}'910k42$ 5 B]Pt]C$$Jf9D~~*2B Xc"x*%&5\c} =E4.8cs8XI$.!,GN-'C N We.m0 % -N W#x   $@_&sR[n} ", 9J_- (%>A ' #  *8S G"p(y 21A8s%?9&L sQ}LRo)E ! 4AH"Y7|//!Ce#k / *=h#8{    E2#Koj:2-)`86U wj B ?% Ye G  6 I !Z J|  \^|}|=J5.5 EQSUGoB  2 A \h{ I.9S1b?  -C %PQU0z kI *Q &|     zt!"M}#?# $' -'9'B'X' s'~''' ''''''''' ((( !(,( 5( B(M(Q(e(7-]'|&Z(1 q*USC3`BU<X8 I 9c<j!Jb"#+Vn!UR,}~Rm}n%A*PP=xE0ElY :hs~_5k+!XEWA_N[a(87  cgL.yT92Y/H e<_\)KL )[g^wJ<X\Dv=U:.Fu-OzedQPTo|DdW%p0,A*74yvVD%;F s $o9-BG2NJ{)ti?.Q#8yO#7/&j]f 'o G6YlF;]d'^G=eCn3$w LrO xqE[/iSH&?{I2bM6zxp0#i>HG 3MC"N*uu5HvBIw65$4@@t9\C:K;)K:m kz(?^'DN$VRr%|hk f@3,>BZ> `ZJhMKt a{aT!SQjsI(QM0f~c=8+41&564gpSml"-`.WR/b1F2}>1"AP  rT,@ ;q+OL?  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: Anki 0.3 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-18 16:14+0000 Last-Translator: Marwane K. Language-Team: LMS MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) X-Poedit-Country: FRANCE Language: X-Poedit-Language: French X-Poedit-SourceCharset: utf-8 X-Poedit-Basepath: /usr/share/anki/ankiqt Arrêt (1 sur %d) (inactif) (actif) Contient %d carte. Contient %d cartes.%% correctes%(a)0.1f %(b)s par jour%(a)0.1fs (%(b)s)%(a)d sur %(b)d note mise à jour.%(a)d sur %(b)d notes mises à jour.%(a)dko montant, %(b)dko descendant%(tot)s %(unit)s%d carte%d cartes%d carte supprimée.%d cartes supprimées.%d carte exportée.%d cartes exportées.%d carte importée.%d cartes importées.%d carte étudiée.%d cartes étudiées.%d carte par minute%d cartes par minute%d paquet mis à jour.%d paquets mis à jour.%d groupe%d groupes%d note%d notes%d note de plus%d notes de plus%d note introduite%d notes introduites%d note mise à jour%d notes mises à jour%d révision%d révisions%d sélectionnées%d sélectionnées%s se trouve déjà sur votre bureau. Le remplacer ?Copie de %s%s jour%s jours%s jour%s jours%s supprimé%s heure%s heures%s heure%s heures%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s mois%s mois%s mois%s mois%s seconde%s secondes%s seconde%s secondes%s pour supprimer :%s an%s ans%s année%s années%sd%sh%sm%smo%ss%syÀ &propos…&Greffons&Vérifier l’intégrité de la base de données...&Bachoter…&Éditer&Exporter…&Fichier&Chercher&Déplacement&Aide&Manuel en ligne (en anglais)&Aide&Importer&Importer…&Inverser la sélectionCarte &suivanteOuvrir le dossier des greffons&PréférencesCarte &précédente&Replanifier…&Faire un don&Changer de compte…&OutilsA&nnuler« %(row)s » avait %(num1)d champs au lieu des %(num2)d prévus(%s correctes)(fin)(filtrée)(apprentissage)(inédite)(limite parent : %d)(veuillez sélectionner 1 carte)...Les fichiers portant l’extension .anki2 ne peuvent servir à l’import-export ; le manuel vous précise les modalités de sauvegarde./0j1 101 mois1 an10 h22 h3 h4 h16 hErreur 504 d'attente de passerelle reçue. Essayez de désactiver temporairement votre antivirus.: et%d carte %d cartes Ouvrir le dossier des archivesVisiter le site internet%(pct)d%% (%(x)s sur %(y)s)%d/%m/%Y @ %H:%MSauvegardes
Anki va créer une sauvegarde de votre collection à chaque fois qu’elle est fermée ou synchronisée.Format d’exportation :Trouver :Taille de la police :Police :dans :Inclure :Longueur de ligne :Remplacer par :SynchronisationSynchronisation
Désactivée pour le moment ; pour l’activer cliquez sur le bouton de synchronisation dans la fenêtre principale.

Compte requis

Vous devez posséder un compte pour pouvoir synchroniser votre collection. Merci de créer un compte gratuitement, puis entrez les informations de connexion ci-dessous.

Mise à jour de Anki

La version %s vient de paraître.

< Entrez ici votre recherche ou bien appuyez Entrée pour voir le paquet actuel entier >Un grand merci à tous ceux qui ont contribué par leurs suggestions, diagnostics, ou dons.L’indice de facilité d’une carte correspond à l’intervalle de temps (en jours) qui serait affiché au-dessus du bouton de révision « Correct ».Enregistrement de collection.apkg sur le bureau.Un problème est survenu pendant la synchronisation des médias. Veuillez utiliser Outils > Vérification des médias, puis synchroniser de nouveau pour corriger l'erreur.Annulé  %sÀ propos d’AnkiAjouterAjouter (raccourci :Ctrl+Entrée)Ajouter un champAjouter des médiasAjouter un nouveau paquet (Ctrl+N)Ajouter un type de noteAjouter le versoAjouter des marqueursAjouter une nouvelle carteAjouter à :Ajouter : %sAjoutéAjouté aujourd’huiUn doublon a été ajouté avec comme premier champ : %sÀ revoirÀ nouveau aujourd’huiOublis : %sTous les paquetsTous les champsToutes les cartes dans un ordre aléatoireL’intégralité des cartes, notes et médias du compte seront supprimées. Procéder à la suppression ?Tolérer du HTML dans les champsUne erreur s'est produite dans un add-on.
Merci d'en informer le forum des add-on:
%s
Une erreur est survenue lors de l'ouverture de %sUne erreur s'est produite. Elle pourrait avoir été causée par un bug sans conséquence,
ou alors votre paquet pourrait avoir un problème.

Pour s'assurer que le problème n'est pas lié avec votre paquet, merci d'utiliser le menu Outils > Vérifier la base de données.

Si cette démarche ne résout pas le problème, merci de copier ce qui suit
dans un rapport de bug :L’image est enregistrée et se trouve sur le bureau.AnkiPaquet ANKI 1.2 (*.anki)Anki 2 utilise un nouveau format d’enregistrement des paquets de cartes. Mais grâce à cet assistant, vous pourrez utiliser vos anciens paquets, d’une part sur Anki 2 puisqu’ils seront convertis, d’autre part sur l’ancienne version en cas de pépin, puisqu’ils seront sauvegardés.Paquet ANKI 2.0Anki 2.0 ne peut mettre à niveau que les paquets provenant de la version 1.2. Si vous avez des paquets plus vieux encore, il vous faut les ouvrir dans Anki 1.2 afin de les mettre à niveau en 1.2, avant de réessayer ici l’import dans Anki 2.0.Tas de paquets ANKIAnki n’a pas pu trouver la ligne entre la question et la réponse. Veuillez ajuster le modèle manuellement pour intervertir question et réponse.Anki est un logiciel de répétition espacée convivial et intelligent. Il est libre et gratuit.Anki est sous licence AGPL3. Veuillez voir le fichier licence dans la distribution source pour plus d'informations.Anki ne sait pas lire les fichiers de configuration issus de cette vieille version d’ANKI. Allez voir « Fichier > Importer… ».Votre identifiant Ankiweb ou votre mot de passe sont incorrects. Merci de réessayer.Identifiant Anki :Ankiweb a rencontré un problème, réessayez un peu plus tard et si le problème persiste, remplissez-nous un rapport de bug.Ankiweb est actuellement surchargé. Veuillez réessayer un peu plus tard.AnkiWeb est en maintenance. Veuillez réessayer dans quelques minutes.RéponseBoutons de réponseRéponsesUn logiciel antivirus ou pare-feu empêche Anki de se connecter au réseau.Toute carte qui n’est reliée à rien sera supprimée. Si une note n’a plus de cartes restantes, elle sera perdue. Procéder tout de même ?Apparaît en double dans le fichier : %sÊtes-vous sûr(e) de vouloir supprimer %s ?Au moins un type de carte est requis.Au moins une étape est requise.Attacher des images, sons ou vidéos (F3)Jouer l’audio automatiquementSynchroniser automatiquement à l’ouverture et à la fermeture.MoyenneDurée moyenneDurée de réponse moyenneFacilité moyenneMoyenne (par jour travaillé) Intervalle moyenVersoAperçu du versoModèle du versoSauvegardesBasiqueGénéralités (deux sens)Généralités (converse facultative)Gras (Ctrl+B)ParcourirParcourir et installer…ExplorateurExplorateur (%(cur)d carte affichée ; %(sel)s)Explorateur (%(cur)d cartes affichées ; %(sel)s)Apparence du navigateurOptions de l’explorateurGénérerAjouter des marqueurs par lot (Ctrl+Maj+T)Supprimer les marqueurs par lot (Ctrl+Alt+T)EnfouirEnfouir la carteEnfouir la noteEnfouir les nouvelles cartes associées jusqu'au prochain jourEnfouir les révisions liées jusqu'au lendemainAnki sait détecter les signes de ponctuation tels les virgules ou les tabulations. Mais si la détection automatique se trompe, le caractère peut être entré manuellement ici. Pour écrire une tabulation, entrez \t.AnnulerCarteCarte %dCarte 1Carte 2Identifiant carteInformations sur la carte (Ctrl+Maj+I)Liste des cartesType de carteTypes de cartesTypes de cartes pour %sCarte enfouie.Carte exclue.Cette carte est pénible.CartesStatut des cartesLes cartes ne peuvent être déplacées manuellement dans un paquet filtré.Cartes avec texte en clairLes cartes reviendront à leurs paquets d’origine après révision.Cartes…CentreModifierTransformer %s en :Changer de paquetModifier le type de noteModifier le type de note (Ctrl+N)Modifier le type de la note…Changer la couleur (F8)Changer le paquet selon le type de noteModifiéVérification des &médias...Vérifier les fichiers dans le dossier des médiasVérification…ChoisirChoisir le paquetChoisir le type de noteChoisir les marqueursDupliquer : %sFermerFermer en perdant la saisie en cours ?Texte à trousTexte à trous (Ctrl+Maj+C)Code :Le fichier de la collection est corrompu. Il existe un manuel en ligne.Deux-pointsVirguleConfigurer les options et la langue de l’interfaceConfirmer le mot de passe :Félicitations ! Vous en avez fini avec ce paquet pour l’instant.Connexion en cours…ContinuerCopierRéponses exactes sur les cartes matures : %(a)d/%(b)d (%(c).1f%%)Connues : %(pct)0.2f%%
(%(good)d sur %(tot)d)Impossible de se connecter à Ankiweb. Merci de vérifier votre connexion réseau et réessayez.Impossible d’enregistrer du son. Avez-vous installé lame et sox ?Le fichier %s n’a pas pu être sauvegardé.BachoterCréer un paquetCréer un paquet filtréCrééeCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Maj+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Maj+=Ctrl+Maj+ACtrl+Maj+CCtrl+Maj+FCtrl+Maj+LCtrl+Maj+MCtrl+Maj+PCtrl+Maj+RCtrl+UCtrl+WCtrl+ZCumulé%s cumuléesRéponses cumuléesCartes cumuléesPaquet actuelType de note actuelRévisions particulièresSéance de révisions particulièresPas en minutes d’une carte à revoirPersonnaliser les cartes (Ctrl+L)Modifier les champsCouperLa base de données est reconstruite et optimisée.DateJours travaillésDésautoriserConsole de débogagePaquetÉcraser le paquetLe paquet sera importé quand un compte sera ouvert.PaquetsIntervalles décroissantsPar défautLe nombre de cartes en fonction de leur intervalle de révision.SupprimerSupprimer %s ?Supprimer les cartesSupprimer le paquetSupprimer les cartes videsSupprimer la noteSupprimer les notesSupprimer les marqueursSupprimerRetirer le champ de %s ?Supprimer le type de carte '%(a)s', et ses %(b)s ?Supprimer ce type de note et toutes les cartes correspondantes ?Supprimer ce type de note inutilisé ?Supprimer les médias inutilisés ?Supprimer…Carte %d supprimée avec une note manquante.Cartes %d supprimées avec une note manquante.%d carte sans modèle supprimée.%d cartes sans modèle supprimées.Suppression d’une note dont il manquait le type.Suppression de %d notes dont il manquait le type.Suppression d’%d note sans cartes.Suppression de %d notes sans cartes.%d note avec comptage de champ erroné supprimée.%d notes avec comptage de champ erroné supprimées.Supprimé.Supprimé. Redémarrez Anki.En supprimant le paquet de la liste des paquets, ses cartes reviendront à leur paquet d’origine.DescriptionDescription du paquet sur le panneau de révision :DialogueSupprimer le champLe téléchargement a échoué : %sTélécharger depuis AnkiwebTéléchargement réussi. Redémarrez Anki.Téléchargement depuis Ankiweb…DûSeulement les cartes duesPrévues pour demain&QuitterFacilitéFacileFacilité bonusIntervalle pour les cartes facilesModifierModifier %sModifier la carte en coursModifier le HTMLModifier en personnalisantModifier…modifiéPolice d’écritureCorrections enregistrées. Veuillez redémarrer Anki.VideChercher des cartes videsNombre de cartes vides : %(c)s Champs : %(f)s Cartes vides trouvées. Veuillez lancer Outils>Cartes videsPremier champ vierge : %sFinIndiquez dans quel paquet placer les %s nouvelles cartes, ou laissez vide :Entrez la position de la carte (1…%s) :Saisir le(s) marqueurs(s) à ajouter :Supprimer via les marqueurs :Erreur durant le téléchargement : %sErreur au démarrage : %sProblème à l’exécution de %s.Problème à l’exécution de %sExporterExporter…ExtraFF1F3F5F7F8Le champ %d du fichier est :Correspondance des champsNom du champ :Champ :ChampsChamps pour %sChamps séparés par : %sChamps…&SélectionFichier est invalid. Veuillez restaurer de la sauvegarde.Le fichier est manquant.AbrégerSélection :FiltréPaquet filtré %dChercher un &doublon…Trouver les doublons&Chercher–RemplacerChercher et RemplacerTerminerPremière cartePremière révisionCorrespondant au premier champs : %sCorrigé %d carte invalide.Corrigé %d cartes invalides.Corrigé le type de note : %sRetournerLe dossier existe déjà.Police :Pied de pagePour des raisons de sécurité, on ne peut réaliser « %s » sur les cartes. Pour le faire, insérez la commande, mais dans un paquetage différent, et importez ce paquetage dans l’en-tête LaTeX.Charge de travailFormulaireSens normal & converse facultativeDeux sens, normal & converse%(a)s doublons parmi %(b)s.RectoAperçu du rectoModèle du rectoGénéralFichier généré : %sGénéré sur %sPartagesCorrectIntervalle de passeVue en langage hypertexteDifficileAvez-vous LaTeX et DVIPNG d’installés ?En-têteAidePlus grande facilitéHistoriqueAccueilRépartition horaireHeuresLes heures insignifiantes (révisions < 30) ne sont affichées.Si vous avez contribué mais n’apparaissez pas dans cette liste, veuillez nous contacter.Moyenne (tous jours confondus) Ignorer les temps de réponses dépassantIgnorer la casseIgnorer les cartes dont le premier champ existe déjà.Ignorer cette mise à jourImporterImporterImporter les cartes même si le premier champ existe déjà.Échec de l’importation. Échec de l’importation. Informations de débogage : Options d’importationImportation complète.Dans le dossier des média mais utilisé par aucune carte :Afin que votre collection fonctionne correctement lors des déplacements entre appareils, Anki requiert que l'horloge interne de votre ordinateur soit correcte. Cette horloge interne peut être fausse même si votre système affiche une heure valide. Veuillez aller dans les réglages de l'horloge de votre ordinateur, et vérifier : - Réglage AM/PM - Dérive de l'horloge - Jour, mois et année - Fuseau horaire - Heure d'été Différence avec l'heure correcte : %s.Inclure les médiasInclure les données de planificationInclure les marqueursAccroître le quota de cartes inéditesAccroître le quota de cartes inédites deAccroître le quota de cartes à revoirAccroître le quota de cartes à revoir deIntervalles croissantsInfoInstaller un greffonLangue de l’interfaceIntervalleModificateur d’intervalleIntervallesCode invalide.Encodage invalide, veuillez renommer :Fichier invalid. Veuillez restaurer de la sauvegarde.Mot de passe invalide.Propriété invalide trouvée sur la carte. Veuillez utiliser Outils > Vérifier l'intégrité de la base de données. Si le problème subsiste, veuillez demander de l'aide sur le site de support.Expression régulière invalide.La carte a été suspendue.Italique (Ctrl+I=Erreur javascript à la ligne %(a)d : %(b)sAller aux mots-clés avec Ctrl+Shift+TConserverLaTeXÉquation LaTeXEnv. math. LaTeXEchecsDernière carteDernière révisionLes derniers ajouts d’abordApprendreApprendre jusqu'à la limiteApprises : %(a)s, Revues : %(b)s, Réapprises : %(c)s, Filtrées : %(d)sÀ repasserPénibleTraitement des péniblesSeuil de pénibilitéGaucheLimiter àChargement…Protégez d’un mot de passe ce compte ou bien laissez blanc :Plus long intervalleRechercher dans le champs :Plus petite facilitéGérer&Types de notesAssocier à %sAssocier aux marqueursMarquerMarquer la noteMarquer la note (Ctrl+K)MarquéMatureIntervalle maximumQuota de révisions quotidiennesMédiasIntervalle minimumMinutesMélanger les cartes inédites aux révisions.Paquet MNEMOSYNE 2.0 (*.db)Autres choixLes plus difficiles (en nombre de faux pas)Déplacer les cartesDéplacer dans le paquet (Ctrl+D)Déplacer les cartes dans le paquet :N&oteLe nom existe déjà.Nom du paquet :Nom :RéseauInéditesCartes inéditesCartes inédites dans le paquet : %sSeulement les nouvelles cartesNouvelles cartes par jourNouveau nom du paquet :Nouvel intervalleNouveau nom :Nouveau type de note :Nouveau nom pour le profil de réglagesNouvelle position (1…%d) :Le jour suivant démarre àAucune carte n'est arrivée à échéance pour le moment.Aucune carte ne remplit les critères demandés.Aucune carte n’est vide.Aucune carte mature n'a été étudiée aujourd'hui.Pas de fichiers inutilisés ou manquants trouvés.NoteIdentifiant noteType de noteTypes de noteLa note et sa carte %d ont été supprimées.La note et ses cartes %d ont été supprimées.Note enterrée.Note suspendue.Information : les médias ne sont pas restaurés. Il serait sage de sauvegarder régulièrement votre dossier Anki.Information : il manque une partie de l’historique. Consultez l’aide de l’explorateur.Notes en textePas de note sans remplir de champ !Marqueurs ajoutés.RienValiderLes plus anciennement vues d’abordA la prochaine synchronisation, forcer les changements dans une direction.Les notes n’ont pu être importées parce qu’elles ne disposaient pas de cartes. C’est la réponse habituelle lorsque des champs sont manquants, ou qu’ils ont été intervertis lors de l’élaboration du fichier.Seule les nouvelles cartes peuvent être repositionnées.Un seul client peut accéder AnkiWeb à la fois. Si une synchronisation a échoué, veuillez réessayer dans quelques minutes.OuvrirOptimisation…Limite optionnelle :OptionsOptions pour %sProfil de réglages :Options…Ordre d’apparitionLes plus récemment vues d’abordOrdre des échéancesRemplacer le Modele RectoRemplacer la policeRemplacer le Modèle VersoCollection Anki empaquetée (*.apkg *.zip)Mot de passe :Les mots de passe ne correspondent pasCollerCopier les images en PNG.Pauker 1,8 leçonPourcentagePériode : %sPlacer à la fin de la file d’attente des nouvelles cartes.Placer en attente de révisions, au rythme d’un intervalle entre :Veuillez ajouter un nouveau type de note auparavant.Merci de patienter, cela peut prendre quelques instants.Veuillez connecter le microphone et rassurez-vous que le dispositif audio n'est pas utilisé par un autre logiciel.Corrigez cette note et faites-en un texte à trous. (%s)Veuillez vérifier qu’un compte est ouvert, qu’Anki n'est pas occupé et réessayez.Veuillez installer PyAudioVeuillez installer mplayerVeuillez d’abord ouvrir un compte.Merci d'utiliser le menu Outils > Cartes videsVeuillez sélectionner un paquet.Veuillez ne sélectionner que des cartes qui ont un même type de note.Veuillez sélectionner au moins un élément.Merci de mettre à jour Anki.Il faut passer par Fichier > ImporterConnectez-vous sur Ankiweb, mettez à jour le paquet et réessayez.PositionPréférencesAperçuPrévisualiser les cartes sélectionnées (%s)Aperçu des cartes inéditesVoir les cartes inédites ajoutées ces derniersTraitement en cours…Mot de passe du compte…Compte :ComptesAuthentification Proxy demandéeQuestionFin de la file d’attente : %dDébut de la file d’attente : %dQuitterAu hasardOrdre aléatoireÉvaluationPrêt pour la mise à jourReconstruireS’enregistrerEnregistrer un son (F5)Enregistrement…
Durée : %0.1fÉchéance dépassée relativeÉtudier à nouveauConserver le contenu lors de l’ajoutSupprimer les marqueursSupprimer le formatage (Ctrl+R)Supprimer cette carte impliquerait la suppression d’une ou plusieurs autres notes. Ajouter d’abord un nouveau type de note.RenommerRenommer le paquetRejouer le sonSe réécouterRepositionnerRepositionner les nouvelles cartesRepositionner…Il faut au moins l’un de ces marqueurs :ReportéReplanifierReplanifier les cartes selon mes réponses dans ce paquetReprendre maintenantSens de lecture inversé (DàG)Revenu à l’état antérieur à « %s ».RévisionRévisionsTemps passéAvancer la révisionAvancer la révision deRevoir les cartes oubliées ces derniersRevoir les cartes oubliéesTaux de révisions réussies en fonction de l’heure du jour.RévisionsCartes à réviser dans le paquet : %sDroiteEnregistrer l’imagePortée : %sChercherRechercher avec le formatage (lent)Sélection&Tout sélectionnerSélectionnerÔter par les marqueurs :Le fichier sélectionné n'était pas au format UTF-8. Merci de consulter la section du manuel relative à l'import de fichiers.Révision sélectivePoint-virguleServeur introuvable. Soit votre connexion est interrompue, ou votre antivirus / pare-feu logiciel empêche Anki de se connecter à Internet.Appliquer le groupe d’options à tous les paquets au dessous de %s ?Valider pour tous les sous-paquetsChoisir une couleur (F7)La touche majuscule était maintenue enfoncée. Aucune synchronisation automatique ni de chargement de greffons.Changer la position de cartes existantesRaccourci : %sRaccourci : %sAfficher %sMontrer la réponseMontrer les doublonsMontrer le chronomètrePlacer les cartes inédites après les révisions.Placer les cartes inédites avant les révisions.Placer les cartes inédites dans l’ordre de leur ajoutPlacer les cartes inédites au hasardMontrer la date de la prochaine révision au dessus des boutonsMontrer le nombre de cartes restantes durant la révisionVoir les statistiques. Raccourci : %sTaille :Des cartes associées ou enfouies ont été repoussées à une prochaine session.Certains réglages ne s’appliqueront qu’après le redémarrage d’Anki.Certaines mises à jour ont été ignorées suite au changement de type de note :Trier selon le champTrier selon ce champ dans l’explorateurLe tri sur cette colonne n’est pas permis. Choisissez-en une autre.Sons et imagesEspacePosition de départ :Facilité initialeStatistiquesPas :Pas (en minutes)Les pas doivent être des nombres.Retirer le code HTML lors d’un copier-coller de texte%(a)s déjà étudiées aujourd’hui en %(b)s.Étudiées aujourd’huiÉtudierÉtudier le paquetÉtudier le paquet…Étudier maintenantEtude par carte ou par étiquetteStyleStyles (partagés parmi les cartes)Indice (Ctrl+=)XML issu de SUPERMEMO (*.xml)Exposant (Ctrl+Shift+=)SuspendreSuspendre la carteSuspendre la noteSuspenduSynchroniser l’audio et les images égalementSynchroniser avec Ankiweb. Raccourci : %sSynchronisation des médias…La synchronisation a échoué : %sLa synchronisation a échoué car vous êtes hors-ligne.L’horloge de votre ordinateur doit être correctement réglée pour permettre la synchronisation. Veuillez régler l’horloge et essayer à nouveauSynchronisation…TabulationMarquer les doublonsMarquer (*)MarqueursPaquet cible (Ctrl+D)Champ viséTexteFichier texte séparé par des tabulations ou des points-virgules (*)Ce paquet existe déjà.Le nom de ce champ est déjà pris.Ce nom est déjà pris.Le délai imparti à la connexion à Ankiweb est expiré. Vérifiez votre connexion réseau et réessayez.La configuration par défaut ne peut pas être supprimée.Le paquet par défaut ne peut pas être supprimé.Répartition des cartes selon leur statutLe premier champ est videLe premier champ du type de note ne peut pas être vide.Le caractère suivant ne peut pas être utilisé : %sLe recto de cette carte est vide. Veuillez utiliser Outils>Chercher des cartes vides.Les icônes proviennent de différentes sources ; veuillez consulter la source d’Anki pour connaître les crédits.Votre saisie générerait une question vide sur toutes les cartes.La part et le nombre de révisions selon le statut de la carte.Prévision du nombre de cartes à réviser selon leur jour d’échéance et leur statut.Le choix des divers boutons en fonction de l’ancienneté de la carte.Les permissions de votre dossier temporaire système sont incorrectes, et Anki n'a pas pu les corriger par lui-même. Veuillez consulter le manuel Anki (chercher 'dossier temporaire') pour plus d'informations.Le fichier fournit n'est pas un fichier .apkg valable.Aucune carte ne correspond à cette recherche. Voulez-vous la modifier ?Une telle modification suppose de ré-envoyer la totalité de la base de données lors de la prochaine synchronisation de la collection. S’il y de plus récentes modifications à partir d’un appareil tiers, qui n’ont pu être synchronisées, celles-ci seront perdues. Continuer ?Le temps passé à répondre selon le jour et selon le statut de la carte.La mise à jour est terminée, vous pouvez maintenant utiliser Anki 2.0.

Le journal de la mise à jour s’inscrit infra %s

Il y a d’autres cartes inédites mais la limite quotidienne est atteinte. Cette limite peut-être rehaussée (dans les options), mais n’oubliez pas que plus vous introduisez des cartes inédites, plus votre charge de travail à court terme sera intense.Il faut au moins un compte !Cette colonne ne peut pas être triée, mais vous pouvez rechercher des types de cartes individuelles, comme « card:Card 1 ».Cette colonne ne peut pas être triée, mais vous pouvez rechercher des paquets spécifiques en cliquant sur celle de gauche.Ce fichier ne semble pas être un fichier .apkg valide. Si vous obtenez cette erreur d'un fichier téléchargé depuis AnkiWeb, il se peut que votre téléchargement ait échoué. Merci de réessayer ; si le problème persiste, merci de réessayer en utilisant un autre navigateur.Ce fichier existe. Êtes-vous sûr de vouloir l’écraser ?Ce dossier contient l’ensemble de vos données Anki en un seul endroit, pour simplifier les mises à jour. Si vous souhaitez utiliser un dossier différent, allez voir : %s Ce paquet permet de réviser indépendamment de la planification d’Anki.Il s'agit d'une suppression de {{c1::echantillon }} .L’import de ce fichier va écraser (supprimer et remplacer) votre collection actuelle. Voulez-vous tout de même l’importer ?Cet assistant va vous guider dans le processus de mise à jour vers Anki 2.0. Pour que la transition se fasse en douceur, lisez attentivement les pages suivantes. DuréeLimite de tempsÀ réviserPour parcourir les greffons, veuillez cliquer sur le bouton Parcourir ci-dessus.

Lorsque vous avez trouvé un greffon intéressant, veuillez coller son code ci-dessous.Pour importer dans un compte demandant un mot de passe, ouvrez d’abord le compte.Pour faire d’une carte déjà existante, un texte à trous, il faut passer par « Édition > Modifier le type de la note » et choisir « Texte à trous ».Pour les voir maintenant, cliquez sur le bouton Désenfouir ci-dessous.Le bouton « Révisions particulières » ci-dessous vous permet de sortir du schéma de révisions proposé.Aujourd’huiLa limite de révision a été atteinte pour aujourd'hui, mais il y a encore des cartes en attente de révision. Pour une mémorisation optimale, pensez à augmenter la limite quotidienne dans les options.TotalDurée totaleNombre total de cartesNombre total de notesTraiter la saisie comme une expression régulièreTypeChamp inconnu %sIncapable d’importer à partir d’un fichier en lecture seule.DésenfouirSouligné (Ctrl+U)AnnulerAnnuler %sFormat inconnu.Non-vueMettre à jour la note existante lorsque le premier champs est identique%(a)d de %(b)d notes existantes mises à jour.Mise à niveau terminée.Assistant de mise à jourMise à niveauMise à niveau du paquet %(a)s sur %(b)s… %(c)sEnvoyer vers AnkiwebEnvoi vers AnkiwebUtilisé par des cartes mais manquant dans le dossier média :Utilisateur 1Version %sFinissez de modifier la carte pour continuer.Attention, le texte à trous ne fonctionnera pas tant que vous ne changez pas le type de carte en 'Texte à trous' (en haut de la fenêtre).BienvenueAjouter par défaut au paquet courantQuand une réponse est montrée, rejouer le son de la question et de la réponseSi vous êtes prêt à lancer la mise à jour, cliquez sur le bouton correspondant. Lors du processus de mise à jour, votre navigateur ouvrira le manuel. Si vous lisez l’anglais, vous y verrez que beaucoup de choses ont changé depuis la dernière version.Une fois vos paquets mis à niveau, Anki va essayer de copier les sons et images de vos vieux paquets. S’ils sont localisés dans un dossier différent que celui par défaut, l’assistant ne sera peut-être pas en mesure de les localiser. Un journal sera disponible à la fin de la mise à jour. Si vous remarquez que les médias n’ont pas été copiés, veuillez lire l’aide pour savoir comment faire.

Ankiweb permet désormais de synchroniser directement les médias. Aucune opération spéciale n’est nécessaire, les médias seront synchronisés directement avec vos cartes lorsque vous synchroniserez vos paquets avec Ankiweb.Toute la collectionSouhaitez-vous la télécharger tout de suite ?Programme écrit par Damien Elmes, avec les correctifs, les traductions, les vérifications et les idées de :

%(cont)sLe type de carte est 'Texte à trous' mais vous n'avez pas choisi de mot à cacher. Continuer quand même ?Vous avez un nombre important de paquets. Merci de consulter %(a)s. %(b)sVous ne vous êtes pas encore enregistré.Vous devez avoir au moins une colonne.RécentesRécentesVos paquetsVotre modification aura un impact sur plusieurs paquets. Si vous souhaitez modifier uniquement le paquet sélectionné, veuillez d'abord ajouter un nouveau profil de réglages.Le fichier contenant votre collection semble être corrompu. Ceci peut survenir quand le fichier est copié ou déplacé alors qu'Anki est ouvert, ou encore quand la collection est stockée sur un disque réseau ou sur un espace de stockage en ligne. Merci de consulter le manuel en ligne pour savoir comment restaurer votre bibliothèque à partir d'une sauvegarde automatique.Votre collection présente des contradictions. Merci d'utiliser le menu Outils > Vérifier la base de données, puis synchronisez à nouveau.Votre collection ou un fichier média est trop lourd pour être synchronisé.Votre collection a été transféré avec succès dans AnkiWeb.Vos paquets ici et sur ​​AnkiWeb diffèrent de telle sorte qu'ils ne peuvent pas être fusionnés ensemble, il est donc nécessaire de remplacer le pont d'un côté avec les platines de l'autre. Si vous choisissez de télécharger, Anki va télécharger la collection d'AnkiWeb, et tous les changements que vous avez effectués sur votre ordinateur depuis la dernière synchronisation seront perdues. Si vous choisissez d'uploader, Anki va envoyer votre collection vers AnkiWeb, et toutes les modifications que vous avez apportées sur AnkiWeb ou vos autres appareils depuis la dernière synchronisation pour ces appareils seront perdues. Après que tous les appareils soient synchronisés, les futurs révisions et les cartes ajoutées peuvent être fusionnées automatiquement.(aucun paquet)sauvegardescarte(s)Les cartes du paquetscartes sélectionnées parcollectionjjour(s)paquetvie du paquetdoublonaidemasquerheuresheure(s) après minuitfaux pasassocié à %sassocié à Marqueursminute(s)minutesmorévisionssecondesstatistiquescette pagesemtoute la collection~anki-2.0.20+dfsg/locale/da/0000755000175000017500000000000012256137063015100 5ustar andreasandreasanki-2.0.20+dfsg/locale/da/LC_MESSAGES/0000755000175000017500000000000012065014110016646 5ustar andreasandreasanki-2.0.20+dfsg/locale/da/LC_MESSAGES/anki.mo0000644000175000017500000021120612252567245020153 0ustar andreasandreasT\5XGYG `GkGrG"xGG GGG8GHH/H"@H$cH$H&HH"HI)I:I$WI |III0IIJ&J 9JEJ(VJJJ,JJ*JK,+K XKfK(wKKKKKKK KKKKK KKKL L LL L (L3L ELPLhLxLLLLLL0L LM M M!M'M:MQMUMMMMMMMNN N NTNfNhN,~N(NN!NOf-OO OO O OOOPPe/PP7?Q wQQ5QXQY#R8}RkR "S .S9S=S XS bSlS S SS SSSS S$SS S T T %T%0TKVTTNT"U)U#@VdViVV xWW%X7XRXvYwY7Y 5ZwAZEZ@Z@[G[V[R^[[4\#O\#s\\ \\(\] !].] B]O]h]y] ~] ]]]]]]]]^L^d^w^^^^^ ^ ^)^' _3____` ``` 2` <` F`Q` c`p``` `3``S`@aIaPa Wa eaqaaaa"aaa&a %b1b 8bDb Ub abkbqbbbb-bbb(bc5.c dcrc{c8c5cPc7@dxdd ddddd dddddde eee"e)e 0e =e Je We de qe ~e eeee e eee ee ff,fFf_fpftff f f ff f/fg gg%&gLg Sg ^g kg wg g g g gg,g(g#hAh VhF`hNhPh>GiPiii]i \j8hjj jjj)j k&k*k 9kFkLkQk Vk akoktk |k kkkk k!kkk)k0"lSlil4ml!llllmm0mAm HmRmXmZm]m`mcmfmim m mmm mm mm,mn%n,n4n=nNnbnrnnn n nnNno2o7oNoTo[o ppp4pFp`p fptpppp ppp pp$pqq q!q)q.q?q.EqFtqqq q4r5rHr Or1[rrrrr*r ss 8sEs"es"s sssss tt $t .t UIF*(1:l,*IW't.#d>e 89Cɕ( r6,1 DNaїu3/M٘'-Ι ԙ ߙ !'<dk.&ۚ "&,Se,} Uۛ1$98^(r"WϟS'0{$"Ѡ {^5#U,  ˦ͦҦ צ *@EMPX` fprC J U c#q AƩ 1+A3m19Ӫ 1)[p$($ϫ5$Zb&q (ެ, 7-M{- Э%ޭ & - 9G Y cm|   ֮  , 8 FS4\  ٯ°ŰȰ˰ΰhѰ:<+Q5}!ӱ  ɲ ܲ#q9<k >ҴS^e?ĵ  ض  /A R \ hr&  Ϸ ݷ3Ljc&4 '?glqcelҽ2W j>K@ U% '+= it!$,FsI'*+'V~ (1  ->Sg l6vU (/>N]u   .7;Z`~!*  )105bR6"= BMfov }   - :GNU\ er #1&6]bw1 2"UZ c m {  %':YIbQR8QK l m@y )%;&Ah{     +"NR&aA@!&%H"n  "; KU[ bp 3  -@ O [h{Q ( >F [hq  #  "/(>X; 8 B:O!.!&H'[+,0 !-DW` u $3#$+ 1?Z amC  & . ;-Es    #=CU^{ #, @M\ n { (15)G3q A |1X8 HRW?j o * ;I[n   "#/S*[ &.+':PbD[Tp$,258hJ /,E r    !7@Rc|*ufm } *  : T`!z %.4 c o #  Qm ~9Tmh$  &18 A O]{/&..N hGtEB E#QHu   5%V|  4!2P mx !"/YK  4<ZzV)%"=`7z(?_@{*+)=-L* w2u,!n vx<)C*jIh!1@iBN_w}  * 4$Afk. 5 -Ao +-+ 4'?Ug <?DR/  T _ 0e +       s E'V~ `m~9=F IU ^ hsu7-]&{&Z(0 ~q)URB2`AT;X7 H 9c;j Jb"#+Un!TQ,|~Ql}n%A*PP=xD/ElY:hr~^4j* WDW@_M[a'86bgK.yT82Y.H d< _[)JL )Zf^wJ<X\Dv<U9-Fu,OzedPOSo|CcV$p/,@)64yvVD$:F s #o8,BG1MI{(ti?-Q"7xN"7.%j\f  'nF6XlE;]d&]G<eCm3#v LrN wqE[/hRG%>{I1aL5yxp0#i>GF 2MC"N*ut4HuBHw65$3@?t9\B9J;(K:m kz'>^'CN$VRq%|hk e?3+=AY= `ZIgLKs `zaT!SPisI(QM0f}c=8+31&554goSmk!-_.WR/b1E2}>0!AO  rS+@ :p*OK?  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-25 19:38+0000 Last-Translator: Aputsiaq Niels Janussen Language-Team: Danish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: da Stop (1 af %d) (slået fra) (slået til) Den har %d kort. Den har %d kort.%% Korrekt%(a)0.1f %(b)s/dag%(a)0.1fs (%(b)s)%(a)d af %(b)d notater opdateret%(a)d af %(b)d notater opdateret%(a)dkB op, %(b)dkB ned%(tot)s %(unit)s%d kort%d kort%d kort blev slettet.%d kort blev slettet.%d kort blev eksporteret.%d kort blev eksporteret.%d kort blev importeret.%d kort blev importeret.%d kort blev blev studeret i%d kort blev blev studeret i%d kort/minut%d kort/minut%d stak blev opdateret.%d stakke blev opdateret.%d gruppe%d grupper%d note%d noter%d note tilføjet%d noter tilføjet%d note importeret.%d noter importeret.%d note opdateret%d noter opdateret%d gennemgang%d gennemgange%d valgt%d valgte%s findes allerede på dit skrivebord. Overskriv den?%s kopi%s dag%s dage%s dag%s dage%s slettet.%s time%s timer%s time%s timer%s minut%s minutter%s minut.%s minutter.%s minut%s minutter%s måned%s måneder%s måned%s måneder%s sekund%s sekunder%s sekund%s sekunder%s til sletning:%s år%s år%s år%s år%s dag%s time%s min%smo%s sek%s årOm &Anki...&Tilføjelser&Tjek database...&Terp ...&Redigér&Eksportér...&Filer&Find&Kør&Guide&Guide...&Hjælp&Importér&Importér...&Invertér markering&Næste kort&Åbn tilføjelsesmappe&Indstillinger...&Forrige kortÆnd&re skema...&Støt Anki&Skift profil&VærktøjerFo&rtryd'%(row)s' havde %(num1)d felter, forventede %(num2)d(%s korrekt)(slut)(filtreret)(læring)(ny)(overordnet grænse: %d)(vælg venligst 1 kort)....anki2-filer er ikke beregnet til import. Hvis du forsøger at gendanne fra en sikkerhedskopi, så se venligst sektionen 'Sikkerhedskopier' (på engelsk Backups) i brugermanualen./0d1 101 måned1 år1021030416Modtog 504-fejl om tidsudløb for adgangspunktet. Prøv venligst at slå din antivirus fra midlertidigt.: og%d kort%d kortÅbn mappe med sikkerhedskopierBesøg websted%(pct)d%% (%(x)s af %(y)s)%Y-%m-%d @ %H:%MSikkerhedskopier
Anki vil oprette en sikkerhedskopi af dine samlinger hvergang den bliver lukket eller synkroniseret.Eksportformat:Find:Skriftstørrelse:Skrifttype:I:Inkludér:Linjestørrelse:Erstat med:SynkroniseringSynkronisering
Er ikke indstillet; klik på knappen til synkronisering i hovedvinduet for at aktivere.

Der kræves en konto

Der kræves en fri konto for at bevare din samling synkroniseret. Tilmeld dig venligst for en konto, og indtast dernæst dine detaljer nedenfor.

Anki er opdateret

Anki %s er blevet udgivet.

En stor tak til alle som er kommet med forslag, fejlrapporter og donationer bidrag.Et korts lethed er størrelse fa næste interval når du svarer "godt" i en gennemgang.En fil med navnet collection.apkg blev gemt på dit skrivebord.Der opstod et problem under synkronsiering af mediet. Brug venligst Værktøjer>Tjek medie, og synkronisér dernæst igen, for at korrigere dette problem.Afbrød: %sOm AnkiTilføjTilføj (genvej: ctrl+enter)Tilføj feltTilføj medieTilføj ny stak (Ctrl+N)Tilføj notattypeTilføj baglænsTilføj etiketterTilføj nyt kortFøj til:Tilføj: %sTilføjetTilføjet i dagTilføjede dublet med første felt: %sIgenIgen i dagAntal gentagelser: %sAlle kortsætAlle felterAlle kort i tilfældig rækkefølge (terpetilstand)Alle kort, noter og medier for denne profil vil blive slettet. Er du sikker?Tillad HTML i felterDer opstod en fejl i et udvidelsesmodul.
Skriv venligst til udvidelsesmodulets forum:
%s
Der opstod en fejl under åbning af %sDer opstod en fejl. Det kan være forårsaget af en harmløs fejl,
eller din stak kan indeholde en fejl.

For at bekræfte at der ikke er problemer med din stak, så kør Værktøjer > Tjek database.

Hvis dette ikke løser problemet, så kopiér og indsæt følgende
i en fejlmelding:Et billede blev gemt på dit skrivebordAnkiAnki 1.2 kortsæt (*.anki)Anki 2 gemmer dine kortsæt i et nyt format. Denne guide vil automatisk konvertere dine kortsæt til det nye format. Dine kortsæt vil blive sikkerhedskopieret før opgraderingen, så hvis du skal tilbage til en tidligere version af Anki kan du stadig bruge dine kortsæt.Anki 2.0 KortsætAnki 2.0 understøtter kun automatisk opgradering fra Anki 1.2. For at indlæse ældre stakke, så bedes du venligst åbne dem i Anki 1.2 og opgradere dem, og dernæst importere dem ind i Anki 2.0.Anki stak-pakkeAnki fandt ikke linjen mellem spørgsmålet og svaret. Tilpas venligst skabelonen manuelt for at bytte om på spørgsmålet og svaret.Anki er et venligt, intelligent opbygget indlæringssystem. Det er gratis og udviklet i åben kode.Anki er udgivet under AGPL3-licensen. Se venligst licensfilen i kildeudgivelsen for mere information.Anki kunne ikke indlæse en gamle konfigurationsfil. Brug Fil>Importer til at importere dine kortsæt fra en tidligere Anki version.AnkiWeb ID eller password var forkert; prøv igen.AnkiWeb ID:AnkiWeb modtog en fejl. Prøv igen om et par minutter, og hvis problemet bliver ved, opret en fejlrapport.AnkiWeb er travl i øjeblikket. Prøv igen om et par minutter.Der foretages vedligehold på AnkiWeb. Prøv venligst igen om få minutter.SvarSvarknapperSvarAntivirus- eller firewall-software forhindrer Anki i at tilkoble sig til internettet.Alle kort der er tomme vil blive slettet. Hvis et notat ikke har nogle kort vil det blive slettet. Er du sikker på du vil fortsætte.Forekommer 2 gange i filen: %sEr du sikker på at du vil slette %s?Der kræves mindst én korttype.Mindst et skridt er nødvendigt.Vedhæft billeder/lyd/video (F3)Afspil automatisk lydSynkroniser automatisk profil ved åben/lukGennemsnitGennemsnitstidGennemsnitlig svartidGennemsnitlig lethedGennemsnit for dage med studierGennemsnits intervalBagsideBagside anmeldelseBadsideskabelonBackupGrundlæggendeGrundlæggende (og kort baglæns)Grundlæggende (valgfrit med kort baglæns)Fed skrift (Ctrl+B)GennemseGennemse && installér ...BrowserBrowser (%(cur)d kort vist; %(sel)s)Browser (%(cur)d kort vist; %(sel)s)Udseende på browserBrowserindstillingerBygMassetilføjelse af mærker (Ctrl+Skift+T)Masse-fjernelse af mærker (Ctrl+Alt+T)BegravBegrav kortBegrav notatBegrav relaterede kort indtil næste dagBegrav relaterede gennemgange indtil dagen efter.Som standard vil Anki opfange tegnet mellem felter, så som en tabulator, et komma eller lign. Hvis Anki opfanger tegnet forkert, kan du indtaste det her. Brug \t til at repræsentere tabulator.AfbrydKortKort %dKort 1Kort 2Kort-IDKort-info (Ctrl+Skift+I)KortlisteKorttypeKorttyperKorttyper til %sKort er begravetKort er suspenderet.Kortet var en igle.KortKorttyperKort kan ikke flyttes manuelt ind i en filtreret stak.Kort som ren tekstKort flyttes automatisk tilbage til deres oprindelige stakke, når du gennemgår dem.Kort...CentreretÆndreÆndre %s til:Ændre kortsætSkift notetypeSkift notetype (Ctrl+N)Skift notetype...Skift farve (F8)Skift stak afhængig af notetypeÆndretTjek &medie...Tjek filerne i mediebiblioteketKontrollerer...VælgVælg stakVælg notetypeVælg mærkerKlon: %sLukLuk og tab nuværende indhold?ClozeCloze-sletning (Ctrl+Skift+C)Kode:Samlingen er defekt. Se manualen.KolonKommaVælg sprog og konfigurér AnkiBekræft adgangskode:Tillyke! Du er færdig med dette kortsæt.Tilkobler...FortsætKopierRet svar på ældre kort: %(a)d/%(b)d (%(c).1f%%)Korrekt: %(pct)0.2f%%
(%(good)d ad %(tot)d)Kunne ikke forbindel til AnkiWeb. Check dine netværksindstillinger og prøv igen.Kunne ikke optage lyd. Har du installeret lame og sox?Kunne ikke gemme filen: %sTerpOpret stakOpret filtreret stak ...OprettetCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Skift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+KCtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Skift+=Ctrl+Shift+ACtrl+Skift+CCtrl+Shift+FCtrl+Skift+LCtrl+Shift+MCtrl+Skift+PCtrl+Skift+RCtrl+UCtrl+WCtrl+ZVoksendeKumulativ %sKumulative svarKumulative kortNuværende kortsætNuværende notattype:Brugerdefineret studieBrugerdefineret studielektionTilpassede trin (i minutter)Tilpas kort (Ctrl+L)Tilpas felterKlipDatabasen er genopbygget og optimeret.DatoDage du har studeretFjern godkendelseKonsol til fejlsøgningKortsætTilsidesættelse af stakStak vil blive importeret når en profil åbnes.Alle kortsætAftagende intervallerStandardForsinkelse indtil anmeldelserne bliver vist igen.SletSlet %s?Slet kortSlet kortsætSlet de tommeSlet notatSlet notaterSlet etiketterSlet ubrugteSlet felt fra %s?Slet korttypen '%(a)s' og dets %(b)s?Slet denne note-type og alle dens kort?Slet denne ubrugte notetype?Slet medier som ikke anvendes?Slet ...Slettede %d kort med manglende note.Slettede %d kort med manglende note.Slettede %d kort med manglende skabelon.Slettede %d kort med manglende skabelon.Slettede %d note med manglende notetype.Slettede %d noter med manglende notetype.Slettede %d note uden kort.Slettede %d noter uden kort.Slettede %d note med forkert felttal.Slette %d noter med forkerte felttal.Slettet.Slettet. Genstart venligst Anki.Sletning af denne stak for staklisten, vil returnere alle tilbageværende kort til deres oprindelige stakke.BeskrivelseBeskrivelsen som vises på studieskærmen (kun nuværende stak):DialogKasseret feltHentning mislykkedes: %sHenter fra AnkiWebHetning lykkedes. Genstart venligst Anki.Henter fra AnkiWeb...I dagVis kun kort med overskredet tidsfristTidsfrist i morgen&AfslutSværhedsgradLetNem bonusNemt intervalRedigérRediger %sRediger nuværendeRediger HTMLRedigér for at tilpasseRedigér ...RedigeretRedigerende fontRedigering er gemt. Genstart venligst Anki.TomTomme kort ...Tøm kort-numre: %(c)s Felter: %(f)s Der blev fundet tomme kort. Kør venligst Værktøjer>Tomme kort.Tome første felt: %sSlutIndtast kortsæt at placere nye %s kort i, eller efterlad blank:Indtast ny kortposition (1...%s):Indtast etiketter der skal tilføjes:Indtast etiketter der skal slettesFejl under hetning: %sFejl under opstart: %sFejl under afvikling af %s.Fejl ved afvikling af %sEksportérEksportérEkstraFF1F3F5F7F8Felt %d i fil er:FeltopmærkningFeltnavn:Felt:FelterFelter for %sFelter separeret af: %sFelter...Fil&terFilen er ugyldig. Gendan den fra en sikkerhedskopi.Filen manglede.FiltrérFilter:FiltreretFiltreret stak %dFind &dubletter...Find dubletterSøg og er&stat...Søg og erstatFærdiggørFørste kortFørste GennemgangFørste felt matchede: %sRettede %d kort med ugyldige egenskaber.Rettede %d kort med ugyldige egenskaber.Rettede notetype: %sVendMappe findes allerede.Skrift:SidefodAf hensyn til sikkerheden, så er '%s' ikke tilladt på kort. Du kan stadig bruge det, ved at placere kommandoen i en anden pakke, og importere denne pakke i LaTeX-hovedet i stedet.PrognoseFormularFremad & valgfrit baglænsFremad & baglænsFandt %(a)s på tværs af %(b)s.ForsideFontforhåndsvisningFontskabelonGenereltOprettet fil: %sOprettet %sHent delteGodtGradueringsintervalHTML EditorHårdHar du installeret latex og dvipng?OverskriftHjælpLettesteHistorikStartTimevist opdeltTimerTimer med mindre end 30 gennemgange vises ikke.Hvis du har bidraget og ikke findes på listen så kontakt os.Hvis du studerer hver dagIgnorer svartider længere endIgnorer versalIgnorér linjer hvor første felt matcher eksisterende noteSe bort fra denne opdateringImportérImporter filImportér selv om eksisterende note har samme første-feltImport mislykkedes. Import fejlede: fejlinformation: Import mulighederImport er fuldført.I medie-mappe, men ikke anvendt af nogen kort:Inkluder medieInkluder planlægningsinformationInkluder etiketterForøg dagens begrænsning for nye kortForøg dagens begrænsning for nye kort medForøg dagens grænse for gennemgang af kortForøg dagens grænse for gennemgang af kort medIntervallerne øgesInformationInstallér tilføjelseGrænsefladesprog:IntervalInterval-modifikatorIntervallerUgyldig kode.Ugyldig indkodning; omdøb venligst:Filen er ugyldig. Gendan den fra en sikkerhedskopi.Ugyldigt password.Ugyldig egenskab fundet i kort. Brug venligst Værktøjer>Tjek database, og dukker problemet op igen, så stil venligst et spørgsmål på supportstedet.Ugyldigt regulært udtryk.Det er blevet suspenderet.Kursiv tekst (Ctrl+I)JS fejl på linie %(a)d: %(b)sSpring til mærker med Ctrl+Skift+TBeholdLaTeXLaTeX-ligningMatematik-miljø for LaTeXUdfaldSidste kortSeneste anmeldelseSeneste tilføjes førstLærLær foran grænseLær: %(a)s, Gennemgå: %(b)s, Lær påny: %(c)s, Filtrerede: %(d)sIndlæringIgleIgle-handlingIgle-grænseværdiVenstreBegræns tilHenter...Lås konto med password eller efterlad blank:Længste intervalSe i felt:SværesteAdministrérAdministrér notetyperMappe til %sKnyt til TagsMarkerMarker notatMarkér note (Ctrl+K)MærketModenMaksimum-intervalMaximum anmeldelser / dagMedieMinimalt intervalMinutterMix kortene og anmeldelserneMnemosyne 2.0 kortsæt (*.db)MereFlest omgangeFlyt kortFlyt til stak (Ctrl+D)Flyt kort til kortsætN&otatNavnet eksisterer.Navn på stakken:Navn:NetværkNyeNye kortNye kort i stak: %sKun nye kortNye kort / dagNyt kortsætnavn:Nyt intervalNyt navn:Ny notattype:Ny indstillings gruppenavn:Ny position (1...%d):Næste dag start vedDer er ingen kort med udløben tidsfristIngen kort som passede til de kriterier du angav.Ingen tomme kort.Der blev ikke studeret ældre kort i dag.Der blev ikke fundet ubrugte eller manglende filer.NoteNote-IDNotattypeNotattyperNote og dets %d kort er slettet.Note og dets %d kort er slettet.Noten er begravet.Note er suspenderet.Bemærk: Medie er ikke sikkerhedskopieret. Etablér venligst en periodisk sikkerhedskopi af din Anki-mappe for at sikre dig.Bemærk: Noget at historikken mangler. For mere information, se browser documentationen.Notat i ren tekstNoter kræver mindst ét felt.Mærkede noter.IngentingO.k.Ældste set førstGennemtving ensretning af ændringer ved næste synkronisering.Én eller flere noter blev ikke importeret, fordi de ikke oprettede nogen kort. Dette kan ske når du har tomme felter, eller når du ikke har kædet indholdet i tekstfilen til de korrekte felter.Kun nye kort kan repositioneres.AnkiWeb kan kun tilgås af én klient ad gangen. Hvis en tidligere synkronisering mislykkedes, så forsøg igen om nogle få minutter.ÅbenOptimerer...Valgfri grænse:IndstillingerMuligheder for %sIndstillingsgruppeIndstillinger...RækkefølgeTilføjede rækkefølgeFristordenOverskriv skabelon til bagside:Overskriv forside:Overskriv skabelon til forside:Pakket Anki-stak (*.apkg *.zip)Adgangskode:Adgangskoderne stemmer ikke overensIndsætIndsæt billeder fra udklipsholder som PNGPauker 1.8-lektion (*.pau.gz)ProcentPeriode: %sPlacer i slutningen af den nye kortkøPlacer i anmeldelseskøen med interval mellem:Tilføj venligst en anden note-type først.Vent venligst; dette kan tage lidt tid.Tilslut en mikrofon, og forsikr dig, at andre programmer ikke bruger lydenheden.Redigér venligst denne note og tilføj nogle cloze-sletninger. (%s)Sørg venligst for at have en profil åben og at Anki ikke er aktiv, forsøg dernæst igen.Installér venligst PyAudioInstallér venligst mplayerÅbn venligst en profil først.Kør venligst Værktøjer>Tomme kortVælg venligst en stak.Udvælg venligst kun kort fra én note-type.Vælg venligst et eller andet.Opgrader venligst til den seneste version af Anki.Benyt venligst Fil>Importér for at importere denne fil.Besøg venligst AnkiWeb, opgradér din kortstak, og forsøg dernæst igen.PositionOpsætningForhåndsvisningForhåndsvis valgte kort (%s)Forhåndsvis nye kortForhåndsvis nye kort tilføjet i den sidsteBehandler...Profil password...Profil:ProfilerDer kræves proxy-godkendelse.SpørgsmålKø nederste: %dKø top: %dAfslutTilfældigTilfældig rækkefølgeBedømmelseKlar til at opgradereGenopbygOptag egen stemmeIndspil lyd (F5)Optager...
Tid: %0.1fRelativ overskridelseGenlærHusk sidste indtastning når der tilføjesFjern mærkaterFjern formatering (Ctrl+R)Fjernelse af denne korttype ville betyde at én eller flere noter blev slettet. Opret venligst en ny korttype først.OmdøbOmdøg kortsætGenafspil lydAfspil egen stemmeRepositionerRepositioner nye kortRepositioner...Påkræv én eller flere af disse mærker:Nyt tidspunktSkemalæg igenPlanlæg kort påny baseret på mine svar i denne kortstakFortsæt nuModsat tekstretning (RTL)Gendannet til tilstand før '%s'.GennemgangAntal anmeldelserAnmeldelsestidGennemgå på forkantGennemgå på forkant medGennemgå kort som er glemt i senesteGennemgå glemte kortAnmeldelses succesrate for hver time af dagen.GennemgangeForfaldne gennemgange i stak: %sHøjreGem billedeVirkefelt: %sSøgSøg indenfor formatering (langsom)VælgVælg &altVælg &NotaterVælg mærker som skal udelades:Den valgte vil var ikke i formatet UTF-8. Læs venligst manualens importsektion .Selektivt studieSemikolonServer blev ikke fundet. Enten er din forbindelse røget, eller også blokerer antivirus/firewall-software Anki fra at koble sig på internettet.Indstil alle stakke nedenfor %s til denne tilvalgsgruppe?Angiv for alle delstakkeAngiv farve for forgrunden (F7)Skift-tasten blev holdt nede. Spring over automatisk synkronisering og indlæsning af udvidelsesmoduler.Skift position for eksisterende kortGenvej: %sGenvej: %sVis %sVis svarVis dubletterVis svartiderVis nye kort efter anmeldelseVis nye kort før gennemgangeVis nye kort i den rækkefølge de er tilføjetVis nye kort i tilfældig rækkefølgeVis næste anmeldelsestider over svarknapperneVis tilbageværende kortantal under anmeldelseVis statistik. Genvej %s.Størrelse:Nogle relaterede eller begravede kort blev udsat til en senere session.Nogle ændringer træder først i kraft efter du har genstartet Anki.Nogle opdateringer blev ignoreret, da notetypen er blevet ændret:Sorter feltSorter efter dette felt i browserenSortering i denne søjle er ikke understøttet. Vælg venligst en anden.Lyd & billederMellemrumStartposition:Sværhedsgrad ved startStatistikTrin:Trin (i minutter)Trin skal være tal.Fjern HTML når tekst indsættes%(a)s er gennemgået på %(b)s i dag.Studeret i dagStudereStudér stakStudér stak ...Gennemgå nuStudér kortene efter kortenes tilstand eller mærkeStilStiludformning (delt mellem kort)Sænket skrift (Ctrl+=)Supermemo XML-eksport (*.xml)Hævet skrift (Ctrl+Skift+=)SuspendérSuspender kortSuspender notatSuspenderetSynkroniser lyd og billeder ogsåSynkroniser med AnkiWeb. Genvej %sSynkroniserer medier...Synkronisering fejlede: %sSynkronisering fejlede; internettet er offline.Synkronisering kræver at uret i din computer er sat korrekt. Indstil uret og prøv igen.Synkroniserer...TabAfmærk dubletterMærkat kunMærkerMål-kortstak (Ctrl+D)Målfelt:TekstTekst separerede af tabulatorstop eller semikolon(*)Det kortsæt findes allerede.Det feltnavn er allerede brugt.Det navn er allerede brugt.Forbindelsen til AnkiWeb fik timeout. Check dine netværksindstillinger og prøv igen.Standardkonfigurationen kan ikke fjernes.Standardkortsættet kan ikke slettes.Delingen af kort i dine kortsæt.Det første felt er tomt.Det første felt af denne notetype skal være afbildet.Det følgende tegn kan ikke anvendes: %sForsiden af kortet er tom. Kør venligst Værktøjer>Tomme kortIkonerne blev indhentet fra forskellige kilder; se venligst Anki-kilden for at se bidragsydere.Det input du gav ville oprette et tom spørgsmål på alle kort.Antallet af spørgsmål du har svaret på.Antal af anmeldelser med frist i fremtiden.Antal gange du har trykket på hver knap.Tilladelserne for dit systems midlertidige mappe er ikke korrekt, og Anki er ikke i stand til at rette dem automatisk. Søg venligst efter 'temp folder' i Anki-manualen for mere information.Den leverede fil er ikke en gyldig .apkg-fil.Den foretagne søgning gav ingen match med kort. Ønsker du at tilpasse den?Den ønskede ændring ville kræve et fuld upload af databasen når du synkroniserer din samling næste gang. Hvis du har anmeldelser eller andre ændringer ventede på et andet apparat der ikke er synkroniseret endnu, vil ændringerne bliv mistet. Vil du fortsætte?Tiden du har taget om at svare på spørgsmålene.Opgraderingen er færdig, og du er klar til at start Anki 2.0

Herunder er en log fra opdateringen:

%s

Der er flere nye kort tilgængelige, men den daglige grænse er opbrugt. Du kan øge grænsen, men husk at jo flere kort du introducerer, jo højere bliver dit anmeldelsesarbejde også.Der skal mindst være én profil.Der kan ikke sorteres efter denne kolonne, men du kan søge efter individuelle korttyper, såsom 'kort:Kort1'.Der kan ikke sorteres efter denne kolonne, men du kan søge efter speficikke stakke ved at klikke på én til venstre.Dette ligner ikke en gyldig .apkg-fil. Hvis du får denne fejl fra en fil, der er hentet fra AnkiWeb, så mislykkedes hentningen sandsynligvis. Forsøg venligst igen, og hvis problemet fortsat er tilstede, så kan du forsøge igen med en anden browser.Denne fil findes. Er du sikker på at du vil overskrive den?Denne mappe lagrer alle dine Anki-data på ét enkelt sted, så det er nemmere at lave sikkerhedskopier. For at fortælle Anki at der skal anvendes en anden placering, se: %s Dette er en speciel stak til studier uden for den normale tidsplan.Dette er en {{c1::sample}} cloze-sletning.Dette vil slette din eksisterende samling og erstatte den med dataene i filen du importerer. Er du sikker?Denne guide vil hjælpe dig med at opgradere til Anki 2.0 For en nem opgradering, læs følgende sider. TidTidsboksgrænseTil gennemgangFor at gennemse tilføjelser, så klik knappen gennemse nedenfor.

Når du har fundet en tilføjelse du kan lide, så indsæt dens kode nedenfor.For at importere ind i en profil beskyttet af adgangskode, så åben profil forud for forsøg på import.For at lave en cloze-sletning på en eksisterende note, så skal du først ændre den til en cloze-type, via Redigér>Skift notetype.For at se dem med det samme, så klik knappen Grav frem igen, der er nedenfor.For at studere uden for den normale plan, så tryk på knappen Brugerdefineret studie nedenfor.I dagDagens anmeldelsesgrænse er nået, men der er stadig kort der venter på at blive anmeldt. for at optimere hukommelsen, overvej at øge den daglige grænse.IaltTid i altKort ialtNotater ialtFortolk inddata som regulære udtrykTypeSkriv svar: ukendt felt %sKan ikke importere fra en skrivebeskyttet fil.Grav frem igenUnderstreget tekst (Ctrl+U)FortrydFortryd %sUkendt filformatUlæstOpdatér eksisterende noter når første felt matchesOpdaterede %(a)d af %(b)d eksisterende noter.Opgradering færdigGuide til opgraderingOpgradererOpgraderer kortsæt %(a)s af %(b)s... %(c)sUploader til AnkiWebUploader til AnkiWeb...Anvendt i kort, men findes ikke i mediemappe:Bruger 1Version %sAfventer færdiggørelse af redigering.Advarsel, cloze-sletninger vil ikke fungere før du skifter typen i toppen til Cloze.VelkommenNår der tilføjes, så gå til nuværende stak som standardNår svar vises, så afspil både lydspørgsmål og -svar pånyNår du er klar til at opgradere, klik på commit knappen. Opgraderingsguiden Vil åbne i din browser med opgraderingen foretages. Læs venligst guiden omhyggeligt, der er sket mange forandringer iforhold til tidligere Anki versioner.Når dine kortsæt er opgraderede, vil Anki forsøge at kopiere lyd og billeder fra dine gamle kortsæt. Hvis du har brugt en tilpasset DropBox mappe eller tilpasset medie mappe, kan det være at opgraderingsprocessen ikke kan finde dit medie. Senere vil der blive vist en rapport om opgradering. Hvis du bemærker at dit medie ikke blev kopieret når det skulle have blevet det, se opgraderingsguiden for flere instruktioner.

AnkiWeb understøtter nu mediesynkronisering direkte uden speciel opsætning og medie bliver synkroniseret sammen med dine kort når du synkronisere med AnkiWeb.Hele samlingenVil du gerne downloade den nu?Skrevet af Damien Elmes, med patches, oversættelser, test og design fra:

%(cont)sDu har en notetype for cloze-sletning, men har ikke foretaget nogen cloze-sletninger. Fortsæt?Du har en masse stakke. Se venligst %(a)s. %(b)sDu har endnu ikke optaget din stemme endnu.Du skal have mindst en søjleUngUng+LærDine kortsætDine ændring til påvirke flere stakke. Hvis du blot ønsker at ændre den nuværende stak, så skal du først tilføje en ny tilvalgsgruppe.Din fil med samlingen ser ud til at være beskadiget. Dette kan hænde når filen kopieres eller flyttes, mens Anki er åben, eller når samlingen er gemt på et netværk eller skydrev. Se venligst i manualen for information om genskabelse fra en automatisk sikkerhedskopi.Din samling er i en inkonsistent tilstand. Kør venligst Værktøjer>Tjek database, og synkronisér dernæst påny.Din samling eller en mediefil er for stor til at blive synkroniseret.Overførslen af din samling til AnkiWeb blev gennemført. Hvis du bruger andre enheder, så synkronisér dem venligst nu, og vælg at hente samlingen du netop har overført fra denne maskine. Efter at have gjort dette, så vil fremtidige gennemgange og tilføjede kort blive flettet automatisk.Dine stakke her og de på AnkiWeb er forskellige på en måde, så de ikke kan flettes sammen - derfor er det nødvendigt at overskrive stakkene på den ene side med stakkene fra den anden. Hvis du vælger at hente, så vil Anki hente samlingen fra AnkiWeb, og enhver ændring du har foretaget på din maskine, siden sidste synkronisering til denne enhed, blive tabt. Når alle enheder er synkroniseret, så vil fremtidige gennemgange og tilføjede kort blive flettet automatisk.[ingen stak]Sikkerhedskopierkortkort fra stakkenkort udvalgt afsamlingddagekortsætlevetid på stakdublethjælpskjultimertimer efter midnatomgangeafbilledet til %safbilledet til MærkerminminuttermdAnmeldelsersekunderstatistikdenne sidewhele samlingen~anki-2.0.20+dfsg/locale/es/0000755000175000017500000000000012256137063015123 5ustar andreasandreasanki-2.0.20+dfsg/locale/es/LC_MESSAGES/0000755000175000017500000000000012065014110016671 5ustar andreasandreasanki-2.0.20+dfsg/locale/es/LC_MESSAGES/anki.mo0000644000175000017500000021727512252567245020212 0ustar andreasandreasP5GG G+G2G"8G[G ]GgGzG8GGGG"H$#H$HH&mHH"HHHH$I N(kNN!NNfNTO jOwO O OOOOOeOUP7P 7QAQ5TQXQYQ8=R vR RRR R RR R RR RSSS S$(SMS SS_S oS yS%SKSSN T"ZT}T#UUUU VVyWWRXvbXwX7QY YwYE Z@SZZZZRZ[[#[#[[ \+\(D\m\ u\\ \\\\ \ \\\\]4]G]N]c]Lk]]]]]]^ !^ +^)5^'_^^C_J_O_W_^_e_m_ _ _ __ ____ _3_,`S@```` ` ````a"a:aBa&Ra yaa aa a aaaaab- b;bAb(Gbpb5b bbb8b5 cPCc7ccc cc ddd "d-d>dEdLdSdZdadhdodvd}d d d d d d d d dddd e ee-e >eKe ^ekeeeeeee e e ff f/'fWf]frf%zff f f f f f f f f g,!g(Ngwgg gFgNgPJh>hPh+i4i]Ri i8ii i jj)4j^jzj~j jjjj j jjj j jjjk k!k7k=k)Lk0vkkk4k!kl+lAlWlplll lllllllll l lll mm 'm1m,:mgmymmmmmmmmm m m n#n(n?nEnLnno o%o7oQo Woeoto|oo ooo oo$oop pppp0p.6pFeppp p4p&q9q @q1Lq~qqqq*qq ss ss"s"t :t[tptutttt t t)ttu#u:uOumuuuuuu u uuuu<v=vFv LvYvivnv wv+vvv vvv v w w ww.w5wa i1t  ΃  ,K-b ˄҄ V+ ,LaG| Ć  '9Vt*'܇!&@,6m8 ݈!? JZ` p ~։    !+FNm ͊ ڊ *0A!Tdv ۋ *(/X rX+"3&V}0+ȍ>U3F*Ў(1$V,IA'{t#d(e8#C(r  .8au/MØ ə ՙ!'&NUmrz.&Ś &=O,g Uś$#8H(\"WS0e$"ޠ {w^x5ע U lv~  ˦զڦߦ*/7:BJ PZ\mop x &ũ ǩҩ? 8Yj---ݪ1 $=+b#'֫)( =7^ (۬($9,P}'.̭ (DHLPUY ] ky  Ȯ̮ Ӯݮ !#EVh x 7 !3UY !%)7ű:"8![}{1@] lwҳZ@ T_Grgt"A ٶ 'B^s · ̷'ڷ 0@5QcX`E~+ĺ %3kN0 ZYl  UF!%,<$Z!6 !BU]{$ "_- + *<73t * .GYm<a ^j r| ) !,.Bq )9 Xc/h0 A6@`w4! / 8CZah oz    ,9@G N Yg}  ! *>(Ens 1 7T ]j | 32*%]$ @IW=?k A$Ljq M7@Pe.y  *@ G Q _k $2Vp[4*,Gt "'8?FU nxN .@X lv  & +@H]l~ " &3,M`%'EVr{A5.7E}`%|/2'*?j   HD\z"# !)9Hc!lD   ) 3A?    '08J `k}!4IRV]m #*D!d<&/3 8 C P]^u& 4GLO?o4~HN]ox !!&) P]{) ./,A6noHi^"0!R7e34D" g q~*; $>FOox    9 I&T{ '1@Q jv* ?&!6!Xz*4O"Wz & #i# @4u`,< O Ydv!/,,&5G\:) T;hL*F+r !;J Sar/& (2D S0_+7.  .24g*{!c5,+b-:+ZAaS+R.~37I;,@m!k ou :* @ $# xH  b g   f@  >+ aj     )(9QYl u B-6 R*_9  &Q' y>Q!9TZW0%%. CMBV ~    19Njowz  7,\"w~%Z', zq% UN>.`=7X3D 8b7iJb!"+Qm!P,x}Mh|n${@)PO<w@+ElY9hn}Z0f&S@W<^I[a#82^gG-xS41X*G`; _W)FL(Vb]vI<W\Du8T5)Ft(OdcLKOo{?_R p++<%24yvUC 6Er n4(AF-IEz$ti?)P3tJ6*!jXe 'jB6Tk A;] d"YG8eCi3r KrJ spDZ.dNC!:|zI-]H1uxo/#h=CB . LB"N*up0HqBDw55#/?;s9[>~5F:$K:mky#: ^&?M$VQm%{gja;2'9=U9_}YEcHJo\v`T RLesH(QM0fyM  c=7*/0&4 13fkSlg-[.VR/~a1A2|>,AK  qOP '@6l&NG>  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: Anki 0.9.7.7 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-10-27 00:36+0000 Last-Translator: Tonil Megaton Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) X-Poedit-Country: SPAIN Language: es X-Poedit-Language: Spanish Parar (1 de %d) (desactivado) (activado) Tiene %d tarjeta. Tiene %d tarjetas.%% Aciertos%(a)0.1f %(b)s/día%(a)0.1fs (%(b)s)%(a)d de %(b)d nota traducida%(a)d de %(b)d notas actualizadas%(a)dkB subidos, %(b)dkB bajados%(tot)s %(unit)s%d tarjeta%d tarjetas%d tarjeta eliminada.%d tarjetas eliminadas.%d tarjeta exportada.%d tarjetas exportadas.%d tarjeta importada.%d tarjetas importadas.%d tarjeta estudiada en%d tarjetas estudiadas en%d tarjeta/minuto%d tarjetas/minuto%d mazo actualizado.%d mazos actualizados.%d grupo%d grupos%d nota%d notas%d nota añadida%d notas añadidas%d nota importada.%d notas importadas.%d nota actualizada%d notas actualizadas%d repaso%d repasos%d seleccionada%d seleccionadas%s ya existe en tu escritorio. ¿Deseas sobrescribirlo?Copia de %s%s día%s days%s día%s días%s eliminadas.%s hora%s horas%s hora%s horas%s minuto%s minutos%s minuto.%s minutos.%s minuto%s minutos%s mes%s meses%s mes%s meses%s segundo%s segundos%s segundo%s segundos%s a eliminar:%s año%s años%s año%s años%sd%sh%sm%smo%ss%sy&Acerca de...&Complementos&Comprobar Base de Datos...&Empollar...&Editar&Exportar...&Archivo&Buscar&Ir&Guía&Guía...&Ayuda&Importar&Importar...&Invertir Selección&Siguiente Tarjeta&Abrir carpeta de complementos...&Preferencias...&Tarjeta Anterior&Reprogramar...&Donar...&Cambiar perfil...&Herramientas&Deshacer'%(row)s' tenía %(num1)d campos, se esperaban %(num2)d(%s correctas)(fin)(filtrada)(aprendizaje)(nueva)(límite precursor: %d)(por favor, selecciona 1 tarjeta)…Los archivos .anki2 no son diseñados para importación. Si está intentando restaurar de una copia de seguridad, vea la sección 'Backups' del manual de usuario./0d1 101 mes1 año10AM10PM3AM4AM4PMRecibido un error 504 de tiempo de espera agotado para la puerta de enlace. Por favor, intenta desactivar temporalmente tu antivirus.: y%d tarjeta%d tarjetasAbrir carpeta de copias de seguridadVisitar sitio web%(pct)d%% (%(x)s de %(y)s)%Y-%m-%d @ %H:%MCopias de seguridad
Anki creará una copia de seguridad de tu colección cada vez que sea cerrada o sincronizada.Formato de exportación:Buscar:Tamaño de la Fuente:Fuente:En:Incluir:Tamaño de la Línea:Reemplazar Con:SincronizaciónSincronización
Actualmente no está activada; haz clic en el botón de sincronizar en la pantalla principal para activarla.

Se requiere una cuenta

Se requiere una cuenta gratuita para mantener tu colección sincronizada. Por favor, regístrate e introduce tus detalles aquí debajo.

Actualización de Anki

Anki %s está disponible.

Mi más sincero agradecimiento a todos los que han hecho sugerencias, informes de errores y donaciones.La facilidad de una tarjeta es el tamaño del intervalo siguiente cuando tu respuesta es "bien" en un repaso.Un archivo llamado collection.apkg fue guardado en tu escritorio.Abortada: %sAcerca de AnkiAñadirAñadir (atajo: ctrl+enter)Añadir campoAñadir archivos de mediosAñadir Nuevo Mazo (Ctrl+N)Añadir tipo de notaAñadir ReversoAñadir etiquetasAñadir nueva tarjetaAñadir a:Añadir: %sAñadidasAñadidas hoyAñadida duplicada con primer campo: %sOtra vezOlvidadas HoyCuenta de Otra Vez: %sTodos los MazosTodos los CamposTodas las tarjetas en orden aleatorio (modo empollar)Todas las tarjetas, notas, y archivos multimedia de este perfil serán eliminados. ¿Estás seguro?Permitir HTML en los camposOcurrió un error en un complemento
Repórtalo en el foro de complementos:
%s
Ocurrió un error al abrir %sOcurrió un error. Puede haber sido causado por un error inofensivo,
o bien puede que tu mazo tenga un problema.

Para confirmar que no es un problema con tu mazo, ejecuta Herramientas > Comprobar Base de Datos.

Si esto no soluciona el problema, por favor, copia lo que sigue
en un informe de errores:Se ha guardado una imagen en tu escritorio.AnkiAnki 1.2 Deck (*.anki)Anki 2 almacena tu mazos en un nuevo formato. Este asistente convertirá automáticamente tus mazos a este formato. Se hará una copia de seguridad de tus mazos antes de la actualización, de modo que si necesitas volver a la versión anterior de Anki, podrás seguir usándolos.Anki 2.0 DeckAnki 2.0 sólo soporta la actualización automática desde Anki 1.2. Para cargar mazos antiguos, por favor, ábrelos en Anki 1.2 para actualizarlos, y luego impórtalos a Anki 2.0.Paquete de Mazos AnkiAnki no pudo encontrar la línea de separación entre la pregunta y la respuesta. Por favor, ajusta la plantilla manualmente para intercambiar la pregunta y la respuesta.Anki es un sistema de aprendizaje espaciado inteligente y fácil de usar. Es gratuito y de código abierto.Anki está licenciado bajo la licencia AGPL3. Consulta el archivo de la licencia en la distribución fuente para más información.Anki no fue capaz de cargar tu antiguo archivo config. Por favor, utiliza Archivo>Importar para importar tus mazos desde versiones anteriores de Anki.La ID AnkiWeb o la contraseña son incorrectas; por favor, inténtalo de nuevoAnkiWeb ID:AnkiWeb ha encontrado un error. Vuelve a intentarlo en unos minutos, y si el problema persiste, por favor envíe un informe de error.AnkiWeb está demasiado concurrido en estos momentos. Vuelve a intentarlo en unos minutos.AnkiWeb está en estado de mantenimiento. Por favor, vuelve a intentarlo en unos minutos.RespuestaBotones de RespuestaRespuestasUn antivirus o un software cortafuegos está evitando que Anki se conecte a Internet.Las tarjetas asignadas a nada se eliminarán. Si una nota no tiene cartas restantes, se perderán. ¿Seguro que desea continuar?Apareció doble en el archivo: %s¿Está seguro que desea eliminar %s?Se requiere como mínimo un tipo de tarjeta.Se requiere al menos un paso.Adjuntar imágenes/audio/vídeo (F3)Reproducir audio automáticamenteSincronizar automáticamente al abrir/cerrar el perfilPromedioTiempo promedioTiempo de respuesta promedioFacilidad promedioPromedio en los días estudiadosIntervalo promedioReversoPrevisualización del ReversoPlantilla de ReversoCopias de seguridadBásicoBásico (y tarjeta invertida)Básico (tarjeta invertida opcional)Negrita (Ctrl+B)ExplorarExaminar && Instalar...ExploradorExplorador (%(cur)d tarjeta mostrada; %(sel)s)Explorador (%(cur)d tarjetas mostradas; %(sel)s)Apariencia del ExploradorOpciones del ExploradorConstruirAñadir Etiquetas en bloque (Ctrl+Mayús+T)Eliminar Etiquetas en bloqueOcultarOcultar TarjetaOcultar NotaOcultar tarjetas nuevas relacionadas hasta el día siguienteOcultar repasos relacionados hasta el siguiente diaPor defecto, Anki detectará el carácter entre campos, como una marca de tabulación, una coma o similares. Si Anki detecta el carácter incorrectamente, puedes introducirlo aquí. Usa \t para representar una marca de tabulación.CancelarTarjetaTarjeta %dTarjeta 1Tarjeta 2ID de tarjetaInformación de la Tarjeta (Ctrl+Mayús+I)Lista de TarjetasTipo de TarjetaTipos de TarjetasTipos de Tarjeta para %sTarjeta ocultada.Tarjeta suspendida.La tarjeta era una sanguijuela.TarjetasTipos de TarjetaNo es posible mover tarjetas manualmente a un mazo filtrado.Tarjetas en Texto PlanoLas tarjetas serán devueltas automáticamente a sus mazos originales una vez las hayas repasado.Tarjetas...CentrarModificarModificar %s a:Cambiar mazoCambiar Tipo de NotaCambiar Tipo de Nota (Ctrl+N)Cambiar Tipo de Nota...Cambiar color (F8)Cambiar mazo en función del tipo de notaModificadaComprobar &MultimediaComprobar archivos en el directorio multimediaComprobando…SeleccioneElegir MazoElegir Tipo de NotaElige las EtiquetasClon: %sCerrar¿Cerrar y perder la información actual?ClozeHueco (Ctrl+Mayús+C)Código:La coleccion esta dañada. Por favor, consulte el manual.Dos puntosComaConfigurar idioma de la interfaz y las opcionesConfirme contraseña:¡Enhorabuena! Has finalizado este mazo por hoy.Conectando...ContinuarCopiarRespuestas correctas en tarjetas maduras: %(a)d/%(b)d (%(c).1f%%)Aciertos: %(pct)0.2f%%
(%(good)d de %(tot)d)No se pudo conectar con AnkiWeb. Por favor, comprueba tu conexión de red y vuelve a intentarlo.No se pudo grabar audio. ¿Has instalado lame y sox?No se pudo guardar el archivo: %sEmpollarCrear MazoCrear Mazo Filtrado...CreadaCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZAcumuladas%s AcumuladosRespuestas AcumuladasTarjetas acumuladasMazo ActualTipo de nota actual:Estudio PersonalizadoSesión de Estudio PersonalizadaPasos personalizados (en minutos)Personalizar Tarjetas (Ctrl+L)Personalizar CamposCortarBase de datos reconstruida y optimizada.DataDías estudiadosDesautorizarConsola de depuraciónMazoMazo PreferenteEl mazo será importado cuando se abra un perfil.MazosIntervalos decrecientesPredeterminadoAplazamiento hasta que los repasos se muestran de nuevoEliminar¿Borrar %s?Eliminar TarjetasEliminar MazoEliminar VacíasEliminar notaEliminar NotasEliminar EtiquetasEliminar No Usados¿Eliminar campo de %s?¿Eliminar el tipo de tarjeta '%(a)s', y sus %(b)s?¿Eliminar este tipo de nota y todas sus tarjetas?¿Eliminar ese tipo de nota sin usar?¿Eliminar archivos media no usados?Borrar...Eliminadas %d tarjeta sin nota.Eliminadas %d tarjetas sin nota.Eliminada %d tarjeta sin plantilla.Eliminadas %d tarjetas sin plantilla.Eliminada %d nota con tipo de nota ausenteEliminadas %d notas con tipo de nota ausenteEliminada %d nota sin tarjetasEliminadas %d notas sin tarjetasEliminada %d nota con una cuenta de campos errónea.Eliminadas %d notas con una cuenta de campos errónea.Eliminado.Eliminado. Por favor, reinicia Anki.Al eliminar este mazo de la lista de mazos se devolverán todas las tarjetas restantes a su mazo original.DescripciónDescripción a mostrar en la pantalla de estudio (sólo para el mazo actual):DiálogoDescartar campoDescarga fallida: %sBajar desde AnkiWebDescarga completada. Por favor, reinicia Anki.Descargando desde AnkiWeb...ProgramadasSólo tarjetas programadasProgramadas mañanaS&alirFacilidadFácilBonus para FácilIntervalo para FácilEditarEditar %sEditar ActualEditar HTMLEditar para personalizarEditar…EditadoEditando fuenteEdiciónes guardadas. Reinicie Anki.VaciarTarjetas Vacías...Números de tarjetas vacias: %(c)s Campos: %(f)s Se han encontrado tarjetas vacías. Por favor, accede a Herramientas>Tarjetas Vacías.Primer campo vacio: %sFinIntroduce el mazo en el que quieras colocar las %s tarjetas nuevas, o deja el campo vacío:Introduce la nueva posición de la tarjeta (1...%s):Introduzca las etiquetas que se añadiran:Introduzca las etiquetas que se eliminarán:Error descargando: %sError al iniciar: %sError al ejecutar %s.Error ejecutando %sExportarExportar...ExtraFF1F3F5F7F8El campo %d del archivo es:Asignar camposNombre de Campo:Campo:CamposCampos para %sCampos separados por: %sCampos...Fil&trosEl archivo no es válido. Por favor, restáuralo desde una copia de seguridad.No se encontró el archivo.FiltrarFiltrar:FiltradasMazo Filtrado %dBuscar &Duplicadas...Buscar DuplicadasBuscar y Re&emplazar...Buscar y reemplazarFinalizarPrimera TarjetaPrimer repasoPrimer campo coincidente: %sInvertirLa carpeta ya existe.Fuente:Pie de páginaPor razones de seguridad, no se permite '%s' en las tarjetas. Puedes seguir usándolo insertando el comando en un paquete distinto, e importando ese paquete en la cabecera LaTeX.PronósticoFormularioAnverso y Reverso OpcionalAnverso y ReversoEncontradas %(a)s a lo largo de %(b)s.AnversoPrevisualización del AnversoPlantilla de AnversoGeneralArchivo generado: %sGenerado en %sMazos CompartidosBienIntervalo para pasarEditor HTMLDifícil¿Has instalado ya latex y dvipng?EncabezadoAyudaFacilidad más altaHistoriaCarpeta de inicioDistribución HorariaHorasLas horas con menos de 30 repasos no son mostradas.Si ha contribuido y no está en esta lista, por favor, contacte con nosotros.Si hubieses estudiado todos los díasIgnorar tiempos de respuesta mayores deIgnorar mayúsculasIgnorar líneas donde el primer campo coincida con una nota existenteIgnorar esta actualizaciónImportarImportar archivoImportar aún cuando exista alguna nota con el mismo primer campoImportación errónea. La importación falló. Información de depuración: Importar opcionesImportación completa.En el archivo multimedia pero no incluído en tarjetas:Para asegurar que tu colección funcione correctamente al ser transferida entre dispositivos, Anki necesita que el reloj interno de tu ordenador esté ajustado correctamente. El reloj interno puede estar mal ajustado aunque tu sistema muestre correctamente la hora local. Por favor, accede a los ajustes horarios en tu ordenador y comprueba lo siguiente: - AM/PM - Desviación del reloj - Día, mes y año - Zona horaria - Horario de verano Diferencia con el tiempo correcto: %s.Incluir archivos multimediaIncluir información de programaciónIncluir etiquetasAumentar el límite de tarjetas nuevas para hoyAumentar el límite de tarjetas nuevas para hoy enAumentar el límite de repasos para hoyAumentar el límite de repasos para hoy enIntervalos crecientesInformaciónInstalar ComplementoIdioma de la interfaz:IntervaloModificador de intervaloIntervalosCódigo no válido.Archivo no válido. Por favor, restáuralo desde una copia de seguridad.Contraseña no válida.Expresión regular incorrectaHa sido suspendida.Itálica (Ctrl+I)Error JS en la línea %(a)d: %(b)sSaltar a etiquetas con Ctrl+Mayus+TConservarLaTeXEcuación LaTeXEntorno matemático LaTeXOlvidosÚltima TarjetaÚltimo repasoÚltimas añadidas primeroAprenderLímite al estudio por adelantadoAprender: %(a)s, Repasar: %(b)s, Reaprender: %(c)s, Filtradas: %(d)sAprendiendoSanguijuelasAcción para SanguijuelasUmbral para SanguijuelasIzquierdaLimitar aCargando...Bloquea la cuenta con una contraseña, o deja el campo en blanco:Intervalo más largoBuscar en el campo:Facilidad más bajaAdministrarAdministrar Tipos de Nota...Asignar a %sAsignar a EtiquetasMarcarMarcar NotaMarcar NotaMarcadasMadurasIntervalo máximoRepasos máximos/díaMultimediaIntervalo mínimoMinutosMezclar tarjetas nuevas y repasosMnemosyne 2.0 Deck (*.db)MásMás veces olvidadasMover TarjetasMover al Mazo (Ctrl+D)Mover tarjetas al mazo:N&otaEl nombre ya existe.Nombre para el mazo:Nómbre:RedNuevasTarjetas nuevasTarjetas nuevas en el mazo: %sSólo tarjetas nuevasTarjetas nuevas/díaNombre del nuevo mazo:Intervalo para nuevasNombre nuevo:Nuevo tipo de nota:Nombre del nuevo grupo de opciones:Nueva posición (1...%d):El siguiente día empieza a lasAún no hay tarjetas programadas.Ninguna tarjeta coincide con los criterios que has indicado.No hay tarjetas vacías.Hoy no se estudiaron tarjetas maduras.No se encontraron archivos perdidos o sin usar.NotaID de notaTipo de notaTipos de NotaLa nota y su única tarjeta ha sido eliminada.La nota y sus %d tarjetas han sido eliminadas.La nota ha sido enterrada.La nota ha sido suspendida.Nota: Los archivos multimedia no son respaldados. Por favor, haz copias de seguridad de tu carpeta Anki periódicamente para que esté segura.Nota: Falta parte de la historia. Para más información, consulta la documentación sobre el explorador de tarjetas.Notas en Texto PlanoLas notas requieren al menos un campo.Notas etiquetadas.NadaOKMas tiempo sin repasar, primeroForzar cambios en una dirección en la próxima sincronizaciónUna o mas notas no fueron importadas, porque no generaron ninguna tarjeta. Esto puede ocurrir cuando tienes campos vacíos, o cuando no has asociado el contenido del archivo de texto a los campos correctos.Sólo las tarjetas nuevas pueden ser reposicionadas.Sólo un cliente puede acceder AnkiWeb al mismo tiempo. Si una sincronización anterior falló, por favor, vuelve a intentarlo pasados unos minutos.AbrirOptimizando...Límite opcional:OpcionesOpciones para %sGrupo de opciones:Opciones…OrdenOrden añadidoOrden de programadasReemplazar plantilla del reverso:Reemplazar fuente:Reemplazar plantilla del anverso:Mazo de Anki Comprimido (*.apkg *.zip)Contraseña:Las contraseñas no coincidenPegarPegar imágenes del portapapeles como PNGLección Pauker 1.8 (*.pau.gz)PorcentajePeríodo: %sColocar al final de la cola de tarjetas nuevasColocar en cola de repaso con intervalos entre:Por favor, añade primero otro tipo de nota.Por favor, ten paciencia; esto puede tardar un tiempo.Por favor, conecta un micrófono, y asegúrate de que otros programas no estén usando el dispositivo de audio.Por favor, modifique esta nota y agregue algunas supresiones cloze. (%s)Por favor, asegúrate de que hay un perfil abierto y de que Anki no está ocupado, y vuelve a intentarlo.Por favor, instala PyAudioPor favor, instala mplayerPor favor, primero abre un perfil.Por favor, ejecuta Herramientas>Tarjetas VacíasSelecciona un mazoPor favor, selecciona tarjetas de un solo tipo de nota.Por favor, selecciona algo.Por favor, actualiza a la última versión de Anki.Use Archivo ▸ Importar para importar este archivo.Por favor, visita AnkiWeb, actualiza tu mazo, y vuelve a intentarlo.PosiciónPreferenciasPrevisualizaciónPrevisualizar la Tarjeta Seleccionada (%s)Previsualizar tarjetas nuevas.Previsualizar las tarjetas nuevas añadidas en los últimosProcesando...Contraseña del Perfil...Perfil:PerfilesAutenticación proxy requerida.PreguntaÚltima de la cola: %dPrimera de la cola: %dSalirAleatorioOrden aleatorioValoraciónListo para ActualizarReconstruirGrabar mi propia vozGrabar sonido (F4)Grabando...
Tiempo: %0.1fAtraso relativoReaprenderRecordar la última entrada al añadirEliminar etiquetasBorrar formatos (Ctrl+R)Eliminar este tipo de tarjeta supondría la eliminación de una o más notas. Por favor, crea primero un nuevo tipo de tarjeta.RenombrarRenombrar MazoReproducir AudioReproducir mi propia vozReposiciónReposicionar Tarjetas NuevasReposicionar...Se requiere una o más de estas etiquetas:ReprogramarReprogramarReprogramar tarjetas en función de mis respuestas en este mazoContinuar AhoraDirección inversa de texto (RTL)Revertido a estado previo a '%s'.RepasarNúmero de repasosTiempo de repasoRepasar por adelantadoRepasar por adelantadoRepasar tarjetas olvidadas en los últimosRepasar tarjetas olvidadasPorcentaje de repasos correctos a lo largo del día.RepasosRepasos programados en el mazo: %sDerechaGuardar la imagenÁmbito: %sBuscarBuscar en elementos de formato (lento)SeleccionarSeleccionar &TodoSeleccionar &NotasSelecciona las etiquetas a excluir:El archivo seleccionado no estaba en formato UTF-8. Por favor, lee la sección "importación" del manual.Estudio SelectivoPunto y comaServidor no encontrado. O bien tu conexión está caída, o bien tu antivirus/firewall está impidiendo que Anki se conecte a Internet.¿Asignar este grupo de opciones a todos los mazos debajo de %s?Asignar a todos los submazosAplicar color al texto (F7)La tecla Mayus estaba presionada. Omitiendo sincronización automática y carga de complementos.Cambiar posición de las tarjetas existentesTecla de atajo: %sAtajo: %sMostrar %sMostrar RespuestaMostrar duplicadosMostrar temporizador de respuestaMostrar tarjetas nuevas después de los repasosMostrar tarjetas nuevas antes de los repasosMostrar tarjetas nuevas en el orden añadidoMostrar tarjetas nuevas aleatoriamenteMostrar intervalo de próximo repaso encima de los botones de respuestaMostrar el número de tarjetas restantes durante el repasoMostrar estadísticas. Tecla de atajo: %sTamaño:Algunas tarjetas relacionadas o enterradas fueron aplazadas a una sesión posterior.Algunos ajustes tendrán efecto después de reiniciar Anki.Algunas actualizaciones fueron ignoradas porque el tipo de nota ha cambiado:Campo OrdenadoOrdenar según este campo en el exploradorNo es posible cambiar el orden en esta columna. Por favor, elige otra.Sonidos e ImágenesEspacioPosición de comienzo:Facilidad inicialEstadísticasPaso:Pasos (en minutos)Los pasos deben ser números.Eliminar HTML al pegar textoHoy has estudiado %(a)s en %(b)s.Estudiadas HoyEstudiarEstudiar MazoEstudiar Mazo...Comenzar a EstudiarEstudiar según estado o etiqueta de la tarjetaEstiloEstilo (compartido entre las tarjetas)Subíndice (Ctrl+=)Supermemo XML (*.xml)Superíndice (Ctrl+May+=)SuspenderSuspender TarjetaSuspender NotaSuspendidasSincronizar también los sonidos y las imágenesSincronizar con AnkiWeb. Tecla de atajo: %sSincronizando Multimedia...La sincronización falló: %sLa sincronización falló; no hay conexión a Internet.La sincronización requiere que el reloj de tu ordenador esté correctamente ajustado. Por favor, ajusta el reloj e inténtalo de nuevo.Sincronizando...TabulaciónEtiquetar DuplicadasSólo EtiquetarEtiquetasMazo de destino (Ctrl+D)Campo de destino:TextoTexto separado por tabulaciones o punto y coma (*)Este mazo ya existeEse nombre de campo ya está siendo usado.Ese nombre ya está siendo usado.La conexión a AnkiWeb ha expirado. Por favor, comprueba tu conexión de red e inténtalo de nuevo.La configuración por defecto no puede ser eliminada.El mazo por defecto no puede ser eliminado.El desglose de las tarjetas en tu(s) mazo(s).El primer campo está vacío.El primer campo del tipo de nota debe ser asignado a algo.No se puede usar el siguiente carácter: %sEl anverso de esta tarjeta está vacío. Por favor, ejecuta Herramientas>Tarjetas Vacías.Los iconos se obtuvieron de distintas fuentes; mira el código fuente de Anki para los créditos.La entrada que has realizado produciría una pregunta vacía en todas las tarjetas.El número de preguntas que has respondido.El número de repasos programados en el futuroEl número de veces que has presionado cada botón.Los permisos en la carpeta de archivos temporales de tu sistema son incorrectos, y Anki no puede corregirlos automáticamente. Por favor, busca "temp folder" (en inglés) en el manual de Anki para más información.El archivo proporcionado no es un archivo .apkg valido.La búsqueda solicitada no devolvió ninguna tarjeta. ¿Deseas revisarla?El cambio solicitado hará necesaria una subida completa de la base de datos la próxima vez que sincronices tu colección. Si tienes repasos u otros cambios pendientes en otro dispositivo que no hayan sido sincronizados aún, se perderán. ¿Deseas continuar?El tiempo tomado en responder las preguntas.La actualización se ha completado, y ya puedes comenzar a usar Anki 2.0

Aquí tienes el registro de la actualización:

%s

Hay más tarjetas nuevas disponibles, pero has alcanzado el límite diario. Puedes aumentar el límite en las opciones, pero ten en cuenta que cuantas más tarjetas nuevas introduzcas, más aumentará tu carga de trabajo a corto plazo.Debe de haber al menos un perfil.Esta columna no se puede ordenar, pero puedes buscar tipos de tarjetas individuales, como 'card:Tarjeta 1'.Esta columna no puede ser ordenada, pero puedes buscar mazos específicos haciendo clic en uno en la izquierda.Este archivo no parece ser un archivo .apkg válido. Si estás obteniendo este error con un archivo descargado desde AnkiWeb, es posible que tu descarga haya fallado. Por favor, vuelve a intentarlo, y si el problema continua, vuelve a intentarlo con otro navegador.Este archivo ya existe. ¿Seguro que desea sobrescribirlo?Esta carpeta almacena todos tus datos en una ubicación única, para facilitar las copias de seguridad. Para indicar a Anki que use una ubicación diferente, por favor, consulta: %s Este es un mazo especial para estudiar fuera del horario normal.Este es un {{c1::ejemplo}} de hueco.Esto eliminará tu colección actual y la reemplazará con los datos del archivo que estás importando. ¿Estás seguro?Este asistente te guiará a lo largo del proceso de actualización de Anki 2.0. Para evitar inconvenientes, por favor, lee atentamente las siguientes páginas. HoraLímite de sesión de estudioA repasarPara explorar complementos, haz clic en el botón Explorar aquí debajo.

Cuando hayas encontrado un complemento que te interese, por favor, pega su código aquí debajo.Para importar a un perfil protegido por contraseña, abre el perfil antes de intentar la importación.Para crear huecos en una nota existente, primero debes cambiarla a un tipo de nota de huecos, mediante Editar>Cambiar Tipo de Nota.Para verlas ahora, haz clic en el botón Mostrar aquí debajo.Para estudiar fuera del horario normal, haz clic en el botón Estudio Personalizado aquí debajo.HoyHas alcanzado el límite actual de repasos, pero todavía hay tarjetas a la espera de ser repasadas. Para una memorización óptima, considera aumentar el límite diario en las opciones.TotalTiempo totalTarjetas totalesNotas totalesTratar inserción como expresión regularTipoEscribir respuesta: campo desconocido %sNo es posible importar desde un archivo de sólo lectura.MostrarSubrayado (Ctrl+U)DeshacerDeshacer %sFormato de archivo desconocido.No vistasActualizar las tarjetas existentes cuando el primer campo coincidaActualizadas %(a)d de %(b)d notas existentes.Actualización completadaAsistente de ActualizaciónActualizandoActualizando mazos %(a)s de %(b)s... %(c)sSubir a AnkiWebSubiendo a AnkiWeb...Faltan en el archivo multimedia pero se usan en tarjetas:Usuario 1Versión %sEsperando a que finalices la edición.Cuidado, los huecos no funcionarán a menos que cambies el tipo de nota a Huecos.Bienvenido/aAl añadir, hacerlo en el mazo actual de manera predeterminadaCuando se muestre la respuesta, reproducir el audio de la pregunta y la respuestaCuando estés listo para actualizar, haz clic en el botón de envío para continuar. La guía de actualización se abrirá en tu navegador mientras se lleva a cabo la actualización. Por favor, léela detenidamente, ya que han cambiado muchas cosas respecto a la versión anterior de Anki.Cuando tus mazos hayan sido actualizados, Anki intentará copiar todos los sonidos e imágenes de los mazos antiguos. Si estabas utilizando una carpeta de Dropbox o una carpeta media personalizada, puede que el proceso de actualización no pueda localizar tus archivos multimedia. Al acabar, se te presentará un informe de la actualización. Si ves que los archivos media no han sido copiados donde deberían, por favor, consulta la guía de actualización para más instrucciones.

AnkiWeb ahora soporta sincronización media directa. No se requiere instalación, y los archivos media serán sincronizados junto con tus tarjetas cuando sincronices con AnkiWeb.Colección Entera¿Desea descargarlo ahora?Escrito por Damien Elmes, con parches, traducción, pruebas y diseño de:%(cont)sTienes un tipo de nota de huecos pero no has insertado ningún hueco. ¿Quieres continuar?Tienes muchos mazos. Por favor, lee %(a)s. %(b)sAún no has grabado tu voz.Tiene que haber al menos una columna.JóvenesJóvenes+AprendiendoTus MazosTus cambios afectarán a varios mazos. Si deseas cambiar únicamente el mazo actual, añade primero un nuevo grupo de opciones.Tu archivo de colección aparece como corrupto. Esto puede ocurrir cuando el archivo es copiado o movido mientras Anki está abierto, o cuando la colección es almacenada en una unidad de red o en la nube. Por favor, lee el manual para encontrar información sobre cómo restaurar desde una copia de seguridad automática.Tu colección está en un estado inconsistente. Por favor, ejecuta Herramientas>Comprobar Base de Datos, y sincroniza de nuevo.Tu colección, o uno de tus archivos media, es demasiado grande para ser sincronizado.Tu colección fue subida con éxito a AnkiWeb. Si utilizas otros dispositivos, sincronízalos ahora, y elige descargar la colección que acabas de subir desde este ordenador. Después de esto, los repasos futuros y tarjetas añadidas serán combinados automáticamente.Tus mazos aquí y en AnkiWeb difieren de tal manera que no pueden ser combinados, por lo que es necesario sobrescribir los mazos de un lado con los del otro. Si eliges descargar, Anki descargará la colección desde AnkiWeb, y se perderá cualquier cambio que hayas hecho en tu ordenador desde la última sincronización. Si eliges subir, Anki subirá tu colección a AnkiWeb, y se perderá cualquier cambio que hayas hecho en AnkiWeb o en tus otros dispositivos desde la última sincronización. Después de que todos los dispositivos se hayan sincronizado, los futuros repasos y las tarjetas añadidas podrán ser combinados automáticamente.[sin baraja]copias de respaldotarjetastarjetas del mazotarjetas seleccionadas porcolecciónddíasmazovida del mazoduplicadasayudaocultarhorashoras pasada medianocheolvidosasignado a %sasignado a Etiquetasminsminutosmorepasossegundosestadísticasesta páginawtoda la colección~anki-2.0.20+dfsg/locale/bg/0000755000175000017500000000000012256137063015104 5ustar andreasandreasanki-2.0.20+dfsg/locale/bg/LC_MESSAGES/0000755000175000017500000000000012065014110016652 5ustar andreasandreasanki-2.0.20+dfsg/locale/bg/LC_MESSAGES/anki.mo0000644000175000017500000002251512252567245020162 0ustar andreasandreassL   8   # 2 C X k                   + ; J Y j }     (  f N d q    e 7? w X     !,1R)7| wE8~ (' ,6=BIP Vdkry   $ ).6> C M Ygou 0;a=#!#?c  - HT#d7- < ]~  Q2N4/)Fp (#'Mi_s.$  # (IZ NZI 7 i!Xm!n!5"Q" `"$k"%"=" " " ##&#5#K#R#Y#`# g#t#{###### #&#$$3:$ n$y$+$ $ $$$ $$%-%>%UfWP&/7RN*LZX+Gr=@m#]ajHOF;>Y(2l\ B 0Q oq.sC?e-_ TDdk43pM<8Kb9 `n'!, JS)[g6:5E^hVAi1"%$Ic Stop%%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%d selected%d selected%s copy%s day%s days%s hour%s hours%s minute%s minutes%s month%s months%s second%s seconds%s year%s years%sd%sh%sm%ss%sy&About...&Add-ons&Cram...&Edit&File&Find&Go&Guide&Guide...&Help&Import&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo(new)1 month1 yearOpen backup folderVisit websiteBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.About AnkiAddAdd (shortcut: ctrl+enter)Add TagsAdd: %sAddedAgainAll FieldsAnkiAnki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki is a friendly, intelligent spaced learning system. It's free and open source.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeBackupsBrowseBrowserBrowser OptionsBuryBury NoteCancelCardCenterChangeCloseConnecting...Ctrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZDeleteDueEditExportExport...F1FieldsFind and ReplaceHTML EditorHave you installed latex and dvipng?HelpImportInvalid regular expression.LeftNetworkNothingOpenPassword:PreferencesProcessing...ReviewsRightProject-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-21 19:39+0000 Last-Translator: Bozhkov Language-Team: Bulgarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:43+0000 X-Generator: Launchpad (build 16869) Language: bg Спри%%(a)d от %(b)d бележка обновена%(a)d от %(b)d бележки обновени%d избрани%d избрани%s копиране%s ден%s дни%s час%s часа%s минута%s минути%s месец%s месеци%s секунда%s секунди%s година%s години%sd%sh%sm%ss%sy&За програмата...&Добавки&Зубрене&Редактиране&Файл&Търсене&Напред&Ръководство&Ръководство...&Помощ&Внасяне&Обръщане на избора&Следваща карта&Отваряне на папката с добавки&Настройки&Предишна картаПромяна на &разписаниетоПодпомагане на Anki&Превключи Профил&Инструменти&Отмяна(нов)1 месец1 годинаa href="бекъп">Отваряне на бекъп директориятаПосетете уебсайтаРезервни копия
ще бъдат създадени от всеки път, когато затворите или синхронизирате Anki.Експортиране във формат:Търсене:Големина на шрифтаШрифт:В:Размер на линиите:Замени с:СинхронизиранеСинхронизиране

Anki беше обновен

Anki %s беше издаден.

<игнорирано>Много благодарности към всички хора, които помогнаха с предложения, докладваха проблеми и допринесоха с парични дарения.Относно AnkiДобавянеДобавяне (пряк път: Ctrl+Enter)Добавяне на етикетиДобавяне: %sДобавенОтновоВсички полетаAnkiAnki 2 съхранява Вашите тестета в нов формат. Този помощник автоматично ще преобразува Вашите тестета в този формат. Резервни копия на Вашите тестета ще бъдат създадени преди обновяването, така че, ако се наложи да се върнете към предишната версия на Anki, тестетата ви пак ще могат да бъдат използвани.Anki е приятна и интелигентно организирана система за обучение. Тя е безплатна и с отворен код.AnkiWeb ID или парола са грешни; моля, опитайте отново.AnkiWeb ID:AnkiWeb се сблъска с грешка. Моля, опитайте отново след няколко минути, и ако отново имате проблеми, моля, докладвайте за неизправност.AnkiWeb е твърде зает в момента. Моля, опитайте отново след няколко минути.Необходима е поне една стъпка.Прикачване на изображения/аудио файлове/видео файлове (F3)Автоматично възпроизвеждане на звукови файловеАвтоматична синхронизаци при отваряне/затваряне на профилаРезервни копияПрегледЧетецНастройки на четецаСкриване за по-късноСкриване на бележката за по-късноОтказКартаЦентърПромянаЗатвориСвързване...Ctrl+FCtrl+NCtrl+PCtrl+QCtrl+Shift+FCtrl+ZИзтриванеНасроченоРедактиранеЕкспортиранеЕкспортиране...F1ПолетаТърсене и заместванеHTML редакторИнсталирали ли сте latex и dvipng?ПомощИмпортиранеГрешен регулярен израз.ОтлявоМрежаНищоОтварянеПарола:ПредпочитанияОбработка…ПрегледиОтдясноanki-2.0.20+dfsg/locale/km/0000755000175000017500000000000012256137063015123 5ustar andreasandreasanki-2.0.20+dfsg/locale/km/LC_MESSAGES/0000755000175000017500000000000012223404531016677 5ustar andreasandreasanki-2.0.20+dfsg/locale/km/LC_MESSAGES/anki.mo0000644000175000017500000000103112252567246020170 0ustar andreasandreas,<PQX  StopProject-Id-Version: anki Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-10-01 08:25+0000 Last-Translator: Rob Hawkins Language-Team: Khmer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) ឈប់anki-2.0.20+dfsg/locale/hr/0000755000175000017500000000000012256137063015125 5ustar andreasandreasanki-2.0.20+dfsg/locale/hr/LC_MESSAGES/0000755000175000017500000000000012065014111016674 5ustar andreasandreasanki-2.0.20+dfsg/locale/hr/LC_MESSAGES/anki.mo0000644000175000017500000012104412252567246020201 0ustar andreasandreas0#.. ..."./ /8'/`/y/"/$/$/&/"0A0T0e00}00&00(0131,J1w1*11,1 12(2 ?2I2R2e2n2 t22222 222 22 2222 33-3@3G3 M3 X3c3i3|33 44444&4(<4e44f45 5&5 85 E5P5`5r55e5676 656X&787 777 7 77 88 #80888@8 F8R8 X8 d8 n8Ky88#8899:R;wq;7; !<w-<E<R<>=#== >%>(>> g>t> y> >>>>>>L> ?0?6?S?q? v??<@C@H@P@ i@ s@~@@@3@@@ @ @AA1AEA"XA{A&A AA AA AAAB&B,B2B(8BaB sBBPB7BC &C2CJCRCYC `CkC|CCCCCCCCCC C C C C C D D D*D1D 8DEDXDrDDDD D DD/DDDE E E !E -E :E FE SE _EmE(EE EEE EF FF0F)FFpFFFFF F FFF F FFFF F! G-G3GBG4FG!{GGGGGG GH H HHHH 1H ?HKHRH YHgH HHHHHHHHHHI I"I9I?IFIKIeI kIyII III IIIIIIFI%J EJ4QJJJ J1JJJKK*1K \KjK KKKKKK KKKL,LAL_LdLjLyLL LLLL LL L+LL M M M(M -M7MJMQMbMvM|MM MMM MMMM MM NN #N 0N:NINaNxNN!NN N<N OO]'OaO!O P#P5P :PHPXP`PoP ~PP PPPPP,P# Q)DQEnQQQQQ,RBR-[R+R8R R RSS%S.S ?SMSRSbSiSzSSSSS SSiTrT yT TT TTT T1T UU0U7U ?UJU QU ]U kU,uUU UU UUV*V'BV!jV6V V!V?V0W@WFW VW dWoWuWWWW WW W W XXX8X @X MX ZX dX*XXX!XdX [YfYoYtY Y YYXY+,Z"XZ{ZUZFZI2[|[tl\#\8]>]r]A^^^ ^^ai______. `9`J` Y`&c```,`` ``aa"+aWNa$a"a aa b bb b b4bHb^bcbkbqbsbmd tddd1dddzdHe deAe>e8f;?fJ{ff&f#g7,gdg:{gg:gh &hAGhhCh hDiSiciAiiii ij j jj&j-j 5j@jHjNj Wjejzj jjjjjj j j kk(kDkHkkkkkkk<k%5l[l|sllmm /m O!g ÈЈ؈ .G Wap ‰#҉.Ibv} Ŋ ڊ !9O9d <Skf&b3čˍۍ  %09Q(Z 2&׎-O,|ԏ1*14\M ߐ   );AW^u&ő p  ے < S_ ~   ӓ1%. T`q@4B7z'= ,7>R$n  Ö Ζܖ + A)N&x!4j  %ʘ] .k'™OؙG(Fp"(DKo:3;RaA5;S \h:ӟ +';5Q  ɠؠH> \}ǡء "fv10U0>Qk9A M!;)P@  >|,yO* D,V-kW^B5l W\+J&b'-($ Bxh w@Y{XaC7.8IFy"|P#{3}4_'u nCacVv  cTK\wZo*:h8i*p6:ej}=S;IAeM)~s=r 72z%R6f,#4E+ "nNJ[&-m ?` / ]HiFSL3/ZdH<?m&_ +z%^OT$Gg!UrjQEo pttN/%[g5!L(bD2'.s1udY~XGR(x]q`#.$ qK<l9")0 Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d selected%d selected%s already exists on your desktop. Overwrite it?%s day%s days%s day%s days%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo(filtered)(learning)(new)(parent limit: %d)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year andOpen backup folderVisit website%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A file called collection.apkg was saved on your desktop.About AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn image was saved to your desktop.AnkiAnki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.Antivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Are you sure you wish to delete %s?At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverage TimeBackBack PreviewBack TemplateBackupsBold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard Info (Ctrl+Shift+I)Card ListCard TypesCard Types for %sCard was a leech.CardsCards can't be manually moved into a filtered deck.Cards...ChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeClone: %sCloseClose and lose current input?Cloze deletion (Ctrl+Shift+C)Code:ColonCommaConfigure interface language and optionsConfirm password:Connecting...CopyCouldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+ZCurrent DeckCurrent note type:Custom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDateDeauthorizeDebug ConsoleDeckDeck will be imported when a profile is opened.DecksDefaultDeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete this note type and all its cards?Delete this unused note type?Delete...Deleted.Deleted. Please restart Anki.DescriptionDialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...EndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sExportExport...F1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst CardFolder already exists.Font:FooterFormFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGet SharedGoodGraduating intervalHTML EditorHardHeaderHelpHistoryHomeIf you have contributed and are not on this list, please get in touch.Ignore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsInfoInstall Add-onInterface language:IntervalInterval modifierInvalid code.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLearnLearningLeechLeech actionLimit toLoading...Lock account with password, or leave blank:Look in field:ManageMap to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMaximum intervalMaximum reviews/dayMediaMinimum intervalMoreMove CardsMove To Deck (Ctrl+D)Move cards to deck:Name exists.Name:NetworkNewNew CardsNew cards in deck: %sNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo empty cards.No unused or missing files found.NoteNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes require at least one field.NothingOnly new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderPassword:Passwords didn't matchPastePaste clipboard images as PNGPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PreferencesProcessing...Profile Password...Profile:ProfilesQueue bottom: %dQueue top: %dQuitRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)ReviewReviewsSave ImageSearchSelect &AllSelect &NotesSemicolonSet all decks below %s to this option group?Set for all subdecksShift position of existing cardsShortcut key: %sShow AnswerShow DuplicatesShow answer timerShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSome settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStylingStyling (shared between cards)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...Tag OnlyTagsTarget Deck (Ctrl+D)Target field:That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The first field is empty.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There must be at least one profile.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.TypeUnderline text (Ctrl+U)UndoUndo %sUnknown file format.Update existing notes when first field matchesUpgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.WelcomeWhole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou haven't recorded your voice yet.You must have at least one column.Your Decksbackupscollectiondaysdeckdeck lifehours past midnightmapped to %smapped to Tagsminssecondsstats~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2012-12-30 09:34+0000 Last-Translator: Tim Tadić Language-Team: Croatian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2013-12-11 05:45+0000 X-Generator: Launchpad (build 16869) Language: hr Stop (1 od %d) (isklj) (uklj) Ima %d karticu. Ima %d kartica. Ima %d karata.%% Točno%(a)d od %(b)d bilježaka je aktualizirana%(a)d od %(b)d bilježaka aktualizirano%(a)d od %(b)d bilježaka aktualizirano%(a)dkB gore, %(b)dkB dolje%d kartica%d kartica%d kartica%d kartica izbrisana.%d kartica izbrisano.%d kartica izbrisano.%d kartica izvezena.%d kartica izvezeno.%d kartica izvezeno.%d kartica uvezena%d kartice uvezene%d kartica uvezeno%d kartica učena u%d kartica učeno u%d kartica učeno u%d špil aktualiziran.%d špila aktualizirana.%d špilova aktualizirano.%d grupa%d grupe%d grupa%d bilješka%d bilješke%d bilješki%d odabrano%d odabrane%d odabrano%s već postoji na vašoj radnoj površini. Prebrisati?%s dan%s dana%s dana%s dan%s dana%s dana%s sat%s sata%s sati%s sat%s sata%s sati%s minuta%s minute%s minuta%s minuta.%s minute.%s minuta.%s minuta%s minute%s minuta%s mjesec%s mjeseca%s mjeseci%s mjesec%s mjeseca%s mjeseci%s sekunda%s sekunde%s sekundi%s sekunda%s sekunde%s sekundi%s za obrisati:%s godina%s godine%s godina%s godina%s godine%s godina&O programu...&Dodaci&Provjeri bazu podataka...Štrebanje...Ur&edi&Izvoz…&Datoteka&Traži&Kreni&Vodič&Vodič...&Pomoć&Uvoz&Uvoz…Obrn&i odabirSljedeća kartica...&Otvori mapu s dodacima...&Postavke...&Prethodna karticaPre&rasporedi...&Podrži Anki...&Promjena profila...&Alati&Poništi(filtrirano)(učenje)(novi)(ograničenje za nadređeni komplet: %d)....anki2 datoteke nisu namijene za uvoz. Ako želite vratiti sigurnosnu kopiju, pogledajte odjeljak 'Backups' u uputi za uporabu./0d1 101 mjesec1 godina iOtvaranje mape sa sigurnosnim kopijamaPosjeti web stranicu%Y-%m-%d @ %H:%MSigurnosne kopije
Anki će napraviti sigurnosnu kopiju vaše kolekcije svaki put kada se zatvori ili sinkronizira.Format za izvoz:Traži:Veličina slova:Font:U:Uključi:Veličina linije:Zamijeni sa:SinkronizacijaSinkronizacija
Nije uključena; za uključivanje kliknite tipku za sinkronizaciju u glavnom prozoru.

Potreban je račun

Za sinkronizaciju vaše kolekcije treba vam besplatan račun. Registrirajte račun, a zatim dolje unesite svoje podatke.

Anki ažuriran

Objavljen je Anki %s.

Puno hvala svima koji su davali prijedloge, prijavljivali greške i donirali.Datoteka naziva collection.apkg je spremljena na vašu radnu površinu.O programu AnkiDodajDodaj (prečac: ctrl+enter)Dodaj poljeDodaj medijeDodaj novi špil (Ctrl+N)Dodaj vrstu bilješkeDodaj oznakeDodaj novu karticuDodaj u:Dodaj: %sDodanoDodano danasPonovnoPonovno danasSvi špiloviSva poljaIzbrisat će se sve kartice, bilješke i mediji ovog profila. Jeste li sigurni?Dozvoli HTML u poljimaSlika je spremljena na vašu radnu površinu.AnkiAnki 2 sprema vaše špilove u novom formatu. Ovaj čarobnjak će automatski pretvoriti vaše špilove u taj format. Prije nadogradnje napravit ćemo sigurnosnu kopiju vaših špilova kako biste ih mogli nastaviti koristiti ako se odlučite vratiti na stariju verziju.Anki 2.0 podržava samo automatsku nadogradnju iz verzije 1.2. Za učitavanje starih špilova otvorite ih u Anki 1.2 kako biste ih nadogradili, a zatim ih uvezite u Anki 2.0.Anki nije pronašao crtu između pitanja i odgovora. Ručno prilagodite obrazac za zamjenu pitanja i odgovora.Anki je jednostavan, inteligentan program za učenje metodom odgođenog ponavljanja. Besplatan je i ima otvoreni kod.Anki nije mogao učitati vašu staru konfiguracijsku datoteku. Upotrijebite Datoteka>Uvoz za uvoz špilova iz prethodnih verzija Ankija.AnkiWeb ID ili lozinka su bili pogrešni; pokušajte ponovno.AnkiWeb ID:Došlo je do greške u AnkiWebu. Pokušajte ponovno za nekoliko minuta, a ako se problem nastavi, ispunite izvještaj o programskoj pogrešci.AnkiWeb je trenutno prezaposlen. Pokušajte ponovno za nekoliko minuta.Vaš antivirusni program ili vatrozid sprječavaju Anki da se spoji na internet.Svaka kartica koja nije označena ničime će biti izbrisana. Ako bilješka nema više kartica, izgubit ćete ju. Jeste li sigurni da želite nastaviti?Jeste li sigurni da želite izbristi %s?Potreban je bar jedan korak.Dodavanje slika/zvuka/video zapisa (F3)Automatska reprodukcija zvučnog zapisaAutomatska sinkronizacija prilikom otvaranja/zatvaranja profilaProsječno vrijemePoleđinaPregled stražnje stranePredložak stražnje straneSigurnosne kopijePodebljani tekst (Ctrl+B)PregledPregled i& instalacija...PreglednikPreglednik (%(cur)d kartica prikazana; %(sel)s)Preglednik (%(cur)d kartica prikazano; %(sel)s)Preglednik (%(cur)d kartica prikazano; %(sel)s)Opcije preglednikaIzradiSkupno dodavanje oznaka (Ctrl+Shift+T)Skupno uklanjanje oznaka (Ctrl+Alt+T)ZakopajZakopaj bilješkuAnki će standardno otkriti znak između polja, kao što su tabulator, zarez itd. Ako Anki pogrešno prepozna znak, možete ga unijeti ovdje. Upotrijebite \t za tabulator.OtkažiKarticaKartica %dInformacija o kartici (Ctrl+Shift+I)Lista karticaVrste karticaVrste kartica za %sKarta je bila pijavica.KarticeKarte se ne mogu ručno premjestiti u filtrirani špil.Kartice...PromijeniPromijeni %s u:Promijeni špilPromijeni vrstu bilješkePromijeni vrstu bilješke (Ctrl+N)Promijeni vrstu bilješke...Promijeni boju (F8)Promijeni špil ovisno o vrsti bilješkePromijenjenoProvjeri datoteke u mapi s medijimaProvjera u tijeku...OdaberiOdaberi špilOdaberi vrstu bilješkeKloniraj: %sZatvoriZatvori i poništi trenutni unos?Brisanje polja za upisivanje (Ctrl+Shift+C)Kôd:DvotočkaZarezPodesi jezik i mogućnosti sučeljaPotvrdi lozinku:Povezivanje…KopirajNije uspjelo povezivanje s AnkiWebom. Provjerite svoje mrežne postavke i pokušajte ponovno.Zvuk nije snimljen. Jeste li instalirali lame i sox?Ova datoteka nije spremljena: %sStvori špilNapravi filtrirani špil...StvorenoCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+ZAktualni špilAktualna vrsta bilješke:Prilagođeni koraci (u minutama)Prilagođavanje kartica (Ctrl+L)Prilagođavanje poljaIzrežiDatumDeautorizirajKonzola za ispravljanje grešakaŠpilŠpil neće biti uvezen dok je otvoren profil.ŠpiloviPočetna vrijednostObrišiObrisati %s?Obriši karticeObriši špilObriši prazneObriši bilješkuObriši bilješkeObriši oznakeObriši nekorišteneObrisati polje iz %s?Obrisati ovaj tip bilješke i sve pripadajuće karte?Obrisati ovaj nekorišteni tip bilješke?Izbriši...Obrisano.Obrisano. Molimo, ponovno pokrenite Anki.OpisDijalogOdbaci poljePreuzimanje nije uspjelo: %sPreuzmi sa AnkiWeb-aPreuzimanje uspješno. Molimo, ponovno pokrenite Anki.Preuzimanje s AnkiWeb-a...ObvezaI&zlazTežinaLaganoLaki bonusLaki intervalUrediPromijeni %sUređivanje aktualnogPromijeni HTMLUredi za prilagođavanjePromijeni…PromijenjenoMijenjanje fontaPromjene su spremljene, Molimo, ponovno pokrenite Anki.PraznoPrazne karte...KrajUnesite špil za spremanje novih %s karata, ili ostavite prazno:Unesi novu poziciju karte (1...%s):Unesite oznake za dodavanje:Unesite oznake za brisanje:Greška u preuzimanju: %sGreška tijekom pokretanja: %sIzveziIzvoz...F1F3F5F7F8Polje %d datoteke je:Preslikavanje poljaIme polja:Polje:PoljaPolja za %sPolja su odvojena sa: %sPolja...Fi<eriDatoteka nije pronađena.FilterFilter:FiltriranoŠpil %d je filtriran.Pronađi &duplikate...Pronađi duplikate&Pronađi i zamijeni...Pronađi i zamijeniPrva kartaMapa već postoji.Font:PodnožjeObrazacPronađeno %(a)s u %(b)s.Prednja stranaPregled prednje stranePredložak prednje straneOpćenitoPodijeliDobroInterval za prijelaz na viši stupanjHTML uređivačTeškoZaglavljePomoćPovijestNaslovnaAko ste pridonijeli a niste na ovoj listi, molimo da nam se javite.Ignoriraj vremena odgovora duža odIgnoriraj veličinu slovaIgnoriraj linije gdje se prvo polje podudara sa postojećom bilješkomZanemari ovo ažuriranjeUveziUvezi datotekuUvezi iako postojeća bilješka ima isto prvo poljeUvoz neuspješan. Uvoz nije uspio. Informacije za ispravljanje grešaka: Opcije uvozaUvoz završen.U mapi s medijskim datotekama, ali ih ne koristi niti jedna kartica:Uključi medijske datotekeUključi informacije o vremenskom rasporeduUključi oznakeInformacijeInstaliraj dodatakJezik sučelja:IntervalModifikator intervalaNeispravan kod.Neispravna lozinka.Neispravan regularni izraz.Suspendirana je.Nakošen tekst (Ctrl+I)JS greška na liniji %(a)d: %(b)sZadržiLaTeXLaTeX jednadžbaLaTeX math okr.PromašajiZadnja kartaUčenjeUčenjePijavicaPostupak za pijaviceOgraniči naUčitavam...Zaključaj račun lozinkom, ili ostavi prazno:Traži u polju:UpravljajPreslikaj u %sPreslikaj u oznakeOznačiOznači bilješkuOznači bilješku (Ctrl+K)OznačenoNajveći razmakMaksimalan broj ponavljanja po danuMedijske datotekeNajmanji razmakVišePremjesti kartePremjesti u špil (Ctrl+D)Premjesti karte u špil:Naziv već postoji.Naziv:MrežaNovoNove karticeNove kartice u špilu: %sNovih karata po danuNovi naziv za špil:Novi razmakNovi naziv:Novi tip bilješke:Novi naziv grupe postavki:Novi položaj (1...%d):Idući dan počinje uNema praznih karata.Nisu pronađene nekorištene ili datoteke koje nedostaju.BilješkaVrste bilješkiBilješka i pripadajuća karta %d obrisani.Bilješka i pripadajuće karte %d obrisane.Bilješka i pripadajuće karte %d obrisane.Bilješka je zakopana.Bilješka suspendirana.Bilješka: ne postoji sigurnosna kopija medijskih datoteka. Napravite periodično sigurnosno kopiranje svoje Anki mape kako biste bili sigurni.Bilješka: Nedostaje jedan dio povijesti. Za više informacija pogledajte dokumentaciju u pregledniku.Bilješka zahtijeva barem jedno polje.NištaSamo novim karticama se može promijeniti položaj.OtvoriOptimizacija...Izborno ograničenje:PostavkePostavke za %sGrupa postavki:Postavke...RedoslijedLozinka:Lozinke se ne poklapajuZalijepiZalijepi slike iz međuspremnika kao PNGDodaj na kraj reda novih karata.Stavite u red za ponavljanje s intervalom između:Najprije dodajte novu vrstu bilješke.Molimo budite strpljivi; ovo može potrajati.Uvjerite se da je profil otvoren i da Anki ne radi, a zatim pokušajte ponovno.Molimo, instalirajte PyAudioMolimo, instalirajte mplayerMolimo, prvo otvorite profil.Molimo, odaberite špil.Odaberite kartice iz samo jedne vrste bilježaka.Odaberite nešto.Aktualizirajte Anki. na posljednju verzijuMolimo koristite Datoteka>Uvoz za uvoz ove datoteke.Molimo posjetite AnkiWeb, nadogradite svoj špil, a zatim pokušajte ponovno.PrilagodbeObrađujem...Lozinka profila...Profil:ProfiliKraj reda: %dPočetak reda: %dIzlazNasumičan redoslijedOcjenaSpreman za nadogradnjuPonovno izgradiSnimi vlastiti glasSnimi zvuk (F5)Snimam...
Vrijeme: %0.1fZapamti zadnji unos prilikom dodavanjaUkloni oznakeIzbriši formatiranje (Ctrl+R)Uklanjanjem ove vrste kartica izbrisala bi se jedna ili više bilježaka. Najprije napravite novu vrstu kartice.PreimenujPreimenuj špilPonovno reproduciraj zvukReproducirajte vlastiti glasPremjestiPremjesti nove karticePrerasporediPrerasporediPrerasporedi kartice na temelju mojih odgovora u ovom špiluNastavi sadObrnuti smjer teksta (s desna)PonavljanjePonavljanjaSpremi slikuPretraživanjeOd&aberi sveOdabieri &bilješkeTočka-zarezSve špilove ispod %s postavi u ovu grupu opcija?Postavi za sve pod-špilovePromijeni položaj postojećih karataKratica: %sPrikaži odgovorPrikaži duplikatePrikaži vrijeme odgovaranjaPrikaži vrijeme sljedećeg ponavljanja iznad tipki s odgovorimaPrikaži broj preostalih kartica tijekom ponavljanjaPokaži statistike. Kratica: %sNeka podešenja će početi djelovati kada ponovno pokrenete Anki.Sortiranje poljaSortiraj prema ovom polju u preglednikuSortiranje prema ovom stupcu nije podržano. Odaberite drugo.Zvukovi i slikeRazmakPočetni položaj:Početna težinaStatistikeKorak:Koraka (u minutama)Koraci moraju biti brojevi.Ukloni HTML prilikom umetanja tekstaDanas si učio %(a)s u %(b)s.Učeno danasUčiUči špilUči špil...Uči sadStilStil (dijeli se među karticama)SuspendirajSuspendiraj karticuSuspendiraj bilješkuSuspendiranoSinkroniziraj i audio i slikovne datotekeSinkroniziraj s AnkiWebom. Prečac: %sSinkronizacija medijskih datotekaSinkronizacija nije uspjela: %sSinkronizacija nije uspjela; nema veze s internetom.Za sinkronizaciju sat na Vašem računalu mora biti ispravno podešen. Ispravite sat i pokušajte ponovno.Sinkronizacija...Samo oznakaOznakeCiljni špil (Ctrl+D)Ciljno polje:Taj naziv za polje je već u uporabi.Taj naziv je već u uporabi.Isteklo je vrijeme za spajanje s AnkiWebom. Provjerite mrežne postavke i pokušajte ponovno.Standardna konfiguracija se ne može ukloniti.Standardni špil se ne može izbrisati.Prvo polje je prazno.Ikone smo dobili iz više izvora; zasluge možete vidjeti u Anki izvornom kodu.Vaša ulazna informacija generirala bi prazno pitanje u svim karticama.Pretraživanje nije pronašlo niti jednu karticu. Želite li ponoviti?Izmjena koju ste zatražili zahtijevat će učitavanje cijele baze podataka prilikom sljedeće sinkronizacije Vaše kolekcije. Ako na drugom uređaju imate izmjene koje još nisu ovdje sinkronizirane, izgubit ćete ih. Želite li nastaviti?Aktualizacija je završena i spremni ste početi koristiti Anki 2.0.

Ispod se nalazi zapisnik aktualizacije:

%s

Mora postojati barem jedan profil.Ta datoteka već postoji. Jeste li sigurni da ju želite prebrisati?U ovoj mapi se na jednom mjestu čuvaju svi Vaši podaci za Anki, kako bi se olakšalo sigurnosno kopiranje. Ako želite da Anki koristi drugu lokaciju, pogledajte: %s Ovo će obrisati vaš postojeći komplet i zamijeniti ga sa podacima u datoteci koju uvozite. Jeste li sigurni?Ovaj čarobnjak će vas provesti kroz aktualizaciju na Anki 2.0. Za jednostavnu aktualizaciju pažljivo pročitajte sljedeće stranice. VrijemeVremensko ograničenjeZa ponavljanjeZa pregledavanje dodataka kliknite dolje na tipku za pregledavanje.

Kada pronađete dodatak koji Vam se sviđa, ispod upišite njegov kod.Za uvoz u profil zaštićen lozinkom prije uvoza otvorite profil.VrstaPodcrtaj tekst (Ctrl+U)PoništiPoništi %sNepoznat format datoteke.Ažuriraj postojeće bilješke kada se prvo polje podudaraNadogradnja završenaČarobnjak za nadogradnjuNadograđujemNadograđujem špil %(a)s od %(b)s... %(c)sPošalji na AnkiWebŠaljem na AnkiWeb...Košisteno na karticama, ali nedostaje u mapi medija:Korisnik 1Inačica %sČekam da uređivanje završi.DobordošliCijeli kompletŽelite li ju preuzeti sada?Kodirao Damien Elmes. Zakrpe, prijevodi, testiranje i dizajn:

%(cont)sJoš niste snimili svoj glas.Morate imati barem jedan stupac.Vaši špilovisigurnosne kopijekompletdanašpilživotni vijek špilasati iza ponoćipreslikano u %sPreslikano u Tagsminutasekundistatistike~anki-2.0.20+dfsg/locale/ca/0000755000175000017500000000000012256137063015077 5ustar andreasandreasanki-2.0.20+dfsg/locale/ca/LC_MESSAGES/0000755000175000017500000000000012065014110016645 5ustar andreasandreasanki-2.0.20+dfsg/locale/ca/LC_MESSAGES/anki.mo0000644000175000017500000007361212252567245020161 0ustar andreasandreas,Y<%% %%%"%% %%8&;&T&e&"v&$&$&&& '")'L'_'p'$' '''0(1(9(&H( o({(((((,()*!)L),a) ))())))))) ))*** $*/*5*;*?* F*P*V* ^*i* {*********0* .+;+ A+ L+W+]+p+t+,,, ,,,,$,(,,,0,2,(H,q,!,,f,1- G-T- f- s-~----e-2.7. /5/XT/8/ /// 0 0$0 :0 H0T0 ]0j0r0z0 00 00 0 0K01#$1H1M1d1 \2j2 33R3w37j4 4w4E&5l5s55R55#`66 66(67 77/7@7 E7 R7`7h7n7777L7788888V8 [8e8!9(9-959<9C9 \9 f9 p9{9999 9399S :]:f:m: t: :::::":;& ; 2;>; E;Q; b;l;r;;-;;;(;;5 < A<O<5T<P<7<=*= /=;=S=[=b= i=t=========== = = = = = > > &>3>:>A> H> S>a>t> >> >>>>> ??/? 4? A? M?[? `?/n???? ? ? ? ? ? ? ? @@(-@V@ t@~@@]@ AA A$A8A)NAxAAAAA A AAA A AAAA B!B5B;BJB4NBBBBBBBC CCCCCC"C%C(C DC RC^CeC lCzC CCCCCCCCCD D #D0D5DLDRDYDbDgDD DDDD DD DD$DE EEEEF$EkE EEE EEE*EF &F3F8F AFKFgFlFrFyFFFFF FF F FFFFFFF F!FGG$G ,G 6G BGPGbG ~GGG G GGGH6HVHsHH HHH8H H!HI,&I SI"^IWIIIIJ JK K K K"KL L$LC;LLLL-L-L-#M1QM*M-MMM!M' N+HNtN N3N NN&N %O2O(COlOO*OO'OO* P5PFP&UP|PPPPPP P PP PP PPPPQ QQQ #Q/QGQ"YQ|QQQQQQ Q1Q -R:R ?R IRTRZRmRqR S"S%S*S0S6S;S@SDSHSLSNSAbS!S!SSTTTTT TTTU+U{BUU?hV VKVlVBkW WWW WWXX4XDXVX fX qX }X XX XXXX[X4Y'LYtYyYYZZc[{[_\a\H\*]z@]O] ^^ '^I1^}{^^$_#;_#__7__ _____`,`A`I`Y``` x`a``` aa5aLa^axa>bFb Nb Yb cb)mbbbbb bbcc>-clc[c ccc cdd(dFd^d+sdd9ddd de e#e!)eKe:Qe ee1ee3ef1f67fZnf7f!g#g 6gAg Ugaghg ogzggggggggggg g g g g h h &h 4hBhIhPhWh `hlhh hhhh"hi&i:i/@ipiui iiii3ii j jj'j 8jEjXjhjzj"jjFj8k Qk \k%fklk kl ll6l)Olyl ll lllllll lmm&m-m,EmrmwmmZm&m(nqHqNqGTq(qqqqr"r8r6Nr#rr rr r$rs sss s+s 0s=sFs[s dsqsssssss s.ssss s tt-t'Gtott ttt-t7u(8u=au!uuuu"u vBv av+mv v7v vvWvTwYwmww[0 1I dc${g5E.jS31]*W Mf9rWw4!oNi(J|s X/a$2>X@:+xc[g=0?-wZtvBtC.r~e) 2N '(]vdzb\Y#/{uAT;z`H LC="KHu}FV~fE'6D}sJ_yZ 39nBqR@px:YG6m_l85hmP&I<ij! &<bO)e*U% `Gyo|aKhLk;Qkq8%4P\# 7,Ql?R"7+MOA^^S>UTpnVF D,- Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM: andOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A file called collection.apkg was saved on your desktop.About AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Are you sure you wish to delete %s?At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage intervalBackBack PreviewBack TemplateBackupsBasicBold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeClone: %sCloseClose and lose current input?Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...CopyCorrect: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDefaultDeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete this note type and all its cards?Delete this unused note type?Delete...Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...EndEnter deck to place new %s cards in, or leave blank:Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst CardFirst ReviewFlipFolder already exists.Font:FooterForecastFormFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGet SharedGoodHTML EditorHardHave you installed latex and dvipng?HeaderHelpHistoryHomeHoursIf you have contributed and are not on this list, please get in touch.Ignore answer times longer thanIgnore caseIgnore this updateImportImport FileImport failed. Import optionsIn media folder but not used by any cards:Include scheduling informationInclude tagsInfoIntervalIntervalsInvalid regular expression.KeepLaTeXLapsesLearnLearningLeechLeftLimit toLoading...ManageMap to %sMap to TagsMarkMarkedMediaMinutesMoreNetworkNew CardsNo unused or missing files found.NothingOpenOptionsPassword:PreferencesProcessing...Record audio (F5)Recording...
Time: %0.1fRescheduleReverse text direction (RTL)RightSelect &AllShow AnswerShow new cards before reviewsShow new cards in order addedShow new cards in random orderSome settings will take effect after you restart Anki.Strip HTML when pasting textSupermemo XML export (*.xml)SuspendSuspendedSyncing Media...TagsThis file exists. Are you sure you want to overwrite it?Total TimeTreat input as regular expressionUndo %sUsed on cards but missing from media folder:Version %sWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sdaysmapped to %smapped to Tags~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-04-04 23:14+0000 Last-Translator: Paco Riviere Language-Team: Catalan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:43+0000 X-Generator: Launchpad (build 16869) Language: ca Atura (1 de %d) (desactivat) (activat) Té %d targeta. Té %d targetes.%% correctes%(a)0.1f %(b)s per dia%(a)d de %(b)d nota actualitzada%(a)d de %(b)d notes actualitzades%(a)dkB pujats, %(b)dkB baixats%(tot)s %(unit)s%d targeta%d targetes%d targeta eliminada.%d targetes eliminades.%d targeta exportada.%d targetes exportades.%d targeta importada.%d targetes importades.%d targeta estudiada en%d targetes estudiades en%d targeta per minut%d targetes per minut%d pila actualitzada.%d piles actualitzades.%d grup%d grups%d nota%d notes%d nota afegida%d notes afegides%d nota importada.%d notes importedes.%d nota actualitzada%d notes actualitzades%d revisió%d revisions%d seleccionada%d seleccionades%s ja existeix al teu disc. Ho voleu sobreescriure?còpia de %s%s dia%s dies%s dia%s dies%s suprimida%s hora%s hores%s hora%s hores%s minut%s minuts%s minut.%s minuts.%s minut%s minuts%s mes%s mesos%s mes%s mesos%s segon%s segons%s segon%s segons%s per esborrar:%s any%s anys%s any%s anys%sd%sh%sm%smo%ss%sy&Quant a...&Complements&Comprova la base de dades...&Repassa...&Edita&Exporta...&Fitxer&Cerca&Vés&Manual&Manual...&Ajuda&Importa&Importa...&Inverteix la selecció&Targeta següent&Obre la carpeta de complements...&Preferències...Targeta &anteriorCanvia la &planificació&Dóna suport a Anki...&Canvia de perfil...&EinesDesfés (&U)'%(row)s' amb %(num1)d camps, s'esperava %(num2)d(%s correct)(fi)(filtrat)(aprenent)(nou)(parent limit: %d)…els arxius d'.anki2 no estan fets per a ser importats. Si estàs intentant restaurar una còpia de seguretat, mira a la secció "Còpies de seguretat" del manual de l'usuari./0d1 101 mes1 any10AM10PM3AM4AM4PM: iObre la carpeta de les còpies de seguretatVés al lloc web%(pct)d%% (%(x)s de %(y)s)%d-%m-%Y @ %H:%MCòpies de seguretat
Anki farà una còpia de seguretat de la col·lecció de l'usuari cada cop que el tanqueu o sincronitzeu.Format d'exportació :Cerca :Mida de la lletra:Lletra:A :Inclou:Mida de la línia:Substitueix per:SincronitzacióSincronització
No està activada; feu clic al botó de sincronització de la pantalla principal per activar-la.

Cal tenir un compte

Cal tenir un compte gratuït per a sincronitzar la col·lecció. Registreu un compte nou i introduïu-ne els detalls aquí.

Actualització d'Anki

Anki %s està disponible.

Els nostres agraïments per a totes les persones que han aportat suggeriments, informes d'errors i donatius.S'ha desat un arxiu anomenat collection.apkg al vostre escriptori.Quant a AnkiAfegeixAfegir (drecera: ctrl+retorn)Afegeix campAfegeix arxiu multimèdiaAfegeix pila (Ctrl+N)Afegeix tipus de notaAfegeis el dorsAfegeix etiquetesAfegeix targetaAfegeix a:Afegeix: %sS'ha afegitAfegides avuiDe nouDe nou avuiOblidats : %sTotes les pilesTots els campsS'eliminaran totes les targetes, notes i arxius multimèdia d'aquest perfil. N'esteu segur?Permet l'HTML als campsS'ha guardat una imatge a l'escriptori.AnkiPaquet Anki 1.2 (*.anki)Anki 2 guarda les piles en un format diferent. Aquest assistent convertirà automàticament les piles al nou format. Se'n farà una còpia de seguretat abans d'actualitzar, de manera que si has de tornar a la versió anterior les teves piles encara hi seran compatibles.Paquet Anki 2.0Anki 2.0 només permet l'actualització automàtica des d'Anki 1.2. Per actualitzar piles antigues, obriu-les a Anki 1.2 per actualitzar-les, i després importeu-les a Anki 2.0.Paquet de targetes AnkiAnki no ha trobat la línia entre la pregunta i la resposta. Ajusteu la plantilla manualment per a canviar la pregunta i la resposta.Anki és un agradable sistema intel·ligent d'aprenentatge espaiat. És lliure i de codi obert.Anki no troba l'antic arxiu de configuració. Feu servir Arxiu>Importa per importar les piles de les versions anteriors d'Anki.Identificador o contrasenya d'AnkiWeb incorrectes; torneu-ho a intentar.Identificador AnkiWebAnkiweb ha trobat un error. Torneu-ho a intentar d'aquí a uns minuts i si el problema es manté creeu un informe d'error.AnkiWeb està massa ocupat ara mateix. Torneu-ho a intentar d'aquí uns minuts.RespostaBotons de respostaRespostesL'antivirus o el tallafoc està impedint que Anki es connecti a internet.Totes les targetes no assignades s'eliminaran. Si una nota no té cap carta assignada, es perdrà. Segur que voleu continuar?Segur que voleu eliminar %s?Es requereix una passa com a mínim.Adjuntar imatges/àudio/vídeo (F3)Reprodueix l'àudio automàticamentSincronitza automàticament en obrir o tancar un perfilMitjanaTemps promigTemps de resposta migInterval promitgReversVista prèvia del reversPlantilla del reversCòpies de seguretatBàsicaText en negretaNavegaNavega && instal·la...NavegadorExplorador (%(cur)d targeta es mostra; %(sel)s)Explorador (%(cur)d targetes es mostren; %(sel)s)Aspecte del navegadorOpcions del navegadorConstrueixAfegeix etiquetes en grupTreu etiquetes en grupPosa sota la pilaPosa la nota sota la pilaPer defecte, Anki detectarà el caràcter entre camps, com un tabulador, una coma o similar. Si Anki detecta malament el caràcter, podeu introduir-lo aquí. Useu \t per representar el tabulador.AnuŀlaTargetaTargeta %dTargeta 1Targeta 2Informació de la targeta (Ctrl+Majús+I)Llista de targetesTipus de targetaTipus de targetesTipus de targetes per %sFitxa suspesaLa targeta era una sangonera.TargetesTipus de targetesLes targetes no es poden moure manualment a una pila filtrada.Targetes en text plaLes targetes tornaran automàticament a les seves piles d'origen després que les repasseu.Targetes...CentraCanviaCanvia %s a:Canvia la pilaCanvia tipus de notaCanvia tipus de nota (Ctrl+N)Canvia tipus de nota...Canvia el color (F8)Canvia la pila en funció del tipus de notaCanviatComprova els fitxers de la carpeta de fitxers multimèdiaS'està comprovant...TriaTria pilaTria tipus de notaClona: %sTancaTancar i perdre l'entrada actual?Codi:La col·lecció està danyada. Si us plau veieu el manual.Dos puntsComaConfigura les opcions i l'idioma de l'interfícieConfirmeu la contrasenya:Enhorabona! De moment heu acabat amb aquest paquet.S'està connectant...CopiaCorrecte: %(pct)0.2f%%
(%(good)d of %(tot)d)No s'ha pogut connectar a AnkiWeb. Comproveu la connexió de xarxa i torneu-ho a intentar.No s'ha pogut gravar el so. Heu instal·lat lame i sox?No s'ha pogut guardar l'arxiu: %sEstudiar de valentCrear pilaCrear pila filtradaS'ha afegitCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Majús+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Majús+=Ctrl+Majús+ACtrl+Majús+CCtrl+Majús+FCtrl+Majús+LCtrl+Majús+MCtrl+Majús+PCtrl+Majús+RCtrl+UCtrl+WCtrl+ZAcumulatAcumulat %sRespostes acumuladesTargetes acumuladesPila actualTipus de nota actual:Estudi personalitzatSessió d'estudi personalitzadaPasses personalitzades (en minuts)Personalitzar targetesPersonalitzar campsTallaS'ha reconstruït i optimitzat la base de dadesDataDies que heu estudiatDesautoritzaConsola de depuracióPilaDescarta el paquetS'importarà la pila tan bon punt s'obri un perfil.PilesPer defecteEliminaVoleu eliminar %s?Elimina targetesElimina pilaElimina les buidesElimina la notaElimina les notesElimina les etiquetesElimina les que no es facin servirVoleu eliminar el camp de %s?Voleu eliminar aquest tipus de nota i totes les targetes relacionades?Voleu eliminar aquest tipus de nota que no es fa servir?Elimina...Eliminat.Eliminat. Ara cal que reinicieu Anki.Si elimineu aquesta pila de la llista de piles totes les targetes restants tornaran a la seva pila d'origen.DescripcióDiàlegDescarta el campDescàrrega fallida: %sDescarrega des d'AnkiWebDescàrrega correcta. Ara reinicieu Anki.Descarregant des d'AnkiWebVenciment&SurtFacilitatFàcilBonus per FàcilInterval per FàcilEditaEdita %sEdita l'actualEdita l'HTMLEdita per personalitzarEdita...EditatEditant tipus de lletraCanvis guardats. Ara cal que reinicieu Anki.BuitTargetes buides...AcabarSeleccioneu la pila en què voleu col·locar les %s noves targetes, o deixeu -ho en blanc:Entreu les etiquetes que voleu afegir:Entreu les etiquetes que voleu suprimir:Error a la descàrrega: %sError a l'inici: %sS'ha produït un error en executar %s.S'ha produït un error en executar %sExportaExporta...ExtraFF1F3F5F7F8El camp %d del fitxer és:Mapejat de campNom del camp:Camp:CampsCamps per %sCamps separats per: %sCamps...&FiltresFiltreFiltre:FiltratPila amb filtre %dCerca &duplicats...Cerca duplicatsCerca i reemplaça...Cerca i reemplaçaPrimera targetaPrimera revisióGireuAquesta carpeta ja existeix.Tipus de lletra:Peu de pàginaPronòsticFormulariS'han trobat %(a)s d'entre %(b)s.AnversPrevisualització de l'anversPlantilla de l'anversOpcions generalsS'ha generat el fitxer: %sPiles compartidesCorrecteEditor HTMLDifícilHeu instal·lat LaTeX i dvipng?CapçaleraAjudaHistòriaIniciHoresSi hi heus contribuït però no sou a la llista, poseu-vos en contacte.Ignoreu temps de resposta més llargs deIgnoreu les majúsculesIgnora aquesta actualitzacióImportaImporta un fitxerHi ha hagut un error en importar. Opcions d'importacióA la carpeta de mèdia, però no usat per cap targeta.Inclou informació de planificacióInclou les etiquetesInformacióIntervalIntervalsL'expressió regular no és vàlida.MantéLaTeXLapsesEstudiaAprenentatgeLapaA l'esquerraLimita aS'està carregant...GestionaAssocia a %sAssocia a les etiquetesMarcaMarcatMèdiaMinutsMésXarxaNoves fitxesNo s'ha trobat cap fitxer inútil o que falti.ResObreOpcionsContrasenya:PreferènciesS'està processant...Enregistra un àudio (F5)S'està enregistrant...
Temps: %0.1fTorna a planificarText de dreta a esquerra (RTL)A la dretaSelecciona-ho &totMostra la respostaMostra les targetes noves abans de les altresMostra les targetes noves pel ordre en que s'han afegitMostra les targetes noves desendreçadesAlguna configuració no tindrà efecte fins a reengegar Anki.Suprimeix l'HTML en enganxar textExporta a Supermemo XML (*.xml)SuspènSuspèsS'està sincronitzant els media...EtiquetesAquest fitxer ja existeix. Esteu segur que el voleu sobreescriure?Temps totalTracta l'entrada com una expressió regularDesfés %sTargetes usades, però perdudes a la carpeta de mèdia.Versió %sVoleu baixar-ho ara?Escrit per en Damien Elmes, amb pedaços, traduccions, testeig i disseny de:

%(cont)sdiesmapejat a %smapejat a Etiquetes~anki-2.0.20+dfsg/locale/vi/0000755000175000017500000000000012256137063015132 5ustar andreasandreasanki-2.0.20+dfsg/locale/vi/LC_MESSAGES/0000755000175000017500000000000012065014111016701 5ustar andreasandreasanki-2.0.20+dfsg/locale/vi/LC_MESSAGES/anki.mo0000644000175000017500000022656712252567246020226 0ustar andreasandreasUl5hGiG pG{GG"GG GGG8GH.H?H"PH$sH$H&HH"I&I9IJI$gI III0I JJ&"J IJUJ(fJJJ,JJ*J&K,;K hKvK(KKKKKKK KKKKK K LLLL L*L0L 8LCL UL`LxLLLLLLL0L MM M &M1M7MJMaMeMMMMMN NNNNNT!NvNxN,N(NN!O%Of=OO OO O OOPP(Pe?PP7OQ QQ5QXQY3R8RkR 2S >SISMS hS rS|S S SS SSSS S$S T TT +T 5T%@TKfTTNT"U9U#PVtVyVV WW5XGXRXvYwY7 Z EZwQZEZ@[P[W[f[Rn[[D\#_\#\\ \\(])] 1]>] R]_]x]] ] ]]]]]]^ ^^L'^t^^^^^^ ^ ^)^'_C__` ```!`)` B` L` V`a` s```` `3``S`PaYa`a ga uaaaaa"aaa&b 5bAb HbTb eb qb{bbbbb-bbb(c,c5>c tccc8c5cPc7Pddd ddddd dddeeeee$e+e2e9e @e Me Ze ge te e e eeee e eee ef f'fWiPiii]j lj8xjj jjj)jk6k:k IkVk\kak fk qkkk k kkkk k!kkk)l02lclyl4}l!llllm,m@mQm Xmbmhmjmmmpmsmvmym m mmm mm mm,m#n5nqOq.UqFqqq r4rErXr _r1krrrrr*rs tt tt"u"6u Yuzuuuuuu u u u) v5vGvvvvw1wPwUw[wjwzw w wwww<wx x xx-x2x ;x+Fxrxx xxx x xx xxxxyy%y+yz KzUzdz|zzz+zz#z!{>{C{ K{ U{<`{ {{]{a|z|!| ||||,|}#}k}`~ e~s~~~~ ~~ ~ ~~~~! 2<SYw  ,#)VD8EԀ1He,Ł-ށ+ 88q z# ߂ 2; LZ_fv}Ճ i9 Ä Ԅ߄ "% -18 ju  Dž Ӆ-&T\t z  Ɇ׆VF V`,%G@  Lj ψۈ8V*u'!ȉ@618h !?Ί$ 4 BMSf} Ƌ ̋ ׋  1Da| *Ɍ!d: ƍˍ ( 6WXr+ˎ"&A0[+>UFM*(1,ؑIO'?tgܓ#ȔdeQ8Cw(rWژߘ au/WM՚ۚ| !Ư̈̀'16>S.Z& М&ڜ,+X _jUߝ$8 E( I"ZW}Sա0)$Z" {;^<5ѤUڥ 0:BH\ ny{ Ĩب  13  # %3H,Zӫ (I R^u:Ѭ " 5CL_ hr έ֭#+O_ n y  ɮԮ & $4K_ | 9ί߯ ")DH#*06;@Eͱϱ.%*$Puu  $1D Yg'y{γJJ( s~[sj@2ٷ'!;]}  Ƹ Ҹ ܸ84:O_pIwι"Fti޺<μӼ[L`%::N LXJE4 z ])')<%\2 #!5W r| &#6'Em'  ;7Sou{   , 2A?S  2Ii& :!5<N er30R \ m3zE#*G0<xh<#[   #* 1 > K X e r   %7Pl9 %07F ~ E ) < J Xc{/5"/#S$[(.'* ++6rbY 8FYp4#  !,1Jdjs  E ;H+YG& J&Kr-! ( 2>@CFIL(Ox &$ L)v   !18S  )-<X t' @ MY o{Vt4#V AbiRz,#N7>%! +1I/{5 8G`o2L&+2&Ry !:" ] it=*D ]h 'AQh,n&" 9CYnt{  3#Mq965H Q_o+q. O i tQ/  '2H"`'* + I jw+?0F$kL]8!"++&3AZ)>ALG '-'9 R\$e     ) 5"B%e 1  -CVTi// 6@O e r8 +  *8"=` gu -FZD$Uzc1'7 GQb+v'.25,Db1#LJPE4Q,~ "&5\ p|(,,3` +01:7X#9 =J\b} E, . pM 3 + ! #@ Kd ' O r( _ ! 4 R p <k w & #Gk0%D6uPZ<Q  m?iaj[bu@29 Q\ x - P:Xp7^`q  @JMF"6"#b#8#/$(H$q$ w$$$i[%&[p'n';),.,7,=,S,n,~,, ,,, ,,,, ,,-"-(-.-1-A- G- S-^-`-u-7-]'|&Z(1 q*USC3`BU<X8 I 9c<j!Jb"#+Vn!UR,}~Rm}n%A*PP=xE0ElY :hs~_5k+!XEWA_N[a(87  cgL.yT92Y/H e<_\)KL )[g^wJ<X\Dv=U:.Fu-OzedQPTo|DdW%p0,A*74yvVD%;F s $o9-BG2NJ{)ti?.Q#8yO#7/&j]f 'o G6YlF;]d'^G=eCn3$w LrO xqE[/iSH&?{I2bM6zxp0#i>HG 3MC"N*uu5HvBIw65$4@@t9\C:K;)K:m kz(?^'DN$VRr%|hk f@3,>BZ> `ZJhMKt a{aT!SQjsI(QM0f~c=8+41&564gpSml"-`.WR/b1F2}>1"AP  rT,@ ;q+OL?  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed %d card with invalid properties.Fixed %d cards with invalid properties.Fixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid property found on card. Please use Tools>Check Database, and if the problem comes up again, please ask on the support site.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: anki Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-30 01:42+0000 Last-Translator: Tada Saki Language-Team: Vietnamese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) Language: vi Dừng (1 trên %d) (tắt) (bật) Có %d thẻ.%% Chính xác%(a)0.1f %(b)s/ngày%(a)0.1fs (%(b)s)Đã cập nhật %(a)d trên %(b)d ghi chú%(a)dkB lên, %(b)dkB xuống%(tot)s %(unit)s%d thẻĐã xóa %d thẻ.Đã xuất %d thẻ.Đã nhập %d thẻ.Đã học %d thẻ trong%d thẻ/phútĐã cập nhật %d bộ thẻ.%d nhóm%d ghi chúĐã thêm %d ghi chúĐã nhập %d ghi chúĐã cập nhật %d ghi chú%d thẻ ôn tập%d được chọnĐã có %s trên màn hình làm việc. Ghi đè không?bản sao %s%s ngày%s ngàyĐã xóa %s.%s giờ%s giờ%s phút%s phút.%s phút%s tháng%s tháng%s giây%s giây%s chờ xóa:%s năm%s năm%sng%sg%sph%sth%sgi%sn&Giới thiệu...Phần &Gắn thêm&Kiểm tra Cơ sở dữ liệu...&Luyện thi...Chỉnh &sửa&Xuất...&Tập tin&Tìm&Tới&Hướng dẫn&Hướng dẫn...Trợ &giúp&Nhập&Nhập...Đả&o ChọnThẻ &Kế&Mở Thư mục phần Gắn thêm...&Tùy chỉnhThẻ T&rướcLập &lịch lại...&Ủng hộ Anki...&Chuyển đổi Hồ sơ...&Công cụH&oàn tác'%(row)s' có %(num1)d trường tin, yêu cầu %(num2)d(chính xác %s)(cuối)(lọc)(đang học)(mới)(giới hạn ở cấp trên: %d)(vui lòng chọn 1 thẻ)...Tập tin .anki2 không được thiết kế cho mục đích nhập vào. Nếu bạn muốn phục hồi từ bản sao lưu, xin vui lòng xem phần 'Sao lưu' trong hướng dẫn sử dụng./0ng1 101 tháng1 năm10 SA10 CH3 SA4 SA4 CHNhận được lỗi quá hạn cổng truy cập 504. Xin vui lòng thử tạm thời vô hiệu hoá trình quét virus của bạn:%d thẻMở thư mục sao lưuGhé thăm trang web%(pct)d%% (%(x)s trên %(y)s)%d-%m-%Y @ %H:%MSao lưu
Anki sẽ sao lưu bộ sưu tập của bạn mỗi khi thoát hoặc thực hiện đồng bộ.Định dạng xuất ra:Tìm:Cỡ chữ:Kiểu chữ:Trong:Bao gồm:Kích thước đường gạch:Thay Bằng:Đồng bộ hóaĐồng bộ hóa
Hiện đang tắt; nhấp nút đồng bộ trong cửa sổ chính để bật đồng bộ.

Yêu cầu tài khoản

Bạn cần có tài khoản (miễn phí) để đồng bộ bộ sưu tập. Xin vui lòng đăng ký tài khoản rồi nhập thông tin chi tiết vào phía dưới.

Bản Cập nhật Anki

Anki %s đã được phát hành.

Xin cảm ơn tất cả những bạn đã đưa đến cho chúng tôi gợi ý, báo cáo lỗi và đóng góp.Độ dễ của thẻ là kích thước của khoảng cách tiếp theo khi bạn trả lời "Tốt" trong lần ôn tập,Đã lưu tập tin collection.apkg lên màn hình làm việc.Có vấn đề xảy ra khi đồng bộ phương tiện. Vui lòng đến Công cụ > Kiểm tra Phương tiện, rồi đồng bộ lại để sửa vấn đề.Đã huỷ: %sGiới thiệu về AnkiThêmThêm (phím tắt: Ctrl+Enter)Thêm Trường tinThêm dữ liệu Phương tiệnThêm Bộ thẻ Mới (Ctrl+N)Thêm Kiểu Ghi chúThêm Thẻ ngượcThêm NhãnThêm thẻ mớiThêm vào:Thêm: %sĐã thêmĐã thêm Hôm nayĐã thêm thẻ trùng với trường đầu tiên: %sLạiHọc lại Hôm nayHọc lại: %sMọi Bộ thẻMọi Trường tinTất cả thẻ với thứ tự ngẫu nhiên (chế độ luyện thi)Mọi thẻ, ghi chú và dữ liệu phương tiện cho hồ sơ này sẽ bị xóa. Bạn có chắc chắn không?Cho phép HTML trong trường tinCó lỗi xảy ra trong phần gắn thêm.
Xin vui lòng gửi lên diễn đàn phần gắn thêm:
%s
Có lỗi xảy ra khi mở %sCó lỗi xảy ra. Nguyên nhân có thể là do một mối rối vô hại,
hoặc bộ thẻ của bạn có trục trặc.

Để chắc rằng vấn đề không nằm ở bộ thẻ của bạn, vui lòng chạy Công cụ > Kiểm tra Cơ sở dữ liệu

Nếu vẫn không khắc phục được vấn đề, vui lòng sao chép đoạn sau
vào bản báo cáo rối:Đã lưu tập tin hình ảnh lên màn hình làm việc.AnkiBộ thẻ Anki 1.2 (*.anki)Anki 2 lưu trữ bộ thẻ với định dạng mới. Trình thuật sĩ này sẽ tự động chuyển đổi bộ thẻ của bạn sang định dạng đó. Bộ thẻ sẽ được sao lưu trước khi nâng cấp, nên bạn vẫn có thể sử dụng bộ thẻ cũ nếu muốn quay trở lại một phiên bản trước của Anki.Bộ thẻ Anki 2.0Anki 2.0 chỉ hỗ trợ nâng cấp tự động từ Anki 1.2. Để tải những bộ thẻ cũ, xin vui lòng dùng Anki 1.2 mở để nâng cấp trước rồi lại nhập vào Anki 2.0.Gói Bộ thẻ AnkiAnki không tìm thấy đường gạch giữa câu hỏi và câu trả lời. Xin vui lòng tự điều chỉnh lại kiểu mẫu để chuyển đổi giữa câu hỏi và câu trả lời.Anki là hệ thống học tập cách khoảng thông minh và thân thiện. Anki là một phần mềm mở và miễn phí.Anki được cấp quyền sử dụng theo giấy phép AGPL3. Vui lòng tham khảo tập tin giấy phép sử dụng trong bộ phân phối nguồn để biết thêm thông tin.Anki không nạp được tập tin cấu hình cũ của bạn. Xin vui lòng dùng chức năng Tập tin > Nhập để nhập những bộ thẻ của bạn từ phiên bản Anki trước.ID hoặc mật khẩu Anki Web không chính xác; xin vui lòng thử lại.ID AnkiWeb:AnkiWeb gặp lỗi. Xin vui lòng thử lại sau ít phút. Nếu vấn đề vẫn không khắc phục, xin vui lòng gửi báo cáo lỗi.AnkiWeb hiện đang rất bận. Xin vui lòng thử lại sau ít phút.AnkiWeb hiện đang bảo trì. Vui lòng thử lại sau ít phút.Trả lờiNút Trả lờiTrả lờiPhần mềm chống virus hoặc tường lửa đang ngăn cản Anki kết nối Internet.Tất cả những thẻ không được ánh xạ sẽ bị xóa. Nếu một ghi chú không còn thẻ nào, nó cũng sẽ bị mất. Bạn có chắc chắn muốn tiếp tục không?Xuất hiện 2 lần trong tập tin: %sBạn có chắc chắn muốn xóa %s?Yêu cầu ít nhất một kiểu thẻ.Cần ít nhất một bước.Đính kèm ảnh/âm thanh/phim (F3)Tự động phát âm thanhTự động đồng bộ khi đóng/mở hồ sơTrung bìnhThời lượng Trung bìnhThời gian trả lời trung bìnhĐộ dễ trung bìnhSố ngày trung bình đã họcKhoảng cách trung bìnhMặt sauXem trước Mặt sauKiểu mẫu Mặt sauSao lưuCơ bảnCơ bản (với thẻ ngược)Cơ bản (thẻ ngược tùy chọn)Chữ đậm (Ctrl+B)DuyệtDuyệt && Cài...Trình duyệtDuyệt (hiện %(cur)d thẻ; %(sel)s)Thể hiện Trình duyệtTùy chọn Trình duyệtTạoThêm Nhãn Hàng loạt (Ctrl+Shift+T)Xóa Nhãn Hàng loạt (Ctrl+T)GiấuGiấu ThẻGiấu Ghi chúThẻ mới có liên quan bị chôn đến ngày hôm sauGiấu ôn tập liên quan cho tới ngày kế tiếpMặc định, Anki sẽ phát hiện ký tự giữa các trường tin, ví dụ như tab, phẩy...v.v Nếu Anki phát hiện không chính xác, bạn có thể nhập vào đây. Dùng \t để biểu diễn ký tự tab.HủyThẻThẻ %dThẻ 1Thẻ 2Số ThẻThông tin Thẻ (Ctrl+Shift+I)Danh sách ThẻKiểu ThẻKiểu ThẻKiểu Thẻ %sĐã giấu thẻ.Đã dừng thẻ.Thẻ bám.ThẻKiểu ThẻKhông thể di chuyển thủ công thẻ vào bộ thẻ lọc.Thẻ dạng Văn bản ThôThẻ sẽ được tự động chuyển lại bộ thẻ gốc sau khi ôn tập.Thẻ...GiữaThay đổiĐổi %s thành:Đổi Bộ thẻĐổi Kiểu Ghi chúĐổi Kiểu Ghi chú (Ctrl+N)Đổi Kiểu Ghi chú...Đổi màu (F8)Đổi bộ thẻ theo kiểu ghi chúĐã đổiKiểm tra &Phương tiện...Kiểm tra các tập tin trong thư mục phương tiệnĐang kiểm tra...ChọnChọn Bộ thẻChọn Kiểu Ghi chúChọn NhãnNhân bản: %sĐóngĐóng và bỏ qua các nhập liệu hiện hànhĐiền chỗ trốngXóa thành chỗ điền trống (Ctrl+Shift+C)Mã:Bộ sưu tập bị hỏng. Xin vui lòng tham khảo tài liệu hướng dẫn.Dấu hai chấmDấu phẩyCấu hình ngôn ngữ và tùy chọn giao diệnXác nhận mật khẩu:Xin chúc mừng! Hiện giờ bạn đã học xong bộ thẻ này.Đang kết nối...TiếpChépSố trả lời đúng thẻ trưởng thành: %(a)d/%(b)d (%(c).1f%%)Chính xác: %(pct)0.2f%%
(%(good)d trên %(tot)d)Không kết nối đến AnkiWeb được. Xin vui lòng kiểm tra kết nối mạng và thử lại.Không thu âm được. Bạn đã cài lame và sox chưa?Không lưu tập tin được : %sLuyện thiTạo Bộ thẻTạo Bộ thẻ Lọc...Đã tạoCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZTích lũy%s Tích lũyTrả lời Tích lũyThẻ Tích lũyBộ Thẻ Hiện hànhKiểu ghi chú hiện tại:Học Tùy biếnPhiên Học Tùy biếnBước tùy biến (phút)Tùy biến Thẻ (Ctrl+L)Tùy biến Trường tinCắtĐã tái dựng và tối ưu hóa cơ sở dữ liệu.NgàySố ngày đã họcBỏ ủy quyềnMàn hình Gỡ lỗiBộ thẻThay thế Bộ thẻBộ thẻ sẽ được nhập vào khi mở hồ sơ.Bộ thẻKhoảng cách giảm dầnMặc địnhThời gian giãn cách đến khi hiện thẻ ôn tập lần nữaXóaXoá %s không?Xóa ThẻXóa Bộ thẻXóa Thẻ trốngXóa Ghi chúXóa Ghi chúXóa NhãnXóa dữ liệu ThừaXóa trường tin khỏi %s ?Xoá kiểu thẻ '%(a)s' và %(b)s của nó ?Xóa kiểu ghi chú này và mọi thẻ liên hệ?Xóa kiểu ghi chú thừa này ?Xoá dữ liệu phương tiện không dùng ?Xóa...Đã xóa %d thẻ thiếu ghi chú.Đã xóa %d thẻ thiếu kiểu mẫu.Đã xóa %d ghi chú thiếu kiểu ghi chú.Đã xóa %d ghi chú không có thẻ.Đã xoá %d thẻ sai số trường tin.Đã xóa.Đã xóa. Xin vui lòng chạy lại Anki.Khi xóa bộ thẻ này khỏi danh sách, toàn bộ thẻ còn lại sẽ được trả về bộ thẻ gốc.Mô tảMô tả hiển thị trên màn hình học tập (chỉ với bộ thẻ hiện tại):Hộp thoạiBỏ trường tinTải thất bại: %sTải xuống từ AnkiWebTải thành công. Xin vui lòng chạy lại Anki.Đang tải xuống từ AnkiWeb...Đến hạnChỉ thẻ nợĐến hạn ngày mai&ThoátĐộ dễDễPhần chênh mức DễKhoảng cách mức DễSửaSửa %sSửa Ghi chú Hiện hànhSửa HTMLChỉnh sửa để tùy biếnChỉnh sửa...Đã sửaKiểu chữ khi Chỉnh sửaĐã lưu lại các hiệu chỉnh. Xin vui lòng chạy lại Anki.Làm trốngThẻ Trống...Thẻ trống: %(c)s Trường tin: %(f)s Tìm thấy thẻ trống. Vui lòng chạy Công cụ > Thẻ Trống.Trống trường tin đầu tiên: %sKết thúcNhập bộ thẻ để thêm thẻ mới kiểu %s, hoặc để trống:Nhập vị trí thẻ mới (1...%s):Nhập nhãn cần thêm:Nhập nhãn cần xóa:Tải bị lỗi: %sCó lỗi trong quá trình khởi chạy: %sGặp lỗi khi thực thi %s.Gặp lỗi khi chạy %sXuấtXuất...Phụ thêmFF1F3F5F7F8Trường %d của tập tin là:Ánh xạ trường tinTên trường tin:Trường tinTrường tinCác trường tin của bộ thẻ %sTrường tin phân cách bằng: %sTrường tin...Bộ &lọcTập tin không hợp lệ. Xin vui lòng phục hồi từ bản sao lưu.Không tìm thấy tập tin.LọcLọc:Đã lọcBộ thẻ Lọc %dTìm Thẻ t&rùng...Tìm Thẻ trùngTìm và Th&ay...Tìm và ThayXongThẻ ĐầuÔn tập Lần đầuTrường đầu tiên khớp: %sĐã sửa %d thẻ có thuộc tính không hợp lệ.Kiểu ghi chú cố định: %sLậtThư mục đã tồn tại.Kiểu chữ:Chân trangVì lý do an ninh, bạn không được dùng '%s' trên thẻ. Bạn vẫn có thể dùng nó bằng cách đặt lệnh trong một gói khác, rồi nhập gói đó vào đầu đề LaTeX.Dự báoBiểu mẫuThẻ đúng & Thẻ ngược tùy chọnThẻ đúng & Thẻ ngượcTìm thấy %(a)s trên %(b)s.Mặt trướcXem trước Mặt trướcKiểu mẫu Mặt trướcTổng quátTập tin đã phát sinh: %sĐã phát sinh vào %sLấy Bộ thẻ Chia sẻĐượcKhoảng cách mức ĐượcTrình soạn thảo HTMLKhóBạn đã cài latex và dvipng chưa?Đầu trangTrợ giúpĐộ dễ cao nhấtLịch sửGốcChia nhỏ Theo giờGiờNhững mốc giờ có ít hơn 30 thẻ ôn tập sẽ không được hiển thị.Xin vui lòng liên lạc với chúng tôi nếu bạn có tham gia đóng góp mà không thấy tên mình trên danh sách.Nếu học hàng ngày thìBỏ qua mỗi khi thời gian trả lời lâu hơnBỏ qua phân biệt hoa thườngBỏ qua những dòng mà trường tin đầu tiên trùng với ghi chú hiện cóBỏ qua bản cập nhật nàyNhậpNhập Tập tinNhập vào ngay cả khi ghi chú hiện có có cùng trường tin đầu tiênNhập thất bại. Nhập thất bại. Thông tin gỡ lỗi: Tùy chọn nhậpNhập hoàn tất.Nằm trong thư mục phương tiện nhưng chưa được thẻ nào dùng:Để bảm đảm rằng bộ sưu tập của bnạ hoạt động đúng đắn khi chuyển thiết bị, Anki yêu cầu đồng hồ bên trong máy tính của bạn phải được đặt chính xác. Đồng hồ bên trong có thể sai ngay cả khi hệ thống của bạn hiện thời gian nội bộ chính xác. Vui lòng đến thiết lập thời gian trên máy tính của bạn và kiểm tra các phần sau: - Sáng/Chiều - Độ lệch giờ - Ngày, tháng, năm - Múi giờ - Tiết kiệm giờ theo mùa Sai biệt với giờ đúng: %s.Bao gồm dữ liệu phương tiệnBao gồm thông tin lập lịchBao gồm nhãnTăng giới hạn thẻ mới cho hôm nayTăng giới hạn thẻ mới cho hôm nay vớiTăng giới hạn thẻ ôn tập cho hôm nayTăng giới hạn thẻ ôn tập cho hôm nay vớiKhoảng cách tăng dầnThông tinCài Phần gắn thêmNgôn ngữ Giao diện:Khoảng cáchHệ số khoảng cáchKhoảng cáchMã không hợp lệ.Mã hoá không hợp lệ; vui lòng đổi tên:Tập tin không hợp lệ. Xin vui lòng phục hồi từ bản sao lưu.Mật khẩu không hợp lệ.Tìm thấy thuộc tính không hợp lệ trên thẻ. Vui lòng dùng Công cụ > Kiểm tra CSDL và nếu vẫn có vấn đề, vui lòng hỏi trên trang hỗ trợ.Biểu thức chính quy không hợp lệ.Thẻ đã bị dừng.Chữ nghiêng (Ctrl+I)Lỗi JS ở dòng %(a)d: %(b)sNhảy đến nhãn với Ctrl+Shift+TGiữLaTeXPhương trình LaTeXMôi trường toán LaTeXHỏngThẻ CuốiÔn tập Sau cùngThẻ thêm mới nhất trướcHọcGiới hạn học trướcHọc: %(a)s, Ôn: %(b)s, Học lại: %(c)s, Lọc: %(d)sĐang họcThẻ bámHành động với thẻ bámNgưỡng thành thẻ bámTráiGiới hạn trongĐang nạp...Khóa tài khoản bằng mật khẩu, hoặc để trống:Khoảng lâu nhấtTìm trong trường tin:Độ dễ thấp nhấtQuản lýQuản lý Kiểu Ghi chú...Ánh xạ với %sÁnh xạ với NhãnĐánh dấuĐánh dấu Ghi chúĐánh dấu Ghi chú (Ctrl+K)Đã đánh dấuTrưởng thànhKhoảng tối đaÔn tập tối đa/ngàyPhương tiệnKhoảng tối thiểuPhútTrộn lẫn thẻ mới và thẻ ôn tậpBộ thẻ Mnemosyne 2.0 (*.db)ThêmNhiều lần hỏng nhấtDi chuyển ThẻDi chuyển Đến Bộ thẻ (Ctrl+D)Di chuyển thẻ vào bộ thẻ:&Ghi chúTrùng tên đã có.Tên cho bộ thẻ:Tên:MạngMớiThẻ MớiThẻ mới trong bộ: %sChỉ thẻ mớiThẻ mới/ngàyTên bộ thẻ mới:Khoảng mớiTên mới:Kiểu ghi chú mới:Tên nhóm tùy chọn mới:Vị trí mới (1...%d):Ngày kế tiếp bắt đầu lúcChưa có thẻ nợ.Không có thẻ ứng với tiêu chí bạn đã đưa.Không có thẻ trống.Chưa có thẻ trưởng thành học trong hôm nay.Không tìm thấy tập tin thiếu hay thừa nào.Ghi chúSố Ghi chúKiểu Ghi chúKiểu Ghi chúĐã xóa ghi chú và %d thẻ liên kếtĐã tạm hoãn ghi chú.Đã dừng ghi chú.Lưu ý: Dữ liệu phương tiện sẽ không được sao lưu. Xin vui lòng sao lưu định kỳ thư mục Anki của bạn để phòng xa.Lưu ý: một vài thông tin lược sử bị thiếu. Để biết thêm chi tiết, xin vui lòng tham khảo tài liệu trình duyệt.Ghi chú dạng Văn bản ThôGhi chú cần ít nhất một trường tin.Ghi chú đã gắn nhãnKhông gìĐồng ýThẻ lâu nhất trướcỞ lần đồng bộ kế tiếp, bắt buộc thay đổi trong một hướngKhông nhập được ghi chú vì nó không phát sinh thẻ nào cả. Điều này có thể xảy ra khi bạn có trường tin trống hay bạn chưa ánh xạ nội dung trong tập tin văn bản vào các trường tin tương ứng.Chỉ có thể định vị lại thẻ mới.Chỉ một trình khách có thể truy xuất AnkiWeb một lúc. Nếu lần đồng bộ trước hỏng, vui lòng thử lại trong ít phút.MởĐang tối ưu hóa...Giới hạn tùy chọn:Tuỳ chọnTùy chọn bộ thẻ %sNhóm tùy chọn:Tùy chọn...Thứ tựThứ tự thêm vàoThứ tự đến hạnThay thế kiểu mẫu mặt sau:Thay thế kiểu chữ:Thay thế kiểu mẫu mặt trước:Bộ thẻ Anki Đóng gói (*.apkg *.zip)Mật khẩu:Mật khẩu không khớpDánDán hình ảnh clipboard với dạng PNGBài học Pauker 1.8 (*.pau.gz)Phần trămThời gian: %sĐặt vào cuối hàng đợi thẻ mớiĐặt vào hàng đợi ôn tập với khoảng cách giữa:Xin vui lòng thêm kiểu thẻ khác trước.Xin vui lòng kiên nhẫn; thao tác này có thể mất một lúc.Xin vui lòng gắn micro vào, và chắc chắn rằng những chương trình khác đang không dùng thiết bị tiếng.Xin vui lòng sửa ghi chú này và thêm vài chỗ điền trống. (%s)Xin vui lòng đảm bảo rằng hồ sơ đã mở và Anki đang rỗi, rồi thử lại.Xin vui lòng cài đặt PyAudioXin vui lòng cài đặt mplayer.Xin vui lòng mở một hồ sơ trước.Vui lòng chạy Công cụ > Thẻ TrốngXin vui lòng chọn một bộ thẻ.Xin vui lòng chọn thẻ từ một kiểu ghi chú duy nhất.Xin vui lòng chọn một cái gì đó.Xin vui lòng nâng cấp lên phiên bản Anki mới nhất.Xin vui lòng dùng Tập tin>Nhập để nhập tập tin này.Xin vui lòng ghé thăm AnkiWeb, nâng cấp bộ thẻ, rồi thử lại.Vị tríTùy chỉnhXem trướcXem trước Thẻ Được chọn (%s)Xem trước thẻ mớiXem trước thẻ mới thêm vào sau cùngĐang xử lý...Mật khẩu Hồ sơ...Hồ sơ:Hồ sơYêu cầu xác thực ủy nhiệm.Câu hỏiCuối hàng đợi: %dĐầu hàng đợi: %dThoátNgẫu nhiênTrộn ngẫu nhiên thứ tựĐánh giáSẵn sàng Nâng cấpTái tạoThu TiếngThu âm (F5)Đang thu...
Thời gian:%0.1fTình trạng đến hạn liên quanHọc lạiGhi nhớ nhập liệu sau cùng khi thêm mớiBỏ NhãnBỏ định dạng (Ctrl+R)Loại bỏ kiểu thẻ này sẽ khiến cho một hoặc nhiều ghi chú bị xóa. XIn vui lòng tạo một kiểu thẻ mới trước.Đổi tênĐổi tên Bộ thẻPhát lại Âm thanhPhát lại TiếngĐịnh vị lạiĐịnh vị lại Thẻ MớiĐịnh vị lại...Yêu cầu một hoặc một số nhãn sau:Lập lịch lạiLập lịch lạiLập lịch lại thẻ các dựa trên cách tôi trả lời ở bộ thẻ nàyTiếp tục Bây giờHướng văn bản ngược (phải qua trái)Phục hồi lại trạng thái trước '%s'.Ôn tậpSố Ôn tậpThời gian Ôn tậpÔn trướcÔn trướcÔn thẻ quên sau cùngÔn thẻ quênTỷ lệ ôn tập thành công mỗi giờ trong ngàyÔn tậpÔn tập đến hạn trong bộ thẻ: %sPhảiLưu ẢnhPhạm vi: %sTìmTìm trong định dạng (chậm)ChọnChọn &HếtChọn &Ghi chúChọn nhãn để loại trừ:Tập tin được chọn không có định dạng UTF-8. Vui lòng tham khảo phần nhập vào của tài liệu hướng dẫn.Học tập Lựa chọnDấu chấm phẩyKhông tìm thấy máy chủ. Hoặc là bạn đã bị mất kết nối, hoặc có phần mềm chống virus/tường lửa đang ngăn chặn Anki kết nối với internet.Đặt tất cả bộ thẻ dưới %s vào nhóm tùy chọn này?Đặt cho tất cả bộ thẻ conĐặt màu mặt (F7)Phím Shift được nhấn giữ. Bỏ qua đồng bộ tự đồng và nạp phần gắn thêm.Dịch chuyển vị trí các thẻ hiện hữuPhím tắt: %sPhím tắt: %sHiện %sHiện Đáp ánHiện Thẻ trùngHiện đồng hồ bấm giờ trả lờiHiện thẻ mới sau phần ôn tậpHiện các thẻ mới trước khi ôn tậpHiện các thẻ mới theo thứ tự thêm vàoHiện các thẻ mới theo thứ tự ngẫu nhiênHiện thời gian ôn tập kế tiếp trên các nút trả lờiHiện số thẻ còn lại trong lúc ôn tậpHiện thống kê. Phím tắt: %sCỡ:Vài thẻ liên quan hoặc thẻ chôn bị hoãn lại đến phiên sau.Một số thiết lập chỉ có hiệu lực sau khi chạy lại Anki.Vài cập nhật bị bỏ qua vì kiểu ghi chú đã thay đổi:Trường Sắp xếpSắp xếp theo trường này trong trình duyệtKhông hỗ trợ sắp xếp trên cột này. Xin vui lòng chọn cột khác.Âm thanh & Hình ảnhKhoảng trắngVị trí bắt đầu:Độ dễ ban đầuThống kêBước:Bước (phút)Bước phải là sốGỡ bỏ HTML khi dán văn bảnĐã học %(a)s trong %(b)s hôm nay.Đã học Hôm nayHọc tậpHọc Bộ thẻHọc Bộ thẻ...Học Bây giờHọc theo trạng thái thẻ hay nhãnĐịnh kiểuĐịnh kiểu (chia sẻ giữa các thẻ)Chỉ số dưới (Ctrl+=)Tập tin xuất XML của Sumermemo (*.xml)Chỉ số trên (Ctrl+Shift+=)DừngDừng ThẻDừng Ghi chúDừngĐồng bộ cả âm thanh và hình ảnhĐồng bộ hóa với AnkiWeb. Phím tắt: %sĐang đồng bộ dữ liệu Phương tiện...Đồng bộ thất bại: %sĐồng bộ thất bại; kết nối ngoại tuyến.Để tiến hành đồng bộ, đồng hồ máy tính phải được đặt chính xác. Xin vui lòng chỉnh đồng hồ rồi thử lại.Đang đồng bộ...TabNhãn TrùngChỉ gắn NhãnNhãnBộ thẻ Đích (Ctrl+D)Trường tin đích:Văn bảnVăn bản ngăn cách bởi ký tự Tab hay Dấu chấm phẩy (*)Bộ thẻ đã tồn tại.Tên trường tin này đã được dùng.Tên này đã được dùng.Kết nối đến AnkiWeb bị quá thời gian. Xin vui lòng kiểm tra kết nối mạng rồi thử lại.Không thể loại bỏ cấu hình mặc định.Không thể xóa bộ thẻ mặc định.Sự phân chia thẻ trong bộ.Trường tin đầu tiên trống.Trường tin đầu tiên của kiểu ghi chú phải được ánh xạ.Không dùng được ký tự này: %sMặt trước thẻ này trống. Vui lòng chạy Công cụ > Thẻ Trống.Các biểu tượng được lấy từ nhiều nguồn; xin vui lòng xem nguồn Anki để biết xuất xứ.Phần nhập liệu bạn cung cấp sẽ tạo ra một câu hỏi trống trên mọi thẻ.Số câu hỏi đã trả lời.Số thẻ ôn tập đến hạn trong tương lai.Số lần nhấn mỗi nút.Phân quyền trên thư mục tạm thời trên hệ thống của bạn không chính xác, và Anki không thể chỉnh nó tự động được Vui lòng tìm 'thư mục tạm' trong hướng dẫn sử dụng Anki để có thêm thông tin.Tập tin đã cho không phải tập tin .apkg hợp lệ.Yêu cầu tìm kiếm bạn cung cấp không khớp với bất kỳ thẻ nào. Bạn có muốn sửa lại không?Thao tác thay đổi này yêu cầu tải lên toàn bộ cơ sở dữ liệu trong lần đồng bộ bộ sưu tập kế tiếp. Nếu bạn có phần ôn tập hoặc thay đổi khác trên thiết bị khác chưa được đồng bộ thì chúng sẽ bị mất. Tiếp tục chứ?Thời gian trả lời câu hỏi.Nâng cấp hoàn tất, bạn đã sẵn sàng sử dụng Anki 2.0.

Bên dưới là ghi chép cập nhật:

%s

Vẫn còn nhiều thẻ nữa, nhưng đã đến giới hạn hàng ngày. Bạn có thể tăng thêm giới hạn trong phần tùy chọn, nhưng cần nhớ rằng bạn càng đưa ra nhiều thẻ mới thì gánh nặng ôn tập trong thời gian ngắn đối với bạn ngày càng cao hơn.Phải có ít nhất một hồ sơ.Cột này không dùng để sắp thứ tự được, nhưng bạn có thể tìm kiếm từng kiểu thẻ riêng, như là 'card:Card 1'.Cột này không dùng để sắp thứ tự được, nhưng bạn có thể nhấp vào một bộ thẻ bên trái để tìm kiếm bộ thẻ cụ thể.Tập tin này dường như không phải tập tip .apkg hợp lệ. Nếu bạn gặp lỗi này với tập tin tải xuống từ AnkiWeb, có khả năng bản tải của bạn đã hỏng. Vui lòng thử lại, và nếu vấn đề vẫn tồn tại, vui lòng thử lại với trình duyệt khác.Tập tin này đã tồn tại. Bạn có chắc chắn muốn ghi đè không?Thư mục này lưu trữ tất cả dữ liệu Anki vào một vị trí duy nhất, để dễ sao lưu. Nếu muốn Anki dùng một vị trí khác, xin vui lòng tham khảo: %s Đây là bộ thẻ đặc biệt để học ngoài thời khóa biểu bình thường.Đây là một {{c1::ví dụ}} về chỗ điền trống.Thao tác này sẽ xóa bộ sưu tập bạn đang có và thay thế bằng dữ liệu trong tập tin bạn định nhập. Bạn có chắc chắn không?Trình thuật sĩ này sẽ giúp bạn trong quá trình nâng cấp Anki 2.0. Để quá trình nâng cấp diễn ra suôn sẻ, xin vui lòng đọc kỹ những trang sau. Thời gianGiới hạn khung thời gianCần ÔnĐể duyệt xem các phần gắn thêm, xin vui lòng nhấp nút Duyệt bên dưới.

Nếu tìm thấy phần gắn thêm nào thích, xin vui lòng dán mã của nó vào bên dưới.Để nhập vào một hồ sơ bảo vệ bằng mật khẩu, vui lòng mở hồ sơ trước khi nhập.Để tạo chỗ điền trống trong ghi chú hiện có, trước tiên cần chuyển nó sang kiểu điền trống, ở Chỉnh sửa>Đổi Kiểu Ghi chú.Để xem ngay bây giờ, nhấp nút Bỏ chôn bên dưới.Để học thêm ngoài thời khóa biểu bình thường, nhấp nút Học Tùy biến bên dưới.Hôm nayĐã đến giới hạn trong ngày hôm nay, nhưng vẫn còn nhiều thẻ đang chờ ôn tập. Để giúp trí nhớ hoạt động hiệu quả hơn, bạn có thể xem xét tăng giới hạn hàng ngày trong phần tùy chọn.TổngTổng Thời gianTổng số thẻTổng số ghi chúXử lý dữ liệu nhập theo dạng biểu thức chính quyKiểuKiểu trả lời: trường tin không biết %sKhông thể nhập được từ tập tin chỉ đọc.Bỏ chônChữ gạch chân (Ctrl+U)Hoàn tácHoàn tác %sĐịnh dạng tập tin không xác định.Chưa thấyCập nhật các ghi chú hiện hữu khi so khớp trường tin đầu tiênĐã cập nhật %(a)d trong %(b)d ghi chú hiện hữu.Nâng cấp Hoàn tấtThuật sĩ Nâng cấpĐang nâng cấpĐang nâng cấp bộ thẻ %(a)s trong %(b)s... %(c)sTải lên AnkiWebĐang tải lên AnkiWeb...Phương tiện được thẻ sử dụng nhưng không có trong thư mục phương tiện:Người dùng 1Phiên bản %sChờ hoàn tất chỉnh sửa.Cảnh báo, xoá điền trống sẽ không hoạt động được cho đến khi bạn chuyển kiểu thẻ ở trên cùng sang kiểu Điền trống.Chào mừngKhi thêm mới, mặc định thực hiện với bộ thẻ hiện hànhKhi hiện câu trả lời, phát lại cả câu hỏi và đáp ánKhi đã sẳn sàng nâng cấp, nhấp nút Tiến hành để tiếp tục. Hướng dẫn nâng cấp sẽ được mở ra trong trình duyệt trong suốt quá trình. Xin vui lòng đọc kỹ, do đã có nhiều thay đổi so với phiên bản Anki trước.Khi nâng cấp bộ thẻ, Anki sẽ cố gắng sao chép mọi âm thanh và hình ảnh từ bộ thẻ cũ. Nếu bạn có sử dụng thư mục DropBox hay thư mục phương tiện tùy biến thì Anki có thể sẽ không định vị được phương tiện. Sau đó, Anki sẽ trình bày một bản báo cáo nâng cấp cho bạn. Nếu có dữ liệu phương tiện nào không được sao chép, xin vui lòng xem hướng dẫn nâng cấp để được chỉ dẫn thêm.

Giờ đây AnkiWeb đã hỗ trợ đồng bộ phương tiện trực tiếp. Bạn không cần thiết đặt gì thêm, dữ liệu phương tiện sẽ được đồng bộ cùng với thẻ đến AnkiWeb.Cả Bộ sưu tậpBạn có muốn tải xuống ngay bây giờ không?Viết bởi Damien Elmes, với sự tham gia đóng góp các bản vá, dịch thuật, chạy thử và thiết kế của:

%(cont)sBạn có một kiểu ghi chú xoá điền trống nhưng chưa xoá chỗ này. Thực hiện ?Bạn có nhiều bộ thẻ. Vui lòng xem %(a)s. %(b)sBạn chưa thu tiếng.Bạn phải có ít nhất một cột.TrẻTrẻ+HọcBộ thẻ của BạnThay đổi của bạn sẽ tác động đến nhiều bộ thẻ. Nếu bạn chỉ muốn thay đổi bộ thẻ hiện tại, vui lòng thêm vào một nhóm tuỳ chọn mới trước.Tập tin bộ sưu tập của bạn dường như đã hỏng. Điều này có thể xảy ra do tập tin bị di chuyển hoặc sao chép khi Anki đang mở, hoặc bộ sưu tập được lưu trữ trên ổ đĩa mạng hay đám mây. Vui lòng tham khảo tài liệu hướng dẫn để biết cách phục hồi từ bản sao lưu tự động.Bộ sưu tập thẻ của bạn đang trong tình trạng thiếu nhất quán. Vui lòng chạy Công cụ > Kiểm tra Cơ sở dữ liệu, rồi đồng bộ lại.Bộ sưu tập hoặc tập tin phương tiện của bạn quá lớn để đồng bộ.Bộ sưu tập của bạn đã được tải lên AnkiWeb thành công. Nếu có dùng thiết bị nào khác, xin vui lòng đồng bộ hóa nó ngay, và chọn tải về bộ sưu tập mà bạn vừa tải lên từ máy này. Sau đó, những bước ôn tập và thẻ mới thêm vào trong tương lai sẽ được tự động kết hợp lại.Bộ thẻ của bạn ở đây và trên AnkiWeb khác nhau đến nỗi không thể kết hợp với nhau được, vì vậy cần phải ghi đè một bộ lên bộ còn lại. Nếu chọn tải xuống, Anki sẽ tải xuống bộ sưu tập trên AnkiWeb, và mọi thay đổi trên máy tính từ lần đồng bộ trước sẽ bị mất. Nếu chọn tải lên, Anki sẽ tải bộ sưu tập của bạn lên AnkiWeb, và mọi thay đổi trên AnkiWeb hoặc các thiết bị khác từ lần đồng bộ trước sẽ bị mất. Sau khi mọi thiết bị đã được đồng bộ, những lần ôn tập và thêm thẻ mới trong tương lai sẽ được tự động kết hợp với nhau.[không có bộ thẻ]sao lưuthẻthẻ từ bộ thẻthẻ được chọn theobộ sưu tậpngngàybộ thẻdòng đời bộ thẻtrùngtrợ giúpẩngiờgiờ qua nửa đêmlần hỏngánh xạ với %sánh xạ với Nhãnphútphútththẻ ôn tậpgiâythống kêtrang nàytcả bộ sưu tập~anki-2.0.20+dfsg/locale/ko/0000755000175000017500000000000012256137063015125 5ustar andreasandreasanki-2.0.20+dfsg/locale/ko/LC_MESSAGES/0000755000175000017500000000000012065014111016674 5ustar andreasandreasanki-2.0.20+dfsg/locale/ko/LC_MESSAGES/anki.mo0000644000175000017500000017621512252567246020213 0ustar andreasandreas0`AaA hAsAzA"AA AA8AAB%B"6B$YB$~B&BB"B CC0C$MC rCCC0CCC&D /D;D(LDuDD,DD*D E,!E NE\E(mEEEEEEE EEEEE EEEEE FFF F)F ;FFF^FnF}FFFFF0F F F GGG*G.GGGGGGGGGGGTG?HAH,WH(HH!HHfImI II I IIIIIeJnJ7K PK5ZKXKYK8CL |LLL L LL L LL LMMM M"M (M 4M >MKIMMNM#MN"N9N 1O?OOORtPvPw>Q7Q QwQErRRRRRR)SS#S#ST .TOT(hTT TT TTTT T UUUU9UXUkUrUULUUUUV"V@V EVOV WWWW&W-W FW PW ZWeWwWWW W3WWSWGXPXWX ^X lXxXXXX"XX&X Y(Y /Y;Y LYVY\YzYYY-YYY(YZ5Z OZ]Z5bZPZ7Z![8[ =[I[a[i[p[ w[[[[[[[[[[[[ [ [ [ \ \ \ '\ 4\A\H\O\ V\ a\o\\ \\ \\\\]]]=] B] O] []i] n]/|]]]]%]] ] ^ ^ ^ -^ 9^ F^ R^`^(v^^^ ^F^N#_Pr_>_` `])` `8`` ```) a5aQa Uabahama ra }aaa a aaaa a!aab)b0>bobb4b!bbb cc8cLc]c dcnctcvcyc|cccc c ccc cc cc,d/dAdHdPdYdjd~ddd d ddddddde+eEe KeYehepee eee ee$eee efff$f.*fFYfff f4fg-g 4g1@grgggg*g gg h*h"Jh"mh hhhhhhh i i)!iKi]iyiiiiiiii i i jj%j<7jtj}j jjjj j+jjj kkk -k 7kCk HkRkeklkskkkkkkkk k kll1l 7lDlJlRl Vl`l vll l lllll+l'm!7mYm ^m hm<sm mm]ma+nn!nnnn,n o#oo o pp$p3p BpMp Sp _pippp ppppp q q!q,@q#mq)qVq8rEKrrrrrr,s u l$?Q`(gD/3E LY hry * A%g +R/QHt3C$$ E<`4MR; D  7 B$Lqx     <!F h#v #1F Wev.M ES"q (C ;#\(  '+=V gqF5!| 2'/Z+!0/ 9V@^ 1X8O`o5*3 >LSd x " %=[3p~#48IPgv8}%,% z/,,%$*?O/jR*!}_9+Oy{>12ahX0w& - ;Ixmw< C Q _m$3 1?F/@: { .AOb&r'@8h  "   &=X\`dkovz-NisIITpsRJRmY]D}f=OXc`VpG ^Cey*W &gijk!#Gftt,;j~iD5  A  9':dL~o+ A&VK 1`B$ux?X=Equu<a}A/L\z  `XgcSEl *!+YjFkh(xSU2m(v"IyzC7hk'%O;QJM"U:8  D+;q]HWw wxWb@{P?Q{R)y}| 1L *6$m~Tvac#46Uo&B\KvZ@{'VB>#F^=_znbb2"( 04-<7dhN)>Q8MqY)nd@neZO9e.!H_C 5t$,of> 3r:S [/a9F4Js[3r^8,GM-<.g 0N1w_]p/6\3K2T%0H5r lPZ|?%Pl|[.E7 Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(filtered)(learning)(new)(parent limit: %d)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.About AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAgainAgain TodayAll DecksAll FieldsAll cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury NoteBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...CopyCorrect: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFirst CardFirst ReviewFlipFolder already exists.Font:FooterForecastForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name:NetworkNewNew CardsNew cards in deck: %sNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards matched the criteria you provided.No empty cards.No unused or missing files found.NoteNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift position of existing cardsShortcut key: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some settings will take effect after you restart Anki.Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStylingStyling (shared between cards)Supermemo XML export (*.xml)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.Underline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards selected bycollectionddaysdeckdeck lifehelphourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatswwhole collection~Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-09-20 03:52+0000 Last-Translator: jnnk Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: 정지 (1/%d) (꺼짐) (켜짐) %d카드가 들어 있습니다.%% 정답%(a)0.1f %(b)s/일%(a)d/%(b)d노트를 업데이트 했습니다.%(a)dkB 업로드, %(b)dkB 다운로드%(tot)s %(unit)s%d카드%d카드를 삭제했습니다.%d카드를 내보냈습니다.%d카드를 가져왔습니다.%d카드를 공부한 시간%d카드/분%d뭉치를 업데이트했습니다.%d그룹%d노트%d노트를 추가했습니다.%d노트를 가져왔습니다.%d노트를 업데이트했습니다.%d복습%d개 선택%s 파일은 이미 데스크톱에 존재합니다. 덮어쓸까요?%s 복사%s일%s일%s 삭제됨.%s시간%s시간%s분%s분.%s분%s개월%s달%s초%s초삭제할 %s:%s년%s년%s일%s시간%s분%s달%s초%s년정보(&A)...추가 기능(&A)데이터베이스 검사(&C)...벼락치기(&C)...편집(&E)내보내기(&E)...파일(&F)찾기(&F)이동(&G)지침서(&G)지침서(&G)...도움말(&H)가져오기(&I)가져오기(&I)...선택 항목 반전(&I)다음 카드(&N)추가 기능 폴더 열기(&O)...환경 설정(&P)...이전 카드(&P)일정 재조정(&R)...앙키 후원(&S)...프로필 전환(&S)...도구(&T)실행 취소(&U)'%(row)s'째 줄의 필드는 %(num1)d개. 예상한 필드는 %(num2)d개.(%s 정답)(여과됨)(익히는 중)(새 카드)(부모 제한: %d)....anki2 파일은 가져오기 용으로 제작되지 않았습니다. 백업 파일에서 복구를 하려면, 사용 설명서에서 '백업' 항목을 참고하세요./0일1 101개월1년10AM10PM3AM4AM4PM504 gateway timeout 오류가 발생했습니다. 안티바이러스를 잠시 꺼보세요.: 그리고%d카드백업 폴더 열기공식 웹사이트 방문%(pct)d%% (%(x)s/%(y)s)%Y-%m-%d @ %H:%M백업
앙키는 사용자의 모음집을 종료하거나 동기화할 때마다 백업을 만듭니다.내보내기 형식:찾을 말:글꼴 크기:글꼴:대상:포함:줄 간격:바꿀 말:동기화동기화
현재 사용하지 않고 있습니다. 프로그램 기본 창에서 동기화 버튼을 눌러서 활성화하세요.

계정이 필요합니다

무료 계정이 있어야 사용자의 모음집을 동기화할 수 있습니다. 사용자 등록을 한 뒤, 필요한 정보를 아래에 입력하세요.

앙키 업데이트

앙키 %s 버전이 공개되었습니다.

<무시><찾을 내용을 이 곳에 입력하세요. 이대로 엔터 키를 누르면 현재 뭉치를 표시합니다.>제안, 버그 신고, 기부를 해주신 모든 분께 감사드립니다.카드의 수월함은 "알맞음" 평가 버튼에 지정된 다음 복습 간격의 크기로 나타납니다.collection.apkg이라는 이름의 파일을 바탕화면에 저장했습니다.앙키 소개추가추가 (단축키: ctrl+enter)필드 추가미디어 넣기새 뭉치 추가 (Ctrl+N)노트 유형 추가반대 방향 추가태그 추가새 카드 추가삽입 위치:추가: %s추가됨오늘 추가다시오늘 다시모든 뭉치모든 필드현재 프로필의 모든 카드, 노트, 미디어 파일이 삭제됩니다. 계속 진행하겠습니까?필드 안에 HTML 허용추가 기능에서 오류가 발생했습니다.
추가 기능 포럼에 보고하세요:
%s
이미지 파일을 바탕 화면에 저장했습니다.앙키앙키 1.2 뭉치 (*.anki)앙키 2는 새로운 형식으로 뭉치를 저장합니다. 이 마법사는 사용자의 뭉치를 새 형식에 맞게 변환할 것입니다. 사용자의 뭉치는 업그레이드를 하기 전에 백업되기 때문에, 이전 버전의 앙키로 돌아가야 될 경우, 여전히 옛 뭉치을 사용할 수 있습니다.앙키 2.0 뭉치앙키 2.0로 자동 업그레이드하는 것은 앙키 1.2부터만 지원합니다. 더 이전 버전의 뭉치를 열려면, 우선 앙키 1.2에서 열어서 업그레이드한 다음, 다시 앙키 2.0으로 불러오세요.앙키 뭉치 꾸러미질문과 답을 구분하는 선을 찾을 수 없습니다. 서식을 수동으로 수정해서 질문과 답을 바꾸세요.앙키는 사용하기 편하고, 영리한 분산 학습 시스템입니다. 무료로 제공하는 오픈 소스 프로그램입니다.앙키는 AGPL3 라이센스를 따릅니다. 더 자세한 정보는 소스 배포판의 라이센스 파일을 참고하세요.옛 설정 파일을 열 수 없습니다. 파일>가져오기를 선택해서 이전 버전의 앙키 뭉치를 가져오세요.앙키웹 아이디나 비밀번호가 틀렸습니다. 다시 시도하세요.앙키웹 아이디:앙키웹에 문제가 생겼습니다. 몇 분 뒤 다시 시도해 봐도, 문제가 계속될 경우, 오류 보고를 해주세요.현재 앙키웹에 과도한 접속이 이루어지고 있습니다. 몇 분 뒤 다시 시도하세요.답평가 버튼답앙키가 인터넷에서 접속하는 것을 안티바이러스나 방화벽 소프트웨어가 막고 있습니다.어디에도 배정되지 않은 카드는 모두 삭제됩니다. 카드가 존재하지 않는 노트는 사라집니다. 계속 진행하겠습니까?파일에서 두 번 등장합니다: %s%s 뭉치를 삭제하시겠습니까?최소한 하나의 카드 유형이 필요합니다.적어도 하나의 단계는 반드시 필요합니다.이미지/오디오/비디오 넣기 (F3)자동으로 오디오 재생프로필을 열고 닫을 때 자동 동기화평균평균 시간평균 답변 시간평균 수월함공부한 기간 동안 평균평균 복습 간격뒷면뒷면 미리보기뒷면 서식백업기본기본 (역방향 카드 포함)기본 (선택적 역방향 카드)굵은 글씨 (Ctrl+B)탐색둘러보고 설치하기...탐색기탐색기 (%(cur)d카드 표시; %(sel)s)탐색기에서 표시할 때탐색기 옵션모으기여러 태그 추가 (Ctrl+Shift+T)여러 태그 삭제 (Ctrl+Alt+T)덮기노트 덮기기본적으로 앙키는 탭이나 쉼표 같은 필드 구분 문자를 자동으로 감지합니다. 만약 앙키가 구분 문자를 제대로 감지하지 못한다면, 이곳에 구분 문자를 직접 입력하세요. 탭은 \t로 표현하세요.취소카드카드 %d카드 1카드 2카드 정보 (Ctrl+Shift+I)카드 목록카드 유형카드 유형%s의 카드 유형카드가 보류되었습니다.카드가 거머리였습니다.카드카드 유형여과된 뭉치에 카드를 수동으로 옮겨 넣을 수 없습니다.텍스트 파일로 정리한 카드공부한 카드는 자동으로 원래 있던 뭉치로 돌아갑니다.카드...가운데수정'%s'에서:뭉치 바꾸기노트 유형 바꾸기노트 유형 바꾸기 (Ctrl+N)노트 유형 바꾸기...색깔 바꾸기 (F8)노트 유형에 따라 뭉치 바꾸기변경미디어 디렉토리에 있는 파일 점검검사 중...선택뭉치 선택노트 유형 선택복제: %s닫기입력한 내용을 포기하고 창을 닫을까요?빈칸빈칸 뚫기 (Ctrl+Shift+C)코드:모음집이 깨졌습니다. 사용 설명서를 참고하세요.쌍점쉼표인터페이스 언어 및 기타 옵션 설정비밀번호 확인:축하합니다! 현재까지 이 뭉치에서 만기된 모든 카드를 공부했습니다.연결 중...복사하기정답률: %(pct)0.2f%%
(%(good)d/%(tot)d)앙키웹에 연결할 수 없습니다. 네트워크 연결 상태를 확인하고 다시 시도하세요.녹음을 할 수 없습니다. lame과 sox를 설치했습니까?파일을 저장할 수 없습니다: %s몰아보기뭉치 만들기여과된 뭉치 만들기...생성Ctrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+Z누적누적 %s누적 답변누적 카드현재 뭉치현재 노트 유형:맞춤 공부맞춤 공부 세션맞춤 익힘 단계 (분 단위)카드 설정 바꾸기(Ctrl+L)필드 설정 바꾸기잘라내기데이터베이스를 재구성하고 최적화했습니다.날짜공부한 기간권한 해제디버그 콘솔뭉치뭉치 뛰어넘기프로필을 열 때 뭉치를 가져올 것입니다.뭉치복습 간격이 긴 것부터기본다음 번 복습 때까지 기다리는 시간.삭제%s 추가기능을 삭제할까요?카드 삭제뭉치 삭제빈 카드 삭제노트 삭제노트 삭제태그 삭제잉여 미디어 삭제%s에서 필드를 삭제할까요?이 노트 유형과 여기에 속한 모든 카드를 작제할까요?사용하지 않는 이 노트 유형을 삭제할까요?사용되지 않는 미디어 파일을 지울까요?삭제...노트가 사라진 %d카드를 삭제했습니다.서식이 사라진 %d카드를 삭제했습니다.사라진 노트 형식으로 작성된 노트 %d개를 삭제했습니다.카드가 없는 노트 %d개를 삭제했습니다.삭제했습니다.삭제했습니다. 앙키를 다시 시작하세요.뭉치 목록에서 이 뭉치를 지우면, 남아 있는 모든 카드는 각자의 원래 뭉치로 돌아갑니다.설명공부 화면에 표시할 설명 (현재 뭉치에만 해당):대화 상자필드 제거다운로드 실패: %s앙키웹에서 다운로드성공적으로 다운로드했습니다. 앙키를 다시 시작하세요.앙키웹에서 다운로드하는 중...만기내일 만기종료(&X)수월함쉬움쉬움 버튼 보너스쉬움 간격편집편집: %s현재 카드 편집HTML 편집원하는 대로 수정하세요.편집...편집글꼴편집 결과가 저장되었습니다. 앙키를 다시 시작하세요.비우기빈 카드...빈 카드 번호: %(c)s 필드: %(f)s 빈 카드가 발견되었습니다. 도구>빈 카드를 실행하세요.비어 있는 첫 필드: %sEnd%s의 새로운 카드를 넣을 뭉치를 입력하거나, 빈 칸으로 남겨 두세요:새 카드 위치를 입력하세요 (1...%s):추가할 태그를 입력하세요:삭제할 태그를 입력하세요:다운로드 오류: %s프로그램 시작 오류: %s%s 실행 중 오류 발생.%s 실행 중 오류 발생.내보내기내보내기...기타FF1F3F5F7F8필드 %d빈 카드를 실행하세요뭉치를 선택하세요.하나의 노트 유형에 속한 카드만 선택하세요.무언가 선택하세요.최신 버전의 앙키로 업그레이드하세요.이 파일을 가져오려면, 파일>가져오기 메뉴를 사용하세요.앙키웹을 방문해서 뭉치를 업그레이드한 뒤 다시 시도하세요.위치환경 설정미리 보기새 카드 미리 보기이 기간 전부터 현재까지 추가한 새 카드 미리보기:처리 중...프로필 비밀번호...프로필:프로필프록시 인증이 필요합니다.질문대기열의 끝: %d대기열의 시작: %d닫기무작위로무작위 순서평점업그레이드 준비를 마침다시 모으기음성 녹음녹음 (F5)녹음 중...
시간: %0.1f재익힘이전에 입력한 내용 유지태그 삭제글씨 꾸밈 걷어내기 (Ctrl+R)이 카드 유형을 제거하면 하나 이상의 노트가 삭제될 수 있습니다. 먼저 새로운 카드 유형을 만드세요.이름 변경뭉치 이름 변경오디오 재생음성 재생위치 재조정새 카드 위치 재조정위치 재조정...이 태그들 중 하나 이상 있어야 함:일정 재조정일정 재조정이 뭉치에서 선택한 평가 버튼을 카드의 복습 일정에 반영다시 진행글씨 좌우 뒤집기 (RTL)'%s' 이전 상태도 되돌리기복습복습 횟수복습 시간앞당겨 복습하기이 기간만큼 앞당겨 복습하기:이 기간 전부터 현재까지 잊어버린 카드 복습하기:잊어버린 카드 복습하기하루 중 시간대 별 정답률.복습뭉치에서 만기된 복습 카드: %s오른쪽이미지로 저장범위: %s찾기꾸밈 정보 안까지 찾기 (느림)이 뭉치에서전체 선택(&A)노트 선택(&N)제외할 태그 선택:선택적 공부쌍반점서버를 찾을 수 없습니다. 인터넷 연결이 끊어졌거나, 바이러스 백신 또는 방화벽 소프트웨어가 앙키가 인터넷에 접속할 수 없도록 막고 있습니다.%s의 모든 하위 뭉치에도 이 옵션 그룹을 지정할까요?모든 하위 뭉치에도 적용글씨 색깔 지정 (F7)기존 카드의 위치 이동단축키: %s%s 보기답 보기중복된 항목 보기답변 시간 표시새 카드는 복습 카드보다 나중에 등장새 카드는 복습 카드보다 먼저 등장새 카드는 추가한 순서대로 등장새 카드는 무작위로 등장평가 버튼 위에 다음 복습 시점 표시남은 카드 개수를 복습 화면에 표시통계 보기. 단축키: %s크기:일부 사항은 앙키를 다시 시작한 뒤 적용됩니다.정렬 필드탐색기에서 이 필드를 기준으로 정렬이 세로열을 기준으로 정렬할 수 없습니다. 다른 열을 선택하세요.사운드와 이미지스페이스 바시작 위치:초기 수월함통계단계:익힘 단계(분 단위)익힘 단계는 반드시 숫자로 지정하세요.텍스트를 붙여 넣을 때 HTML 제거오늘은 %(a)s를 %(b)s 동안 공부했습니다.오늘 공부공부공부할 뭉치공부할 뭉치...공부 시작스타일스타일 (카드끼리 공유됨)Supermemo XML (*.xml)보류카드 보류노트 보류보류됨오디오와 이미지 동기화앙키웹과 동기화. 단축키: %s미디어 파일 동기화...동기화 실패: %s동기화 실패: 인터넷이 연결되지 않음.동기화를 하려면 사용자 컴퓨터의 시각이 정확해야합니다. 시계를 수정한 뒤 다시 시도하세요.동기화 중...탭태그만 달기태그목표 뭉치 (Ctrl+D)목표 필드:내용탭이나 쌍반점으로 구분한 텍스트 파일 (*)그 뭉치는 이미 존재합니다.이미 사용 중인 필드 이름입니다.이미 사용 중인 이름입니다.앙키웹과의 연결 시간이 초과되었습니다. 네트워크 연결 상태를 점검하고 다시 시도하세요.기본 설정은 삭제할 수 없습니다.기본 뭉치는 삭제할 수 없습니다.뭉치에 들어있는 카드 분류.첫째 필드가 비어있습니다.노트 유형의 첫 필드는 반드시 배정되야합니다.다음 문자는 사용할 수 없습니다: %s아이콘들의 출처는 다양합니다. 앙키 소스를 참고하여 각 저작자를 확인하세요.입력한 내용대로라면 모든 카드에서 빈 질문이 만들어집니다.그동안 답변한 질문 개수앞으로 공부할 복습량각 버튼을 누른 횟수제시한 검색어에 해당하는 카드가 없습니다. 검색어를 수정하겠습니까?이 변경 사항을 적용할 경우, 다음 동기화 때 데이터베이스 전체를 업로드해야합니다. 다른 기기에서 했던 복습 등의 변경 사항이 아직 이 곳에 동기화된 상태가 아니라면, 그대로 잃게됩니다. 계속하겠습니까?질문에 답을 하기까지 걸린 시간업그레이드가 완료되어, 이제 앙키 2.0을 사용할 수 있습니다.

업데이트 로그:

%s

공부할 수 있는 새 카드가 더 있지만, 일일 제한량에 도달했습니다. 옵션에서 제한량을 높일 수 있지만, 새 카드를 더 많이 시작할수록 그에 따라 단기 복습량도 늘어난다는 것을 주의하세요.적어도 하나의 프로필은 반드시 있어야합니다.이 세로열을 기준으로 정렬할 수 없습니다. 그러나 개별 카드 유형을 찾기 위해 'card:Card 1'와 같이 검색할 수 있습니다.이 세로열을 기준으로 정렬할 수 없습니다. 그러나 왼편의 항목을 클릭해서 특정 뭉치를 검색할 수 있습니다.파일이 이미 존재합니다. 덮어쓸까요?이 폴더는 백업 생성을 쉽게 하기 위해서, 사용자의 모든 앙키 관련 데이터를 한 곳에 저장합니다. 다른 위치를 지정하려면 다음을 참고하세요: %s 이것은 정상 복습 일정에서 벗어난 공부를 할 때 사용하는 특별한 뭉치입니다.이것은 빈칸 뚫기 {{c1::견본}}입니다.기존의 모음집을 삭제하고 가져오려는 파일에 들어있는 자료로 대체할 것입니다. 계속 진행할까요?이 마법사는 앙키 2.0 업그레이드를 도와줄 것입니다. 매끄러운 업그레이드를 위하여, 다음에 나오는 화면을 주의깊게 읽어주세요. 시간시간 제한복습 카드추가 기능을 둘러보려면, 아래의 탐색 버튼을 클릭하세요.

원하는 추가기능을 찾았다면 해당 코드를 아래에 붙여넣으세요.암호로 보호된 프로필로 뭉치를 가져오려면, 먼저 해당 프로필을 연 상태에서 시도하세요.이미 존재하는 노트에 빈칸 뚫기를 만들려면, 편집>노트 유형 바꾸기를 통해서 빈칸 뚫기 유형으로 먼저 바꾸어야 합니다.정상 복습 일정을 벗어나 공부를 하고 싶다면, 아래에 있는 맞춤 공부 버튼을 클릭하세요.오늘복습을 기다리는 카드가 더 있지만, 일일 제한량에 도달했습니다. 최적의 암기 효과를 위해, 옵션에서 제한량을 높이길 권합니다.전체전체 시간전체 카드전체 노트정규식으로 취급유형답 입력: 알 수 없는 필드 %s읽기 전용 파일은 가져올 수 없습니다.밑줄 글씨 (Ctrl+U)실행 취소%s 취소알 수 없는 파일 형식.보지 않은 카드첫 필드가 일치할 경우 기존의 노트를 업데이트업그레이드 완료업그레이드 마법사업그레이드 하는 중뭉치 업그레이드 중 %(a)s/%(b)s... %(c)s앙키웹으로 업로드앙키웹에 업로드 중...카드에 사용되었지만, 미디어 폴더에 없는 파일:사용자 1버전 %s편집이 끝나길 기다리고 있습니다.환영합니다카드를 추가할 때, 현재 뭉치에 넣도록 기본 설정답을 표시할 때, 질문과 답에 있는 오디오를 모두 다시 재생업그레이드할 준비가 되었다면, 커밋(commit) 버튼을 눌러 계속 진행하세요. 업그레이드가 진행될 때, 업그레이드 지침서가 웹브라우저에 열릴 것입니다. 예전 앙키로부터 많은 것이 바뀌었으니, 주의깊게 읽어보세요.뭉치를 업그레이드할 때, 앙키는 옛 뭉치에 있던 모든 사운드와 이미지 파일을 복사해오려고 시도할 것입니다. 만약 사용자가 드롭박스 폴더나 미디어 폴더를 따로 지정해서 사용 중이었다면, 업그레이드 과정에서 해당 미디어 파일의 위치가 검색되지 않게 됩니다. 나중에 업그레이드 보고서가 제출되었을 때, 미디어 파일이 제대로 복사되지 않은 것을 발견한다면, 업그레이드 지침서에서 더 자세한 설명을 확인하세요.

앙키웹은 이제 미디어 동기화를 직접 지원합니다. 특별한 설치 과정을 거치지 않아도, 뭉치를 앙키웹에 동기화할 때, 사용자의 카드와 같이 미디어 파일도 동기화됩니다.모음집 전체지금 다운로드하시겠습니까?Damien Elems가 만들고, 아래 분들이 패치, 번역, 테스트, 디자인에 참여했습니다:

%(cont)s음성을 녹음하지 않았습니다.적어도 세로열 하나는 반드시 필요합니다.어린 카드어린 카드 + 익힘 카드기존 뭉치성공적으로 모음집을 앙키웹에 업로드했습니다. 만약 다른 기기를 사용하고 있다면, 이 컴퓨터에서 업로드한 모읍집을 다운로드할 수 있도록 동기화하세요. 그 뒤에 이루어진 복습과 카드 추가는 자동으로 병합됩니다.여기에 저장된 뭉치는 서로 병합할 수 없는 방식으로 앙키웹과 차이가 납기 때문에, 한쪽의 뭉치를 다른 쪽으로 덮어써야만 합니다. 다운로드를 선택한다면, 앙키는 앙키웹에서 모음집을 다운로드하며, 마지막 동기화 이후 이 컴퓨터에서 이루어진 변경 사항은 소실됩니다. 업로드를 선택한다면, 앙키는 여기의 모음집을 앙키 웹에 업로드하며, 마지막 동기화 이후 앙키웹이나 다른 기기에서 이루어진 변경 사항은 소실됩니다. 모든 기기들이 동기화된 뒤에 이루어지는 복습과 카드 추가는 자동적으로 병합됩니다.[뭉치 없음]개카드카드, 선택 기준모음집일일뭉치뭉치 일생도움말시간시간 뒤실패%s에 배정됨태그로 배정됨분분달복습초통계주모음집 전체~anki-2.0.20+dfsg/locale/it/0000755000175000017500000000000012256137063015130 5ustar andreasandreasanki-2.0.20+dfsg/locale/it/LC_MESSAGES/0000755000175000017500000000000012065014111016677 5ustar andreasandreasanki-2.0.20+dfsg/locale/it/LC_MESSAGES/anki.mo0000644000175000017500000021605112252567246020207 0ustar andreasandreasSL5HGIG PG[GbG"hGG GGG8GGHH"0H$SH$xH&HH"HII*I$GI lIII0III&J )J5J(FJoJJ,JJ*JK,K HKVK(gKKKKKKK KKKKK KKKKK L LL L#L 5L@LXLhLwLLLLL0L LL L MMM*MAMEMMMMMMMMMMMTNVNXN,nN(NN!NOfOO OO O OOOOPePP7/Q gQqQ5QXQYR8mRkR S S)S-S HS RS\S rS SS SSSS S$SS SS T T% TKFTTNT"TU#0VTVYVpV hWvWX'XRXvXwuY7Y %Zw1ZEZ@Z0[7[F[RN[[$\#?\#c\\ \\(\ ] ]] 2]?]X]i] n] {]]]]]]]]]L^T^g^w^}^^^ ^ ^)^'^#______` ` "` ,` 6`A` S```p`` `3``S`0a9a@a Ga Uaaaraaa"aaa&a b!b (b4b Eb Qb[babbbb-bbb(b c5c Tcbckc8pc5cPc70dhdd ddddd dddddddde eee e -e :e Ge Te ae ne {eeee e eee ee eff6fOf`fdff f f ff f/fffg%g7iPviii]i Lj8Xjj jjj)jjkk )k6knRnbnwnn n nnnnnnnnooooop pp$p,p?p OpZp_p spp$ppp ppppp.pFq\quq q4qqq q1q.r>r^rmr*rr JtXt wtt"t"t t u u%u4uHuQu cu mu {u)uuuu v v>v]vbvhvwvv v vvvv<vww w*w:w?w Hw+Swww www w ww wwwx xx2x8xIxQxkxx x xxxx xxxxx x yy .yUr,Ҁ-+8E~ #ȁ  ?H YglsƂ +iF ÃЃ  "2 :1E w  DŽ Ԅ -3ai Å ʅ օVS cm,2GM  LJԇ ܇ 'Ec*'!Ո@6>8u !?ۉ+1 A OZ`s Ŋӊ ي >Qn *֋!%dG ʌӌ، () CdX+؍"&'N0h+>ŎUFZ*(̏1',I\'Ltt#Փde^Ĕ8C(Ȗrd au/dM !Ԛٚ'&>CK`.g&Λ ݛ& ,8e lwU$8R(-V"gWS06$g" {̡H^I5ޣU =GOUi { ʧѧ  !+->@  $@ BMc=u Ԫ'''G)o)!%)%Ou4) - ;#Im)%ѭ+ 9J%ZϮ   & /;Q!aƯ گD 3A HSck'),18?EKQW[]/ϱ1#1!Uwi (E WbrDB DODcpBƷ"Ϸ 1GXk  &۸   ?e]ùb۹3>:r,ڻ߻&!3ν_gǾG> %|1?6%.CML!=_~ = -EUr "/S74' !6<J<' .=Z `FnS!*3<L\s*+4JQau !"/ (2+:f8|.6g9E* %0GNU \gx &-4 ; FRds! &#-QVg5 5= E Sar03)O.y KSYS=a MXru H= ERg-z  - 6B Tb ~ $+2E[B`3"!;Vo  )2-:h~  >X` y ]ho$ : FP o| 1EM)eF <$a.x? %(+(A+j   "'Ai ~!"/C JW#p>   3<E1]  3Q`gz' &@[aq  !&Hb%~1#9IN V c=p l^##"DF1]0BJY lw~' $?'G o 0:%2:]m9NTev+ , 080i +,DM%U{  'HY6b!xFOa| ( A N$[* %;-T  -  !*\L=Z%_=Wp )-+''S8{@/ %Q1<M) LJ !!> `nu ("'<EWh'p11~8  '83>r'^6//f(-4A;X}@*.B.q$rQ,-`nD(uR:4n1 cx  4 k " '       0, ] (b 1        8$ )]    8 " :C~ "s *(4f]Ld"'& rR my ) ?JLSY hrx!   '7-]%z&Z(/ }q(UQA1`@:X6G 9c:jJb"#+Tn!S,{~Pk}n%~A*PP=xC.ElY:hq~]3i)VCW?_L[a&85agJ.yT72Y-H c< _Z)IL )Ye^wJ<X\Dv;U8,Fu+OzedONRo|BbU#p.,?(54yvVD#9F s "o7+BG0LH{'ti?,Q!6wM!7-$j[f 'mE6WlD;] d%\G;eCl3"u LrM vqE[/gQF$={I0`K4xxp0#i>FE 1MC"N*us3HtBGw65$2@>t9\A8I;'K:m kz&=^'BN$VRp%|hk d>3*<@X< `ZHfKKr _yaT!SOhsI(QM0f|P c=8+21&544gnSmj -^.WR/b1D2}>/ AN  rRS*@ 9o)OJ?  Stop (1 of %d) (off) (on) It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%(a)0.1fs (%(b)s)%(a)d of %(b)d note updated%(a)d of %(b)d notes updated%(a)dkB up, %(b)dkB down%(tot)s %(unit)s%d card%d cards%d card deleted.%d cards deleted.%d card exported.%d cards exported.%d card imported.%d cards imported.%d card studied in%d cards studied in%d card/minute%d cards/minute%d deck updated.%d decks updated.%d group%d groups%d note%d notes%d note added%d notes added%d note imported.%d notes imported.%d note updated%d notes updated%d review%d reviews%d selected%d selected%s already exists on your desktop. Overwrite it?%s copy%s day%s days%s day%s days%s deleted.%s hour%s hours%s hour%s hours%s minute%s minutes%s minute.%s minutes.%s minute%s minutes%s month%s months%s month%s months%s second%s seconds%s second%s seconds%s to delete:%s year%s years%s year%s years%sd%sh%sm%smo%ss%sy&About...&Add-ons&Check Database...&Cram...&Edit&Export...&File&Find&Go&Guide&Guide...&Help&Import&Import...&Invert Selection&Next Card&Open Add-ons Folder...&Preferences...&Previous Card&Reschedule...&Support Anki...&Switch Profile...&Tools&Undo'%(row)s' had %(num1)d fields, expected %(num2)d(%s correct)(end)(filtered)(learning)(new)(parent limit: %d)(please select 1 card)....anki2 files are not designed for importing. If you're trying to restore from a backup, please see the 'Backups' section of the user manual./0d1 101 month1 year10AM10PM3AM4AM4PM504 gateway timeout error received. Please try temporarily disabling your antivirus.: and%d card%d cardsOpen backup folderVisit website%(pct)d%% (%(x)s of %(y)s)%Y-%m-%d @ %H:%MBackups
Anki will create a backup of your collection each time it is closed or synchronized.Export format:Find:Font Size:Font:In:Include:Line Size:Replace With:SynchronisationSynchronization
Not currently enabled; click the sync button in the main window to enable.

Account Required

A free account is required to keep your collection synchronized. Please sign up for an account, then enter your details below.

Anki Updated

Anki %s has been released.

A big thanks to all the people who have provided suggestions, bug reports and donations.A card's ease is the size of the next interval when you answer "good" on a review.A file called collection.apkg was saved on your desktop.A problem occurred while syncing media. Please use Tools>Check Media, then sync again to correct the issue.Aborted: %sAbout AnkiAddAdd (shortcut: ctrl+enter)Add FieldAdd MediaAdd New Deck (Ctrl+N)Add Note TypeAdd ReverseAdd TagsAdd new cardAdd to:Add: %sAddedAdded TodayAdded duplicate with first field: %sAgainAgain TodayAgain count: %sAll DecksAll FieldsAll cards in random order (cram mode)All cards, notes, and media for this profile will be deleted. Are you sure?Allow HTML in fieldsAn error occurred in an add-on.
Please post on the add-on forum:
%s
An error occurred while opening %sAn error occurred. It may have been caused by a harmless bug,
or your deck may have a problem.

To confirm it's not a problem with your deck, please run Tools > Check Database.

If that doesn't fix the problem, please copy the following
into a bug report:An image was saved to your desktop.AnkiAnki 1.2 Deck (*.anki)Anki 2 stores your decks in a new format. This wizard will automatically convert your decks to that format. Your decks will be backed up before the upgrade, so if you need to revert to the previous version of Anki, your decks will still be usable.Anki 2.0 DeckAnki 2.0 only supports automatic upgrading from Anki 1.2. To load old decks, please open them in Anki 1.2 to upgrade them, and then import them into Anki 2.0.Anki Deck PackageAnki couldn't find the line between the question and answer. Please adjust the template manually to switch the question and answer.Anki is a friendly, intelligent spaced learning system. It's free and open source.Anki is licensed under the AGPL3 license. Please see the license file in the source distribution for more information.Anki wasn't able to load your old config file. Please use File>Import to import your decks from previous Anki versions.AnkiWeb ID or password was incorrect; please try again.AnkiWeb ID:AnkiWeb encountered an error. Please try again in a few minutes, and if the problem persists, please file a bug report.AnkiWeb is too busy at the moment. Please try again in a few minutes.AnkiWeb is under maintenance. Please try again in a few minutes.AnswerAnswer ButtonsAnswersAntivirus or firewall software is preventing Anki from connecting to the internet.Any cards mapped to nothing will be deleted. If a note has no remaining cards, it will be lost. Are you sure you want to continue?Appeared twice in file: %sAre you sure you wish to delete %s?At least one card type is required.At least one step is required.Attach pictures/audio/video (F3)Automatically play audioAutomatically sync on profile open/closeAverageAverage TimeAverage answer timeAverage easeAverage for days studiedAverage intervalBackBack PreviewBack TemplateBackupsBasicBasic (and reversed card)Basic (optional reversed card)Bold text (Ctrl+B)BrowseBrowse && Install...BrowserBrowser (%(cur)d card shown; %(sel)s)Browser (%(cur)d cards shown; %(sel)s)Browser AppearanceBrowser OptionsBuildBulk Add Tags (Ctrl+Shift+T)Bulk Remove Tags (Ctrl+Alt+T)BuryBury CardBury NoteBury related new cards until the next dayBury related reviews until the next dayBy default, Anki will detect the character between fields, such as a tab, comma, and so on. If Anki is detecting the character incorrectly, you can enter it here. Use \t to represent tab.CancelCardCard %dCard 1Card 2Card IDCard Info (Ctrl+Shift+I)Card ListCard TypeCard TypesCard Types for %sCard buried.Card suspended.Card was a leech.CardsCards TypesCards can't be manually moved into a filtered deck.Cards in Plain TextCards will be automatically returned to their original decks after you review them.Cards...CenterChangeChange %s to:Change DeckChange Note TypeChange Note Type (Ctrl+N)Change Note Type...Change colour (F8)Change deck depending on note typeChangedCheck &Media...Check the files in the media directoryChecking...ChooseChoose DeckChoose Note TypeChoose TagsClone: %sCloseClose and lose current input?ClozeCloze deletion (Ctrl+Shift+C)Code:Collection is corrupt. Please see the manual.ColonCommaConfigure interface language and optionsConfirm password:Congratulations! You have finished this deck for now.Connecting...ContinueCopyCorrect answers on mature cards: %(a)d/%(b)d (%(c).1f%%)Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)Couldn't connect to AnkiWeb. Please check your network connection and try again.Couldn't record audio. Have you installed lame and sox?Couldn't save file: %sCramCreate DeckCreate Filtered Deck...CreatedCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativeCumulative %sCumulative AnswersCumulative CardsCurrent DeckCurrent note type:Custom StudyCustom Study SessionCustom steps (in minutes)Customize Cards (Ctrl+L)Customize FieldsCutDatabase rebuilt and optimized.DateDays studiedDeauthorizeDebug ConsoleDeckDeck OverrideDeck will be imported when a profile is opened.DecksDecreasing intervalsDefaultDelays until reviews are shown again.DeleteDelete %s?Delete CardsDelete DeckDelete EmptyDelete NoteDelete NotesDelete TagsDelete UnusedDelete field from %s?Delete the '%(a)s' card type, and its %(b)s?Delete this note type and all its cards?Delete this unused note type?Delete unused media?Delete...Deleted %d card with missing note.Deleted %d cards with missing note.Deleted %d card with missing template.Deleted %d cards with missing template.Deleted %d note with missing note type.Deleted %d notes with missing note type.Deleted %d note with no cards.Deleted %d notes with no cards.Deleted %d note with wrong field count.Deleted %d notes with wrong field count.Deleted.Deleted. Please restart Anki.Deleting this deck from the deck list will return all remaining cards to their original deck.DescriptionDescription to show on study screen (current deck only):DialogDiscard fieldDownload failed: %sDownload from AnkiWebDownload successful. Please restart Anki.Downloading from AnkiWeb...DueDue cards onlyDue tomorrowE&xitEaseEasyEasy bonusEasy intervalEditEdit %sEdit CurrentEdit HTMLEdit to customizeEdit...EditedEditing FontEdits saved. Please restart Anki.EmptyEmpty Cards...Empty card numbers: %(c)s Fields: %(f)s Empty cards found. Please run Tools>Empty Cards.Empty first field: %sEndEnter deck to place new %s cards in, or leave blank:Enter new card position (1...%s):Enter tags to add:Enter tags to delete:Error downloading: %sError during startup: %sError executing %s.Error running %sExportExport...ExtraFF1F3F5F7F8Field %d of file is:Field mappingField name:Field:FieldsFields for %sFields separated by: %sFields...Fil&tersFile is invalid. Please restore from backup.File was missing.FilterFilter:FilteredFiltered Deck %dFind &Duplicates...Find DuplicatesFind and Re&place...Find and ReplaceFinishFirst CardFirst ReviewFirst field matched: %sFixed note type: %sFlipFolder already exists.Font:FooterFor security reasons, '%s' is not allowed on cards. You can still use it by placing the command in a different package, and importing that package in the LaTeX header instead.ForecastFormForward & Optional ReverseForward & ReverseFound %(a)s across %(b)s.FrontFront PreviewFront TemplateGeneralGenerated file: %sGenerated on %sGet SharedGoodGraduating intervalHTML EditorHardHave you installed latex and dvipng?HeaderHelpHighest easeHistoryHomeHourly BreakdownHoursHours with less than 30 reviews are not shown.If you have contributed and are not on this list, please get in touch.If you studied every dayIgnore answer times longer thanIgnore caseIgnore lines where first field matches existing noteIgnore this updateImportImport FileImport even if existing note has same first fieldImport failed. Import failed. Debugging info: Import optionsImporting complete.In media folder but not used by any cards:In order to ensure your collection works correctly when moved between devices, Anki requires your computer's internal clock to be set correctly. The internal clock can be wrong even if your system is showing the correct local time. Please go to the time settings on your computer and check the following: - AM/PM - Clock drift - Day, month and year - Timezone - Daylight savings Difference to correct time: %s.Include mediaInclude scheduling informationInclude tagsIncrease today's new card limitIncrease today's new card limit byIncrease today's review card limitIncrease today's review limit byIncreasing intervalsInfoInstall Add-onInterface language:IntervalInterval modifierIntervalsInvalid code.Invalid encoding; please rename:Invalid file. Please restore from backup.Invalid password.Invalid regular expression.It has been suspended.Italic text (Ctrl+I)JS error on line %(a)d: %(b)sJump to tags with Ctrl+Shift+TKeepLaTeXLaTeX equationLaTeX math env.LapsesLast CardLatest ReviewLatest added firstLearnLearn ahead limitLearn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)sLearningLeechLeech actionLeech thresholdLeftLimit toLoading...Lock account with password, or leave blank:Longest intervalLook in field:Lowest easeManageManage Note Types...Map to %sMap to TagsMarkMark NoteMark Note (Ctrl+K)MarkedMatureMaximum intervalMaximum reviews/dayMediaMinimum intervalMinutesMix new cards and reviewsMnemosyne 2.0 Deck (*.db)MoreMost lapsesMove CardsMove To Deck (Ctrl+D)Move cards to deck:N&oteName exists.Name for deck:Name:NetworkNewNew CardsNew cards in deck: %sNew cards onlyNew cards/dayNew deck name:New intervalNew name:New note type:New options group name:New position (1...%d):Next day starts atNo cards are due yet.No cards matched the criteria you provided.No empty cards.No mature cards were studied today.No unused or missing files found.NoteNote IDNote TypeNote TypesNote and its %d card deleted.Note and its %d cards deleted.Note buried.Note suspended.Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe.Note: Some of the history is missing. For more information, please see the browser documentation.Notes in Plain TextNotes require at least one field.Notes tagged.NothingOKOldest seen firstOn next sync, force changes in one directionOne or more notes were not imported, because they didn't generate any cards. This can happen when you have empty fields or when you have not mapped the content in the text file to the correct fields.Only new cards can be repositioned.Only one client can access AnkiWeb at a time. If a previous sync failed, please try again in a few minutes.OpenOptimizing...Optional limit:OptionsOptions for %sOptions group:Options...OrderOrder addedOrder dueOverride back template:Override font:Override front template:Packaged Anki Deck (*.apkg *.zip)Password:Passwords didn't matchPastePaste clipboard images as PNGPauker 1.8 Lesson (*.pau.gz)PercentagePeriod: %sPlace at end of new card queuePlace in review queue with interval between:Please add another note type first.Please be patient; this can take a while.Please connect a microphone, and ensure other programs are not using the audio device.Please edit this note and add some cloze deletions. (%s)Please ensure a profile is open and Anki is not busy, then try again.Please install PyAudioPlease install mplayerPlease open a profile first.Please run Tools>Empty CardsPlease select a deck.Please select cards from only one note type.Please select something.Please upgrade to the latest version of Anki.Please use File>Import to import this file.Please visit AnkiWeb, upgrade your deck, then try again.PositionPreferencesPreviewPreview Selected Card (%s)Preview new cardsPreview new cards added in the lastProcessing...Profile Password...Profile:ProfilesProxy authentication required.QuestionQueue bottom: %dQueue top: %dQuitRandomRandomize orderRatingReady to UpgradeRebuildRecord Own VoiceRecord audio (F5)Recording...
Time: %0.1fRelative overduenessRelearnRemember last input when addingRemove TagsRemove formatting (Ctrl+R)Removing this card type would cause one or more notes to be deleted. Please create a new card type first.RenameRename DeckReplay AudioReplay Own VoiceRepositionReposition New CardsReposition...Require one or more of these tags:ReschedRescheduleReschedule cards based on my answers in this deckResume NowReverse text direction (RTL)Reverted to state prior to '%s'.ReviewReview CountReview TimeReview aheadReview ahead byReview cards forgotten in lastReview forgotten cardsReview success rate for each hour of the day.ReviewsReviews due in deck: %sRightSave ImageScope: %sSearchSearch within formatting (slow)SelectSelect &AllSelect &NotesSelect tags to exclude:Selected file was not in UTF-8 format. Please see the importing section of the manual.Selective StudySemicolonServer not found. Either your connection is down, or antivirus/firewall software is blocking Anki from connecting to the internet.Set all decks below %s to this option group?Set for all subdecksSet foreground colour (F7)Shift key was held down. Skipping automatic syncing and add-on loading.Shift position of existing cardsShortcut key: %sShortcut: %sShow %sShow AnswerShow DuplicatesShow answer timerShow new cards after reviewsShow new cards before reviewsShow new cards in order addedShow new cards in random orderShow next review time above answer buttonsShow remaining card count during reviewShow statistics. Shortcut key: %sSize:Some related or buried cards were delayed until a later session.Some settings will take effect after you restart Anki.Some updates were ignored because note type has changed:Sort FieldSort by this field in the browserSorting on this column is not supported. Please choose another.Sounds & ImagesSpaceStart position:Starting easeStatisticsStep:Steps (in minutes)Steps must be numbers.Strip HTML when pasting textStudied %(a)s in %(b)s today.Studied TodayStudyStudy DeckStudy Deck...Study NowStudy by card state or tagStylingStyling (shared between cards)Subscript (Ctrl+=)Supermemo XML export (*.xml)Superscript (Ctrl+Shift+=)SuspendSuspend CardSuspend NoteSuspendedSynchronize audio and images tooSynchronize with AnkiWeb. Shortcut key: %sSyncing Media...Syncing failed: %sSyncing failed; internet offline.Syncing requires the clock on your computer to be set correctly. Please fix the clock and try again.Syncing...TabTag DuplicatesTag OnlyTagsTarget Deck (Ctrl+D)Target field:TextText separated by tabs or semicolons (*)That deck already exists.That field name is already used.That name is already used.The connection to AnkiWeb timed out. Please check your network connection and try again.The default configuration can't be removed.The default deck can't be deleted.The division of cards in your deck(s).The first field is empty.The first field of the note type must be mapped.The following character can not be used: %sThe front of this card is empty. Please run Tools>Empty Cards.The icons were obtained from various sources; please see the Anki source for credits.The input you have provided would make an empty question on all cards.The number of questions you have answered.The number of reviews due in the future.The number of times you have pressed each button.The permissions on your system's temporary folder are incorrect, and Anki is not able to correct them automatically. Please search for 'temp folder' in the Anki manual for more information.The provided file is not a valid .apkg file.The provided search did not match any cards. Would you like to revise it?The requested change will require a full upload of the database when you next synchronize your collection. If you have reviews or other changes waiting on another device that haven't been synchronized here yet, they will be lost. Continue?The time taken to answer the questions.The upgrade has finished, and you're ready to start using Anki 2.0.

Below is a log of the update:

%s

There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.There must be at least one profile.This column can't be sorted on, but you can search for individual card types, such as 'card:Card 1'.This column can't be sorted on, but you can search for specific decks by clicking on one on the left.This file does not appear to be a valid .apkg file. If you're getting this error from a file downloaded from AnkiWeb, chances are that your download failed. Please try again, and if the problem persists, please try again with a different browser.This file exists. Are you sure you want to overwrite it?This folder stores all of your Anki data in a single location, to make backups easy. To tell Anki to use a different location, please see: %s This is a special deck for studying outside of the normal schedule.This is a {{c1::sample}} cloze deletion.This will delete your existing collection and replace it with the data in the file you're importing. Are you sure?This wizard will guide you through the Anki 2.0 upgrade process. For a smooth upgrade, please read the following pages carefully. TimeTimebox time limitTo ReviewTo browse add-ons, please click the browse button below.

When you've found an add-on you like, please paste its code below.To import into a password protected profile, please open the profile before attempting to import.To make a cloze deletion on an existing note, you need to change it to a cloze type first, via Edit>Change Note Type.To see them now, click the Unbury button below.To study outside of the normal schedule, click the Custom Study button below.TodayToday's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.TotalTotal TimeTotal cardsTotal notesTreat input as regular expressionTypeType answer: unknown field %sUnable to import from a read-only file.UnburyUnderline text (Ctrl+U)UndoUndo %sUnknown file format.UnseenUpdate existing notes when first field matchesUpdated %(a)d of %(b)d existing notes.Upgrade CompleteUpgrade WizardUpgradingUpgrading deck %(a)s of %(b)s... %(c)sUpload to AnkiWebUploading to AnkiWeb...Used on cards but missing from media folder:User 1Version %sWaiting for editing to finish.Warning, cloze deletions will not work until you switch the type at the top to Cloze.WelcomeWhen adding, default to current deckWhen answer shown, replay both question and answer audioWhen you're ready to upgrade, click the commit button to continue. The upgrade guide will open in your browser while the upgrade proceeds. Please read it carefully, as a lot has changed since the previous Anki version.When your decks are upgraded, Anki will attempt to copy any sounds and images from the old decks. If you were using a custom DropBox folder or custom media folder, the upgrade process may not be able to locate your media. Later on, a report of the upgrade will be presented to you. If you notice media was not copied when it should have been, please see the upgrade guide for more instructions.

AnkiWeb now supports media syncing directly. No special setup is required, and media will be synchronized along with your cards when you sync to AnkiWeb.Whole CollectionWould you like to download it now?Written by Damien Elmes, with patches, translation, testing and design from:

%(cont)sYou have a cloze deletion note type but have not made any cloze deletions. Proceed?You have a lot of decks. Please see %(a)s. %(b)sYou haven't recorded your voice yet.You must have at least one column.YoungYoung+LearnYour DecksYour changes will affect multiple decks. If you wish to change only the current deck, please add a new options group first.Your collection file appears to be corrupt. This can happen when the file is copied or moved while Anki is open, or when the collection is stored on a network or cloud drive. Please see the manual for information on how to restore from an automatic backup.Your collection is in an inconsistent state. Please run Tools>Check Database, then sync again.Your collection or a media file is too large to sync.Your collection was successfully uploaded to AnkiWeb. If you use any other devices, please sync them now, and choose to download the collection you have just uploaded from this computer. After doing so, future reviews and added cards will be merged automatically.Your decks here and on AnkiWeb differ in such a way that they can't be merged together, so it's necessary to overwrite the decks on one side with the decks from the other. If you choose download, Anki will download the collection from AnkiWeb, and any changes you have made on your computer since the last sync will be lost. If you choose upload, Anki will upload your collection to AnkiWeb, and any changes you have made on AnkiWeb or your other devices since the last sync to this device will be lost. After all devices are in sync, future reviews and added cards can be merged automatically.[no deck]backupscardscards from the deckcards selected bycollectionddaysdeckdeck lifeduplicatehelphidehourshours past midnightlapsesmapped to %smapped to Tagsminsminutesmoreviewssecondsstatsthis pagewwhole collection~Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-11-16 05:11+0000 Last-Translator: pipep Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-12-11 05:44+0000 X-Generator: Launchpad (build 16869) Language: Interrompi (1 di %d) (non attivo) (attivo) Ha %d carta. Ha %d carte.%% corrette%(a)0.1f %(b)s/giorno%(a)0.1fs (%(b)s)Nota %(a)d di %(b)d aggiornataNote %(a)d di %(b)d aggiornate%(a)dkB upload, %(b)dkB download%(tot)s %(unit)s%d carta%d carte%d carta eliminata.%d carte eliminate.%d carta esportata.%d carte esportate.%d carta importata.%d carte importate.%d carta studiata in%d carte studiate in%d carta/minuto%d carte/minuto%d mazzo aggiornato.%d mazzi aggiornati.%d gruppo%d gruppi%d nota%d note%d nota aggiunta%d note aggiunte%d nota importata.%d note importate.%d nota aggiornata%d note aggiornate%d ripetizione%d ripetizioni%d selezionata%d selezionate%s esiste già sul tuo desktop. Vuoi sovrascriverlo?%s copia%s giorno%s giorni%s giorno%s giorni%s eliminate.%s ora%s ore%s ora%s ore%s minuto%s minuti%s minuto.%s minuti.%s minuto%s minuti%s mese%s mesi%s mese%s mesi%s secondo%s secondi%s secondo%s secondi%s da eliminare:%s anno%s anni%s anno%s anni%sg%sh%sm%sme%ss%sa&Informazioni su...&Add-on&Controlla il database...&Studio focalizzato...&Modifica&Esporta...&File&Trova&Vai&Guida&Guida...&Aiuto&Importa&Importa...&Inverti la selezioneCarta segue&nte&Apri la cartella degli add-on...&Preferenze...Carta &precedente&Ripianifica...&Supporta Anki...&Scambia profilo...&Strumenti&Annulla'%(row)s' possiedono %(num1)d campi, mentre ci si aspettava %(num2)d(%s corrette)(fine)(filtrato)(apprendimento)(nuova)(limite mazzo superiore: %d)(seleziona 1 carta)...I file .anki2 non possono essere importati. Se stai cercando di ripristinare un backup, leggi la sezione 'Backups' del manuale utente./0d1 101 mese1 anno10:0022:0003:0004:0016:00Ricevuto errore 504 gateway timeout. Prova a disabilitare temporaneamente il tuo antivirus.: e%d carta%d carteApri la cartella dei backupVisita il sito web%(pct)d%% (%(x)s di %(y)s)%d/%m/%Y @ %H:%MBackup
Anki creerà un backup della tua collezione ogni volta che viene chiuso o sincronizzato.Formatto di esportazione:Trova:Dimensione carattere:Carattere:In:Includi:Dimensione riga: Sostituisci conSincronizzazioneSincronizzazione
Non abilitata correntemente; clicca il pulsante di sincronizzazione nella finestra principale per abilitarla.

Account necessario

È necessario un account gratuito per mantenere sincronizzata la tua collezione. Iscriviti per un account, poi inserisci i tuoi dati qui sotto.

Aggiornamento di Anki

È stato rilasciato Anki %s.

Un grande ringraziamento a tutti coloro che hanno contribuito con suggerimenti, segnalazioni di bug e donazioni.La facilità di una carta indica la durata del prossimo intervallo rispetto all'ultimo intervallo, rispondendo "normale" durante la ripetizione.Un file chiamato collection.apkg è stato salvato sul tuo desktop.Si è verificato un problema durante la sincronizzazione dei contenuti multimediali. Per correggere il problema esegui Strumenti>Controlla Media, poi sincronizza nuovamente.Interrotto: %sInformazioni su AnkiAggiungiAggiungi (scorciatoia: ctrl+invio)Aggiungi campoAggiungi mediaAggiungi un nuovo mazzo (Ctrl+N)Aggiungi tipo di notaAggiungi inversaAggiungi etichetteAggiungi una carta nuovaAggiungi a:Aggiungi: %sAggiuntoAggiunte oggiAggiunto duplicato con primo campo: %sRipetiFallite oggiCarte fallite: %sTutti i mazziTutti i campiTutte le carte in ordine casuale (modalità studio focalizzato)Tutte le carte, le note e gli elementi multimediali di questo profilo verranno eliminati. Sei sicuro?Permetti HTML nei campiSi è verificato un errore in un add-on.
Scrivi un messaggio sul forum dell' add-on:
%s
Si è verificato un errore durante l'apertura di %sSi è verificato un errore. Può essere stato causato da un bug innocuo,
o il tuo mazzo può avere un problema.

Per verificare che non sia un problema del tuo mazzo, esegui Strumenti > Controlla il database.

Se questo non risolve il problema, copia quanto segue
in una segnalazione di bug:L'immagine è stata salvata sul tuo desktop.AnkiMazzo di Anki 1.2 (*.anki)Anki 2 salva i tuoi mazzi in un nuovo formato. Questo assistente convertirà automaticamente i tuoi mazzi nel nuovo formato. Prima dell'aggiornamento verrà eseguito un backup dei tuoi mazzi, affinché nel caso tu dovessi tornare alla versione precedente di Anki essi siano ancora utilizzabili.Mazzo di Anki 2.0Anki 2.0 può aggiornare automaticamente solo i mazzi da Anki 1.2. Per caricare mazzi più vecchi, aprili dapprima in Anki 1.2, poi importali in Anki 2.0.Pacchetto Mazzi AnkiAnki non ha trovato la linea di separazione tra domanda e risposta. Adatta manualmente il modello per invertire domanda e risposta.Anki è un simpatico e intelligente sistema di ripetizione spaziata. È gratuito e open source.Anki è rilasciato sotto licenza AGPL3. Consulta il file della licenza nella distribuzione sorgente per ulteriori informazioni.Anki non è stato in grado di caricare il tuo vecchio file di configurazione. Utilizza File>Importa per importare i tuoi mazzi da versioni precedenti di Anki.L'ID AnkiWeb o la password non erano corretti; prova di nuovo.ID AnkiWeb:Si è verificato un errore su AnkiWeb. Prova di nuovo tra alcuni minuti, e se il problema persiste invia un rapporto di bug.AnkiWeb al momento è sovraccarico. Riprova tra qualche minuto.AnkiWeb è in manutenzione. Riprova tra alcuni minuti.RispostaPulsanti di rispostaRisposteL'antivirus o il firewall stanno impedendo ad Anki di collegarsi ad internet.Tutte le carte vuote verranno eliminate. Se una nota resta senza carte, verrà eliminata anch'essa. Sei sicuro di voler continuare?Apparsa due volte nel file: %sSei sicuro di voler eliminare %s?È richiesta almeno una carta.È richiesto almeno un passo.Allega immagini/audio/video (F3)Esegui automaticamente l'audioSincronizza automaticamente all'apertura/chiusura del profiloMediaDurata mediaTempo medio di rispostaFacilità mediaMedia per i giorni di studioIntervallo medioRetroAnteprima retroModello retroBackupBasilareBasilare (e carta inversa)Basilare (carta inversa opzionale)Testo in grassetto (Ctrl+B)SfogliaSfoglia e Installa...BrowserBrowser (%(cur)d carta mostrata; %(sel)s)Browser (%(cur)d carte mostrate; %(sel)s)Aspetto del browserOpzioni del browserCreaAggiungi etichette alle carte marcate (Ctrl+Shift+T)Rimuovi etichette in massa (Ctrl+Alt+T)SeppellisciSeppellisci la cartaSeppellisci la notaSeppellisci le carte nuove correlate fino al giorno seguenteSeppellisci le ripetizioni correlate fino al giorno seguenteDi default, Anki rileva i caratteri tra i campi, come tabulazioni, virgole, ecc. Se Anki non rileva correttamente i caratteri, puoi inserirli qui. Usa \t per rappresentare le tabulazioni.AnnullaCartaCarta %dCarta 1Carta 2ID cartaInformazioni sulla carta (Ctrl+Shift+I)Elenco delle carteTipo di cartaTipi di carteTipi di carte per %sCarta seppellita.Carta sospesa.La carta era una sanguisuga.CarteTipi di carteLe carte non possono essere spostate manualmente in un mazzo filtrato.Carte in Testo SempliceLe carte ritorneranno automaticamente nel mazzo originale dopo che le hai ripetute.Carte...CentraleModificaModifica %s in:Cambia il mazzoCambia il tipo di notaCambia tipo di nota (Ctrl+N)Cambia il tipo di nota...Cambia il colore (F8)Cambia mazzo a dipendenza del tipo di notaCambiatoControlla &Media...Verifica i file nella cartella multimedialeControllo in corso...ScegliScegli il mazzoScegli tipo di notaScegli etichetteClona: %sChiudiChiudere perdendo i dati attuali?Testo da completareTesto da completare (Ctrl+Shift+C)Codice:La collezione è corrotta. Consulta il manuale.Due puntiVirgolaConfigura lingua e opzioni dell'interfacciaConferma la password:Congratulazioni! Hai completato questo mazzo per adesso.Connessione...ContinuaCopiaCarte mature corrette: %(a)d/%(b)d (%(c).1f%%)Corrette: %(pct)0.2f%%
(%(good)d di %(tot)d)Non è stato possibile connettersi ad AnkiWeb. Controlla la tua connessione alla rete e prova di nuovo.Non è stato possibile registrare l'audio. Hai installato lame e sox?Non è stato possibile salvare il file: %sStudio focalizzatoCrea mazzoCrea mazzo filtrato...CreatoCtrl+=Ctrl+ACtrl+Alt+FCtrl+Alt+Shift+CCtrl+BCtrl+DCtrl+ECtrl+FCtrl+ICtrl+LCtrl+NCtrl+PCtrl+QCtrl+RCtrl+Shift+=Ctrl+Shift+ACtrl+Shift+CCtrl+Shift+FCtrl+Shift+LCtrl+Shift+MCtrl+Shift+PCtrl+Shift+RCtrl+UCtrl+WCtrl+ZCumulativoCumulate %sRisposte cumulateCarte cumulateMazzo correnteTipo corrente di nota:Studio personalizzatoSessione di studio personalizzatoPassi personalizzati (in minuti)Personalizza le carte (Ctrl+L)Personalizza i campiTagliaDatabase ricostruito e ottimizzato.DataGiorni di studioRevoca l'autorizzazioneConsole di debugMazzoSovrascrivi mazzoIl mazzo verrà importato all'apertura di un profilo.MazziIntervalli decrescentiPredefinitoDifferimento della ripresentazione delle ripetizioni.EliminaEliminare %s?Elimina carteElimina il mazzoElimina le carte vuoteElimina la notaElimina le noteElimina etichetteElimina file inutilizzatiElimina campo da %s?Elimina il tipo di carte '%(a)s' e il suo %(b)s?Eliminare questo tipo di nota e tutte le sue carte?Elimina questo tipo di nota inutilizzato?Elimina contenuto multimediale non utilizzato?Elimina...Eliminato %d carta con nota mancante.Eliminato %d carte con nota mancante.Cancellata %d carta con modello mancante.Cancellate %d carte con modello mancante.Eliminata %d nota con tipo di nota mancante.Eliminate %d note con tipo di nota mancante.Eliminata %d nota senza carte.Eliminate %d note senza carte.Eliminata %d nota con contatore di campi errato.Eliminate %d note con contatore di campi errato.Eliminato.Eliminato. Ora riavvia Anki.L'eliminazione di questo mazzo dall'elenco dei mazzi riporterà tutte le carte rimanenti nel loro mazzo originale.DescrizioneDescrizione da mostrare nella schermata di studio (solo mazzo corrente):DialogoScarta campoDownload fallito: %sScarica da AnkiWebDownload avvenuto con successo. Riavvia Anki.Download da AnkiWeb in corso...ScadenzaSolo carte scaduteDa ripetere domani&EsciFacilitàFacileBonus facileIntervallo facileModificaModifica %sModifica correnteModifica HTMLModifica per personalizzareModifica...ModificatoCarattere dell'editorModifiche salvate. Ora riavvia Anki.SvuotaCarte vuote...Numeri di carta vuoti: %(c)s Campi: %(f)s Trovate carte vuote. Esegui Strumenti>Carte vuote.Primo campo vuoto: %sFineInserisci il mazzo dove mettere le nuove carte %s, o lascia vuoto:Inserisci una nuova posizione della carta (1...%s):Inserisci etichette da aggiungere:Inserisci etichette da eliminare:Errore durante il download: %sErrore durante l'avvio: %sErrore nell'eseguire %s.Errore nell'eseguire %sEsportaEsporta...SupplementariFF1F3F5F7F8Il campo %d del file è:Mappatura campiNome del campo:Campo:CampiCampi per %sCampi separati da: %sCampi...&FiltriIl file non è valido. Ripristina dal backup.Il file era mancante.FiltroFiltro:FiltratoMazzo filtrato %dTrova i &duplicati...Trova i duplicatiTrova e &sostituisci...Trova e sostituisciFinePrima cartaPrima ripetizionePrimo campo corrispondente: %sCorretto tipo di nota: %sInvertiLa cartella esiste già.Carattere:Piè di paginaPer motivi di sicurezza non è permesso l'utilizzo di '%s' nelle carte. Puoi però usare ugualmente questo comando inserendolo in un altro pacchetto, e importando il pacchetto nelle intestazioni LaTeX.PrevisioniModuloAvanti & Inversa opzionaleAvanti & InversaTrovato %(a)s in %(b)s.FronteAnteprima fronteModello fronteGeneraleFile generato: %sGenerato il %sOttieni mazzi condivisiNormaleIntervallo promozioneEditor HTMLDifficileHai installato latex e dvipng?IntestazioneAiutoFacilità massimaCronologiaPagina principaleSuddivisione per ora del giornoOreOre con meno di 30 ripetizioni non sono mostrate.Se hai contribuito e non sei in questo elenco, per favore contattaci.Se studiavi ogni giornoIgnora i tempi di risposta più lunghi diIgnora distinzione maiuscoleIgnora le linee dove il primo campo corrisponde con una nota esistenteIgnora questo aggiornamentoImportaImporta fileImporta anche se una nota esistente ha lo stesso primo campoImportazione fallita. Importazione fallita. Informazioni sul debug: Importa opzioniImportazione completata.Nella cartella multimediale ma non utilizzato da nessuna carta:Per poter scambiare correttamente la tua collezione tra diversi dispositivi, è necessario che l'orologio del tuo computer sia impostato correttamente. Non è sufficiente che la data e l'ora vengano visualizzati correttamente. Va nelle impostazioni di data e ora del tuo computer e verifica quanto segue: - AM/PM - Giorno, mese, anno - Fuso orario - Ora legale Differenza rispetto all'ora corretta: %s.Includi mediaIncludi informazioni intervalli carteIncludi etichetteAumenta il limite odierno di carte nuoveAumenta il limite odierno di carte nuove diAumenta il limite odierno di ripetizioniAumenta il limite odierno di ripetizioni diIntervalli crescentiInformazioniInstalla Add-onLingua dell'interfaccia:IntervalloModificatore intervalloIntervalliCodice non valido.Codifica non valida, rinomina:File non valido. Ripristina dal backup.Password non valida.Espressione regolare non valida.È stata sospesa.Testo in corsivo (Ctrl+I)Errore JS alla linea %(a)d: %(b)sSalta a etichette con Ctrl+Shift+TConservaLaTeXEquazione LaTeXAmbiente LaTeX mathErroriUltima cartaRipetizione più recenteDapprima aggiunte più recentementeImparaImpara oltre il limiteImpara: %(a)s, Ripeti: %(b)s, Reimpara: %(c)s, Filtrate: %(d)sIn apprendimentoSanguisugaAzione sanguisugheLimite sanguisugheSinistraLimita aCaricamento in corso...Blocca l'account con una password o lascia vuoto:Intervallo più lungoGuarda nel campo:Facilità minimaGestisciGestisci i tipi di nota...Mappa su %sMappa verso le etichetteContrassegnaContrassegna la notaContrassegna la nota (Ctrl+K)ContrassegnatoMatureIntervallo massimoRipetizioni massime/giornoMediaIntervallo minimoMinutiMescola le carte nuove e le ripetizioniMazzo di Mnemosyne 2.0 (*.db)AltroMaggior numero di erroriSposta carteSposta nel mazzo (Ctrl+D)Sposta le carte nel mazzo:N&otaIl nome esiste.Nome per il mazzo:Nome:ReteNuoveCarte nuoveCarte nuove nel mazzo: %sSolo carte nuoveCarte nuove/giornoNome del nuovo mazzo:Nuovo intervalloNuovo nome:Nuovo tipo di nota:Nome del nuovo gruppo di opzioni:Nuova posizione (1...%d):Il giorno successivo iniziaNessuna carta da ripetere al momento.Nessuna carta soddisfa i criteri che hai indicatoNessuna carta vuota.Nessuna carta matura studiata oggi.Non è stato trovato nessun file inutilizzato o mancante.NotaID notaTipo di notaTipi di noteNota e %d sua carta eliminata.Nota e %d sue carte eliminate.Nota seppellita.Nota sospesa.Attenzione: Per il contenuto multimediale non viene eseguito nessun backup. Per sicurezza esegui tu stesso un backup della tua cartella di Anki.Nota: Parte della cronologia è mancante. Per ulteriori informazioni consulta la documentazione del browser.Note in testo sempliceLe note richiedono almeno un campo.Note etichettate.NienteOKPiù vecchie visualizzate per primeAlla prossima sincronizzazione, forza i cambiamenti in una direzioneUna o più note non sono state importate, perchè non avrebbero generato nessuna carta. Questo può succedere se hai dei campi vuoti, o se non hai mappato il contenuto del file di testo verso i campi corretti.Solo le carte nuove possono essere riposizionate.Solo un dispositivo per volta può accedere a AnkiWeb. Se una sincronizzazione precedente è fallita, riprova tra alcuni minuti.ApriOttimizzazione in corso...Limite opzionale:OpzioniOpzioni per %sGruppo di opzioni:Opzioni...OrdineOrdine di aggiuntaOrdine di scadenzaSovrascrivi modello retro:Sovrascrivi carattere:Sovrascrivi modello fronte:Mazzo Anki impacchettato (*.apkg *.zip)Password:Le password non coincidonoIncollaIncolla immagini dagli appunti come pngLezione di Pauker 1.8 (*.pau.gz)PercentualePeriodo: %sPosiziona alla fine della coda delle carte nuoveInserisci nella coda delle ripetizioni con intervallo tra:Aggiungi prima un altro tipo di nota.Sii paziente; questo potrebbe impiegare del tempo.Collega un microfono e assicurati che altri programmi non stiano usando il dispositivo audio.Modifica questa nota e aggiungi testo da completare. (%s)Assicurati che un profilo sia aperto e che Anki non sia occupato, poi riprova.Installa PyAudioInstalla mplayerApri prima un profilo.Esegui Strumenti>Carte vuoteSeleziona un mazzo.Seleziona le carte da un solo tipo di nota.Per piacere, seleziona qualcosa.Aggiorna alla versione più recente di Anki.Utilizza File>Importa per importare questo file.Visita AnkiWeb, aggiorna il tuo mazzo e riprova.PosizionePreferenzeAnteprimaAnteprima carta selezionata (%s)Anteprima carte nuoveAnteprima carte nuove aggiunte negli ultimiElaborazione...Password del profilo...Profilo:ProfiliÈ necessaria l'autenticazione proxy.DomandaFondo della coda: %dCima della coda: %dEsciCasualeOrdina in modo casualeValutazionePronto per l'aggiornamentoRicreaRegistra la tua voceRegistra audio (F5)Registrazione...
Tempo: %0.1fRitardo relativoReimparaRicorda l'ultima immissione durante l'aggiunta di noteRimuovi etichetteRimuovi la formattazione (Ctrl+R)La rimozione di questo tipo di carte causerebbe l'eliminazione di una o più note. Crea dapprima un nuovo tipo di carte.RinominaRinomina il mazzoRiproduci di nuovo l'audioRiproduci la tua voceRiposizionaRiposiziona le carte nuoveRiposiziona...Richiedi una o più di queste etichette:Cambia la dataRipianificaRipianifica le carte considerando le mie risposte in questo mazzoRiprendi oraInverti la direzione del testo (RTL)Ripristinato allo stato precedente a '%s'.RipetizioneConteggio delle ripetizioniDurata delle ripetizioniRipeti in anticipoRipeti in anticipo diRipeti carte dimenticate negli ultimiRipeti carte dimenticateSuccesso delle ripetizioni per ora del giornoRipetizioniDa ripetere nel mazzo: %sDestraSalva l'immagineAmbito: %sCercaCerca all'interno della formattazione (lento)SelezionaSeleziona &tuttoSeleziona ¬eSeleziona etichette da escludere:Il file selezionato non era nel formato UTF-8. Consulta la sezione importazione del manuale.Studio selettivoPunto e virgolaServer non trovato. O la connessione internet non è attiva, o il software antivirus/firewall sta impedendo ad Anki di connettersi ad internet.Impostare tutti i mazzi sotto %s in questo gruppo di opzioni?Imposta per tutti i sottomazziImposta il colore in primo piano (F7)Il tasto Shift era premuto. Salto la sincronizzazione automatica e il caricamento degli add-on.Sposta le carte esistentiTasto di scorciatoia: %sScorciatoia: %sMostra %sMostra la rispostaMostra i duplicatiMostra il timer della rispostaMostra le carte nuove dopo le ripetizioniMostra le carte nuove prima delle ripetizioniMostra le carte nuove in ordine di aggiuntaMostra le carte nuove in ordine casualeMostra la prossima scadenza sopra i pulsanti di rispostaMostra il contatore delle carte rimanenti durante le ripetizioniMostra le statistiche. Tasto di scorciatoia: %sDimensione:Alcune carte correlate o seppellite sono state rinviate ad una prossima sessione.Alcune opzioni avranno effetto solo dopo il riavvio di Anki.Alcuni aggiornamenti sono stati ignorati perché il tipo di nota è cambiato:Campo ordinamentoOrdina in base a questo campo nel browserL'ordinamento per questa colonna non è supportato. Scegli un'altra colonna.Suoni e immaginiSpazioPosizione di partenza:Facilità inizialeStatistichePasso:Passi (in minuti)I passi devono essere numeri.Togli l'HTML quando incolli testoOggi hai studiato %(a)s in %(b)s.Studiate oggiStudiaStudia il mazzoStudia il mazzo...Studia adessoStudia per stato delle carte o etichettaStileStile (condiviso tra le carte)Pedice (Ctrl+=)Supermemo esportato in XML (*.xml)Apice (Ctrl+Shift+=)SospendiSospendi la cartaSospendi la notaSospeseSincronizza anche l'audio e le immaginiSincronizza con AnkiWeb. Tasto di scorciatoia: %sSincronizzazione multimedia...Sincronizzazione fallita: %sSincronizzazione fallita; internet non collegato.La sincronizzazione richiede che l'orologio sul tuo computer sia impostato correttamente. Sistema l'orologio e prova di nuovo.Sincronizzazione in corso...TabulazioneEtichetta duplicatiEtichetta soltantoEtichetteMazzo di destinazioneCampo bersaglio:TestoTesto separato da tabulazioni o punti e virgola (*)Quel mazzo esiste già.Quel nome del campo è già utilizzato.Quel nome è già utilizzato.La connessione ad AnkiWeb è scaduta. Controlla la tua connessione alla rete e prova di nuovo.La configurazione predefinita non può essere rimossa.Il mazzo predefinito non può essere eliminato.Suddivisione delle carte nei tuoi mazzi.Il primo campo è vuoto.Il primo campo della nota dev'essere mappato.Il seguente carattere non può essere utilizzato: %sIl fronte di questa carta è vuoto. Esegui Strumenti>Carte vuote.Le icone provengono da diverse fonti; le fonti sono indicate nel testo sorgente di Anki.La tua immissione creerebbe una domanda vuota su tutte le carte.Numero di domande alle quali hai risposto.Numero di ripetizioni che scadranno in futuro.Numero di volte che hai premuto ogni pulsante.I permessi della cartella temporanea del tuo sistema non sono impostati correttamente, e Anki non è in grado di correggerli automaticamente. Per ulteriori informazioni cerca 'temp folder' nel manuale di Anki.Il file non è un file .apkg valido.La ricerca non ha fornito nessun risultato. Vuoi modificare i criteri di ricerca?La modifica richiesta provocherà il caricamento completo del database la prossima volta che sincronizzi la collezione. Se hai delle ripetizioni o degli altri cambiamenti in sospeso su un altro dispositivo che non sono ancora stati sincronizzati qui, andranno persi. Continuare?Tempo impiegato per rispondere alle domande.L'aggiornamento è stato completato e sei pronto per iniziare a utilizzare Anki 2.0.

Qui sotto c'è un registro dell'aggiornamento:

%s

Ci sono ulteriori carte nuove disponibili, ma il limite giornaliero è stato raggiunto. Puoi aumentare il limite nelle opzioni, ma ricordati che più carte nuove introduci, più grande diventerà il tuo carico di lavoro per le ripetizioni a breve termine.Dev'esserci almeno un profilo.Non puoi ordinare per questa colonna, ma puoi cercare singoli tipi di carte, come 'card:Card 1'.Non puoi ordinare per questa colonna, ma puoi cercare mazzi specifici cliccando su uno di essi sulla sinistra.Questi file sembra non essere un file .apkg valido. Se ottieni questo errore con un file scaricato da AnkiWeb, è probabile che lo scaricamento non è riuscito. Riprova, e se il problema rimane, prova di nuovo con un altro browser.Questo file esiste. Vuoi sovrascriverlo?Questa cartella contiene tutti i dati di Anki, per facilitare i backup. Per utilizzare un altro percorso, leggi: %s Questo è un mazzo speciale per studiare al di fuori della pianificazione normale.Questo è un {{c1::esempio}} di testo da completare.La tua collezione esistente verrà eliminata e sostituita con i dati del file che stai importando. Sei sicuro?Questo assistente ti guiderà durante l'aggiornamento a Anki 2.0. Per aggiornare senza problemi, leggi attentamente le pagine seguenti. DurataLimite di tempo per sessioneDa ripeterePer sfogliare gli add-on, clicca qui sotto sul pulsante Sfoglia.

Quando trovi un add-on che ti piace, incolla qui sotto il suo codice.Per importare in un profilo protetto da password, apri il profilo prima di iniziare l'importazione.Per inserire testo da completare in una nota esistente, devi dapprima cambiarla in una nota di tipo con testo da completare, attraverso Modifica>Cambia tipo di notaPer vederle ora, clicca qui sotto su Disseppellisci.Per studiare al di fuori della pianificazione normale, clicca sul pulsante Studio personalizzato qui sotto.OggiIl limite delle ripetizioni per oggi è stato raggiunto, ma ci sono ancora carte che aspettano di essere ripetute. Per un utilizzo ottimale della memoria, considera di aumentare il limite giornaliero nelle opzioni.TotaleDurata totaleCarte totaliNote totaliConsidera l'immissione come espressione regolareTipoDigita la risposta: campo sconosciuto %sImpossibile importare da un file di sola lettura.DisseppellisciTesto sottolineato (Ctrl+U)Annulla&Annulla %sFormato del file sconosciuto.Mai visteAggiorna le note esistenti se il primo campo corrispondeAggiornate %(a)d di %(b)d note esistenti.Aggiornamento completatoAssistente dell'aggiornamentoAggiornamento in corsoAggiormanento del mazzo %(a)s di %(b)s in corso... %(c)sCarica su AnkiWebCaricamento su AnkiWeb in corso...Usato nelle carte ma mancante nella cartella multimediale:Utente 1Versione %sAspettando la modifica per finire.Attenzione, testo da completare non funzionerà fino a quando non cambierai in testo da completare il tipo in alto.BenvenutoAggiungi le note nuove al mazzo correnteQuando viene mostrata la risposta, riproduci anche l'audio della domanda oltre a quello della rispostaQuando sei pronto per aggiornare, clicca il pulsante esegui per proseguire. Nel tuo browser si aprirà la guida per l'aggiornamento, mentre esso procede. Leggila attentamente, in quanto molto è cambiato dalla versione precedente di Anki.Quando i tuoi mazzi vengono aggiornati, Anki cercherà di copiare i suoni e le immagini dai mazzi vecchi. Se stai usando una cartella DropBox personalizzata o una cartella multimediale personalizzata, il processo di aggiornamento potrebbe non essere in grado di localizzare il tuo contenuto multimediale. In seguito ti verrà presentato un rapporto di aggiornamento. Se ti accorgi che il contenuto multimediale non è stato copiato dove dovrebbe essere, consulta la guida all'aggiornamento per ulteriori istruzioni.

AnkiWeb ora supporta la sincronizzazione diretta del contenuto multimediale. Non è necessaria nessuna impostazione particolare, e il contenuto multimediale verrà sincronizzato assieme alle tue carte ogni volta che sincronizzi con AnkiWeb.Collezione completaVuoi scaricarlo ora?Scritto da Damien Elmes, con patch, traduzioni, test e design di:

%(cont)sHai una nota di tipo testo da completare ma non hai inserito nessun testo da completare. Proseguire?Hai moltissimi mazzi. Vedi %(a)s. %(b)sNon hai ancora registrato la tua voce.Devi avere almeno una colonna.GiovaniGiovani+ImparaI tuoi mazziI tuoi cambiamenti avranno effetto su più mazzi. Se vuoi cambiare solo il mazzo corrente, aggiungi dapprima un nuovo gruppo di opzioni.Il file della tua collezione sembra essere corrotto. Può succedere se il file viene copiato o spostato mentre Anki è aperto, o se la collezione è salvata in rete o nel cloud. Consulta il manuale per informazioni su come ripristinare da un backup automatico.La tua collezione è in uno stato inconsistente. Esegui Strumenti>Controlla il database, poi sincronizza di nuovo.La tua collezione o un file multimediale è troppo grande per la sincronizzazione.La tua collezione è stata caricata con successo su AnkiWeb. Se usi altri dispositivi, sincronizzali ora e scegli di scaricare la collezione che hai appena caricato da questo computer. In seguito, le ripetizioni e le aggiunte di carte verranno unite automaticamente.I tuoi mazzi qui e su AnkiWeb differiscono in modo tale che non è possibile unirli. È necessario sovrascrivere i mazzi in un posto con quelli nell'altro posto. Se scegli di scaricare, Anki scaricherà la collezione da AnkiWeb, e tutte le modifiche fatte sul computer dopo l'ultima sincronizzazione andranno perse. Se scegli di caricare, Anki caricherà la tua collezione su AnkiWeb, e tutte le modifiche fatte su AnkiWeb o su altri dispositivi dopo l'ultima sincronizzazione con questo dispositivo andranno perse. Dopo che tutti i dispositivi sono stati sincronizzati, le ripetizioni e le aggiunte di carte verranno unite automaticamente.[nessun mazzo]backupcartecarte dal mazzocarte selezionate percollezioneggiornimazzovita del mazzoduplicatoaiutonascondioreore dopo mezzanotteerrorimappato su %smappato verso le etichetteminminutimeripetizionisecondistatistichequesta paginascollezione intera~anki-2.0.20+dfsg/locale/wo/0000755000175000017500000000000012256137063015141 5ustar andreasandreasanki-2.0.20+dfsg/locale/wo/LC_MESSAGES/0000755000175000017500000000000012230152102016705 5ustar andreasandreasanki-2.0.20+dfsg/locale/wo/LC_MESSAGES/anki.mo0000644000175000017500000000465112252567246020221 0ustar andreasandreas+t;" "6U] cn}  %%, 3 = GRd jv   +: JWjp      ( 0 > W b h t y     "*$(+!# &)% ' Stop It has %d card. It has %d cards.%% Correct%(a)0.1f %(b)s/day%d card%d cards%d card deleted.%d cards deleted.%d card/minute%d cards/minute%s copy&Find&Next Card&Previous Card(please select 1 card)Find:Replace With:AddAdd (shortcut: ctrl+enter)Add new cardAdd to:Add: %sAll cards in random order (cram mode)CardCard %dCard 1Card 2Card ListCard TypeCard TypesCard Types for %sCardsCards TypesCards in Plain TextCards...CopyDelete CardsEasyFind and ReplaceGoodHardOpenShow %sShow AnswerProject-Id-Version: anki Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2013-12-10 17:25+0900 PO-Revision-Date: 2013-10-17 12:07+0000 Last-Translator: Marwane K. Language-Team: Wolof MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2013-12-11 05:46+0000 X-Generator: Launchpad (build 16869) Taxaw Am na %d kart. Am na %d kart.%% Baax%(a)0.1f %(b)s/bés%d kart%d kart%d kart%d kart/minit%d kart/minit%s duppi&Wut&Kart ci topp&Kart bi jiitu(tannal 1 kart)Wut :Wuutal Ag :DolliDolli (gattal : ctrl + enter)Dolli kart bu beesDolli ci biir :Dolli : %sKart yi yëpp ci mbetteelKartKart %dKart 1Kart 2Limu KartGiiru KartGiiru Kart yiGiiru Kart yi bu %sKart yiGiiru Kart yiKart yi ci Mbindu CosaanKart yi...DuppiFar ay KartYombWut ag WuutalBaaxJafeUbbiWon %sWon wuyu bianki-2.0.20+dfsg/README.development0000644000175000017500000000172412221204444016450 0ustar andreasandreasPlease see the README file for basic requirements. You also need to have the python-pyqt development packages installed (specifically, you need the binary pyuic4). To use the development version: $ git clone https://github.com/dae/anki.git $ cd anki $ ./tools/build_ui.sh Make sure you rebuild the UI every time you update the sources. The translations are stored in a bazaar repo for integration with Launchpad's translation services. If you want to use a language other than English: $ cd .. $ mv anki dtop # i18n code expects anki folder to be called dtop $ bzr clone lp:anki i18n $ cd i18n $ ./update-mos.sh $ cd ../dtop And now you're ready to run Anki: $ ./runanki If you get any errors, please make sure you don't have an older version of Anki installed in a system location. Before contributing code, please read the LICENSE file. If you'd like to contribute translations, please see the translations section of http://ankisrs.net/docs/manual.html#_contributing anki-2.0.20+dfsg/tools/0000755000175000017500000000000012065042505014407 5ustar andreasandreasanki-2.0.20+dfsg/tools/build_ui.sh0000755000175000017500000000165311755052304016552 0ustar andreasandreas#!/bin/bash # # generate python files based on the designer ui files. pyuic4 and pyrcc4 # should be on the path. # if [ ! -d "designer" ] then echo "Please run this from the project root" exit fi mkdir -p aqt/forms init=aqt/forms/__init__.py temp=aqt/forms/scratch rm -f $init $temp echo "# This file auto-generated by build_ui.sh. Don't edit." > $init echo "__all__ = [" >> $init echo "Generating forms.." for i in designer/*.ui do base=$(basename $i .ui) py="aqt/forms/${base}.py" echo " \"$base\"," >> $init echo "import $base" >> $temp if [ $i -nt $py ]; then echo " * "$py pyuic4 $i -o $py # munge the output to use gettext perl -pi.bak -e 's/QtGui.QApplication.translate\(".*?", /_(/; s/, None, QtGui.*/))/' $py rm $py.bak fi done echo "]" >> $init cat $temp >> $init rm $temp echo "Building resources.." pyrcc4 designer/icons.qrc -o aqt/forms/icons_rc.py anki-2.0.20+dfsg/tools/tests.sh0000755000175000017500000000065312065042505016114 0ustar andreasandreas#!/bin/bash # # Usage: # tools/tests.sh # run all tests # tools/tests.sh decks # test only test_decks.py # coverage=1 tools/tests.sh # run with coverage test dir=. if [ x$1 = x ]; then lim="tests" else lim="tests.test_$1" fi if [ x$coverage != x ]; then args="--with-coverage" else args="" echo "Call with coverage=1 to run coverage tests" fi (cd $dir && nosetests -vs $lim $args --cover-package=anki) anki-2.0.20+dfsg/tools/anki-wait.bat0000644000175000017500000000006211755052304016764 0ustar andreasandreascd .. set PYTHONPATH=../lib python anki pause anki-2.0.20+dfsg/anki.xpm0000644000175000017500000001426411755052304014731 0ustar andreasandreas/* XPM */ static char * anki_xpm[] = { "32 32 256 2", " c None", ". c #525252", "+ c #515151", "@ c #505050", "# c #4F4F4F", "$ c #4D4D4D", "% c #4B4B4B", "& c #4A4A4A", "* c #494949", "= c #484848", "- c #474747", "; c #464646", "> c #454545", ", c #444444", "' c #424242", ") c #404040", "! c #595959", "~ c #5E5E5E", "{ c #707070", "] c #787878", "^ c #7C7C7C", "/ c #7B7B7B", "( c #7A7A7A", "_ c #797979", ": c #777777", "< c #767676", "[ c #757575", "} c #747474", "| c #737373", "1 c #727272", "2 c #6D6D6D", "3 c #606060", "4 c #636363", "5 c #828282", "6 c #808080", "7 c #7F7F7F", "8 c #7E7E7E", "9 c #7D7D7D", "0 c #6C6C6C", "a c #616161", "b c #898989", "c c #888888", "d c #868686", "e c #848484", "f c #818181", "g c #989898", "h c #656565", "i c #646464", "j c #8A8A8A", "k c #8E8E8E", "l c #8C8C8C", "m c #858585", "n c #838383", "o c #929292", "p c #A7A7A7", "q c #949494", "r c #C7C7C7", "s c #E8E9E9", "t c #6E6E6E", "u c #696969", "v c #959595", "w c #939393", "x c #919191", "y c #8F8F8F", "z c #999999", "A c #F6FBFE", "B c #DFEFFB", "C c #E6F1F9", "D c #BADEF5", "E c #D4E9F7", "F c #A5A5A5", "G c #575757", "H c #979797", "I c #969696", "J c #8D8D8D", "K c #8B8B8B", "L c #878787", "M c #E5EFF5", "N c #97CDF1", "O c #8DC8EF", "P c #7ABFED", "Q c #D4EAF9", "R c #C6C6C6", "S c #5B5B5B", "T c #9E9E9E", "U c #9C9C9C", "V c #9B9B9B", "W c #E5E7E8", "X c #B4DAF5", "Y c #90C9F0", "Z c #94CBF1", "` c #ABD6F3", " . c #E4F2FB", ".. c #D6D7D7", "+. c #5F5F5F", "@. c #A2A2A2", "#. c #A0A0A0", "$. c #9F9F9F", "%. c #9D9D9D", "&. c #9A9A9A", "*. c #B5B5B5", "=. c #E8F3FA", "-. c #AED8F4", ";. c #A9D5F3", ">. c #ADD7F4", ",. c #CDE7F8", "'. c #EAF5FC", "). c #E7E7E7", "!. c #626262", "~. c #909090", "{. c #A1A1A1", "]. c #D8D8D8", "^. c #EFF2F3", "/. c #ECF1F4", "(. c #E8F3FC", "_. c #F0F0F0", ":. c #B6B6B6", "<. c #666666", "[. c #010101", "}. c #686868", "|. c #A9A9A9", "1. c #B0B0B0", "2. c #E9EAEA", "3. c #F7FBFD", "4. c #D7D7D7", "5. c #6A6A6A", "6. c #000000", "7. c #5D5D5D", "8. c #585858", "9. c #A8A8A8", "0. c #E1E1E1", "a. c #ACACAC", "b. c #5A5A5A", "c. c #717171", "d. c #EEF0F1", "e. c #CCCCCC", "f. c #565656", "g. c #676767", "h. c #C9C9C9", "i. c #AAD6F4", "j. c #DBEBF6", "k. c #ADADAD", "l. c #6F6F6F", "m. c #ECF3F7", "n. c #4CA9E7", "o. c #4EAAE7", "p. c #D2E9F9", "q. c #319CE3", "r. c #118CDF", "s. c #E4E4E4", "t. c #C2C2C2", "u. c #C0C0C0", "v. c #C8C8C8", "w. c #EEEFF0", "x. c #9DD0F2", "y. c #2998E2", "z. c #1C91E0", "A. c #92CBF0", "B. c #96CDF1", "C. c #98CEF1", "D. c #99CEF1", "E. c #F0F8FD", "F. c #5C5C5C", "G. c #ECECEC", "H. c #EEF5F9", "I. c #C1E1F7", "J. c #93CBF0", "K. c #58AEE9", "L. c #3BA0E5", "M. c #2F9AE3", "N. c #2596E2", "O. c #1990E0", "P. c #108BDF", "Q. c #0686DD", "R. c #47A6E7", "S. c #E9EFF3", "T. c #171717", "U. c #DBEDFA", "V. c #70BAEB", "W. c #67B6EA", "X. c #5BB0E8", "Y. c #52ABE7", "Z. c #45A5E6", "`. c #3CA1E5", " + c #309BE3", ".+ c #2796E2", "++ c #50ABE8", "@+ c #DCEDF9", "#+ c #A5A6A6", "$+ c #4C4C4C", "%+ c #0F0F0F", "&+ c #ECEDEE", "*+ c #E1F1FB", "=+ c #94CBF0", "-+ c #7ABEED", ";+ c #6EB9EB", ">+ c #64B4EA", ",+ c #58AEE8", "'+ c #4FAAE7", ")+ c #43A4E5", "!+ c #3FA2E5", "~+ c #CBE6F8", "{+ c #D0D0D0", "]+ c #101010", "^+ c #F1F6FA", "/+ c #B7DCF5", "(+ c #84C4EE", "_+ c #7BBFED", ":+ c #6FB9EB", "<+ c #66B5EA", "[+ c #5AAFE8", "}+ c #5BAFE8", "|+ c #F1F5F7", "1+ c #6B6B6B", "2+ c #D1D1D1", "3+ c #E2F1FB", "4+ c #8EC8F0", "5+ c #82C2EE", "6+ c #78BEED", "7+ c #6CB8EB", "8+ c #63B3EA", "9+ c #D5EBF9", "0+ c #B9B9B9", "a+ c #545454", "b+ c #111111", "c+ c #C5C5C5", "d+ c #E7F4FC", "e+ c #A5D3F3", "f+ c #AAD5F4", "g+ c #ACD7F4", "h+ c #8FC9F0", "i+ c #CACACA", "j+ c #ECF6FC", "k+ c #C2E1F6", "l+ c #CBE5F7", "m+ c #F0F7FD", "n+ c #F9FCFE", "o+ c #C7E4F7", "p+ c #B1D9F4", "q+ c #F1F8FC", "r+ c #121212", "s+ c #CFCFCF", "t+ c #F5FAFD", "u+ c #EFF7FC", "v+ c #F3F3F4", "w+ c #F1F1F1", "x+ c #0D0D0D", "y+ c #BFBFBF", "z+ c #FDFEFE", "A+ c #EBEBEB", "B+ c #AEAEAE", "C+ c #040404", "D+ c #1B1B1B", "E+ c #A3A3A3", "F+ c #0E0E0E", "G+ c #020202", " ", " . + @ # $ $ % & * = - ; > , ' ' ) ", " ! ~ { ] ^ / ( _ _ ] : < [ } | | 1 2 3 $ ' ", " 4 / 5 6 7 8 9 ^ / ( ( _ ] : < [ } } | 0 % ", " a ^ b c d e 5 f 6 7 8 9 ^ / ( _ 9 g f < [ h & ", " i j k l j c d m n 5 f 6 o p q j r s g _ ] t + ", " u v w x y k l j b d m n z A B C D E F ^ / } G ", " 0 z H I q o x y J K b L j M N O P Q R 6 8 < S ", " { T U V z H I q o x y J y W X Y Z ` ...o ( +. ", " } @.#.$.%.U &.g H v w x *.=.-.;.>.,.'.).T 9 !. ", " @ ~.o g T {.$.%.U &.g %.].^./.(.Q _.:.K L 6 <. ", " [.+.!.}.2 ] c T #.T U %.|.1.1.2.3.4.o J K e 5. ", " 6.3 ~ 7.S ! 8.S t L w T T %.V 9.0.a.q w x b t ", " 6.4 !.3 +.7.S b.c.! a { e U $.%.9.V g H v J 1 ", " 6.<.h 4 !.3 +.~.d.e.0 G f.! } w T $.%.U &.o < ", " 6.5.}.g.h 4 !.h.i.j.k.b.! G f.3 [ &.@.#.$.I ( ", " 6.2 0 5.u g.l.m.n.o.=.m 7.b.! G f.! 1 w {.V 8 ", " 6.{ l.2 0 5.z p.q.r.Z s.t.u.u.a.l.G f.~ : V 5 ", " 6.} [ J T v.w.x.y.z.z.A.B.C.D.E.*.S b.8.G G F. ", " 6./ 1.G.H.I.J.K.L.M.N.O.P.Q.R.S.~.~ 7.S b.* T. ", " 6.d ].U.O V.W.X.Y.Z.`. +.+++@+#+h !.3 ~ 7.$+%+ ", " 6.8 &.&+*+=+-+;+>+,+'+)+!+~+{+2 g.h i !.3 # ]+ ", " 6.f 6 K v.^+/+(+_+:+<+[+}+|+z 1+5.}.g.h i . ]+ ", " 6.e n f m 2+3+N 4+5+6+7+8+9+0+l.2 1+5.}.g.a+b+ ", " 6.c L m e c+d+-.e+f+g+h+_+g+2.} c.l.t 0 1+8.b+ ", " 6.K j c L i+j+k+l+m+n+ .o+p+q+b } 1 c.l.t b.r+ ", " 6.7 J l j s+t+u+v+0+~.*.4._.w+L ] < } | c.G x+ ", " 6.a x y J y+z+A+B+d e 5 L V V 8 / _ ] < [ & C+ ", " D+[ o x H E+y K b c d e n f 6 8 ^ / _ g.F+ ", " G+D+4 n o x y k l K b c d m n 5 7 | $ D+6. ", " 6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6. ", " "}; anki-2.0.20+dfsg/anki.xml0000644000175000017500000000055012015400137014705 0ustar andreasandreas Anki 1.2 deck Anki 2.0 deck anki-2.0.20+dfsg/README0000644000175000017500000000201512072665646014144 0ustar andreasandreasAnki ------------------------------------- Prerequisites --------------- To install the prerequisites on Ubuntu/Debian, please use the following command: sudo apt-get install python-qt4 mplayer lame libportaudio2 python-sqlalchemy If you're on another distribution the packages may be named differently, so please consult your package manager. Your Python version will need to be 2.6 or 2.7 (not 3+), and both Qt and PyQt need to be 4.7 or later. Installation & Running ------------------------ Anki does not need installing, and can be run from the directory it is extracted to. If you extracted it to ~/anki-2.0 for example, you can run Anki by simply typing ~/anki-2.0/runanki in a terminal. If you'd like to install it system wide, change to the folder you extracted it to, and run 'sudo make install'. If you need to uninstall Anki in the future, you can do so by typing 'sudo make uninstall'. More information ----------------- For more information and the latest version, please see the website at: http://ankisrs.net/ anki-2.0.20+dfsg/thirdparty/0000755000175000017500000000000012256137126015447 5ustar andreasandreasanki-2.0.20+dfsg/thirdparty/send2trash/0000755000175000017500000000000012252567261017527 5ustar andreasandreasanki-2.0.20+dfsg/thirdparty/send2trash/plat_osx.py0000644000175000017500000000340512221204444021717 0ustar andreasandreas# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) # This software is licensed under the "BSD" License as described in the "LICENSE" file, # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license from ctypes import cdll, byref, Structure, c_char, c_char_p from ctypes.util import find_library import os Foundation = cdll.LoadLibrary(find_library(u'Foundation')) CoreServices = cdll.LoadLibrary(find_library(u'CoreServices')) GetMacOSStatusCommentString = Foundation.GetMacOSStatusCommentString GetMacOSStatusCommentString.restype = c_char_p FSPathMakeRefWithOptions = CoreServices.FSPathMakeRefWithOptions FSMoveObjectToTrashSync = CoreServices.FSMoveObjectToTrashSync kFSPathMakeRefDefaultOptions = 0 kFSPathMakeRefDoNotFollowLeafSymlink = 0x01 kFSFileOperationDefaultOptions = 0 kFSFileOperationOverwrite = 0x01 kFSFileOperationSkipSourcePermissionErrors = 0x02 kFSFileOperationDoNotMoveAcrossVolumes = 0x04 kFSFileOperationSkipPreflight = 0x08 class FSRef(Structure): _fields_ = [(u'hidden', c_char * 80)] def check_op_result(op_result): if op_result: msg = GetMacOSStatusCommentString(op_result).decode(u'utf-8') raise OSError(msg) def send2trash(path): try: _send2trash(path) except OSError: # user's system is broken; just delete os.unlink(path) def _send2trash(path): if not isinstance(path, str): path = path.encode(u'utf-8') fp = FSRef() opts = kFSPathMakeRefDoNotFollowLeafSymlink op_result = FSPathMakeRefWithOptions(path, opts, byref(fp), None) check_op_result(op_result) opts = kFSFileOperationDefaultOptions op_result = FSMoveObjectToTrashSync(byref(fp), None, opts) check_op_result(op_result) anki-2.0.20+dfsg/thirdparty/send2trash/__init__.py0000644000175000017500000000073112221204444021624 0ustar andreasandreas# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) # This software is licensed under the "BSD" License as described in the "LICENSE" file, # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license import sys if sys.platform == u'darwin': from .plat_osx import send2trash elif sys.platform == u'win32': from .plat_win import send2trash else: from .plat_other import send2trash anki-2.0.20+dfsg/thirdparty/send2trash/plat_other.py0000644000175000017500000001266112221204444022233 0ustar andreasandreas# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) # This software is licensed under the "BSD" License as described in the "LICENSE" file, # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license # This is a reimplementation of plat_other.py with reference to the # freedesktop.org trash specification: # [1] http://www.freedesktop.org/wiki/Specifications/trash-spec # [2] http://www.ramendik.ru/docs/trashspec.html # See also: # [3] http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html # # For external volumes this implementation will raise an exception if it can't # find or create the user's trash directory. import sys import os import os.path as op from datetime import datetime import stat from urllib import quote from io import open FILES_DIR = u'files' INFO_DIR = u'info' INFO_SUFFIX = u'.trashinfo' # Default of ~/.local/share [3] XDG_DATA_HOME = op.expanduser(os.environ.get(u'XDG_DATA_HOME', u'~/.local/share')) HOMETRASH = op.join(XDG_DATA_HOME, u'Trash') uid = os.getuid() TOPDIR_TRASH = u'.Trash' TOPDIR_FALLBACK = u'.Trash-' + unicode(uid) def is_parent(parent, path): path = op.realpath(path) # In case it's a symlink parent = op.realpath(parent) return path.startswith(parent) def format_date(date): return date.strftime(u"%Y-%m-%dT%H:%M:%S") def info_for(src, topdir): # ...it MUST not include a ".."" directory, and for files not "under" that # directory, absolute pathnames must be used. [2] if topdir is None or not is_parent(topdir, src): src = op.abspath(src) else: src = op.relpath(src, topdir) info = u"[Trash Info]\n" if isinstance(src, unicode): src = src.encode("utf8") info += u"Path=" + quote(src) + u"\n" info += u"DeletionDate=" + format_date(datetime.now()) + u"\n" return info def check_create(dir): # use 0700 for paths [3] if not op.exists(dir): os.makedirs(dir, 0700) def trash_move(src, dst, topdir=None): filename = op.basename(src) filespath = op.join(dst, FILES_DIR) infopath = op.join(dst, INFO_DIR) base_name, ext = op.splitext(filename) counter = 0 destname = filename while op.exists(op.join(filespath, destname)) or op.exists(op.join(infopath, destname + INFO_SUFFIX)): counter += 1 destname = u'%s %s%s' % (base_name, counter, ext) check_create(filespath) check_create(infopath) os.rename(src, op.join(filespath, destname)) f = open(op.join(infopath, destname + INFO_SUFFIX), u'w') f.write(info_for(src, topdir)) f.close() def find_mount_point(path): # Even if something's wrong, "/" is a mount point, so the loop will exit. # Use realpath in case it's a symlink path = op.realpath(path) # Required to avoid infinite loop while not op.ismount(path): path = op.split(path)[0] return path def find_ext_volume_global_trash(volume_root): # from [2] Trash directories (1) check for a .Trash dir with the right # permissions set. trash_dir = op.join(volume_root, TOPDIR_TRASH) if not op.exists(trash_dir): return None mode = os.lstat(trash_dir).st_mode # vol/.Trash must be a directory, cannot be a symlink, and must have the # sticky bit set. if not op.isdir(trash_dir) or op.islink(trash_dir) or not (mode & stat.S_ISVTX): return None trash_dir = op.join(trash_dir, unicode(uid)) try: check_create(trash_dir) except OSError: return None return trash_dir def find_ext_volume_fallback_trash(volume_root): # from [2] Trash directories (1) create a .Trash-$uid dir. trash_dir = op.join(volume_root, TOPDIR_FALLBACK) # Try to make the directory, if we can't the OSError exception will escape # be thrown out of send2trash. check_create(trash_dir) return trash_dir def find_ext_volume_trash(volume_root): trash_dir = find_ext_volume_global_trash(volume_root) if trash_dir is None: trash_dir = find_ext_volume_fallback_trash(volume_root) return trash_dir # Pull this out so it's easy to stub (to avoid stubbing lstat itself) def get_dev(path): return os.lstat(path).st_dev def send2trash(path): try: _send2trash(path) except OSError: # user's system is broken; just delete os.unlink(path) def _send2trash(path): if not isinstance(path, unicode): path = unicode(path, sys.getfilesystemencoding()) if not op.exists(path): raise OSError(u"File not found: %s" % path) # ...should check whether the user has the necessary permissions to delete # it, before starting the trashing operation itself. [2] if not os.access(path, os.W_OK): raise OSError(u"Permission denied: %s" % path) # if the file to be trashed is on the same device as HOMETRASH we # want to move it there. path_dev = get_dev(path) # If XDG_DATA_HOME or HOMETRASH do not yet exist we need to stat the # home directory, and these paths will be created further on if needed. trash_dev = get_dev(op.expanduser(u'~')) if path_dev == trash_dev: topdir = XDG_DATA_HOME dest_trash = HOMETRASH else: topdir = find_mount_point(path) trash_dev = get_dev(topdir) if trash_dev != path_dev: raise OSError(u"Couldn't find mount point for %s" % path) dest_trash = find_ext_volume_trash(topdir) trash_move(path, dest_trash, topdir) anki-2.0.20+dfsg/thirdparty/send2trash/plat_win.py0000644000175000017500000000323712230632446021715 0ustar andreasandreas# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) # This software is licensed under the "BSD" License as described in the "LICENSE" file, # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license from ctypes import windll, Structure, byref, c_uint from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL import os import os.path as op shell32 = windll.shell32 SHFileOperationW = shell32.SHFileOperationW class SHFILEOPSTRUCTW(Structure): _fields_ = [ (u"hwnd", HWND), (u"wFunc", UINT), (u"pFrom", LPCWSTR), (u"pTo", LPCWSTR), (u"fFlags", c_uint), (u"fAnyOperationsAborted", BOOL), (u"hNameMappings", c_uint), (u"lpszProgressTitle", LPCWSTR), ] FO_MOVE = 1 FO_COPY = 2 FO_DELETE = 3 FO_RENAME = 4 FOF_MULTIDESTFILES = 1 FOF_SILENT = 4 FOF_NOCONFIRMATION = 16 FOF_ALLOWUNDO = 64 FOF_NOERRORUI = 1024 def send2trash(path): opath = path if not isinstance(path, unicode): path = unicode(path, u'mbcs') if not op.isabs(path): path = op.abspath(path) fileop = SHFILEOPSTRUCTW() fileop.hwnd = 0 fileop.wFunc = FO_DELETE fileop.pFrom = LPCWSTR(path + u'\0') fileop.pTo = None fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT fileop.fAnyOperationsAborted = 0 fileop.hNameMappings = 0 fileop.lpszProgressTitle = None result = SHFileOperationW(byref(fileop)) if result: # user's system is broken, just delete os.unlink(opath) #msg = u"Couldn't perform operation. Error code: %d" % result #raise OSError(msg) anki-2.0.20+dfsg/tests/0000755000175000017500000000000012256137063014417 5ustar andreasandreasanki-2.0.20+dfsg/tests/test_sync.py0000644000175000017500000002441612227223667017017 0ustar andreasandreas# coding: utf-8 import nose, os, shutil, time from anki import Collection as aopen, Collection from anki.utils import intTime from anki.sync import Syncer, LocalServer from tests.shared import getEmptyDeck # Local tests ########################################################################## deck1=None deck2=None client=None server=None server2=None def setup_basic(): global deck1, deck2, client, server deck1 = getEmptyDeck() # add a note to deck 1 f = deck1.newNote() f['Front'] = u"foo"; f['Back'] = u"bar"; f.tags = [u"foo"] deck1.addNote(f) # answer it deck1.reset(); deck1.sched.answerCard(deck1.sched.getCard(), 4) # repeat for deck2 deck2 = getEmptyDeck(server=True) f = deck2.newNote() f['Front'] = u"bar"; f['Back'] = u"bar"; f.tags = [u"bar"] deck2.addNote(f) deck2.reset(); deck2.sched.answerCard(deck2.sched.getCard(), 4) # start with same schema and sync time deck1.scm = deck2.scm = 0 # and same mod time, so sync does nothing t = intTime(1000) deck1.save(mod=t); deck2.save(mod=t) server = LocalServer(deck2) client = Syncer(deck1, server) def setup_modified(): setup_basic() # mark deck1 as changed time.sleep(0.1) deck1.setMod() deck1.save() @nose.with_setup(setup_basic) def test_nochange(): assert client.sync() == "noChanges" @nose.with_setup(setup_modified) def test_changedSchema(): deck1.scm += 1 deck1.setMod() assert client.sync() == "fullSync" @nose.with_setup(setup_modified) def test_sync(): def check(num): for d in deck1, deck2: for t in ("revlog", "notes", "cards"): assert d.db.scalar("select count() from %s" % t) == num assert len(d.models.all()) == num*4 # the default deck and config have an id of 1, so always 1 assert len(d.decks.all()) == 1 assert len(d.decks.dconf) == 1 assert len(d.tags.all()) == num check(1) origUsn = deck1.usn() assert client.sync() == "success" # last sync times and mod times should agree assert deck1.mod == deck2.mod assert deck1._usn == deck2._usn assert deck1.mod == deck1.ls assert deck1._usn != origUsn # because everything was created separately it will be merged in. in # actual use, we use a full sync to ensure a common starting point. check(2) # repeating it does nothing assert client.sync() == "noChanges" # if we bump mod time, the decks will sync but should remain the same. deck1.setMod() deck1.save() assert client.sync() == "success" check(2) # crt should be synced deck1.crt = 123 deck1.setMod() assert client.sync() == "success" assert deck1.crt == deck2.crt @nose.with_setup(setup_modified) def test_models(): test_sync() # update model one cm = deck1.models.current() cm['name'] = "new" time.sleep(1) deck1.models.save(cm) deck1.save() assert deck2.models.get(cm['id'])['name'].startswith("Basic") assert client.sync() == "success" assert deck2.models.get(cm['id'])['name'] == "new" # deleting triggers a full sync deck1.scm = deck2.scm = 0 deck1.models.rem(cm) deck1.save() assert client.sync() == "fullSync" @nose.with_setup(setup_modified) def test_notes(): test_sync() # modifications should be synced nid = deck1.db.scalar("select id from notes") note = deck1.getNote(nid) assert note['Front'] != "abc" note['Front'] = "abc" note.flush() deck1.save() assert client.sync() == "success" assert deck2.getNote(nid)['Front'] == "abc" # deletions too assert deck1.db.scalar("select 1 from notes where id = ?", nid) deck1.remNotes([nid]) deck1.save() assert client.sync() == "success" assert not deck1.db.scalar("select 1 from notes where id = ?", nid) assert not deck2.db.scalar("select 1 from notes where id = ?", nid) @nose.with_setup(setup_modified) def test_cards(): test_sync() nid = deck1.db.scalar("select id from notes") note = deck1.getNote(nid) card = note.cards()[0] # answer the card locally card.startTimer() deck1.sched.answerCard(card, 4) assert card.reps == 2 deck1.save() assert deck2.getCard(card.id).reps == 1 assert client.sync() == "success" assert deck2.getCard(card.id).reps == 2 # if it's modified on both sides , later mod time should win for test in ((deck1, deck2), (deck2, deck1)): time.sleep(1) c = test[0].getCard(card.id) c.reps = 5; c.flush() test[0].save() time.sleep(1) c = test[1].getCard(card.id) c.reps = 3; c.flush() test[1].save() assert client.sync() == "success" assert test[1].getCard(card.id).reps == 3 assert test[0].getCard(card.id).reps == 3 # removals should work too deck1.remCards([card.id]) deck1.save() assert deck2.db.scalar("select 1 from cards where id = ?", card.id) assert client.sync() == "success" assert not deck2.db.scalar("select 1 from cards where id = ?", card.id) @nose.with_setup(setup_modified) def test_tags(): test_sync() assert deck1.tags.all() == deck2.tags.all() deck1.tags.register(["abc"]) deck2.tags.register(["xyz"]) assert deck1.tags.all() != deck2.tags.all() deck1.save() time.sleep(0.1) deck2.save() assert client.sync() == "success" assert deck1.tags.all() == deck2.tags.all() @nose.with_setup(setup_modified) def test_decks(): test_sync() assert len(deck1.decks.all()) == 1 assert len(deck1.decks.all()) == len(deck2.decks.all()) deck1.decks.id("new") assert len(deck1.decks.all()) != len(deck2.decks.all()) time.sleep(0.1) deck2.decks.id("new2") deck1.save() time.sleep(0.1) deck2.save() assert client.sync() == "success" assert deck1.tags.all() == deck2.tags.all() assert len(deck1.decks.all()) == len(deck2.decks.all()) assert len(deck1.decks.all()) == 3 assert deck1.decks.confForDid(1)['maxTaken'] == 60 deck2.decks.confForDid(1)['maxTaken'] = 30 deck2.decks.save(deck2.decks.confForDid(1)) deck2.save() assert client.sync() == "success" assert deck1.decks.confForDid(1)['maxTaken'] == 30 @nose.with_setup(setup_modified) def test_conf(): test_sync() assert deck2.conf['curDeck'] == 1 deck1.conf['curDeck'] = 2 time.sleep(0.1) deck1.setMod() deck1.save() assert client.sync() == "success" assert deck2.conf['curDeck'] == 2 @nose.with_setup(setup_modified) def test_threeway(): test_sync() deck1.close(save=False) d3path = deck1.path.replace(".anki", "2.anki") shutil.copy2(deck1.path, d3path) deck1.reopen() deck3 = aopen(d3path) client2 = Syncer(deck3, server) assert client2.sync() == "noChanges" # client 1 adds a card at time 1 time.sleep(1) f = deck1.newNote() f['Front'] = u"1"; deck1.addNote(f) deck1.save() # at time 2, client 2 syncs to server time.sleep(1) deck3.setMod() deck3.save() assert client2.sync() == "success" # at time 3, client 1 syncs, adding the older note time.sleep(1) assert client.sync() == "success" assert deck1.noteCount() == deck2.noteCount() # syncing client2 should pick it up assert client2.sync() == "success" assert deck1.noteCount() == deck2.noteCount() == deck3.noteCount() def test_threeway2(): # for this test we want ms precision of notes so we don't have to # sleep a lot import anki.notes intTime = anki.notes.intTime anki.notes.intTime = lambda x=1: intTime(1000) def setup(): # create collection 1 with a single note c1 = getEmptyDeck() f = c1.newNote() f['Front'] = u"startingpoint" nid = f.id c1.addNote(f) cid = f.cards()[0].id c1.beforeUpload() # start both clients and server off in this state s1path = c1.path.replace(".anki2", "-s1.anki2") c2path = c1.path.replace(".anki2", "-c2.anki2") shutil.copy2(c1.path, s1path) shutil.copy2(c1.path, c2path) # open them c1 = Collection(c1.path) c2 = Collection(c2path) s1 = Collection(s1path, server=True) return c1, c2, s1, nid, cid c1, c2, s1, nid, cid = setup() # modify c1 then sync c1->s1 n = c1.getNote(nid) t = "firstmod" n['Front'] = t n.flush() c1.db.execute("update cards set mod=1, usn=-1") srv = LocalServer(s1) clnt1 = Syncer(c1, srv) clnt1.sync() n.load() assert n['Front'] == t assert s1.getNote(nid)['Front'] == t assert s1.db.scalar("select mod from cards") == 1 # sync s1->c2 clnt2 = Syncer(c2, srv) clnt2.sync() assert c2.getNote(nid)['Front'] == t assert c2.db.scalar("select mod from cards") == 1 # modify c1 and sync time.sleep(0.001) t = "secondmod" n = c1.getNote(nid) n['Front'] = t n.flush() c1.db.execute("update cards set mod=2, usn=-1") clnt1.sync() # modify c2 and sync - both c2 and server should be the same time.sleep(0.001) t2 = "thirdmod" n = c2.getNote(nid) n['Front'] = t2 n.flush() c2.db.execute("update cards set mod=3, usn=-1") clnt2.sync() n.load() assert n['Front'] == t2 assert c2.db.scalar("select mod from cards") == 3 n = s1.getNote(nid) assert n['Front'] == t2 assert s1.db.scalar("select mod from cards") == 3 # and syncing c1 again should yield the updated note as well clnt1.sync() n = s1.getNote(nid) assert n['Front'] == t2 assert s1.db.scalar("select mod from cards") == 3 n = c1.getNote(nid) assert n['Front'] == t2 assert c1.db.scalar("select mod from cards") == 3 def _test_speed(): t = time.time() deck1 = aopen(os.path.expanduser("~/rapid.anki")) for tbl in "revlog", "cards", "notes", "graves": deck1.db.execute("update %s set usn = -1 where usn != -1"%tbl) for m in deck1.models.all(): m['usn'] = -1 for tx in deck1.tags.all(): deck1.tags.tags[tx] = -1 deck1._usn = -1 deck1.save() deck2 = getEmptyDeck(server=True) deck1.scm = deck2.scm = 0 server = LocalServer(deck2) client = Syncer(deck1, server) print "load %d" % ((time.time() - t)*1000); t = time.time() assert client.sync() == "success" print "sync %d" % ((time.time() - t)*1000); t = time.time() anki-2.0.20+dfsg/tests/test_decks.py0000644000175000017500000001171112065175361017123 0ustar andreasandreas# coding: utf-8 from tests.shared import assertException, getEmptyDeck def test_basic(): deck = getEmptyDeck() # we start with a standard deck assert len(deck.decks.decks) == 1 # it should have an id of 1 assert deck.decks.name(1) # create a new deck parentId = deck.decks.id("new deck") assert parentId assert len(deck.decks.decks) == 2 # should get the same id assert deck.decks.id("new deck") == parentId # we start with the default deck selected assert deck.decks.selected() == 1 assert deck.decks.active() == [1] # we can select a different deck deck.decks.select(parentId) assert deck.decks.selected() == parentId assert deck.decks.active() == [parentId] # let's create a child childId = deck.decks.id("new deck::child") # it should have been added to the active list assert deck.decks.selected() == parentId assert deck.decks.active() == [parentId, childId] # we can select the child individually too deck.decks.select(childId) assert deck.decks.selected() == childId assert deck.decks.active() == [childId] # parents with a different case should be handled correctly deck.decks.id("ONE") m = deck.models.current() m['did'] = deck.decks.id("one::two") deck.models.save(m) n = deck.newNote() n['Front'] = "abc" deck.addNote(n) # this will error if child and parent case don't match deck.sched.deckDueList() def test_remove(): deck = getEmptyDeck() # create a new deck, and add a note/card to it g1 = deck.decks.id("g1") f = deck.newNote() f['Front'] = u"1" f.model()['did'] = g1 deck.addNote(f) c = f.cards()[0] assert c.did == g1 # by default deleting the deck leaves the cards with an invalid did assert deck.cardCount() == 1 deck.decks.rem(g1) assert deck.cardCount() == 1 c.load() assert c.did == g1 # but if we try to get it, we get the default assert deck.decks.name(c.did) == "[no deck]" # let's create another deck and explicitly set the card to it g2 = deck.decks.id("g2") c.did = g2; c.flush() # this time we'll delete the card/note too deck.decks.rem(g2, cardsToo=True) assert deck.cardCount() == 0 assert deck.noteCount() == 0 def test_rename(): d = getEmptyDeck() id = d.decks.id("hello::world") # should be able to rename into a completely different branch, creating # parents as necessary d.decks.rename(d.decks.get(id), "foo::bar") assert "foo" in d.decks.allNames() assert "foo::bar" in d.decks.allNames() assert "hello::world" not in d.decks.allNames() # create another deck id = d.decks.id("tmp") # we can't rename it if it conflicts assertException( Exception, lambda: d.decks.rename(d.decks.get(id), "foo")) # when renaming, the children should be renamed too d.decks.id("one::two::three") id = d.decks.id("one") d.decks.rename(d.decks.get(id), "yo") for n in "yo", "yo::two", "yo::two::three": assert n in d.decks.allNames() def test_renameForDragAndDrop(): d = getEmptyDeck() def deckNames(): return [ name for name in sorted(d.decks.allNames()) if name <> u'Default' ] languages_did = d.decks.id('Languages') chinese_did = d.decks.id('Chinese') hsk_did = d.decks.id('Chinese::HSK') # Renaming also renames children d.decks.renameForDragAndDrop(chinese_did, languages_did) assert deckNames() == [ 'Languages', 'Languages::Chinese', 'Languages::Chinese::HSK' ] # Dragging a deck onto itself is a no-op d.decks.renameForDragAndDrop(languages_did, languages_did) assert deckNames() == [ 'Languages', 'Languages::Chinese', 'Languages::Chinese::HSK' ] # Dragging a deck onto its parent is a no-op d.decks.renameForDragAndDrop(hsk_did, chinese_did) assert deckNames() == [ 'Languages', 'Languages::Chinese', 'Languages::Chinese::HSK' ] # Dragging a deck onto a descendant is a no-op d.decks.renameForDragAndDrop(languages_did, hsk_did) assert deckNames() == [ 'Languages', 'Languages::Chinese', 'Languages::Chinese::HSK' ] # Can drag a grandchild onto its grandparent. It becomes a child d.decks.renameForDragAndDrop(hsk_did, languages_did) assert deckNames() == [ 'Languages', 'Languages::Chinese', 'Languages::HSK' ] # Can drag a deck onto its sibling d.decks.renameForDragAndDrop(hsk_did, chinese_did) assert deckNames() == [ 'Languages', 'Languages::Chinese', 'Languages::Chinese::HSK' ] # Can drag a deck back to the top level d.decks.renameForDragAndDrop(chinese_did, None) assert deckNames() == [ 'Chinese', 'Chinese::HSK', 'Languages' ] # Dragging a top level deck to the top level is a no-op d.decks.renameForDragAndDrop(chinese_did, None) assert deckNames() == [ 'Chinese', 'Chinese::HSK', 'Languages' ] # '' is a convenient alias for the top level DID d.decks.renameForDragAndDrop(hsk_did, '') assert deckNames() == [ 'Chinese', 'HSK', 'Languages' ] anki-2.0.20+dfsg/tests/test_exporting.py0000644000175000017500000000721212065175361020052 0ustar andreasandreas# coding: utf-8 import nose, os, tempfile from anki import Collection as aopen from anki.exporting import * from anki.importing import Anki2Importer from shared import getEmptyDeck deck = None ds = None testDir = os.path.dirname(__file__) def setup1(): global deck deck = getEmptyDeck() f = deck.newNote() f['Front'] = u"foo"; f['Back'] = u"bar"; f.tags = ["tag", "tag2"] deck.addNote(f) # with a different deck f = deck.newNote() f['Front'] = u"baz"; f['Back'] = u"qux" f.model()['did'] = deck.decks.id("new deck") deck.addNote(f) ########################################################################## @nose.with_setup(setup1) def test_export_anki(): # create a new deck with its own conf to test conf copying did = deck.decks.id("test") dobj = deck.decks.get(did) confId = deck.decks.confId("newconf") conf = deck.decks.getConf(confId) conf['new']['perDay'] = 5 deck.decks.save(conf) deck.decks.setConf(dobj, confId) # export e = AnkiExporter(deck) newname = unicode(tempfile.mkstemp(prefix="ankitest", suffix=".anki2")[1]) os.unlink(newname) e.exportInto(newname) # exporting should not have changed conf for original deck conf = deck.decks.confForDid(did) assert conf['id'] != 1 # connect to new deck d2 = aopen(newname) assert d2.cardCount() == 2 # as scheduling was reset, should also revert decks to default conf did = d2.decks.id("test", create=False) assert did conf2 = d2.decks.confForDid(did) assert conf2['new']['perDay'] == 20 dobj = d2.decks.get(did) # conf should be 1 assert dobj['conf'] == 1 # try again, limited to a deck newname = unicode(tempfile.mkstemp(prefix="ankitest", suffix=".anki2")[1]) os.unlink(newname) e.did = 1 e.exportInto(newname) d2 = aopen(newname) assert d2.cardCount() == 1 @nose.with_setup(setup1) def test_export_ankipkg(): # add a test file to the media folder open(os.path.join(deck.media.dir(), u"今日.mp3"), "w").write("test") n = deck.newNote() n['Front'] = u'[sound:今日.mp3]' deck.addNote(n) e = AnkiPackageExporter(deck) newname = unicode(tempfile.mkstemp(prefix="ankitest", suffix=".apkg")[1]) os.unlink(newname) e.exportInto(newname) @nose.with_setup(setup1) def test_export_anki_due(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u"foo" deck.addNote(f) deck.crt -= 86400*10 deck.sched.reset() c = deck.sched.getCard() deck.sched.answerCard(c, 2) deck.sched.answerCard(c, 2) # should have ivl of 1, due on day 11 assert c.ivl == 1 assert c.due == 11 assert deck.sched.today == 10 assert c.due - deck.sched.today == 1 # export e = AnkiExporter(deck) e.includeSched = True newname = unicode(tempfile.mkstemp(prefix="ankitest", suffix=".anki2")[1]) os.unlink(newname) e.exportInto(newname) # importing into a new deck, the due date should be equivalent deck2 = getEmptyDeck() imp = Anki2Importer(deck2, newname) imp.run() c = deck2.getCard(c.id) deck2.sched.reset() assert c.due - deck2.sched.today == 1 # @nose.with_setup(setup1) # def test_export_textcard(): # e = TextCardExporter(deck) # f = unicode(tempfile.mkstemp(prefix="ankitest")[1]) # os.unlink(f) # e.exportInto(f) # e.includeTags = True # e.exportInto(f) @nose.with_setup(setup1) def test_export_textnote(): e = TextNoteExporter(deck) f = unicode(tempfile.mkstemp(prefix="ankitest")[1]) os.unlink(f) e.exportInto(f) e.includeTags = True e.exportInto(f) def test_exporters(): assert "*.apkg" in str(exporters()) anki-2.0.20+dfsg/tests/test_undo.py0000644000175000017500000000427612225675305017010 0ustar andreasandreas# coding: utf-8 import time from tests.shared import getEmptyDeck from anki.consts import * def test_op(): d = getEmptyDeck() # should have no undo by default assert not d.undoName() # let's adjust a study option d.save("studyopts") d.conf['abc'] = 5 # it should be listed as undoable assert d.undoName() == "studyopts" # with about 5 minutes until it's clobbered assert time.time() - d._lastSave < 1 # undoing should restore the old value d.undo() assert not d.undoName() assert 'abc' not in d.conf # an (auto)save will clear the undo d.save("foo") assert d.undoName() == "foo" d.save() assert not d.undoName() # and a review will, too d.save("add") f = d.newNote() f['Front'] = u"one" d.addNote(f) d.reset() assert d.undoName() == "add" c = d.sched.getCard() d.sched.answerCard(c, 2) assert d.undoName() == "Review" def test_review(): d = getEmptyDeck() d.conf['counts'] = COUNT_REMAINING f = d.newNote() f['Front'] = u"one" d.addNote(f) d.reset() assert not d.undoName() # answer assert d.sched.counts() == (1, 0, 0) c = d.sched.getCard() assert c.queue == 0 d.sched.answerCard(c, 2) assert c.left == 1001 assert d.sched.counts() == (0, 1, 0) assert c.queue == 1 # undo assert d.undoName() d.undo() d.reset() assert d.sched.counts() == (1, 0, 0) c.load() assert c.queue == 0 assert c.left != 1001 assert not d.undoName() # we should be able to undo multiple answers too f = d.newNote() f['Front'] = u"two" d.addNote(f) d.reset() assert d.sched.counts() == (2, 0, 0) c = d.sched.getCard() d.sched.answerCard(c, 2) c = d.sched.getCard() d.sched.answerCard(c, 2) assert d.sched.counts() == (0, 2, 0) d.undo() d.reset() assert d.sched.counts() == (1, 1, 0) d.undo() d.reset() assert d.sched.counts() == (2, 0, 0) # performing a normal op will clear the review queue c = d.sched.getCard() d.sched.answerCard(c, 2) assert d.undoName() == "Review" d.save("foo") assert d.undoName() == "foo" d.undo() assert not d.undoName() anki-2.0.20+dfsg/tests/test_remote_sync.py0000644000175000017500000001344112227223667020366 0ustar andreasandreas# coding: utf-8 import nose, os, time from tests.shared import assertException from anki.sync import Syncer, FullSyncer, RemoteServer, \ MediaSyncer, RemoteMediaServer, httpCon from anki import Collection as aopen deck1=None deck2=None client=None server=None server2=None # Remote tests ########################################################################## import tests.test_sync as ts from tests.test_sync import setup_basic import anki.sync anki.sync.SYNC_URL = "http://localhost:5000/sync/" TEST_USER = "synctest@ichi2.net" TEST_PASS = "abc123" TEST_HKEY = "WqYF0m7fOHCNPI4a" TEST_REMOTE = True def setup_remote(): setup_basic() # mark deck1 as changed ts.deck1.save() ts.server = RemoteServer(TEST_HKEY) ts.client.server = ts.server @nose.with_setup(setup_remote) def test_meta(): global TEST_REMOTE try: # if the key is wrong, meta returns nothing ts.server.hkey = "abc" assert not ts.server.meta() except Exception, e: if e.errno == 61: TEST_REMOTE = False print "aborting; server offline" return ts.server.hkey = TEST_HKEY meta = ts.server.meta() assert meta['mod'] assert meta['scm'] assert meta['mod'] != ts.client.col.mod assert abs(meta['ts'] - time.time()) < 3 @nose.with_setup(setup_remote) def test_hkey(): if not TEST_REMOTE: return assert not ts.server.hostKey(TEST_USER, "wrongpass") ts.server.hkey = "willchange" k = ts.server.hostKey(TEST_USER, TEST_PASS) assert k == ts.server.hkey == TEST_HKEY @nose.with_setup(setup_remote) def test_download(): if not TEST_REMOTE: return f = FullSyncer(ts.client.col, "abc", ts.server.con) assertException(Exception, f.download) f.hkey = TEST_HKEY f.download() @nose.with_setup(setup_remote) def test_remoteSync(): if not TEST_REMOTE: return # not yet associated, so will require a full sync assert ts.client.sync() == "fullSync" # upload f = FullSyncer(ts.client.col, TEST_HKEY, ts.server.con) assert f.upload() ts.client.col.reopen() # should report no changes assert ts.client.sync() == "noChanges" # bump local col ts.client.col.setMod() ts.client.col.save() assert ts.client.sync() == "success" # again, no changes assert ts.client.sync() == "noChanges" # Remote media tests ########################################################################## # We can't run useful tests for local media, because the desktop code assumes # the current directory is the media folder. def setup_remoteMedia(): setup_basic() con = httpCon() ts.server = RemoteMediaServer(TEST_HKEY, con) ts.server2 = RemoteServer(TEST_HKEY) ts.client = MediaSyncer(ts.deck1, ts.server) @nose.with_setup(setup_remoteMedia) def test_media(): if not TEST_REMOTE: return print "media test disabled" return ts.server.mediatest("reset") assert len(os.listdir(ts.deck1.media.dir())) == 0 assert ts.server.mediatest("count") == 0 # initially, nothing to do assert ts.client.sync(ts.server2.meta()[4]) == "noChanges" # add a file time.sleep(1) os.chdir(ts.deck1.media.dir()) p = os.path.join(ts.deck1.media.dir(), "foo.jpg") open(p, "wb").write("foo") assert len(os.listdir(ts.deck1.media.dir())) == 1 assert ts.server.mediatest("count") == 0 assert ts.client.sync(ts.server2.meta()[4]) == "success" assert ts.client.sync(ts.server2.meta()[4]) == "noChanges" time.sleep(1) # should have been synced assert len(os.listdir(ts.deck1.media.dir())) == 1 assert ts.server.mediatest("count") == 1 # if we remove the file, should be removed os.unlink(p) assert ts.client.sync(ts.server2.meta()[4]) == "success" assert ts.client.sync(ts.server2.meta()[4]) == "noChanges" assert len(os.listdir(ts.deck1.media.dir())) == 0 assert ts.server.mediatest("count") == 0 # we should be able to add it again time.sleep(1) open(p, "wb").write("foo") assert ts.client.sync(ts.server2.meta()[4]) == "success" assert ts.client.sync(ts.server2.meta()[4]) == "noChanges" assert len(os.listdir(ts.deck1.media.dir())) == 1 assert ts.server.mediatest("count") == 1 # if we modify it, it should get sent too. also we set the zip size very # low here, so that we can test splitting into multiple zips import anki.media; anki.media.SYNC_ZIP_SIZE = 1 time.sleep(1) open(p, "wb").write("bar") open(p+"2", "wb").write("baz") assert len(os.listdir(ts.deck1.media.dir())) == 2 assert ts.client.sync(ts.server2.meta()[4]) == "success" assert ts.client.sync(ts.server2.meta()[4]) == "noChanges" assert len(os.listdir(ts.deck1.media.dir())) == 2 assert ts.server.mediatest("count") == 2 # if we lose our media db, we should be able to bring it back in sync time.sleep(1) ts.deck1.media.close() os.unlink(ts.deck1.media.dir()+".db") ts.deck1.media.connect() assert ts.client.sync(ts.server2.meta()[4]) == "success" assert ts.client.sync(ts.server2.meta()[4]) == "noChanges" assert len(os.listdir(ts.deck1.media.dir())) == 2 assert ts.server.mediatest("count") == 2 # if we send an unchanged file, the server should cope time.sleep(1) ts.deck1.media.db.execute("insert into log values ('foo.jpg', 0)") assert ts.client.sync(ts.server2.meta()[4]) == "success" assert ts.client.sync(ts.server2.meta()[4]) == "noChanges" assert len(os.listdir(ts.deck1.media.dir())) == 2 assert ts.server.mediatest("count") == 2 # if we remove foo.jpg on the ts.server, the removal should be synced assert ts.server.mediatest("removefoo") == "OK" assert ts.client.sync(ts.server2.meta()[4]) == "success" assert len(os.listdir(ts.deck1.media.dir())) == 1 assert ts.server.mediatest("count") == 1 anki-2.0.20+dfsg/tests/test_latex.py0000644000175000017500000000355712221204444017145 0ustar andreasandreas# coding: utf-8 import os from tests.shared import getEmptyDeck from anki.utils import stripHTML def test_latex(): d = getEmptyDeck() # change latex cmd to simulate broken build import anki.latex anki.latex.latexCmd[0] = "nolatex" # add a note with latex f = d.newNote() f['Front'] = u"[latex]hello[/latex]" d.addNote(f) # but since latex couldn't run, there's nothing there assert len(os.listdir(d.media.dir())) == 0 # check the error message msg = f.cards()[0].q() assert "executing latex" in msg assert "installed" in msg # check if we have latex installed, and abort test if we don't for cmd in ("latex", "dvipng"): if (not os.path.exists("/usr/bin/"+cmd) and not os.path.exists("/usr/texbin/"+cmd)): print "aborting test; %s is not installed" % cmd return # fix path anki.latex.latexCmd[0] = "latex" # check media db should cause latex to be generated d.media.check() assert len(os.listdir(d.media.dir())) == 1 assert ".png" in f.cards()[0].q() # adding new notes should cause generation on question display f = d.newNote() f['Front'] = u"[latex]world[/latex]" d.addNote(f) f.cards()[0].q() assert len(os.listdir(d.media.dir())) == 2 # another note with the same media should reuse f = d.newNote() f['Front'] = u" [latex]world[/latex]" d.addNote(f) assert len(os.listdir(d.media.dir())) == 2 oldcard = f.cards()[0] assert ".png" in oldcard.q() # if we turn off building, then previous cards should work, but cards with # missing media will show the latex anki.latex.build = False f = d.newNote() f['Front'] = u"[latex]foo[/latex]" d.addNote(f) assert len(os.listdir(d.media.dir())) == 2 assert stripHTML(f.cards()[0].q()) == "[latex]foo[/latex]" assert ".png" in oldcard.q() anki-2.0.20+dfsg/tests/test_sched.py0000644000175000017500000007345112244712607017130 0ustar andreasandreas# coding: utf-8 import time import copy from tests.shared import getEmptyDeck from anki.utils import intTime from anki.hooks import addHook def test_clock(): d = getEmptyDeck() if (d.sched.dayCutoff - intTime()) < 10*60: raise Exception("Unit tests will fail around the day rollover.") def checkRevIvl(d, c, targetIvl): min, max = d.sched._fuzzIvlRange(targetIvl) return min <= c.ivl <= max def test_basics(): d = getEmptyDeck() d.reset() assert not d.sched.getCard() def test_new(): d = getEmptyDeck() d.reset() assert d.sched.newCount == 0 # add a note f = d.newNote() f['Front'] = u"one"; f['Back'] = u"two" d.addNote(f) d.reset() assert d.sched.newCount == 1 # fetch it c = d.sched.getCard() assert c assert c.queue == 0 assert c.type == 0 # if we answer it, it should become a learn card t = intTime() d.sched.answerCard(c, 1) assert c.queue == 1 assert c.type == 1 assert c.due >= t # the default order should ensure siblings are not seen together, and # should show all cards m = d.models.current(); mm = d.models t = mm.newTemplate("Reverse") t['qfmt'] = "{{Back}}" t['afmt'] = "{{Front}}" mm.addTemplate(m, t) mm.save(m) f = d.newNote() f['Front'] = u"2"; f['Back'] = u"2" d.addNote(f) f = d.newNote() f['Front'] = u"3"; f['Back'] = u"3" d.addNote(f) d.reset() qs = ("2", "3", "2", "3") for n in range(4): c = d.sched.getCard() assert qs[n] in c.q() d.sched.answerCard(c, 2) def test_newLimits(): d = getEmptyDeck() # add some notes g2 = d.decks.id("Default::foo") for i in range(30): f = d.newNote() f['Front'] = str(i) if i > 4: f.model()['did'] = g2 d.addNote(f) # give the child deck a different configuration c2 = d.decks.confId("new conf") d.decks.setConf(d.decks.get(g2), c2) d.reset() # both confs have defaulted to a limit of 20 assert d.sched.newCount == 20 # first card we get comes from parent c = d.sched.getCard() assert c.did == 1 # limit the parent to 10 cards, meaning we get 10 in total conf1 = d.decks.confForDid(1) conf1['new']['perDay'] = 10 d.reset() assert d.sched.newCount == 10 # if we limit child to 4, we should get 9 conf2 = d.decks.confForDid(g2) conf2['new']['perDay'] = 4 d.reset() assert d.sched.newCount == 9 def test_newBoxes(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) d.reset() c = d.sched.getCard() d.sched._cardConf(c)['new']['delays'] = [1,2,3,4,5] d.sched.answerCard(c, 2) # should handle gracefully d.sched._cardConf(c)['new']['delays'] = [1] d.sched.answerCard(c, 2) def test_learn(): d = getEmptyDeck() # add a note f = d.newNote() f['Front'] = u"one"; f['Back'] = u"two" f = d.addNote(f) # set as a learn card and rebuild queues d.db.execute("update cards set queue=0, type=0") d.reset() # sched.getCard should return it, since it's due in the past c = d.sched.getCard() assert c d.sched._cardConf(c)['new']['delays'] = [0.5, 3, 10] # fail it d.sched.answerCard(c, 1) # it should have three reps left to graduation assert c.left%1000 == 3 assert c.left/1000 == 3 # it should by due in 30 seconds t = round(c.due - time.time()) assert t >= 25 and t <= 40 # pass it once d.sched.answerCard(c, 2) # it should by due in 3 minutes assert round(c.due - time.time()) in (179, 180) assert c.left%1000 == 2 assert c.left/1000 == 2 # check log is accurate log = d.db.first("select * from revlog order by id desc") assert log[3] == 2 assert log[4] == -180 assert log[5] == -30 # pass again d.sched.answerCard(c, 2) # it should by due in 10 minutes assert round(c.due - time.time()) in (599, 600) assert c.left%1000 == 1 assert c.left/1000 == 1 # the next pass should graduate the card assert c.queue == 1 assert c.type == 1 d.sched.answerCard(c, 2) assert c.queue == 2 assert c.type == 2 # should be due tomorrow, with an interval of 1 assert c.due == d.sched.today+1 assert c.ivl == 1 # or normal removal c.type = 0 c.queue = 1 d.sched.answerCard(c, 3) assert c.type == 2 assert c.queue == 2 assert checkRevIvl(d, c, 4) # revlog should have been updated each time assert d.db.scalar("select count() from revlog where type = 0") == 5 # now failed card handling c.type = 2 c.queue = 1 c.odue = 123 d.sched.answerCard(c, 3) assert c.due == 123 assert c.type == 2 assert c.queue == 2 # we should be able to remove manually, too c.type = 2 c.queue = 1 c.odue = 321 c.flush() print "----begin" d.sched.removeLrn() c.load() print c.__dict__ assert c.queue == 2 assert c.due == 321 def test_learn_collapsed(): d = getEmptyDeck() # add 2 notes f = d.newNote() f['Front'] = u"1" f = d.addNote(f) f = d.newNote() f['Front'] = u"2" f = d.addNote(f) # set as a learn card and rebuild queues d.db.execute("update cards set queue=0, type=0") d.reset() # should get '1' first c = d.sched.getCard() assert c.q().endswith("1") # pass it so it's due in 10 minutes d.sched.answerCard(c, 2) # get the other card c = d.sched.getCard() assert c.q().endswith("2") # fail it so it's due in 1 minute d.sched.answerCard(c, 1) # we shouldn't get the same card again c = d.sched.getCard() assert not c.q().endswith("2") def test_learn_day(): d = getEmptyDeck() # add a note f = d.newNote() f['Front'] = u"one" f = d.addNote(f) d.sched.reset() c = d.sched.getCard() d.sched._cardConf(c)['new']['delays'] = [1, 10, 1440, 2880] # pass it d.sched.answerCard(c, 2) # two reps to graduate, 1 more today assert c.left%1000 == 3 assert c.left/1000 == 1 assert d.sched.counts() == (0, 1, 0) c = d.sched.getCard() ni = d.sched.nextIvl assert ni(c, 2) == 86400 # answering it will place it in queue 3 d.sched.answerCard(c, 2) assert c.due == d.sched.today+1 assert c.queue == 3 assert not d.sched.getCard() # for testing, move it back a day c.due -= 1 c.flush() d.reset() assert d.sched.counts() == (0, 1, 0) c = d.sched.getCard() # nextIvl should work assert ni(c, 2) == 86400*2 # if we fail it, it should be back in the correct queue d.sched.answerCard(c, 1) assert c.queue == 1 d.undo() d.reset() c = d.sched.getCard() d.sched.answerCard(c, 2) # simulate the passing of another two days c.due -= 2 c.flush() d.reset() # the last pass should graduate it into a review card assert ni(c, 2) == 86400 d.sched.answerCard(c, 2) assert c.queue == c.type == 2 # if the lapse step is tomorrow, failing it should handle the counts # correctly c.due = 0 c.flush() d.reset() assert d.sched.counts() == (0, 0, 1) d.sched._cardConf(c)['lapse']['delays'] = [1440] c = d.sched.getCard() d.sched.answerCard(c, 1) assert c.queue == 3 assert d.sched.counts() == (0, 0, 0) def test_reviews(): d = getEmptyDeck() # add a note f = d.newNote() f['Front'] = u"one"; f['Back'] = u"two" d.addNote(f) # set the card up as a review card, due 8 days ago c = f.cards()[0] c.type = 2 c.queue = 2 c.due = d.sched.today - 8 c.factor = 2500 c.reps = 3 c.lapses = 1 c.ivl = 100 c.startTimer() c.flush() # save it for later use as well cardcopy = copy.copy(c) # failing it should put it in the learn queue with the default options ################################################## # different delay to new d.reset() d.sched._cardConf(c)['lapse']['delays'] = [2, 20] d.sched.answerCard(c, 1) assert c.queue == 1 # it should be due tomorrow, with an interval of 1 assert c.odue == d.sched.today + 1 assert c.ivl == 1 # but because it's in the learn queue, its current due time should be in # the future assert c.due >= time.time() assert (c.due - time.time()) > 119 # factor should have been decremented assert c.factor == 2300 # check counters assert c.lapses == 2 assert c.reps == 4 # check ests. ni = d.sched.nextIvl assert ni(c, 1) == 120 assert ni(c, 2) == 20*60 # try again with an ease of 2 instead ################################################## c = copy.copy(cardcopy) c.flush() d.sched.answerCard(c, 2) assert c.queue == 2 # the new interval should be (100 + 8/4) * 1.2 = 122 assert checkRevIvl(d, c, 122) assert c.due == d.sched.today + c.ivl # factor should have been decremented assert c.factor == 2350 # check counters assert c.lapses == 1 assert c.reps == 4 # ease 3 ################################################## c = copy.copy(cardcopy) c.flush() d.sched.answerCard(c, 3) # the new interval should be (100 + 8/2) * 2.5 = 260 assert checkRevIvl(d, c, 260) assert c.due == d.sched.today + c.ivl # factor should have been left alone assert c.factor == 2500 # ease 4 ################################################## c = copy.copy(cardcopy) c.flush() d.sched.answerCard(c, 4) # the new interval should be (100 + 8) * 2.5 * 1.3 = 351 assert checkRevIvl(d, c, 351) assert c.due == d.sched.today + c.ivl # factor should have been increased assert c.factor == 2650 # leech handling ################################################## c = copy.copy(cardcopy) c.lapses = 7 c.flush() # steup hook hooked = [] def onLeech(card): hooked.append(1) addHook("leech", onLeech) d.sched.answerCard(c, 1) assert hooked assert c.queue == -1 c.load() assert c.queue == -1 def test_button_spacing(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) # 1 day ivl review card due now c = f.cards()[0] c.type = 2 c.queue = 2 c.due = d.sched.today c.reps = 1 c.ivl = 1 c.startTimer() c.flush() d.reset() ni = d.sched.nextIvlStr assert ni(c, 2) == "2 days" assert ni(c, 3) == "3 days" assert ni(c, 4) == "4 days" def test_overdue_lapse(): # disabled in commit 3069729776990980f34c25be66410e947e9d51a2 return d = getEmptyDeck() # add a note f = d.newNote() f['Front'] = u"one" d.addNote(f) # simulate a review that was lapsed and is now due for its normal review c = f.cards()[0] c.type = 2 c.queue = 1 c.due = -1 c.odue = -1 c.factor = 2500 c.left = 2002 c.ivl = 0 c.flush() d.sched._clearOverdue = False # checkpoint d.save() d.sched.reset() assert d.sched.counts() == (0, 2, 0) c = d.sched.getCard() d.sched.answerCard(c, 3) # it should be due tomorrow assert c.due == d.sched.today + 1 # revert to before d.rollback() d.sched._clearOverdue = True # with the default settings, the overdue card should be removed from the # learning queue d.sched.reset() assert d.sched.counts() == (0, 0, 1) def test_finished(): d = getEmptyDeck() # nothing due assert "Congratulations" in d.sched.finishedMsg() assert "limit" not in d.sched.finishedMsg() f = d.newNote() f['Front'] = u"one"; f['Back'] = u"two" d.addNote(f) # have a new card assert "new cards available" in d.sched.finishedMsg() # turn it into a review d.reset() c = f.cards()[0] c.startTimer() d.sched.answerCard(c, 3) # nothing should be due tomorrow, as it's due in a week assert "Congratulations" in d.sched.finishedMsg() assert "limit" not in d.sched.finishedMsg() def test_nextIvl(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one"; f['Back'] = u"two" d.addNote(f) d.reset() conf = d.decks.confForDid(1) conf['new']['delays'] = [0.5, 3, 10] conf['lapse']['delays'] = [1, 5, 9] c = d.sched.getCard() # new cards ################################################## ni = d.sched.nextIvl assert ni(c, 1) == 30 assert ni(c, 2) == 180 assert ni(c, 3) == 4*86400 d.sched.answerCard(c, 1) # cards in learning ################################################## assert ni(c, 1) == 30 assert ni(c, 2) == 180 assert ni(c, 3) == 4*86400 d.sched.answerCard(c, 2) assert ni(c, 1) == 30 assert ni(c, 2) == 600 assert ni(c, 3) == 4*86400 d.sched.answerCard(c, 2) # normal graduation is tomorrow assert ni(c, 2) == 1*86400 assert ni(c, 3) == 4*86400 # lapsed cards ################################################## c.type = 2 c.ivl = 100 c.factor = 2500 assert ni(c, 1) == 60 assert ni(c, 2) == 100*86400 assert ni(c, 3) == 100*86400 # review cards ################################################## c.queue = 2 c.ivl = 100 c.factor = 2500 # failing it should put it at 60s assert ni(c, 1) == 60 # or 1 day if relearn is false d.sched._cardConf(c)['lapse']['delays']=[] assert ni(c, 1) == 1*86400 # (* 100 1.2 86400)10368000.0 assert ni(c, 2) == 10368000 # (* 100 2.5 86400)21600000.0 assert ni(c, 3) == 21600000 # (* 100 2.5 1.3 86400)28080000.0 assert ni(c, 4) == 28080000 assert d.sched.nextIvlStr(c, 4) == "10.8 months" def test_misc(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) c = f.cards()[0] # burying d.sched.buryNote(c.nid) d.reset() assert not d.sched.getCard() d.sched.unburyCards() d.reset() assert d.sched.getCard() def test_suspend(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) c = f.cards()[0] # suspending d.reset() assert d.sched.getCard() d.sched.suspendCards([c.id]) d.reset() assert not d.sched.getCard() # unsuspending d.sched.unsuspendCards([c.id]) d.reset() assert d.sched.getCard() # should cope with rev cards being relearnt c.due = 0; c.ivl = 100; c.type = 2; c.queue = 2; c.flush() d.reset() c = d.sched.getCard() d.sched.answerCard(c, 1) assert c.due >= time.time() assert c.queue == 1 assert c.type == 2 d.sched.suspendCards([c.id]) d.sched.unsuspendCards([c.id]) c.load() assert c.queue == 2 assert c.type == 2 assert c.due == 1 # should cope with cards in cram decks c.due = 1 c.flush() cram = d.decks.newDyn("tmp") d.sched.rebuildDyn() c.load() assert c.due != 1 assert c.did != 1 d.sched.suspendCards([c.id]) c.load() assert c.due == 1 assert c.did == 1 def test_cram(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) c = f.cards()[0] c.ivl = 100 c.type = c.queue = 2 # due in 25 days, so it's been waiting 75 days c.due = d.sched.today + 25 c.mod = 1 c.factor = 2500 c.startTimer() c.flush() d.reset() assert d.sched.counts() == (0,0,0) cardcopy = copy.copy(c) # create a dynamic deck and refresh it did = d.decks.newDyn("Cram") d.sched.rebuildDyn(did) d.reset() # should appear as new in the deck list assert sorted(d.sched.deckDueList())[0][4] == 1 # and should appear in the counts assert d.sched.counts() == (1,0,0) # grab it and check estimates c = d.sched.getCard() assert d.sched.answerButtons(c) == 2 assert d.sched.nextIvl(c, 1) == 600 assert d.sched.nextIvl(c, 2) == 138*60*60*24 cram = d.decks.get(did) cram['delays'] = [1, 10] assert d.sched.answerButtons(c) == 3 assert d.sched.nextIvl(c, 1) == 60 assert d.sched.nextIvl(c, 2) == 600 assert d.sched.nextIvl(c, 3) == 138*60*60*24 d.sched.answerCard(c, 2) # elapsed time was 75 days # factor = 2.5+1.2/2 = 1.85 # int(75*1.85) = 138 assert c.ivl == 138 assert c.odue == 138 assert c.queue == 1 # should be logged as a cram rep assert d.db.scalar( "select type from revlog order by id desc limit 1") == 3 # check ivls again assert d.sched.nextIvl(c, 1) == 60 assert d.sched.nextIvl(c, 2) == 138*60*60*24 assert d.sched.nextIvl(c, 3) == 138*60*60*24 # when it graduates, due is updated c = d.sched.getCard() d.sched.answerCard(c, 2) assert c.ivl == 138 assert c.due == 138 assert c.queue == 2 # and it will have moved back to the previous deck assert c.did == 1 # cram the deck again d.sched.rebuildDyn(did) d.reset() c = d.sched.getCard() # check ivls again - passing should be idempotent assert d.sched.nextIvl(c, 1) == 60 assert d.sched.nextIvl(c, 2) == 600 assert d.sched.nextIvl(c, 3) == 138*60*60*24 d.sched.answerCard(c, 2) assert c.ivl == 138 assert c.odue == 138 # fail d.sched.answerCard(c, 1) assert d.sched.nextIvl(c, 1) == 60 assert d.sched.nextIvl(c, 2) == 600 assert d.sched.nextIvl(c, 3) == 86400 # delete the deck, returning the card mid-study d.decks.rem(d.decks.selected()) assert len(d.sched.deckDueList()) == 1 c.load() assert c.ivl == 1 assert c.due == d.sched.today+1 # make it due d.reset() assert d.sched.counts() == (0,0,0) c.due = -5 c.ivl = 100 c.flush() d.reset() assert d.sched.counts() == (0,0,1) # cram again did = d.decks.newDyn("Cram") d.sched.rebuildDyn(did) d.reset() assert d.sched.counts() == (0,0,1) c.load() assert d.sched.answerButtons(c) == 4 # add a sibling so we can test minSpace, etc c2 = copy.deepcopy(c) c2.id = 123 c2.ord = 1 c2.due = 325 c2.col = c.col c2.flush() # should be able to answer it c = d.sched.getCard() d.sched.answerCard(c, 4) # it should have been moved back to the original deck assert c.did == 1 def test_cram_rem(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) oldDue = f.cards()[0].due did = d.decks.newDyn("Cram") d.sched.rebuildDyn(did) d.reset() c = d.sched.getCard() d.sched.answerCard(c, 2) # answering the card will put it in the learning queue assert c.type == c.queue == 1 assert c.due != oldDue # if we terminate cramming prematurely it should be set back to new d.sched.emptyDyn(did) c.load() assert c.type == c.queue == 0 assert c.due == oldDue def test_cram_resched(): # add card d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) # cram deck did = d.decks.newDyn("Cram") cram = d.decks.get(did) cram['resched'] = False d.sched.rebuildDyn(did) d.reset() # graduate should return it to new c = d.sched.getCard() ni = d.sched.nextIvl assert ni(c, 1) == 60 assert ni(c, 2) == 600 assert ni(c, 3) == 0 assert d.sched.nextIvlStr(c, 3) == "(end)" d.sched.answerCard(c, 3) assert c.queue == c.type == 0 # undue reviews should also be unaffected c.ivl = 100 c.type = c.queue = 2 c.due = d.sched.today + 25 c.factor = 2500 c.flush() cardcopy = copy.copy(c) d.sched.rebuildDyn(did) d.reset() c = d.sched.getCard() assert ni(c, 1) == 600 assert ni(c, 2) == 0 assert ni(c, 3) == 0 d.sched.answerCard(c, 2) assert c.ivl == 100 assert c.due == d.sched.today + 25 # check failure too c = cardcopy c.flush() d.sched.rebuildDyn(did) d.reset() c = d.sched.getCard() d.sched.answerCard(c, 1) d.sched.emptyDyn(did) c.load() assert c.ivl == 100 assert c.due == d.sched.today + 25 # fail+grad early c = cardcopy c.flush() d.sched.rebuildDyn(did) d.reset() c = d.sched.getCard() d.sched.answerCard(c, 1) d.sched.answerCard(c, 3) d.sched.emptyDyn(did) c.load() assert c.ivl == 100 assert c.due == d.sched.today + 25 # due cards - pass c = cardcopy c.due = -25 c.flush() d.sched.rebuildDyn(did) d.reset() c = d.sched.getCard() d.sched.answerCard(c, 3) d.sched.emptyDyn(did) c.load() assert c.ivl == 100 assert c.due == -25 # fail c = cardcopy c.due = -25 c.flush() d.sched.rebuildDyn(did) d.reset() c = d.sched.getCard() d.sched.answerCard(c, 1) d.sched.emptyDyn(did) c.load() assert c.ivl == 100 assert c.due == -25 # fail with normal grad c = cardcopy c.due = -25 c.flush() d.sched.rebuildDyn(did) d.reset() c = d.sched.getCard() d.sched.answerCard(c, 1) d.sched.answerCard(c, 3) c.load() assert c.ivl == 100 assert c.due == -25 # lapsed card pulled into cram # d.sched._cardConf(c)['lapse']['mult']=0.5 # d.sched.answerCard(c, 1) # d.sched.rebuildDyn(did) # d.reset() # c = d.sched.getCard() # d.sched.answerCard(c, 2) # print c.__dict__ def test_ordcycle(): d = getEmptyDeck() # add two more templates and set second active m = d.models.current(); mm = d.models t = mm.newTemplate("Reverse") t['qfmt'] = "{{Back}}" t['afmt'] = "{{Front}}" mm.addTemplate(m, t) t = mm.newTemplate("f2") t['qfmt'] = "{{Front}}" t['afmt'] = "{{Back}}" mm.addTemplate(m, t) mm.save(m) # create a new note; it should have 3 cards f = d.newNote() f['Front'] = "1"; f['Back'] = "1" d.addNote(f) assert d.cardCount() == 3 d.reset() # ordinals should arrive in order assert d.sched.getCard().ord == 0 assert d.sched.getCard().ord == 1 assert d.sched.getCard().ord == 2 def test_counts_idx(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one"; f['Back'] = u"two" d.addNote(f) d.reset() assert d.sched.counts() == (1, 0, 0) c = d.sched.getCard() # counter's been decremented but idx indicates 1 assert d.sched.counts() == (0, 0, 0) assert d.sched.countIdx(c) == 0 # answer to move to learn queue d.sched.answerCard(c, 1) assert d.sched.counts() == (0, 2, 0) # fetching again will decrement the count c = d.sched.getCard() assert d.sched.counts() == (0, 0, 0) assert d.sched.countIdx(c) == 1 # answering should add it back again d.sched.answerCard(c, 1) assert d.sched.counts() == (0, 2, 0) def test_repCounts(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) d.reset() # lrnReps should be accurate on pass/fail assert d.sched.counts() == (1, 0, 0) d.sched.answerCard(d.sched.getCard(), 1) assert d.sched.counts() == (0, 2, 0) d.sched.answerCard(d.sched.getCard(), 1) assert d.sched.counts() == (0, 2, 0) d.sched.answerCard(d.sched.getCard(), 2) assert d.sched.counts() == (0, 1, 0) d.sched.answerCard(d.sched.getCard(), 1) assert d.sched.counts() == (0, 2, 0) d.sched.answerCard(d.sched.getCard(), 2) assert d.sched.counts() == (0, 1, 0) d.sched.answerCard(d.sched.getCard(), 2) assert d.sched.counts() == (0, 0, 0) f = d.newNote() f['Front'] = u"two" d.addNote(f) d.reset() # initial pass should be correct too d.sched.answerCard(d.sched.getCard(), 2) assert d.sched.counts() == (0, 1, 0) d.sched.answerCard(d.sched.getCard(), 1) assert d.sched.counts() == (0, 2, 0) d.sched.answerCard(d.sched.getCard(), 3) assert d.sched.counts() == (0, 0, 0) # immediate graduate should work f = d.newNote() f['Front'] = u"three" d.addNote(f) d.reset() d.sched.answerCard(d.sched.getCard(), 3) assert d.sched.counts() == (0, 0, 0) # and failing a review should too f = d.newNote() f['Front'] = u"three" d.addNote(f) c = f.cards()[0] c.type = 2 c.queue = 2 c.due = d.sched.today c.flush() d.reset() assert d.sched.counts() == (0, 0, 1) d.sched.answerCard(d.sched.getCard(), 1) assert d.sched.counts() == (0, 1, 0) def test_timing(): d = getEmptyDeck() # add a few review cards, due today for i in range(5): f = d.newNote() f['Front'] = "num"+str(i) d.addNote(f) c = f.cards()[0] c.type = 2 c.queue = 2 c.due = 0 c.flush() # fail the first one d.reset() c = d.sched.getCard() # set a a fail delay of 1 second so we don't have to wait d.sched._cardConf(c)['lapse']['delays'][0] = 1/60.0 d.sched.answerCard(c, 1) # the next card should be another review c = d.sched.getCard() assert c.queue == 2 # but if we wait for a second, the failed card should come back time.sleep(1) c = d.sched.getCard() assert c.queue == 1 def test_collapse(): d = getEmptyDeck() # add a note f = d.newNote() f['Front'] = u"one" d.addNote(f) d.reset() # test collapsing c = d.sched.getCard() d.sched.answerCard(c, 1) c = d.sched.getCard() d.sched.answerCard(c, 3) assert not d.sched.getCard() def test_deckDue(): d = getEmptyDeck() # add a note with default deck f = d.newNote() f['Front'] = u"one" d.addNote(f) # and one that's a child f = d.newNote() f['Front'] = u"two" default1 = f.model()['did'] = d.decks.id("Default::1") d.addNote(f) # make it a review card c = f.cards()[0] c.queue = 2 c.due = 0 c.flush() # add one more with a new deck f = d.newNote() f['Front'] = u"two" foobar = f.model()['did'] = d.decks.id("foo::bar") d.addNote(f) # and one that's a sibling f = d.newNote() f['Front'] = u"three" foobaz = f.model()['did'] = d.decks.id("foo::baz") d.addNote(f) d.reset() assert len(d.decks.decks) == 5 cnts = d.sched.deckDueList() assert cnts[0] == ["Default", 1, 0, 0, 1] assert cnts[1] == ["Default::1", default1, 1, 0, 0] assert cnts[2] == ["foo", d.decks.id("foo"), 0, 0, 0] assert cnts[3] == ["foo::bar", foobar, 0, 0, 1] assert cnts[4] == ["foo::baz", foobaz, 0, 0, 1] tree = d.sched.deckDueTree() assert tree[0][0] == "Default" # sum of child and parent assert tree[0][1] == 1 assert tree[0][2] == 1 assert tree[0][4] == 1 # child count is just review assert tree[0][5][0][0] == "1" assert tree[0][5][0][1] == default1 assert tree[0][5][0][2] == 1 assert tree[0][5][0][4] == 0 # code should not fail if a card has an invalid deck c.did = 12345; c.flush() d.sched.deckDueList() d.sched.deckDueTree() def test_deckTree(): d = getEmptyDeck() d.decks.id("new::b::c") d.decks.id("new2") # new should not appear twice in tree names = [x[0] for x in d.sched.deckDueTree()] names.remove("new") assert "new" not in names def test_deckFlow(): d = getEmptyDeck() # add a note with default deck f = d.newNote() f['Front'] = u"one" d.addNote(f) # and one that's a child f = d.newNote() f['Front'] = u"two" default1 = f.model()['did'] = d.decks.id("Default::2") d.addNote(f) # and another that's higher up f = d.newNote() f['Front'] = u"three" default1 = f.model()['did'] = d.decks.id("Default::1") d.addNote(f) # should get top level one first, then ::1, then ::2 d.reset() assert d.sched.counts() == (3,0,0) for i in "one", "three", "two": c = d.sched.getCard() assert c.note()['Front'] == i d.sched.answerCard(c, 2) def test_reorder(): d = getEmptyDeck() # add a note with default deck f = d.newNote() f['Front'] = u"one" d.addNote(f) f2 = d.newNote() f2['Front'] = u"two" d.addNote(f2) assert f2.cards()[0].due == 2 found=False # 50/50 chance of being reordered for i in range(20): d.sched.randomizeCards(1) if f.cards()[0].due != f.id: found=True break assert found d.sched.orderCards(1) assert f.cards()[0].due == 1 # shifting f3 = d.newNote() f3['Front'] = u"three" d.addNote(f3) f4 = d.newNote() f4['Front'] = u"four" d.addNote(f4) assert f.cards()[0].due == 1 assert f2.cards()[0].due == 2 assert f3.cards()[0].due == 3 assert f4.cards()[0].due == 4 d.sched.sortCards([ f3.cards()[0].id, f4.cards()[0].id], start=1, shift=True) assert f.cards()[0].due == 3 assert f2.cards()[0].due == 4 assert f3.cards()[0].due == 1 assert f4.cards()[0].due == 2 def test_forget(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) c = f.cards()[0] c.queue = 2; c.type = 2; c.ivl = 100; c.due = 0 c.flush() d.reset() assert d.sched.counts() == (0, 0, 1) d.sched.forgetCards([c.id]) d.reset() assert d.sched.counts() == (1, 0, 0) def test_resched(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one" d.addNote(f) c = f.cards()[0] d.sched.reschedCards([c.id], 0, 0) c.load() assert c.due == d.sched.today assert c.ivl == 1 assert c.queue == c.type == 2 d.sched.reschedCards([c.id], 1, 1) c.load() assert c.due == d.sched.today+1 assert c.ivl == +1 def test_norelearn(): d = getEmptyDeck() # add a note f = d.newNote() f['Front'] = u"one" d.addNote(f) c = f.cards()[0] c.type = 2 c.queue = 2 c.due = 0 c.factor = 2500 c.reps = 3 c.lapses = 1 c.ivl = 100 c.startTimer() c.flush() d.reset() d.sched.answerCard(c, 1) d.sched._cardConf(c)['lapse']['delays'] = [] d.sched.answerCard(c, 1) def test_failmult(): d = getEmptyDeck() f = d.newNote() f['Front'] = u"one"; f['Back'] = u"two" d.addNote(f) c = f.cards()[0] c.type = 2 c.queue = 2 c.ivl = 100 c.due = d.sched.today - c.ivl c.factor = 2500 c.reps = 3 c.lapses = 1 c.startTimer() c.flush() d.sched._cardConf(c)['lapse']['mult'] = 0.5 c = d.sched.getCard() d.sched.answerCard(c, 1) assert c.ivl == 50 d.sched.answerCard(c, 1) assert c.ivl == 25 anki-2.0.20+dfsg/tests/support/0000755000175000017500000000000012256137063016133 5ustar andreasandreasanki-2.0.20+dfsg/tests/support/diffmodels2.anki0000644000175000017500000011200012042736010021155 0ustar andreasandreasSQLite format 3@ J5N -JI0E-@*;&6"0*&#!       BB;''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) ) 39M'indexsqlite_autoindex_reviewHistory_1reviewHistoryJktablesourcessourcesCREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) )  " !2012-10-27"!2012-10-27"newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, PRIMARY KEY (id) ) {tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL,   `tablemediamedia CREATE TABLE media ( id INTEGER NOT NULL, filename TEXT NOT NULL, size INTEGER NOT NULL, created FLOAT NOT NULL, "originalPath" TEXT NOT NULL, description TEXT NOT NULL, PRIMARY KEY (id) ) /ۂՆE  A"#VA"#VCBasicBasic?< ,,k]tablemodelsmodels CREATE TABLE models ( id INTEGER NOT NULL, "deckId" INTEGER, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, features TEXT NOT NULL, spacing FLOAT NOT NULL, "initialSpacing" FLOAT NOT NULL, source INTEGER NOT NULL, PRIMARY KEY (id) )r7tabledeckVarsdeckVarsCREATE TABLE "deckVars" ( "key" TEXT NOT NULL, value TEXT, PRIMARY KEY ("key") )Hu !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspeG F uj\L=/) suspendLeeches sortIndex!revSpacing #revInactive revActive perDay pageSize!newSpacing#newInactive newActive mediaURL !leechFails latexPre latexPost hexCache cssCache @@q<q Atable/Cindexsqlite_autoindex_deckVars_1deckVars !!tablecardModelscardModelsCREATEq AtabledecksdecksCREATE TABLE decks ( id INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, description TEXT NOT NULL, version INTEGER NOT NULL, "currentModelId" INTEGER, "syncName" TEXT, "lastSync" FLOAT NOT NULV ##stablefieldModelsfieldModelsCREATE TABLE "fieldModels" ( id INTEGER NOT NULL, or ""eՆF  l:EForward%(Front)s%(Back)sArial#000000Arial#000000Arial#FFFFFFeՆF   l:EReverse%(Back)s%(Front)sArial#000000Arial#000000Arial#FFFFFF TABLE "cardModels" ( id INTEGER NOT NULL, ordinal INTEGER NOT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, active BOOLEAN NOT NULL, qformat TEXT NOT NULL, aformat TEXT NOT NULL, lformat TEXT, qedformat TEXT, aedformat TEXT, "questionInAnswer" BOOLEAN NOT NULL, "questionFontFamily" TEXT, "questionFontSize" INTEGER, "questionFontColour" VARCHAR(7), "questionAlign" INTEGER, "answerFontFamily" TEXT, "answerFontSize" INTEGER, "answerFontColour" VARCHAR(7), "answerAlign" INTEGER, "lastFontFamily" TEXT, "lastFontSize" INTEGER, "lastFontColour" VARCHAR(7), "editQuestionFontFamily" TEXT, "editQuestionFontSize" INTEGER, "editAnswerFontFamily" TEXT, "editAnswerFontSize" INTEGER, "allowEmptyAnswer" BOOLEAN NOT NULL, "typeAnswer" TEXT NOT NULL, PRIMARY KEY (id), CHECK (active IN (0, 1)), CHECK ("questionInAnswer" IN (0, 1)), CHECK ("allowEmptyAnswer" IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) ) {%   -%#  A"A"Al:E?񙙙 XPriorityVeryHighPriorityHighPriorityLowXL, "hardIntervalMin" FLOAT NOT NULL, "hardIntervalMax" FLOAT NOT NULL, "midIntervalMin" FLOAT NOT NULL, "midIntervalMax" FLOAT NOT NULL, "easyIntervalMin" FLOAT NOT NULL, "easyIntervalMax" FLOAT NOT NULL, delay0 INTEGER NOT NULL, delay1 INTEGER NOT NULL, delay2 FLOAT NOT NULL, "collapseTime" INTEGER NOT NULL, "highPriority" TEXT NOT NULL, "medPriority" TEXT NOT NULL, "lowPriority" TEXT NOT NULL, suspended TEXT NOT NULL, "newCardOrder" INTEGER NOT NULL, "newCardSpacing" INTEGER NOT NULL, "failedCardMax" INTEGER NOT NULL, "newCardsPerDay" INTEGER NOT NULL, "sessionRepLimit" INTEGER NOT NULL, "sessionTimeLimit" INTEGER NOT NULL, "utcOffset" FLOAT NOT NULL, "cardCount" INTEGER NOT NULL, "factCount" INTEGER NOT NULL, "failedNowCount" INTEGER NOT NULL, "failedSoonCount" INTEGER NOT NULL, "revCount" INTEGER NOT NULL, "newCount" INTEGER NOT NULL, "revCardOrder" INTEGER NOT NULL, PRIMARY KEY (id), FOREIGN KEY("currentModelId") REFERENCES models (id) ) $聓ՆE l:EFrontArial1#ՆF  l:EBackArial1dinal INTEGER NOT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, features TEXT NOT NULL, required BOOLEAN NOT NULL, "unique" BOOLEAN NOT NULL, numeric BOOLEAN NOT NULL, "quizFontFamily" TEXT, "quizFontSize" INTEGER, "quizFontColour" VARCHAR(7), "editFontFamily" TEXT, "editFontSize" INTEGER, PRIMARY KEY (id), CHECK (numeric IN (0, 1)), CHECK ("unique" IN (0, 1)), CHECK (required IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) )   4 '''tablemodelsDeletedmodelsDeletedCREATE TABLE "modelsDeleted" ( "modelId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("modelId") REFERENCES models (id) )& +tablefactsfactsCREATE TABLE facts ( id INTEGER NOT NULL, "modelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, "spaceUntil" TEXT NOT NULL, "lastCardId" INTEGER, PRIMARY KEY (id), FOREIGN KEY("modelId") REFERENCES models (id) ) *Ն !l:EA"ޜeA"3front back Ն 5:2Б:FbackՆ5:M :Efront 8KtablefieldsfieldsCREATE TABLE fields ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "fieldModelId" INTEGER NOT NULL, ordinal INTEGER NOT NULL, value TEXT NOT NULL, PRIMARY KEY (id), FOREIGN KEY("fieldModelId") REFERENCES "fieldModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) ) d2dCΎՆN' ge5::FA"ޜeA"ffrontbackA"ޜe@@A"ޜeCìՆ' eg5:;:FA"ޜgbA"FbackfrontA"ޜgb@@A"ޜgb rval FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, due FLOAT NOT NULL, "lastDue" FLOAT NOT NULL, factor FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "firstAnswered" FLOAT NOT NULL, reps INTEGER NOT NULL, successive INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, "yesCount" INTEGER NOT NULL, "noCount" INTEGER NOT NULL, "spaceUntil" FLOAT NOT NULL, "relativeDelay" FLOAT NOT NULL, "isDue" BOOLEAN NOT NULL, type INTEGER NOT NULL, "combinedDue" INTEGER NOT NULL, PRIMARY KEY (id), CHECK ("isDue" IN (0, 1)), FOREIGN KEY("cardModelId") REFERENCES "cardModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) ) 5ItablecardscardsCREATE TABLE cards ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "cardModelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, ordinal INTEGER NOT NULL, question TEXT NOT NULL, answer TEXT NOT NULL, priority INTEGER NOT NULL, inte &ݻ:"fA"}Z:]A"ܜ O.%%tablefactsDeletedfactsDeleted"CREATE TABLE "factsDeleted" ( "factId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("factId") REFERENCES facts (id) ).%%tablecardsDeletedcardsDeleted$CREATE TABLE "cardsDeleted" ( "cardId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("cardId") REFERENCES cards (id) ) /):DA":"XA"ه@  \0%%#tablemediaDeletedmediaDeleted%CREATE TABLE "mediaDeleted" ( "mediaId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("mediaId") REFERENCES cards (id) ) tabletagstags'CREATE TABLE tags ( id integer not null, tag text not null collate nocase, priority integer not null default 2, primary key(id))!tablecardTagscardTags(CREATE TABLE cardTags ( id integer not null, cardId integer not null, tagId integer not null, src integer not null, primary key(id))  Reverse Forward Basic-PriorityVeryHigh%PriorityHigh# PriorityLow 8q:N 8q:N a:* a:*8q:N 8q:N wiZN:- decks1%factsDeleted0!cardModels0 media0+CdeckVarssqlite_autoindex_deckVars_112 1 models0 'reviewHistory0 stats0 cardTags0 sources0%mediaDeleted0#fieldModels0'modelsDeleted0 fields0 facts0 cards0%cardsDeleted0#tagsix_tags_tag3 1 11~TK%%[tablesqlite_stat1sqlite_stat1)CREATE TABLE sqlite_stat1(tbl,idx,stat)n7indexix_cards_typeCombinedcards+CREATE INDEX ix_cards_typeCombined on cards (type, combinedDue, factId)d9indexix_cards_relativeDelaycards,CREATE INDEX ix_cards_relativeDelay on cards (relativeDelay)T/qindexix_cards_modifiedcards-CREATE INDEX ix_cards_modified on cards (modified)T/qindexix_facts_modifiedfacts.CREATE INDEX ix_facts_modified on facts (modified) A"ޜgb5: a:*A"ޜe5:8q:N  8q:N  a:* A"f8q:NA"F a:* A"35:  8q:N  a:* [[WNT/qindexix_cards_prioritycards/CREATE INDEX ix_cards_priority on cards (priority)T+uindexix_cards_factorcards1CREATE INDEX ix_cards_factor on cards (type, factor)N+iindexix_cards_factIdcards2CREATE INDEX ix_cards_factId on cards (factId)S-qindexix_stats_typeDaystats3CREATE INDEX ix_stats_typeDay on stats (type, day)R-mindexix_fields_factIdfields4CREATE INDEX ix_fields_factId on fields (factId) @8q:N@ a:* 5:8q:N5: a:*  !2012-10-27! 2012-10-27 5:_:5:ˣ: M :Eˣ:2Б:F_: xx0$k"9%indexix_cardsDeleted_cardIdcardsDeleted9CREATE INDEX ix_cardsDeleted_cardIde9indexix_fields_fieldModelIdfields5CREATE INDEX ix_fields_fieldModelId on fields (fieldModelId)O +iindexix_fields_valuefields7CREATE INDEX ix_fields_value on fields (value)a!7indexix_media_originalPathmedia8CREATE INDEX ix_media_originalPath on media (originalPath)k"9%indexix_cardsDeleted_cardIdcardsDeleted9CREATE INDEX ix_cardsDeleted_cardId on cardsDeleted (cardId) frontˣ:back_:   /):D  :"X  KK,l%9%r#=' indexix_modelsDeleted_modelIdmodelsDeleted:CREATE INDEX ix_modelsDeleted_modelId on modelsDeleted (modelId)k$9%indexix_factsDeleted_factIdfactsDeletedCREATE INDEX ix_cardTags_tagCard on cardTags (tagId, cardId)   Z:] &ݻ:"f   a:*8q:N8q:N8q:N  8q:N a:*  8q:N 8q:N 8q:N  8q:N  a:*  a:* <<)x)-9Z'1uindexix_cardTags_cardIdcardTags?CREATE INDEX ix_cardTags_cardId on cardTags (cardId)(9Yindexix_cards_intervalDesc2cardsACREATE INDEX ix_cards_intervalDesc2 on cards (type, priority desc, interval desc, factId, combinedDue)x)-9indexix_cards_dueAsc2cardsBCREATE INDEX ix_cards_dueAsc2 on cards (type, priority desc, due, factId, combinedDue)[*/indexix_media_filenamemediaCCREATE UNIQUE INDEX ix_media_filename on media (filename) !5:A"ޜgb a:*!5:A"ޜe8q:N )A"ޜgb5:A"ޜgb a:*)A"ޜe5:A"ޜe8q:N   Reverse-PriorityVeryHigh# PriorityLow%PriorityHigh Forward Basic k3-##oviewrevCardsOldrevCardsOldCREATE VIEW revCardsOld as select * from cards where typeH+#gindexix_tags_tagtagsDCREATE UNIQUE INDEX ix_tags_tag on tags (tag),##gviewfailedCardsfailedCardsCREATE VIEW failedCards as select * from cards where type = 0 and isDue = 1 order by type, isDue, combinedDue-##oviewrevCardsOldrevCardsOldCREATE VIEW revCardsOld as select * from cards where type = 1 and isDue = 1 order by priority desc, interval desc u !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspendLeeches1 XX% ?cssCache.fm32d0913aa1b4ff46 {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm4da0093aa1b4ff45 {font-family:"Arial";font-size:20px;white-space:pre-wrap;} #cmqdc3b073aa1b4ff46 {text-align:center;} #cmqe83913aa1b4ff46 {text-align:center;} #cmadc3b073aa1b4ff46 {text-align:center;} #cmae83913aa1b4ff46 {text-align:center;} .cmbdc3b073aa1b4ff46 {background:#FFFFFF;} .cmbe83913aa1b4ff46 {background:#FFFFFF;}  pageSize4096 sortIndex0d=hexCache{"3661586178059337542": "32d0913aa1b4ff46", "1045839219487211334": "e83913aa1b4ff46", "-8256200675311681723": "8d6c153aa1b4ff45", "-2577458413336985786": "dc3b073aa1b4ff46", "5593480884619902789": "4da0093aa1b4ff45"} EE` .##eviewrevCardsNewrevCardsNewCREATE VIEW revCardsNew as select * from cards where type = 1 and isDue = 1 order by priority desc, interval/##[viewrevCardsDuerevCardsDueCREATE VIEW revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, due0))yviewrevCardsRandomrevCardsRandomCREATE VIEW revCardsRandom as select * from cards where type = 1 and isDue = 1 order by priority desc, factId, ordinal u 2##eviewacqCardsNewacqCardsNewCREATE VIEW acqCardsNew as select * from cards where type = 2 and isDue = 1 order by priority desc, due desc1##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, dueanki-2.0.20+dfsg/tests/support/anki12.anki0000644000175000017500000017600012072552402020062 0ustar andreasandreasSQLite format 3@ ?4N - ?/Cindexsqlite_autoindex_deckVars_1deckVars{tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL, "newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "mature>00*%#  <q<3 !   2011-03-18@x@2ڀ" !2011-03-073 ! 2011-03-06? @ 4!   2011-03-06@@5(;s !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspe: 9  pcXJ:+ ) suspendLeeches sortIndex!revSpacing #revInactive revActive perDay pageSize!newSpacing#newInactive newActive mediaURL 'mediaLocation!leechFails latexPre latexPost hexCache cssCache JJ[F{tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL, "newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, PRIMARY KEY (id) )r7tabledeckVarsdeckVarsCREATE TABLE "deckVars" ( "key" TEXT NOT NULL, value TEXT, PRIMARY KEY ("key") )/Cindexsqlite_autoindex_deckVars_1deckVars y8=    -'.rA`0@&,@@@"9P .>A`8?U+@2\ս~@$-@@@|?  х.)A`\@&ֈ0:@@@eF   .>A\A`8.>A\< WWPS;''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) )9M'indexsqlite_autoindex_reviewHistory_1reviewHistoryJktablesourcessources CREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) )`tablemediamedia CREATE TABLE media ( id INTEGER NOT NULL, filename TEXT NOT NULL, size INTEGER NOT NULL, created FLOAT NOT NULL, "originalPath" TEXT NOT NULL, description TEXT NOT NULL, PRIMARY KEY (id) )   5Вɞ  A\ }A\ tJJapaneseJapanese?%(Meaning)sArial#000000Arial#000000Arial#FFFFFFeȏЍ   k. Reverse%(Back)s%(Front)sArial#000000Arial#000000Arial#FFFFFFeЍ  k. Forward%(Front)s%(Back)sArial#000000Arial#000000Arial#FFFFFFi ɞ  ## .IRecall%(Meaning)s%(Reading)sArial#000000Arial#000000Arial#FFFFFFT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, active BOOLEAN NOT NULL, qformat TEXT NOT NULL, aformat TEXT NOT NULL, lformat TEXT, qedformat TEXT, aedformat TEXT, "questionInAnswer" BOOLEAN NOT NULL, "questionFontFamily" TEXT, "questionFontSize" INTEGER, "questionFontColour" VARCHAR(7), "questionAlign" INTEGER, "answerFontFamily" TEXT, "answerFontSize" INTEGER, "answerFontColour" VARCHAR(7), "answerAlign" INTEGER, "lastFontFamily" TEXT, "lastFontSize" INTEGER, "lastFontColour" VARCHAR(7), "editQuestionFontFamily" TEXT, "editQuestionFontSize" INTEGER, "editAnswerFontFamily" TEXT, "editAnswerFontSize" INTEGER, "allowEmptyAnswer" BOOLEAN NOT NULL, "typeAnswer" TEXT NOT NULL, PRIMARY KEY (id), CHECK ("allowEmptyAnswer" IN (0, 1)), CHECK ("questionInAnswer" IN (0, 1)), CHECK (active IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) )=)eЩ( eg>c. . A\ A`helloworldA`NA\@@A\%N@cF`@cF`A`NFо' cc    .)ԭ. A\ 9A`foobarA`cV@@A`c^A`cV@χ˲Һj' cc .*' }. A\PA\P_321123A\P@@A\P@ӲҺd' cc .*. A\PA\Pp123321A\P@@<Щ !!aM5ItablecardscardsCREATE TABLE cards ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "cardModelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, ordinal INTEGER NOT NULL, question TEXT NOT NULL, answer TEXT NOT NULL, priority INTEGER NOT NULL, 8KtablefieldsfieldsCREATE TABLE fields ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "fieldModelId" INTEGER NOT NULL, ordinal INTEGER NOT NULL, value TEXT NOT NULL, PRIMARY KEY (id), FOREIGN KEY("fieldModelId") REFERENCES "fieldModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) ).%%tablefactsDeletedfactsDeletedCREATE TABLE "factsDeleted" ( "factId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("factId") REFERENCES facts (id) )0%%#tablemediaDeletedmediaDeletedCREATE TABLE "mediaDeleted" ( "mediaId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("mediaId") REFERENCES cards (id) )interval FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, due FLOAT NOT NULL, "lastDue" FLOAT NOT NULL, factor FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "firstAnswered" FLOAT NOT NULL, reps INTEGER NOT NULL, successive INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, "yesCount" INTEGER NOT NULL, "noCount" INTEGER NOT NULL, "spaceUntil" FLOAT NOT NULL, "relativeDelay" FLOAT NOT NULL, "isDue" BOOLEAN NOT NULL, type INTEGER NOT NULL, "combinedDue" INTEGER NOT NULL, PRIMARY KEY (id), FOREIGN KEY("cardModelId") REFERENCES "cardModels" (id), CHECK ("isDue" IN (0, 1)), FOREIGN KEY("factId") REFERENCES facts (id) ) *Z7\*(Dž/.UҰ.I今日[きょう]ו .Uj0q.ImeaningۜЩ .)-. bar.Um-.I今日ݲҪ  .*-. 321Р >c. -. world䘇Ҫ .*i. 123݆Щ.)i. fooݲР>c. i. hello    DD1~T.%%tablecardsDeletedcardsDeletedCREATE TABLE "cardsDeleted" ( "cardId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("cardId") REFERENCES cards (id) ) tabletagstagsCREATE TABLE tags ( id integer not null, tag text not null collate nocase, priority integer not null default 2, primary key(id))!tablecardTagscardTagsCREATE TABLE cardTags ( id integer not null, cardId integer not null, tagId integer not null, src integer not null, primary key(id))K%%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)n7indexix_cards_typeCombinedcards CREATE INDEX ix_cards_typeCombined on cards (type, combinedDue, factId)d9indexix_cards_relativeDelaycards!CREATE INDEX ix_cards_relativeDelay on cards (relativeDelay)T/qindexix_cards_modifiedcards"CREATE INDEX ix_cards_modified on cards (modified)T/qindexix_facts_modifiedfacts#CREATE INDEX ix_facts_modified on facts (modified) || #Recognition Japanese Reverse Forward Basic-PriorityVeryHigh%PriorityHigh# PriorityLow :|l[K: [.:j  [.:j r.:d  r.:d-'.r  -'.rW.? W.?.> .>х.) х.) hK, r_;dWD8'modelsDeleted0-fieldsix_fields_factId9 3#9fieldsix_fields_fieldModelId9 2+fieldsix_fields_value9 1 decks1%factsDeleted0 models26'MreviewHistorysqlite_autoindex_reviewHistory_15 2 1 media0!cardModels4 sources0+CdeckVarssqlite_autoindex_deckVars_116 1-statsix_stats_typeDay4 2 1%3cardTagsix_cardTags_tagCard12 3 1"1cardTagsix_cardTags_cardId12 2%mediaDeleted0 /factsix_facts_modified4 1 #fieldModels5% 7cardsix_cards_typeCombined6 2 1 1" 9cardsix_cards_relativeDelay6 2 /cardsix_cards_modified6 1/cardsix_cards_priority6 6+cardsix_cards_factor6 2 2+cardsix_cards_factId6 2*9#cardsix_cards_intervalDesc26 2 2 2 2 1$-#cardsix_cards_dueAsc26 2 2 1 1 1'cardsix_cards_sort6 1%cardsDeleted0#tagsix_tags_tag8 1 IhIA`.)W.?A\P .*[.:jA\P .*r.:d A`cV.).>A`.U-'.rA`N>c. х.)  W.? [.:j r.:d  .> -'.r х.) A`W.?A`.>A`m-'.rA`х.)A\P_[.:jA\Ppr.:d A`V`.)A]%9ɐ>c. A\P .*A\a.U  -'.r W.? х.) .> [.:j r.:d __ [k!O +iindexix_fields_valuefields+CREATE INDEX ix_fields_valuT/qindexix_cards_prioritycards$CREATE INDEX ix_cards_priority on cards (priority)T+uindexix_cards_factorcards&CREATE INDEX ix_cards_factor on cards (type, factor)N+iindexix_cards_factIdcards'CREATE INDEX ix_cards_factId on cards (factId)S-qindexix_stats_typeDaystats(CREATE INDEX ix_stats_typeDay on stats (type, day)R-mindexix_fields_factIdfields)CREATE INDEX ix_fields_factId on fields (factId)e9indexix_fields_fieldModelIdfields*CREATE INDEX ix_fields_fieldModelId on fields (fieldModelId)O +iindexix_fields_valuefields+CREATE INDEX ix_fields_value on fields (value)a!7indexix_media_originalPathmedia,CREATE INDEX ix_media_originalPath on media (originalPath)k"9%indexix_cardsDeleted_cardIdcardsDeleted-CREATE INDEX ix_cardsDeleted_cardId on cardsDeleted (cardId)r#=' indexix_modelsDeleted_modelIdmodelsDeleted.CREATE INDEX ix_modelsDeleted_modelId on modelsDeleted (modelId) @W.?@[.:j@r.:d @.>@-'.r@х.) >c. х.) .*[.:j .*r.:d.U-'.r.)W.?.).>  !2011-03-18 !2011-03-07 !2011-03-06! 2011-03-06 Lt`L>c. ). >c. :.  .*z.* .*`9.*.Uw-.U.U)\.U.U.U.)#l.).)ԺS.) Lt`Lm-.I.Uj0q.I)\.Ui. `9.*i. S.)i. :. -. #l.)-. z.*-. ). .Iw-.U PA2/今日[きょう]w-.U今日.Uworld). meaning)\.UfooS.)bar#l.)ԁhello:. 321z.*123`9.*     g;([+/indexix_media_filenamemedia7CREATEk$9%indexix_factsDeleted_factIdfactsDeleted/CREATE INDEX ix_factsDelek$9%indexix_factsDeleted_factIdfactsDeleted/CREATE INDEX ix_factsDeleted_factId on factsk$9%indexix_factsDeleted_factIdfactsDeleted/CREATE INDEX ix_factsDeleted_factId on factsDeleted (factId)l%9%indexix_mediaDeleted_factIdmediaDeleted1CREATE INDEX ix_mediaDeleted_factId on mediaDeleted (mediaId)d&3indexix_cardTags_tagCardcardTags2CREATE INDEX ix_cardTags_tagCard on cardTags (tagId, cardId)Z'1uindexix_cardTags_cardIdcardTags3CREATE INDEX ix_cardTags_cardId on cardTags (cardId)(9Yindexix_cards_intervalDesc2cards4CREATE INDEX ix_cards_intervalDesc2 on cards (type, priority desc, interval desc, factId, combinedDue)x)-9indexix_cards_dueAsc2cards5CREATE INDEX ix_cards_dueAsc2 on cards (type, priority desc, due, factId, combinedDue)\*'indexix_cards_sortcards6CREATE INDEX ix_cards_sort on cards (question collate nocase)  Mzk\M -'.r-'.rW.?[.:j х.).>r.:d W.?  х.).>[.:j r.:d ere -'.r -'.r W.? W.? х.)  х.) .> .> [.:j [.:j r.:d r.:d 7{Y7! .*A\P[.:j! .*A\Pr.:d!.)A`W.?  .)A`cV.> >c. A`Nх.) .UA`-'.r [1)A\P .*A\P[.:j)A\P .*A\Pr.:d)A\ 9Ű.)A`W.?( A`cV.)A`cV.>(A`.UA`-'.r(A`N>c. A`Nх.) 0g06cbarW.?6c321[.:j9i今日-'.r6cfoo.>8ehelloх.)6c123r.:d   Reverse#Recognition -PriorityVeryHigh# PriorityLow%PriorityHigh Japanese Forward Basic s !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspendLeeches1 VV' CcssCache.fmb0999d2e8be8499e {font-family:"Arial";font-size:50px;white-space:pre-wrap;} .fmff152d2e8be80d02 {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm12e6692e8be80d02 {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm6a30712e8be8499e {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm6d852d2e8be8499e {font-family:"ヒラギノ明朝 Pro W3";font-size:50px;white-space:pre-wrap;} #cmq8481c72e8be8499e {text-align:center;} #cmqad9ecf2e8be80d02 {text-align:center;} #cmq27207d2e8be80d02 {text-align:center;} #cmq32cfd92e8be8499e {text-align:center;} #cma8481c72e8be8499e {text-align:center;} #cmaad9ecf2e8be80d02 {text-align:center;} #cma27207d2e8be80d02 {text-align:center;} #cma32cfd92e8be8499e {text-align:center;} .cmb8481c72e8be8499e {background:#FFFFFF;} .cmbad9ecf2e8be80d02 {background:#FFFFFF;} .cmb27207d2e8be80d02 {background:#FFFFFF;} .cmb32cfd92e8be8499e {background:#FFFFFF;}  sortIndex0.'ImediaLocation/Users/dae/Dropbox/Public/AnkipageSize4096iGhexCache{"3661383816014481822": "32cfd92e8be8499e", "-66096941588017918": "ff152d2e8be80d02", "7651740211632163230": "6a30712e8be8499e", "-5936079460005049086": "ad9ecf2e8be80d02", "-8505492998582694654": "89f66b2e8be80d02", "-8898612385977710178": "8481c72e8be8499e", "-3822851096768394850": "caf2812e8be8499e", "2819391005603138818": "27207d2e8be80d02", "7891763599975664030": "6d852d2e8be8499e", "-5721369028356191842": "b0999d2e8be8499e", "1361891585962806530": "12e6692e8be80d02"} )5j)eЩ( eg>c. . A\ A`helloworldA`NA\@@A\%N@cF`@cF`A`NFо' cc    .)ԭ. A\ 9A`foobarA`cV@@A`c^A`cV@χ˲Һj' cc .*' }. A\PA\P_321123A\P@@A\P@ӲҺd' cc .*. A\PA\Pp123321A\P@@A\P 5ѕr( ie   .U2.IA\A`m今日今日[きょう]
meaningA`@@A`\@"8jp@"8jpA`@п' cc.)' }. A\ 9A`barfooA\ 9@@A` uPuJ@0##[2##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, dueH,#gindexix_tags_tagtags8CREATE UNIQUE INDEX ix_tags_tag on tag[+/indexix_media_filenamemedia7CREATE UNIQUE INDEX ix_media_filename on media (filename)H,#gindexix_tags_tagtags8CREATE UNIQUE INDEX ix_tags_tag on tags (tag)-##gviewfailedCardsfailedCardsCREATE VIEW failedCards as select * from cards where type = 0 and isDue = 1 order by type, isDue, combinedDue.##oviewrevCardsOldrevCardsOldCREATE VIEW revCardsOld as select * from cards where type = 1 and isDue = 1 order by priority desc, interval desc /##eviewrevCardsNewrevCardsNewCREATE VIEW revCardsNew as select * from cards where type = 1 and isDue = 1 order by priority desc, interval0##[viewrevCardsDuerevCardsDueCREATE VIEW revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, due EEp1))yviewrevCardsRandomrevCardsRandomCREATE VIEW revCardsRandom as select * from cards where type = 1 and isDue = 1 order by priority desc, factId, ordinal2##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, due 3##eviewacqCardsNewacqCardsNewCREATE VIEW acqCardsNew as select * from cards where type = 2 and isDue = 1 order by priority desc, due descanki-2.0.20+dfsg/tests/support/text-2fields.txt0000644000175000017500000000025112221204444021172 0ustar andreasandreas# this is a test file 食べる to eat 飲む to drink テスト test to eat 食べる 飲む to drink 多すぎる too many fields not, enough, fields 遊ぶ to play anki-2.0.20+dfsg/tests/support/suspended12.anki0000644000175000017500000017400012221204444021124 0ustar andreasandreasSQLite format 3@ >}N - >9M'indexsqlite_autoindex_reviewHistory_1reviewHistoryJktablesourcessourcesCREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) )`tablemediamediaCREATE TABLE media ( id INTEGER NOT NULL, filename TEXT NOT NULL, size INTEGER NOT NULL, created FLOAT NOT NULL, "originalPath" TEXT NOT NULL, de6.,'       uBS`tablemediamediaCREATE TABLE media ( id INTEGER `tablemediamediaCREATE TABLE media ( id INTEGER NOT NULL, filename TEXT NOT NULL, size INTEGER NOT NULL, created FLOAT NOT NULL, "originalPath" TEXT NOT NULL, description TEXT NOT NULL, PRIMARY KEY (id) )JktablesourcessourcesCREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) );''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) ) J!2010-01-03@?1Q"A=pw8# YI,U 9M'indexsqlite_autoindex_reviewHistory_1reviewHistory{tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL, "newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, PRIMARY KEY (id) ) ^^Cܓz ++ A#_[A?&~Mandarin PhraseMandarin Phrase?Chinese{{Meaning}}{{Chinese}}
{{Pinyin}}
* {{#Measure word}}
{{Measure word}}{{/Measure word}}
{{#Comments}}

{{Comments}}
{{/Comments}}Arial#000000Arial#000000Arial#bdceba;Ұ- #1 p%/zMeaning->Chinese{{Meaning}}{{Chinese}}
{{Pinyin}}
{{#Hanzi}}
{{Hanzi}}
{{/Hanzi}}
{{#Comments}}
{{Comments}}{{/Comments}}
{{#Tags}}
({{Tags}}){{/Tags}}Arial#000000Arial#000000Arial#bdcebaT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, active BOOLEAN NOT NULL, qformat TEXT NOT NULL, aformat TEXT NOT NULL, lformat TEXT, qedformat TEXT, aedformat TEXT, "questionInAnswer" BOOLEAN NOT NULL, "questionFontFamily" TEXT, "questionFontSize" INTEGER, "questionFontColour" VARCHAR(7), "questionAlign" INTEGER, "answerFontFamily" TEXT, "answerFontSize" INTEGER, "answerFontColour" VARCHAR(7), "answerAlign" INTEGER, "lastFontFamily" TEXT, "lastFontSize" INTEGER, "lastFontColour" VARCHAR(7), "editQuestionFontFamily" TEXT, "editQuestionFontSize" INTEGER, "editAnswerFontFamily" TEXT, "editAnswerFontSize" INTEGER, "allowEmptyAnswer" BOOLEAN NOT NULL, "typeAnswer" TEXT NOT NULL, PRIMARY KEY (id), CHECK ("allowEmptyAnswer" IN (0, 1)), CHECK ("questionInAnswer" IN (0, 1)), CHECK (active IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) ) ]'7kA?l{F ~V ##stablefieldModelsfieldModelsCREATE TABLE "fieldModels" ( id INTEGER NOT NULL, ordinal INTEGER NOT4 '''tablemodelsDeletedmodelsDeletedCREATE TABLE "modelsDeleted" ( "modelId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("modelId") REFERENCES models (id) )V ##stablefieldModelsfieldModelsCREATE TABLE "fieldModels" ( id INTEGER NOT NULL, ordinal INTEGER NOT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, features TEXT NOT NULL, required BOOLEAN NOT NULL, "unique" BOOLEAN NOT NULL, numeric BOOLEAN NOT NULL, "quizFontFamily" TEXT, "quizFontSize" INTEGER, "quizFontColour" VARCHAR(7), "editFontFamily" TEXT, "editFontSize" INTEGER, PRIMARY KEY (id), CHECK (required IN (0, 1)), CHECK ("unique" IN (0, 1)), CHECK (numeric IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) ) DK6ă. p%/zCommentsArial#000000preserve7Ų p%/zChineseHeiti SC2#000000preserve:ҵN% =%.+$Measure wordArial#000000preserve5 p%/zMeaningArial#000000preserve3㥲  p%/zPinyinArial#000000preserve6֠ =%.+$CommentsArial#000000preserve3f  =%.+$PinyinArial#000000preserve6ьܫ$ )=%.+$ChineseHeiti SC LightK#00000013 p%/zHanziArial#000000preserve5։ܫ% =%.+$MeaningArial#000000preserve Nݕ %Op%/zA-e˼A?&{gdue_date_bug冯 Féng​ surname Feng 馮冯 píng​ to gallop / to assist / to attack / to wade / great / old variant of 憑|凭小 xiǎo​ small / tiny / few / young刚 gāng​ hard / firm / strong / just / barely / exactly Féng Xiǎogāng 冯小刚 A World Without Thieves ja 不见不散 & +tablefactsfactsCREATE TABLE facts ( id INTEGER NOT NULL, "modelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, "spaceUntil" TEXT NOT NULL, "lastCardId" INTEGER, PRIMARY KEY (id), FOREIGN KEY("modelId") REFERENCES models (id) ).%%tablefactsDeletedfactsDeletedCREATE TABLE "factsDeleted" ( "factId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("factId") REFERENCES facts (id) )5ItablecardscardsCREATE TABLE cards ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "cardModelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, ordinal INTEGER NOT NULL, question TEXT NOT NULL, answer TEXT NOT NULL, priority INTEGER NOT NULL,   Xɭݕ) -[  S +WG%/A-e˼A?&udA World Without Thieves ja 不见不散冯小刚
Féng Xiǎogāng

冯 Féng​ surname Feng 馮
冯 píng​ to gallop / to assist / to attack / to wade / great / old variant of 憑|凭
小 xiǎo​ small / tiny / few / young
刚 gāng​ hard / firm / strong / just / barely / exactly



(due_date_bug)@,+Yy@" "A@ŞfA*`:??A.b冯 píng​ to gallop / to assist / to attack / to wade / great / old variant of 憑|凭
小 xiǎo​ small / tiny / few / young
刚 gāng​ hard / firm / strong / just / barely / exactly %%`\!8KtablefieldsfieldsCREATE TABLE fields ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "fieldModelId" INTEGER NOT NULL, ordinal INTEGER NOT NULL, value TEXT NOT NULL, PRIMARY KEY (id), FOREIGN KEY("fieldModelId") REFERENCES "fieldModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) ).%%tablecardsDeletedcardsDeletedCREATE TABLE "cardsDeleted" ( "cardId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("cardId") REFERENCES cards (id) )0%%#tablemediaDeletedmediaDeletedCREATE TABLE "mediaDeleted" ( "mediaId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("mediaId") REFERENCES cards (id) ) tabletagstagsCREATE TABLE tags ( id integer not null, tag text not null collate nocase, priority integer not null default 2, primary key(id))!tablecardTagscardTagsCREATE TABLE cardTags ( id integer not null, cardId integer not null, tagId integer not null, src integer not null, primary key(id))   U)D+&LZȗ  0QQ1 3%due_date_bug Phrase-Meaning->Chinese Mandarin %m+Y %m+Y  %m+Y%m+Y RyM0iV8jD {ocR!cardModels2 media0 decks1,%9factsDeletedix_factsDeleted_factId1621 2+CdeckVarssqlite_autoindex_deckVars_118 1 models2;'M!reviewHistorysqlite_autoindex_reviewHistory_161121 42 1"-statsix_stats_typeDay851 426 1$3cardTagsix_cardTags_tagCard4 1 1!1cardTagsix_cardTags_cardId4 4 sources0)%9mediaDeletedix_mediaDeleted_factId1 1,'=modelsDeletedix_modelsDeleted_modelId1 1-fieldsix_fields_factId5 5#9fieldsix_fields_fieldModelId5 1+fieldsix_fields_value5 1 #fieldModels10 /factsix_facts_modified1 1% 7cardsix_cards_typeCombined1 1 1 1" 9cardsix_cards_relativeDelay1 1 /cardsix_cards_modified1 1/cardsix_cards_priority1 1+cardsix_cards_factor1 1 1+cardsix_cards_factId1 1*9#cardsix_cards_intervalDesc21 1 1 1 1 1$-#cardsix_cards_dueAsc21 1 1 1 1 1'cardsix_cards_sort1 1,%9cardsDeletedix_cardsDeleted_cardId1709 2#tagsix_tags_tag8 1 %%rHJEK%%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)n7indexix_cards_typeCombinedcards!CREATE INDEX ix_cards_typeCombined on cards (type, combinedDue, factId)d9indexix_cards_relativeDelaycards"CREATE INDEX ix_cards_relativeDelay on cards (relativeDelay)T/qindexix_cards_modifiedcards#CREATE INDEX ix_cards_modified on cards (modified)T/qindexix_facts_modifiedfacts$CREATE INDEX ix_facts_modified on facts (modified)T/qindexix_cards_prioritycards%CREATE INDEX ix_cards_priority on cards (priority)T+uindexix_cards_factorcards&CREATE INDEX ix_cards_factor on cards (type, factor)N+iindexix_cards_factIdcards'CREATE INDEX ix_cards_factId on cards (factId)S-qindexix_stats_typeDaystats(CREATE INDEX ix_stats_typeDay on stats (type, day)R-mindexix_fields_factIdfields)CREATE INDEX ix_fields_factId on fields (factId)e9indexix_fields_fieldModelIdfields*CREATE INDEX ix_fields_fieldModelId on fields (fieldModelId) A@ŞfS +W%m+Y   %m+Y A?&ud%m+Y A?&{gS +W  %m+Y ?͏%m+Y S +W%m+Y ! 2010-01-03 S +W( ܄S +Wx+WS +WE+WS +W( +WS +WS+W uw..( ܄hV+%/E+Wg%/x+W1+&Y( +W%/S+W "7"冯小刚E+Wzi冯 Féng​ surname Feng 馮
冯 píng​ to gallop / to assist / to attack / to wade / gre=-Féng Xiǎogāng( +W3]A World Without Thieves ja 不见不散x+W  ( ܄ c>oHO +iindexix_fields_valuefields+CREATE INDEX ix_fields_value on fields (value)a!7indexix_media_originalPathmedia-CREATE INDEX ix_media_oO +iindexix_fields_valuefields+CREATE INDEX ix_fields_value on fields (value)a!7indexix_media_originalPathmedia-CREATE INDEX ix_media_originalPath on media (originalPath)k"9%indexix_cardsDeleted_cardIdcardsDeleted.CREATE INDEX ix_cardsDeleted_cardId on cardsDeleted (cardId)r#=' indexix_modelsDeleted_modelIdmodelsDeleted/CREATE INDEX ix_modelsDeleted_modelId on modelsDeleted (modelId)k$9%indexix_factsDeleted_factIdfactsDeleted0CREATE INDEX ix_factsDeleted_factId on factsDeleted (factId)l%9%indexix_mediaDeleted_factIdmediaDeleted1CREATE INDEX ix_mediaDeleted_factId on mediaDeleted (mediaId)d&3indexix_cardTags_tagCardcardTags2CREATE INDEX ix_cardTags_tagCard on cardTags (tagId, cardId)Z'1uindexix_cardTags_cardIdcardTags3CREATE INDEX ix_cardTags_cardId on cardTags (cardId)     ]'7k    U)D+&   %m+Y%m+Y%m+Y  %m+Y  %m+Y %m+Y %m+Y  %m+Y )@,+YyS +WA@Şf%m+Y )A@ŞfS +WA@Şf%m+Y k3ku /#x)-9indexix_cards_dueAsc2cards5CREATE INDEX ix_cards_dueAsc2 on cards (type, priority desc, due, factId, combinedDue)L*'iindexix_(9Yindexix_cards_intervalDesc2cards4CREATE INDEX ix_cards_intervalDesc2 on cards (type, priority desc, interval desc, factId, combinedDue)x)-9indexix_cards_dueAsc2cards5CREATE INDEX ix_cards_dueAsc2 on cards (type, priority desc, due, factId, combinedDue)L*'iindexix_cards_sortcards7CREATE INDEX ix_cards_sort on cards (modified)[+/indexix_media_filenamemedia8CREATE UNIQUE INDEX ix_media_filename on media (filename)H,#gindexix_tags_tagtags9CREATE UNIQUE INDEX ix_tags_tag on tags (tag)-##gviewfailedCardsfailedCardsCREATE VIEW failedCards as select * from cards where type = 0 and isDue = 1 order by type, isDue, combinedDue.##oviewrevCardsOldrevCardsOldCREATE VIEW revCardsOld as select * from cards where type = 1 and isDue = 1 order by priority desc, interval desc A?&ud%m+Y  QQ Phrase-Meaning->Chinese  Mandarin%due_date_bug310 re-wrap;} .fmdd446725f42e2b24 {font-family:"Heiti SC Light";font-size:75px;color:#000000;white-space:pre-wrap;} .fmfa6fb126a953ce66 {font-family:"Arial";font-size:20px;color:#000000;white-space:pre-wrap;} .fm2ab9eb25f42ed6a0 {font-family:"Arial";font-size:20px;color:#000000;white-space:pre-wrap;} .fm318d2b26a9591407 {font-family:"Arial";font-size:20px;color:#000000;white-space:pre-wrap;} .fm67a8a725f42fe085 {font-family:"Arial";font-size:20px;color:#000000;white-space:pre-wrap;} .fm68153d26ad8ac64e {font-family:"Arial";font-size:20px;color:#000000;white-space:pre-wrap;} .fm68562b25f42fe083 {font-family:"Heiti SC";font-size:50px;color:#000000;white-space:pre-wrap;} .fm75df772e1101d92e {font-family:"Arial";font-size:20px;color:#000000;white-space:pre-wrap;} #cmqa4c34725f42fe097 {text-align:center;} #cmq63c90f25f42e2b26 {text-align:center;} #cmaa4c34725f42fe097 {text-align:center;} #cma63c90f25f42e2b26 {text-align:center;} .cmba4c34725f42fe097 {background:#bdceba;} .cmb63c90f25f42e2b26 {background:#bdceba;} "obSD3".# revInactive-# newInactive , revActive + newActive *perDay0)#mobileScale0.70k(KhexCache{"3078750368527472288": "2ab9eb25f42ed6a0", "7518244069952184451": "68562b25f42fe083", "-2502762080203035868": "dd446725f42e2b24", "-6532384235071853787": "a5584f25f42e2b25", "-400907062204969370": "fa6fb126a953ce66", "-3619232575325740921": "cdc5e725f42fe087", "3570557524624610311": "318d2b26a9591407", "7499967990785033806": "68153d26ad8ac64e", "7190294935758580518": "63c90f25f42e2b26", "8493638461981579566": "75df772e1101d92e", "-6574332802694651753": "a4c34725f42fe097", "-2648757433162388700": "db3db925f42e2b24", "1400787872401842298": "13709925f42fe07a", "7469403763446374533": "67a8a725f42fe085"}8'ecssCache.fma5584f25f42e2b25 {font-family:"Arial";font-size:20px;color:#000000;white-space:pre-wrap;} .fmcdc5e725f42fe087 {font-family:"Arial";font-size:20px;color:#000000;white-space:p: &sortIndex3%pageSize4096$!leechFails16#)suspendLeeches1 84!revSpacing0.13' mediaLocation2)latexPost\end{document}"19latexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \begin{document} 0 mediaURL/!newSpacing60.0at / old variant of 憑|凭
小 xiǎo​ small / tiny / few / young
刚 gāng​ hard / firm / strong / just / barely / exactlyS+W *E`* 3##eviewacqCardsNewacqCardsNewCREATE VIEW acqCardsNew as select * from cards where type = 2 and isDue = 1 order by priority desc, due desc2##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, due /##eviewrevCardsNewrevCardsNewCREATE VIEW revCardsNew as select * from cards where type = 1 and isDue = 1 order by priority desc, interval0##[viewrevCardsDuerevCardsDueCREATE VIEW revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, due1))yviewrevCardsRandomrevCardsRandomCREATE VIEW revCardsRandom as select * from cards where type = 1 and isDue = 1 order by priority desc, factId, ordinalanki-2.0.20+dfsg/tests/support/fake.png0000644000175000017500000000000411755052155017542 0ustar andreasandreasabc anki-2.0.20+dfsg/tests/support/invalid-ords.anki0000644000175000017500000042000012042551172021360 0ustar andreasandreasSQLite format 3@ 4N - JktablesourcessourcesCREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) );''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) )9M'indexsqlit6.-(!     8r}wqke_YSMGA;5/)# @ A ! 2008-03-28@jc@' K < !2008-03-27@nXe@+Ԍ S $ 7  ! 2008-03-262@#pq@{L# 8  !2008-03-25J@$^g@%JI$8  !2008-03-24;@ͮ8f'G@y/*: 7  ! 2008-03-22I@Ć,@.y #8  !2008-03-20;@#>O8d@#ێ9 7 ! 2008-03-19&@2[ukZ@:,  6 ! 2008-03-18@UUUU@AͰ9 !2008-0qpovndmRlAk1j!ihgpf`eOd>c.ba`z_h^W]E\5[%ZYXxWiVXUHT7S'RQPvOfNVMEL3K#JIHuGfFVEFD6C&BA@t?a>P=@<0; : ::3J;''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) )9M'indexsqlite_autoindex_reviewHistory_1reviewHistoryJktablesourcessourcesCREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) )  {tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL, "newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, PRIMARY KEY (id) )`tablemediamediaCREATE TABLE media ( id INTEGER NOT NULL, filename TEXT NOT NULL, size INTEGER NOT NULL, created FLOAT NOT NULL, "originalPath" TEXT NOT NULL, description TEXT NOT NULL, PRIMARY KEY (id) )  3դO  ' A^LHA!_2:English/Greek?X e]tablemodelsmodels CREATE TABLE models ( id INTEGER NOT NULL, "deckId" INTEGER, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, features TEXT NOT NULL, spacing FLOAT NOT NULL, "initialSpacing" FLOAT NOT NULL, source INTEGER NOT NULL, PRIMARY KEY (id) )r7tabledeckVarsdeckVars CREATE TABLE "deckVars" ( "key" TEXT NOT NULL, value TEXT, PRIMARY KEY ("key") )/Cindexsqlite_autoindex_deckVars_1deckVars  !!tablecardModelscardModels CREATE TABLE "cardModels" ( id INTEGER NOT NULL, ordinal INTEGER NOq AtabledecksdecksCREATE TABLE decks ( id INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, description TEXT NOT NULL, version INTEGER NOT NULL, "currentModelId" INTEGER, "syncName" TEXT, "lastSync" FLOAT NOT.  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspendLeeches1 sortIndex0pageSize4096e?hexCache{"7714278139299660113": "6b0e9f187f848151", "-3196723299912220334": "d3a2f5187f848152", "7691030065441964367": "6abc07187f84814f", "2342550310125601108": "208269187f848154", "-2642164819234094769": "db5525187f84814f"}D}cssCache.fm6abc07187f84814f {font-family:"Arial";font-size:25px;color:#000000;white-space:pre-wrap;} .fm6b0e9f187f848151 {font-family:"Arial";font-size:25px;color:#000000;white-space:pre-wrap;} #cmqd3a2f5187f848152 {text-align:center;} #cmq208269187f848154 {text-align:center;} #cmad3a2f5187f848152 {text-align:center;} #cma208269187f848154 {text-align:center;} .cmbd3a2f5187f848152 {background:#ffffff;} .cmb208269187f848154 {background:#ffffff;} !revSpaci |l]PE7' )suspendLeeches sortIndex!revSpacing#revInactive revActive perDay pageSize!newSpacing#newInactive newActive)mobileScalePad mediaURL'mediaLocation!leechFails latexPre latexPost hexCache cssCache {{͑T'' # U%OBack-to-frontBack to front%(Greek)s%(English)sArial#000000Arial#000000Arial#ffffff{R'' # U%OFront-to-backFront to back%(English)s%(Greek)sArial#000000Arial#000000Arial#ffffffT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, active BOOLEAN NOT NULL, qformat TEXT NOT NULL, aformat TEXT NOT NULL, lformat TEXT, qedformat TEXT, aedformat TEXT, "questionInAnswer" BOOLEAN NOT NULL, "questionFontFamily" TEXT, "questionFontSize" INTEGER, "questionFontColour" VARCHAR(7), "questionAlign" INTEGER, "answerFontFamily" TEXT, "answerFontSize" INTEGER, "answerFontColour" VARCHAR(7), "answerAlign" INTEGER, "lastFontFamily" TEXT, "lastFontSize" INTEGER, "lastFontColour" VARCHAR(7), "editQuestionFontFamily" TEXT, "editQuestionFontSize" INTEGER, "editAnswerFontFamily" TEXT, "editAnswerFontSize" INTEGER, "allowEmptyAnswer" BOOLEAN NOT NULL, "typeAnswer" TEXT NOT NULL, PRIMARY KEY (id), CHECK (active IN (0, 1)), CHECK ("questionInAnswer" IN (0, 1)), CHECK ("allowEmptyAnswer" IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) ) d%    A!zXA!z'AU%OA!vA?333333? Xȹ NULL, "hardIntervalMin" FLOAT NOT NULL, "hardIntervalMax" FLOAT NOT NULL, "midIntervalMin" FLOAT NOT NULL, "midIntervalMax" FLOAT NOT NULL, "easyIntervalMin" FLOAT NOT NULL, "easyIntervalMax" FLOAT NOT NULL, delay0 INTEGER NOT NULL, delay1 INTEGER NOT NULL, delay2 FLOAT NOT NULL, "collapseTime" INTEGER NOT NULL, "highPriority" TEXT NOT NULL, "medPriority" TEXT NOT NULL, "lowPriority" TEXT NOT NULL, suspended TEXT NOT NULL, "newCardOrder" INTEGER NOT NULL, "newCardSpacing" INTEGER NOT NULL, "failedCardMax" INTEGER NOT NULL, "newCardsPerDay" INTEGER NOT NULL, "sessionRepLimit" INTEGER NOT NULL, "sessionTimeLimit" INTEGER NOT NULL, "utcOffset" FLOAT NOT NULL, "cardCount" INTEGER NOT NULL, "factCount" INTEGER NOT NULL, "failedNowCount" INTEGER NOT NULL, "failedSoonCount" INTEGER NOT NULL, "revCount" INTEGER NOT NULL, "newCount" INTEGER NOT NULL, "revCardOrder" INTEGER NOT NULL, PRIMARY KEY (id), FOREIGN KEY("currentModelId") REFERENCES models (id) ) 2Q  U%OGreekArial#000000preserve4O U%OEnglishArial#000000preserve IV ##stablefieldModelsfieldModelsCREATE TABLE "fieldModels" ( id INTEGER NOT NULL, ordinal INTEGER NOT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, features TEXT NOT NULL, required BOOLEAN NOT NULL, "unique" BOOLEAN NOT NULL, numeric BOOLEAN NOT NULL, "quizFontFamily" TEXT, "quizFontSize" INTEGER, "quizFontColour" VARCHAR(7), "editFontFamily" TEXT, "editFontSize" INTEGER, PRIMARY KEY (id), CHECK (numeric IN (0, 1)), CHECK ("unique" IN (0, 1)), CHECK (required IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) )4 '''tablemodelsDeletedmodelsDeletedCREATE TABLE "modelsDeleted" ( "modelId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("modelId") REFERENCES models (id) )  OЙ˘_U%OAmEA!s17brokenfrog (2) βάτραχος, βατράχι \\X& +tablefactsfactsCREATE TABLE facts ( id INTEGER NOT NULL, "modelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, "spaceUntil" TEXT NOT NULL, "lastCardId" INTEGER, PRIMARY KEY (id), FOREIGN KEY("modelId") REFERENCES models (id) )8KtablefieldsfieldsCREATE TABLE fields ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "fieldModelId" INTEGER NOT NULL, ordinal INTEGER NOT NULL, value TEXT NOT NULL, PRIMARY KEY (id), FOREIGN KEY("fieldModelId") REFERENCES "fieldModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) )5ItablecardscardsCREATE TABLE cards ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "cardModelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, ordinal INTEGER NOT NULL, question TEXT NOT NULL, answer TEXT NOT NULL, priority INTEGER NOT NULL,  6޳˘ Me9f? kQβάτραχος, βατράχι΍˘e9f? jOfrog (2) ˙( m    e9f? iTAmQA!zXOβάτραχος, βατράχιfrog (2)@Pfrog (2)βάτραχος, βατράχι@$v!(@ 1pA uA@@Aqx @-lc@d9XA uinterval FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, due FLOAT NOT NULL, "lastDue" FLOAT NOT NULL, factor FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "firstAnswered" FLOAT NOT NULL, reps INTEGER NOT NULL, successive INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, "yesCount" INTEGER NOT NULL, "noCount" INTEGER NOT NULL, "spaceUntil" FLOAT NOT NULL, "relativeDelay" FLOAT NOT NULL, "isDue" BOOLEAN NOT NULL, type INTEGER NOT NULL, "combinedDue" INTEGER NOT NULL, PRIMARY KEY (id), CHECK ("isDue" IN (0, 1)), FOREIGN KEY("cardModelId") REFERENCES "cardModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) )  bbw tabletagstagsCREATE TABLE tags ( id integer not null, tag text nK.%%tablefactsDeletedfactsDeletedCREATE TABLE "factsDeleted" ( "factId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("factId") REFERENCES facts (id) ).%%tablecardsDeletedcardsDeletedCREATE TABLE "cardsDeleted" ( "cardId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("cardId") REFERENCES cards (id) )0%%#tablemediaDeletedmediaDeletedCREATE TABLE "mediaDeleted" ( "mediaId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("mediaId") REFERENCES cards (id) ) tabletagstagsCREATE TABLE tags ( id integer not null, tag text not null collate nocase, priority integer not null default 2, primary key(id))!tablecardTagscardTagsCREATE TABLE cardTags ( id integer not null, cardId integer not null, tagId integer not null, src integer not null, primary key(id))K%%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)    broken'Front-to-back'Back-to-front-PriorityVeryHigh%PriorityHigh#PriorityLow R9fBR9fBi99fBi99fB !{^? yT5#xk>-! decks1!cardModels2+CdeckVarssqlite_autoindex_deckVars_118 1 models1<'M#reviewHistorysqlite_autoindex_reviewHistory_1106495 20 1"-statsix_stats_typeDay926 463 1$3cardTagsix_cardTags_tagCard4 2 1!1cardTagsix_cardTags_cardId4 2#fieldModels2-fieldsix_fields_factId2 2# 9fieldsix_fields_fieldModelId2 1 +fieldsix_fields_value2 1 /factsix_facts_modified1 1% 7cardsix_cards_typeCombined2 2 1 1" 9cardsix_cards_relativeDelay2 2/cardsix_cards_modified2 2/cardsix_cards_priority2 2+cardsix_cards_factor2 2 1+cardsix_cards_factId2 2*9#cardsix_cards_intervalDesc22 2 2 1 1 1$-#cardsix_cards_dueAsc22 2 2 1 1 1'cardsix_cards_sort2 1#tagsix_tags_tag6 1  A5eEJbe9f? R9fB A ue9f? i99fB !!MOHn7indexix_cards_typeCombinedcards CREATE INDEX ix_cards_typeCombined on cards (type, combinedDue, factId)d9indexix_cards_relativeDelaycards"CREATE INDEX ix_cards_relativeDelay on cards (relativeDelay)T/qindexix_cards_modifiedcards#CREATE INDEX ix_cards_modified on cards (modified)T/qindexix_facts_modifiedfacts$CREATE INDEX ix_facts_modified on facts (modified)T/qindexix_cards_prioritycards%CREATE INDEX ix_cards_priority on cards (priority)T+uindexix_cards_factorcards&CREATE INDEX ix_cards_factor on cards (type, factor)N+iindexix_cards_factIdcards'CREATE INDEX ix_cards_factId on cards (factId)S-qindexix_stats_typeDaystats(CREATE INDEX ix_stats_typeDay on stats (type, day)R-mindexix_fields_factIdfields)CREATE INDEX ix_fields_factId on fields (factId)e9indexix_fields_fieldModelIdfields*CREATE INDEX ix_fields_fieldModelId on fields (fieldModelId)O +iindexix_fields_valuefields+CREATE INDEX ix_fields_value on fields (value)   R9fB  i99fB A!zXOR9fBA!zXOi99fB A!s17e9f?  R9fB i99fB  @R9fB @i99fB e9f? R9fBe9f? i99fBoZE0qaQA1!qaQA1! !2008-06-149 !2008-06-138 !2008-06-127 !2008-06-116 !2008-06-075 !2008-06-064 !2008-06-053 !2008-06-032 !2008-06-021 !2008-06-010 !2008-05-31/ !2008-05-30. !2008-05-25- !2008-05-23, !2008-05-22+ !2008-05-21* !2008-05-20) !2008-05-19( !2008-05-17' !2008-05-16& !2008-05-15% !2008-05-14$ !2008-05-13# !2008-05-06" !2008-05-02! !2008-04-30  !2008-04-29 !2008-04-28 !2008-04-26 !2008-04-24 !2008-04-21 !2008-04-16 !20 !2012-08-29k !2012-07-11: !2012-05-21 !2012-04-03 !2012-02-15 !2011-12-20x~ !2011-10-30H} !2011-09-08| !2011-07-14{ !2011-04-30z !2011-02-28y !2010-12-29Xx !2010-04-21(w !2010-02-28v !2009-12-29u !2009-08-12t !2008-08-24gs !2008-06-064 e9f? (n9f? e9f? 69f? kQ(n9f? jO69f? +Mβάτραχος, βατράχι(n9f? frog (2)69f?  ^?o=0l%9%inde(9Yindexix_cards_intervalDesc2cards4CREATE INDEX ix_cards_intervalDesc2 ona!7indexix_media_originalPathmedia,CREATE INDEX ix_media_originalPath on media (originalPath)k"9%indexix_cardsDeleted_cardIdcardsDeleted.CREATE INDEX ix_cardsDeleted_cardId on cardsDeleted (cardId)r#=' indexix_modelsDeleted_modelIdmodelsDeleted/CREATE INDEX ix_modelsDeleted_modelId on modelsDeleted (modelId)k$9%indexix_factsDeleted_factIdfactsDeleted0CREATE INDEX ix_factsDeleted_factId on factsDeleted (factId)l%9%indexix_mediaDeleted_factIdmediaDeleted1CREATE INDEX ix_mediaDeleted_factId on mediaDeleted (mediaId)d&3indexix_cardTags_tagCardcardTags2CREATE INDEX ix_cardTags_tagCard on cardTags (tagId, cardId)Z'1uindexix_cardTags_cardIdcardTags3CREATE INDEX ix_cardTags_cardId on cardTags (cardId)(9Yindexix_cards_intervalDesc2cards4CREATE INDEX ix_cards_intervalDesc2 on cards (type, priority desc, interval desc, factId, combinedDue)     R9fB  i99fBi99fBR9fB  R9fB R9fB i99fB  i99fB ( @$v!(e9f? A ui99fB( @Pβάτραχος, βατράχιR9fB;mfrog (2)i99fB  -PriorityVeryHigh# PriorityLow%PriorityHigh'Front-to-back broken'Back-to-front LR_&y?L7 ! 2008-03-30/@{f <@t.@ A ! 2008-03-28@jc@' K < !2008-03-27@nXe@+Ԍ S $ 7  ! 2008-03-262@#pq@{L# 8  !2008-03-25J@$^g@%JI$8  !2008-03-24;@ͮ8f'G@y/*: 7  ! 2008-03-22I@Ć,@.y #8  !2008-03-20;@#>O8d@#ێ9 7 ! 2008-03-19&@2[ukZ@:,  6 ! 2008-03-18@UUUU@AͰ9 !2008-03-17@$"'>@<3 .> !2008-03-07@ wυ!@"W pY5"E/> !2008-03-06@"@7DG #' )3 !   2008-03-05@& 8@6 8" !2012-10-24S!2008-03-05"@"Ll0A-@R:(e` S4bZ SKT[%S:  !2008-04-30@%d5@@opi 9:" !2008-04-298 !2008-04-28o@ $Mۜ@t16 ! 2008-04-26 @'8|q@Z?4 ! 2008-04-24@'<@M8 !2008-04-21w@sw=@ @> ! 2008-04-16@,|O@0iG͑'8 ! 2008-04-15w@ÎU=@*XP(7C !2008-04-14v@rO@V(E m39@ , A !2008-04-09@ia8@^|  >= !2008-04-08@@̓ J: ! 2008-04-07@f#@ߴ7 ! 2008-04-04;@"X}/@?- 2 !  2008-04-03@0GX@0GX= ! 2008-04-016@!v@&.XH@ ! 2008-03-31 @Y"@^; O2 < >Kg'v8z>:0 ! 2008-06-01:@gi@w¼  9/ !  2008-05-31N@2N4@y"Y  2A. ! 2008-05-30+@ ?.ޤ@錥+0Z  0>- !  2008-05-25@ EE@p#! <<, !2008-05-23]@"kJr@Q` &  6+ !  2008-05-22@*H>;@`L &UU:* ! 2008-05-21I@!Md b@wyn;) !  2008-05-20@)v@gw4# >( ! 2008-05-19 @333@ozS` B' ! 2008-05-17@V^@gZ@ K$ 'V7& !2008-05-16,@6ebOG@;Kt;  "% !2008-05-15A$ !  2008-05-14@m@q^7@h/s9?# !2008-05-13\@ }ɡ@)JfA 8" !  2008-05-06X@x@Sƒ  8! !2008-05-025@"Q`&:@aV@ Wb*L UWA@ !  2008-06-22@@R O=;? !   2008-06-21@7IYW@ )SP qz;> !   2008-06-20@2 C6@ŭ-/ n@?= !2008-06-198@.(HJ@?c#? 8< ! 2008-06-18f@@k:>; !    2008-06-17-@"4F@lb]''{% 8: ! 2008-06-15t@\{@7   *6A9 !2008-06-14+@'@;3/8 ?8 ! 2008-06-13@>v@Ja187 ! 2008-06-12@~N@~N$ 9"6 !2008-06-11=5 ! 2008-06-07O@uq䨁@j|K   64 !2008-06-06@ b@a <3 ! 2008-06-05@ 8@[_  ; "2 !2008-06-03:1 ! 2008-06-02@@,W|@z%ff( *LT_!o*CP !  2008-07-12b@z@` {l)B 0Yf"!%7O !2008-07-11J@2"@hL#6N !2008-07-10#@<}ꃨ;@q@ ?M ! 2008-07-08@Ϣ"@؞ 5J K !  2008-07-06@&u@X$H ;J !  2008-07-05@S0Ԍ@V4 b' =I !  2008-07-04@۩W@e>) 7H !  2008-07-03@|b@aqaAG !2008-07-02g@uB2@YbW%%* >F ! 2008-07-01@[}DS@lCl .#8E !2008-06-30@B}r3@:_Bh 9D !2008-06-26@;N@c9 :C ! 2008-06-25m@!_V@oO'@=B !2008-06-24@s9@ڰD$ *g7A !   2008-06-23`@n@>K4%= FNh/r9jF"a !  2008-08-05"` !2008-08-045_ !2008-07-31@;M---@]_ ;^ ! 2008-07-29V@\A}@|w@* 5] !  2008-07-28@.@cm7\ ! 2008-07-261@$=9x@s?- <[ !  2008-07-25h@@7@f"O.  >Z !   2008-07-24@!@]?,#.i+=Y ! 2008-07-23J@*jj-@KU<, Xp -"7X !2008-07-22X@"i@3E-7W !2008-07-20T@5n@X@ ,:V ! 2008-07-19@OX @eUUU Rr9U !2008-07-17@}@T! I4T !2008-07-16@r@2V 4@עL,6$ !   2009-09-03X@Cg.@W?&8# !  2009-09-02g@Yݡ^r@PW <:" !2009-09-01g@JT^"@69! !   2009-08-31a@p@I@ 86  !  2009-08-26H@ q@@6 !   2009-08-25Z@hO@e`": ! 2009-08-23&@gN\M@'RPM;6 ! 2009-08-22@`@`17 ! 2009-08-17=@!{;@ " !2009-08-169 ! 2009-08-15@ E@d07 !  2009-08-14]@7 @$@"" !2009-08-128 ! 2009-08-11@ H@@+*98 ! 2009-08-10@,L@C43 OK[j-O96 !   2009-11-06W@!ya|@  "5 !2009-11-04:4 !  2009-10-31h@=;@b 9 =3 !  2009-09-28@a7)@Q@ :2 !  2009-09-20f@@b 5:1 !  2009-09-17@g-@_2c90 !  2009-09-16i@菱 @09/ !   2009-09-15b@xm@a2  ,9. !  2009-09-13q@izV@v  A9- ! 2009-09-12g@y顎@>;9, !   2009-09-11@z@ٻ`5K8+ ! 2009-09-10`@@׺̠ 2:* !   2009-09-09@j@ĵ P?*;:) !   2009-09-08@ @V@"V9( ! 2009-09-07`@M ]*@ȅ-9' ! 2009-09-06b@cN^@u`> MRe)w9M9F !   2009-12-27c@ u3@v. 7E !  2009-12-26Q@=n@;% 7D ! 2009-12-25@؞@fv~  9C ! 2009-12-22<@Ov"""@v`j~! ;B ! 2009-12-21@(s81@E ! G9A ! 2009-12-200@1UUU@rۀ7@ !   2009-12-196@kT/@r߀9? !    2009-12-13@%ɀ`@!`%= 9> !2009-12-08!@ @t8= ! 2009-11-250@UUU@r$9< ! 2009-11-241@g1N^ @r|  9; ! 2009-11-19_@(@w@`*7: !  2009-11-166@+)[ @{-@  79 !  2009-11-10@X^󻻼@f78 !   2009-11-09R@ @} 77 ! 2009-11-07/@~Σg}@r"  ?H _"m2?=V ! 2010-01-24@_@-ޫ&9: 9U ! 2010-01-23?@׏@v1 8T !  2010-01-21A@P3Jԭ@vt 9S !  2010-01-20d@FG@E`#'8R !  2010-01-19:@$@vap@  ^@C  GI [d'G;f ! 2010-02-10r@Gk@ <1 ;e ! 2010-02-09p@zI%@w@ (" p ! 2010-02-20@'Wl@ V 0!;o ! 2010-02-19=@[0C%@v&=n ! 2010-02-18@ Yu@"i  !2010-03-13@/@MҠ>- > !2010-03-11@ ˭@| +-< ! 2010-03-10@@<#@6E0W;> !2010-03-09 @To n@)d@ (rK< ! 2010-03-08@=g@ *8- ;~ ! 2010-03-07l@\ {@ݸC,$<} !  2010-03-06@5UUU@q  #e,:| !  2010-03-05@O!P@5@@F:<{ !   2010-03-04@._@@G$ ;z !   2010-03-02@H\@Rt@ +m* !  2010-03-27@@[m@m0:^ : ! 2010-03-26,@G@s-@ 9 !   2010-03-255@y}@rs<@ ?  ! 2010-03-24@ +|l@6; :  !   2010-03-23@͂D@9@'( <  ! 2010-03-22x@/ """@  8?  !2010-03-21@:dG@HQ =  ! 2010-03-20@@'$2= ! 2010-03-19w@ !2010-08-06"= !2010-08-03"< !2010-07-257; !  2010-07-11/@^@ne΀8: ! 2010-07-08.@zo@n'`(99 !2010-07-067@@p@sP@ 98 !2010-07-03@@ب@rب 77 !  2010-07-01[@@; 196 !2010-06-27R@)D@zV%N585 !  2010-05-23G@=h@yqx@ 84 !2010-05-19 @@m  Fz@Ul1F7V !  2010-12-270@iѪ@r]@ 8U ! 2010-12-26#@!)iB@rK@8T !2010-12-225@r!5!@rۀ 8S ! 2010-12-21R@@~S /8R !2010-12-152@G@rE 7Q ! 2010-12-148@jFm@r%7P ! 2010-12-11)@ _81@iz8O ! 2010-12-081@)9x*@nu`? 7N ! 2010-12-054@v'b@r]%7M ! 2010-12-04@ag9t@f|8L ! 2010-11-30@Ψa@^'=7K ! 2010-11-297@a@se 9J ! 2010-11-28B@Me@vr $7I ! 2010-11-27@؝@f "H !2010-10-03"G !2010-09-129F !2010-08-24@^fff@f  ^N`;M^9f ! 2011-01-12I@N7@z%6 9e ! 2011-01-11a@PyFDZ@@"8d ! 2011-01-10?@,@v;c 9c ! 2011-01-09"@*@g`C 9b !2011-01-08E@E@z+t8a !   2011-01-07k@Ix9k@ƨ . 9` !  2011-01-06P@tR333@}ӑf8_ ! 2011-01-05C@jj.@z!"^ !2011-01-049] !2011-01-03@b)JS@g 8\ !  2011-01-02;@Lx@vf 8[ !2011-01-013@Y@r 9Z !  2010-12-31f@ꆰ@T@ 8Y ! 2010-12-30"@xZZZ@n 8X ! 2010-12-29:@m(ܱ@z9W ! 2010-12-28y@YA7@ƨ`+ KL\#s7K8v ! 2011-02-06<@H@v9u !2011-02-05)@ORWj%@m!8t !2011-01-30 @@n 7s ! 2011-01-29.@1a7@nwt  9r ! 2011-01-28*@UUU@n9q !2011-01-26*@<@n7p !  2011-01-25\@򤅐@ff@/ 7o !  2011-01-23G@$ͅ@zG.h#6n !  2011-01-22=@X)qO@z7m !   2011-01-20K@X`Ǯ{@z/j ":l ! 2011-01-19@(@IC;9k !2011-01-189@Hf >@vz@:j !  2011-01-17@&%+@l /9i ! 2011-01-16c@.^@/ 9h ! 2011-01-15d@Tfff@  / 9g ! 2011-01-13J@`h@zRi@  8Qj1]!r87 !   2011-02-27O@ qk@~Y8#7 ! 2011-02-26;@h3IA@r 8 ! 2011-02-25Y@%{@}@+7 ! 2011-02-24:@#Os@r! 9 ! 2011-02-23k@3d@@88 ! 2011-02-22<@ =p@v 7 !  2011-02-20K@kX@~Ԓ"" !2011-02-197 ! 2011-02-17T@2^a@~r& 6~ !   2011-02-16Q@ @~.8(6} !  2011-02-15>@32@vzI 7| !  2011-02-14d@zH@0`)17{ ! 2011-02-13&@5@lq 7z !2011-02-12T@)z@+\# 8y !2011-02-107@A*@rz@6x !   2011-02-09A@ֵ н@z>c@!8w !2011-02-081@xW/9@mU  ^Lb=Q^: ! 2011-03-23n@I@s'#: ! 2011-03-22K@Ӡm@w k : ! 2011-03-21C@9P=@vG 9 !  2011-03-163@\@m놀9 !  2011-03-15 @h@fh8 !   2011-03-14d@((@o`)6 !  2011-03-13F@m@z]`' 9 !  2011-03-12I@#@z/" !2011-03-117 !   2011-03-10/@Urb @r  8  ! 2011-03-095@y}@r@  8  ! 2011-03-083@₂@rA 7  !  2011-03-074@^v'b@m^68  !   2011-03-06Q@) @z7@ 9  ! 2011-03-03N@#\@zJ  : ! 2011-02-28@m4M@SM0`!F# <O]i-w<8' !   2011-04-10"@Zո@f  9& !  2011-04-089@H7@nap;% ! 2011-04-07E@r;\@rۀ  9$ !   2011-04-051@6w/9@sM^{@ 9# !   2011-04-04T@<@za9" !    2011-04-03E@հk@zb  :! !  2011-04-02b@{dZƇ@xՀ:  !  2011-04-01A@%-@t-; !  2011-03-31g@b2|E@fl+8 !   2011-03-303@r@rB9 !  2011-03-29V@[/@ "< !2011-03-28^@ @&+ 9 !  2011-03-27D@^@z9 : !   2011-03-26u@Fa^@nU* 5 ! 2011-03-25 @q@M @9 !  2011-03-249@:c@vA@   AKVx9A<7 !  2011-04-28v@W;8h@O   ;6 ! 2011-04-27]@<$@~Q+ ;5 !  2011-04-26w@_h߻)@ ŀ"  :4 !  2011-04-251@n@m <3 ! 2011-04-24d@LW@~'H   "2 !2011-04-23<1 ! 2011-04-22X@,+.@z\k :0 !   2011-04-20M@hP@v@ :/ ! 2011-04-19>@z+x1@rZ  9. !  2011-04-180@DDF@nffi  <- ! 2011-04-16l@Y) {@ۥ`%:, !  2011-04-157@j@sC1 :+ !   2011-04-14<@M|DDD@sHԀ :* !   2011-04-13;@ib@r&@  9) !  2011-04-124@+@rӱO 9( ! 2011-04-11;@|V<@q;c  U_"n1n0zU"H !2011-06-06;G ! 2011-05-31@iOS@1vɀ 1 9F !2011-05-264@aVv'b@r  9E ! 2011-05-241@Z@r| ;D !2011-05-19o@'5 @ř3:C !2011-05-16Y@b@p  ! "B !2011-05-14"A !2011-05-139@ ! 2011-05-12C@ ORݜ@z7  :? !  2011-05-11[@ 2*@ `  9> ! 2011-05-10A@)z@v(  9= ! 2011-05-09C@|1@v~@  9< !  2011-05-08=@&ͤ@v, :; ! 2011-05-07x@q@&": !2011-05-03:9 ! 2011-05-01*@I$@o <8 !  2011-04-30@9@""! CM^!m0~C8X !  2011-06-269@T(# @r| 9W !  2011-06-25Q@1) @}'7"8V !  2011-06-24N@4H@}n(8U !  2011-06-23D@w!_KKK@~>u@ :T ! 2011-06-21@&Hs@ge 9S !   2011-06-20x@<@E*8R !  2011-06-18L@E`A yC@|bM@%:Q !  2011-06-17W@.*{@~'x :P !  2011-06-15R@V81@~9l 9O ! 2011-06-14X@.@~7N !  2011-06-132@bh@rDG:M !  2011-06-12m@w@! 9L !  2011-06-11b@_5n@  8K !  2011-06-10S@6C@z77L@8J ! 2011-06-09%@t@n47:I !2011-06-07-@X3Vfff@n1  2_#J]"o2:i ! 2011-07-16-@1r@rd[9h !  2011-07-14J@@v^5 &9g ! 2011-07-133@PPP@rS8f !   2011-07-127@/@r@ 8e !  2011-07-11*@ <=@n@}P  8d !   2011-07-10g@^VU O@x08c !   2011-07-09W@, Rd@z(9b !  2011-07-08x@P@&68a !  2011-07-07A@ s;@y( 9` !   2011-07-06:@˽,#O@rأ@ "_ !2011-07-059^ !   2011-07-04B@@vw!S 9] !  2011-07-03O@-]@~c/9\ ! 2011-07-02B@9,_|@~"  8[ !  2011-07-01.@@r7K@ >Z !2011-06-29@o@'9 "Y !2011-06-28 HEH OH?x ! 2011-08-03@{8L@0 Bb@w !2011-08-02@ݵл@.! >v !  2011-08-01@ Vǘ@[I& >u ! 2011-07-31@5[@k!0V% >t ! 2011-07-30@&)& H@p $`3 9s !   2011-07-293@@rƒ:r !  2011-07-26J@&6)@wL/G  ! 2011-08-21@{@z )\0 > !2011-08-20@zW~@t`F!> !2011-08-19t@*p=@v #< ! 2011-08-17@뮻@ܡʠ$T"> ! 2011-08-16@*e@ ? > ! 2011-08-15@Ͱ@M9 H > ! 2011-08-14@ 7\@7w6  > ! 2011-08-13@AwD@ 9+ < ! 2011-08-11G@S @v >~ ! 2011-08-10V@K% 0@}   >} !2011-08-08@v8@- >, =| ! 2011-08-07@ }@;;+ ?{ ! 2011-08-06@Ga@@Q$ !2011-09-05@ M;O@'@ (!  = !2011-09-04s@:(@!  @ ! 2011-09-03+@UX/@cfl&> ; !  2011-09-02@@hh@vhh  ? !2011-09-01@-"@P \? = !  2011-08-31@7OMV@ӛY [0 > ! 2011-08-30@\"@7 t7  > !  2011-08-29@K[@@  `) > !2011-08-28@W k@ X3  ?  ! 2011-08-27@i0)-{t@i` W)>  ! 2011-08-26@Nl@  :$ ?  !2011-08-25@+%e@ - /7  ?  ! 2011-08-24@Ϙd@h&  G" ?  !2011-08-23@ -u@_ V3> ! 2011-08-22@^@4w6'  @~=y8u9}@:% ! 2011-09-225@}@s @ :$ !  2011-09-211@qN^ @r ! 2011-09-15"@)>@?` .w5 > !  2011-09-14@F@9I= !  2011-09-13@ؾ~@)f A ? !2011-09-12@I_ץ@X W% ? ! 2011-09-11#@2^!n@| ){H > !  2011-09-10K@%z @ /0 %3" ? ! 2011-09-08@+CN^@5p  *G = !2011-09-06Z@q@  :If${9y:<5 !2011-10-08@%)%h}@3ixY. ;4 ! 2011-10-07@$s@:h9E" <3 !2011-10-06@(Hj@  p .? @2 !2011-10-05@)G9@ D' ?1 ! 2011-10-04@&#'@` b; @0 ! 2011-10-03@'}n[@( MY "/ !2011-10-02>. ! 2011-10-01@'R@|H)D ?- !2011-09-30@(ںQ@q:R%  ?, !2011-09-29@)A @ևP5f! "+ !2011-09-28>* ! 2011-09-27m@%!!i@ =psqI 8) ! 2011-09-26+@&8jk)@}- <( !2011-09-25Y@%P sb@l  :' ! 2011-09-24;@&]/@r^@  8& ! 2011-09-23!@@E@fw  HCHNH;E !2011-10-27o@'QL@W  > ! 2011-10-18@*]@aʐ.<#7= ! 2011-10-17@-vKKK@o=< !  2011-10-15O@f@{ <; !2011-10-14@&:bv'@Y: 34 <: !2011-10-13@(B(@9X 90 :9 !2011-10-12{@%_j%w@%0 &" <8 !2011-10-11@%)=@ @G(@ 8/<7 !2011-10-10@#ޫ@M072   <6 !2011-10-09@(ݻ[@{<.  0v6|>v7q0>W !2011-11-14@+2'=p@?/ %$""V !2011-11-13"U !2011-11-12;T !2011-11-11]@+ yH@ ;S !2011-11-10Y@,x@W    0"H !2011-10-30"G !2011-10-29=F !2011-10-28K@'ۿLg@0 XQ4  ICEk,nI"h !2011-12-03@g> "] !2011-11-21"\ !2011-11-19;[ !2011-11-18O@'e? @  ;Z !2011-11-17j@%{geo@ʊ=   ]8\7"z !2011-12-226y !   2011-12-21@#W yC@ghsd9 ! 2012-01-19@*H>@nN9  !  2012-01-18@,tR@;gw&:  ! 2012-01-17@2TKM@6EH$"  !2012-01-169  !  2012-01-15t@6x#Os@|0"  !2012-01-14: ! 2012-01-13@1h*@RjX P" !2012-01-11" !2012-01-10" !2012-01-08" !2012-01-07" !2012-01-06" !2012-01-05" !2012-01-04" !2012-01-03" !2012-01-028~ ! 2011-12-31&@@kc "} !2011-12-26:| ! 2011-12-24B@%1E@{[*  7{ ! 2011-12-237@$=X@ UO[ h-zU" !2012-02-059 !2012-02-04`@ L/UU@rG79 ! 2012-02-03b@1rP4?@ C7 8 ! 2012-02-02W@%f@b;e- 8 !  2012-02-01b@$m@d" ?  : ! 2012-01-31@(E'@33 Z ; ! 2012-01-30@+^?Euuu@, c: !2012-01-29@.ueTI@eJ8 !2012-01-284@1 m@" : ! 2012-01-27@.c]5@ڿ|y : ! 2012-01-26@2O#@nh( [I m0zU[8> ! 2012-03-08k@(f@.*9= !2012-03-07n@"}Xo@0>< ! 2012-03-06@)L{}Og@z5Y##?; ! 2012-03-05@'UU@ɺ8 N:": !2012-03-0499 !2012-03-03W@<@Ƙ #;8 !  2012-03-02@%؃쎕@BF" 97 !2012-03-01Y@*G@|}0! :6 !2012-02-29@,kW@y 6 " :5 !2012-02-28@%Y({@ d( ;4 ! 2012-02-27@+D@h| d 3"3 !2012-02-2692 !  2012-02-25~@,hm@2 7':1 !2012-02-24u@%ҩz@\`5 :0 !2012-02-23@%Cd@?`C'$:/ !2012-02-22@%,@`0E( +O\ AP+"O !2012-03-258N ! 2012-03-24|@2{@A'0 :M !2012-03-23@*fs@R3) :L !2012-03-22@'kQB/@4#9K !2012-03-21n@%o@k 1;J ! 2012-03-20@)lbm@=p O*=I ! 2012-03-19 @(f@ ` nC"H !2012-03-189G !2012-03-17l@6mUUU@k29F !2012-03-16g@'Z3V@P"#:E !2012-03-15@1'.@a+( O!9D !2012-03-14p@){$I@a I- :C ! 2012-03-13@*mH4@:Ƙ H":B !2012-03-12@'{@>c@6A !2012-03-11@*'UUU@t@9@ !2012-03-10|@#C@x> 9? ! 2012-03-09}@#GX9X@Ӭ (- -Jq4Di-9` !2012-04-11j@++x5@ 9_ !2012-04-10i@,V\@>@# 8^ !2012-04-09w@*km@ ,. <] ! 2012-04-08@#UB@c  Q? "\ !2012-04-078[ !2012-04-06d@,kN@4$ݐ+ 9Z !2012-04-05\@&i@S$ 9Y !2012-04-04~@&J]v@I@.) :X !2012-04-03@(M <@e8 WD:W !2012-04-02@&VbHq4@]&fP=% .$"V !2012-04-019U ! 2012-03-31x@(a@ۗP0 9T ! 2012-03-30w@&&@`1'p)# 9S !2012-03-29e@, 'Ŵ@9W :R !2012-03-28@1(@(59Q !2012-03-27c@!jMe@P`&  :P ! 2012-03-26@*VK[_@x gB .D_e(k.:p ! 2012-04-27@0@b%8?==o !2012-04-26@1L@) 34=n !2012-04-25@-&rn@K&f F) :m !2012-04-24@.M:@Ox2< :l ! 2012-04-23@(JjS@G`56 :k !2012-04-22@0 @DVp-@:j !2012-04-21@*LA]@aRD =i !2012-04-20@-Ƭ0!5@n  ?7=h !2012-04-19@*]@0 FB=g !2012-04-18@&-H@cSA-=f !2012-04-17@0O>@M= M  =e !2012-04-16@(ٝz@= TN "d !2012-04-15=c !2012-04-14@+@Z\@_ E-=b !2012-04-13@,^`@8 (B9a !2012-04-12i@&r֍i@ I " TKn1~BT9 !2012-05-13F@+~+@JI 6 ! 2012-05-12@2/@y@ 9~ !2012-05-11{@1zy@1H0:} ! 2012-05-10@, ~@K%< 9| !2012-05-09s@&w>T@/p,(8{ ! 2012-05-08j@*Jv9@@0 9z !2012-05-07u@(Gq@1ƨ.9y ! 2012-05-06i@4|׸@h% :x !2012-05-05@/333@ OP%8 ;w ! 2012-05-04@#AHN+@)*+:v ! 2012-05-03@+Y$i@ D_%"u !2012-05-02:t !  2012-05-01@*Z {@˓t*3 :s !2012-04-30@,,-%@&`bZ8r ! 2012-04-29-@'5UUU@ :q ! 2012-04-28@!Ԑſ@CS0*O /H MZ k/9 !2012-05-30c@&Ԕ W@j9 !2012-05-29c@(Ocd6@9 !2012-05-28o@*-G@1 : !2012-05-27@'c@"`=(7  !2012-05-26@$x@dx9  !2012-05-25L@)w(k@>"Ѐ9  !2012-05-24g@*Yz@$;  !2012-05-23@)2@U_ :  !2012-05-22@& a@l` /U 8 ! 2012-05-21w@/|@zG +,7 ! 2012-05-20*@0ޥ<@9" !2012-05-19" !2012-05-189 !2012-05-17n@* O!@p#; ! 2012-05-16z@)_GX@/`): !2012-05-15@.S?|@S?| 1": !2012-05-14@+F: @ _b Bb&i.o2~B9! ! 2012-06-15@(O@6(9  !2012-06-14t@0'?Xa@G"а"!9 !2012-06-13{@(,rx(@;$9 !2012-06-12y@"=(2@I-: ! 2012-06-11@)#@2ڟ?C> !2012-06-10@'K8@z `Q < !2012-06-09A@(vE܎@n  < !2012-06-08r@#S!# @6 =p#8 ! 2012-06-07~@$4M@>w0$): ! 2012-06-06q@(5U@^  = ! 2012-06-05@$8# @S@/-= !2012-06-04'@&f.l@`( oK#!9 !  2012-06-039@5`5 @ " !2012-06-02: ! 2012-06-01{@'#@0P *9 !2012-05-31q@$@)ff@) _GQu8_81 ! 2012-07-01=@- }@RI  "0 !2012-06-309/ !2012-06-29k@)u| @H}+ :. !2012-06-28@)q\@L̀4%:- !  2012-06-27w@(TI%@ʮ%:, !2012-06-26@%m@M05+:+ !2012-06-25@.@…@|)x uD 3"* !2012-06-24:) !  2012-06-23@'@-#1:( !2012-06-22@'fy@QW O!# :' !2012-06-21@& q@l0 H""9& ! 2012-06-20@'r;UUU@?+=% !2012-06-19@/_:@[;dPhJ#6$ !    2012-06-18@5UU@wƧ =# !2012-06-17@$d```@M=P8& =" !2012-06-16@'4-,I$@ahp * bER`;b9A !2012-07-18z@*D:@ q2;@ !2012-07-17@)J6k @ ` A,7? ! 2012-07-16.@!FQ8@y "> !2012-07-15"= !2012-07-149< !2012-07-13m@&6U@-@4 :; !2012-07-12@&?g@(P< :: !2012-07-11@'–"@u06' 99 !2012-07-10|@)[B)J@pH :8 !2012-07-09@%&2@@GK:7 !2012-07-08@0hLj%w@9 Y96 !2012-07-07~@$Ȣ)@t3}X"v !2012-09-099u !2012-09-08}@#zH@I . 9t !2012-09-07c@%$@$ ;s !2012-09-06@%o@`I >r ! 2012-09-05Y@,2aG@;dX .=q ! 2012-09-04@-ݛ@9DU H"p !2012-09-03"o !2012-09-02=n ! 2012-09-01/@2 ~J@Y<( sA ;;m !2012-08-31@- @@g28l !  2012-08-30@0 X]@6E1T"k !2012-08-29"j !2012-08-28"i !2012-08-27"h !2012-08-26:g ! 2012-08-25k@*;@@`"9f !2012-08-24a@&W@BA( 9e !2012-08-23c@%]F@ UEn1 SzU" !2012-09-26= !2012-09-25@@)`@%b<oG 5;6 !  2012-09-24@+ek[@{"" !2012-09-238 ! 2012-09-22@9a@h ; !2012-09-21@,F-@%h); !2012-09-20v@-$sh@I} : !2012-09-19@%n@b` , -" !2012-09-18:~ !2012-09-17@/j_@x8 J5} !   2012-09-16@,@s@"| !2012-09-15:{ !2012-09-14@0\H\r@gh` @(:z !2012-09-13@'*@M<#9y !2012-09-12v@$Cu' @?M02;x ! 2012-09-11@&.em3@{P=>w !2012-09-100@(5# y@o <0 CJm1[hC" !2012-10-138 ! 2012-10-12s@&BU8@O0*; !2012-10-11@0E#|3@C x: ! 2012-10-10@&ф@>jxj1: !2012-10-09@&(7E@cK V(: !2012-10-08@(%@B6I V8<57 ! 2012-10-07@& r@pV " !2012-10-067 !2012-10-05*@- -@  9 !2012-10-04y@%Z.@r49@)# : !2012-10-03@)!@P 8F ;"  !2012-10-02>  !2012-10-01C@'q޶@YpQ%7  !  2012-09-30@#ݙq@p :  !2012-09-29@+n@eI ,& 9  !2012-09-28R@*m~Wj@-%  : !2012-09-27 @.%f@v{%0 b=" !2012-10-23: !2012-10-18@%Lcq@ S%:" !2012-10-179 !2012-10-16t@%㧹a@NP= : !2012-10-15&@* z@bMg- U"" !2012-10-14 2 0@P`p 0@P`p 0@P`p! 2008-03-05 !2008-03-05 !2008-03-06 !2008-03-07 !2008-03-17 !2008-03-18! 2008-03-05 !2008-03-05 !2008-03-06 !2008-03-07 !2008-03-17 !2008-03-18 !2008-03-19 !2008-03-20  !2008-03-22  !2008-03-24  !2008-03-25  !2008-03-26  !2008-03-27 !2008-03-28 !2008-03-30 !2008-03-31 !2008-04-01 !2008-04-03 !2008-04-04 !2008-04-07 !2008-04-08 !2008-04-09 !2008-04-14 !2008-04-15 !2008-04-16 !2008-04-21 !2008-04-24 !2008-04-26 !2008-04-28 !2008-04-29 !2008-04-30  !2008-05-02! !2008-05-06" !2008-05-13# !2008-05-14$ !2008-05-15% !2008-05-16& !2008-05-17' !2008-05-19( !2008-05-20) !2008-05-21* !2008-05-22+ !2008-05-23, !2008-05-25- !2008-05-30. !2008-05-31/ !2008-06-010 !2008-06-021 !2008-06-032 !2008-06-053 2 0@P`p 0@P`p 0@P`p !2008-06-075 !2008-06-116 !2008-06-127 !2008-06-138 !2008-06-149 !2008-06-15: !2008-06-075 !2008-06-116 !2008-06-127 !2008-06-138 !2008-06-149 !2008-06-15: !2008-06-17; !2008-06-18< !2008-06-19= !2008-06-20> !2008-06-21? !2008-06-22@ !2008-06-23A !2008-06-24B !2008-06-25C !2008-06-26D !2008-06-30E !2008-07-01F !2008-07-02G !2008-07-03H !2008-07-04I !2008-07-05J !2008-07-06K !2008-07-07L !2008-07-08M !2008-07-10N !2008-07-11O !2008-07-12P !2008-07-13Q !2008-07-14R !2008-07-15S !2008-07-16T !2008-07-17U !2008-07-19V !2008-07-20W !2008-07-22X !2008-07-23Y !2008-07-24Z !2008-07-25[ !2008-07-26\ !2008-07-28] !2008-07-29^ !2008-07-31_ !2008-08-04` !2008-08-05a !2008-08-07b !2008-08-11c !2008-08-15d !2008-08-17e !2008-08-23f 0(8HXhx(8HXhy#4EVgx !2 !2 !2008-08-25h !2008-08-26i !2008-08-27j !2008-09-06k !2008-09-07l !2008-09-24m !2 !2008-08-25h !2008-08-26i !2008-08-27j !2008-09-06k !2008-09-07l !2008-09-24m !2008-09-27n !2008-10-07o !2008-10-19p !2008-11-01q !2008-11-04r !2008-11-08s !2008-11-12t !2008-11-14u !2008-12-16v !2008-12-17w !2008-12-20x !2008-12-22y !2008-12-23z !2008-12-24{ !2008-12-26| !2008-12-27} !2008-12-29~ !2009-02-04 !2009-02-11 !2009-02-12 !2009-02-13 !2009-02-14 !2009-02-15 !2009-02-19 !2009-04-18 !2009-06-04 !2009-06-30 !2009-07-12 !2009-07-13 !2009-07-16 !2009-07-17 !2009-07-18 !2009-07-24 !2009-07-30 !2009-07-31 !2009-08-01 !2009-08-02 !2009-08-03 !2009-08-07 !2009-08-09 !2009-08-10 !2009-08-11 /%6GXiz$5FWhy#4EVgx !2009-08-14 !2009-08-15 !2009-08-16 !2009-08-17 !2009-08-22 !2009-08-23 !2009-08-14 !2009-08-15 !2009-08-16 !2009-08-17 !2009-08-22 !2009-08-23 !2009-08-25 !2009-08-26 !2009-08-31 !2009-09-01 !2009-09-02 !2009-09-03 !2009-09-04 !2009-09-05 !2009-09-06 !2009-09-07 !2009-09-08 !2009-09-09 !2009-09-10 !2009-09-11 !2009-09-12 !2009-09-13 !2009-09-15 !2009-09-16 !2009-09-17 !2009-09-20 !2009-09-28 !2009-10-31 !2009-11-04 !2009-11-06 !2009-11-07 !2009-11-09 !2009-11-10 !2009-11-16 !2009-11-19 !2009-11-24 !2009-11-25 !2009-12-08 !2009-12-13 !2009-12-19 !2009-12-20 !2009-12-21 !2009-12-22 !2009-12-25 !2009-12-26 !2009-12-27 !2009-12-28 /%6GXiz$5FWhy#4EVgx !2009-12-31 !2010-01-01 !2010-01-03 !2010-01-05 !2010-01-06 !2010-01-11 !2009-12-31 !2010-01-01 !2010-01-03 !2010-01-05 !2010-01-06 !2010-01-11 !2010-01-13 !2010-01-14 !2010-01-17 !2010-01-19 !2010-01-20 !2010-01-21 !2010-01-23 !2010-01-24 !2010-01-26 !2010-01-27 !2010-01-28 !2010-01-29 !2010-01-30 !2010-01-31 !2010-02-01 !2010-02-02 !2010-02-03 !2010-02-04 !2010-02-05 !2010-02-06 !2010-02-07 !2010-02-08 !2010-02-09 !2010-02-10 !2010-02-11 !2010-02-12 !2010-02-13 !2010-02-14 !2010-02-15 !2010-02-16 !2010-02-17 !2010-02-18 !2010-02-19 !2010-02-20 !2010-02-21 !2010-02-22 !2010-02-23 !2010-02-24 !2010-02-25 !2010-02-26 !2010-02-27 /%6GXiz$5FWhy#4EVgx !2010-03-01 !2010-03-02 !2010-03-04 !2010-03-05 !2010-03-06 !2010-03-07 !2010-03-01 !2010-03-02 !2010-03-04 !2010-03-05 !2010-03-06 !2010-03-07 !2010-03-08 !2010-03-09 !2010-03-10 !2010-03-11 !2010-03-13 !2010-03-14 !2010-03-15 !2010-03-16 !2010-03-17 !2010-03-19 !2010-03-20  !2010-03-21  !2010-03-22  !2010-03-23  !2010-03-24  !2010-03-25 !2010-03-26 !2010-03-27 !2010-03-28 !2010-03-29 !2010-03-30 !2010-03-31 !2010-04-01 !2010-04-02 !2010-04-03 !2010-04-04 !2010-04-05 !2010-04-06 !2010-04-07 !2010-04-08 !2010-04-09 !2010-04-10 !2010-04-11 !2010-04-13  !2010-04-14! !2010-04-15" !2010-04-16# !2010-04-17$ !2010-04-18% !2010-04-19& !2010-04-20' /%6GXiz$5FWhy#4EVgx !2010-04-22) !2010-04-23* !2010-04-24+ !2010-04-25, !2010-04-26- !2010-04-27. !2010-04-22) !2010-04-23* !2010-04-24+ !2010-04-25, !2010-04-26- !2010-04-27. !2010-04-28/ !2010-05-140 !2010-05-151 !2010-05-162 !2010-05-183 !2010-05-194 !2010-05-235 !2010-06-276 !2010-07-017 !2010-07-038 !2010-07-069 !2010-07-08: !2010-07-11; !2010-07-25< !2010-08-03= !2010-08-06> !2010-08-11? !2010-08-15@ !2010-08-17A !2010-08-19B !2010-08-21C !2010-08-22D !2010-08-23E !2010-08-24F !2010-09-12G !2010-10-03H !2010-11-27I !2010-11-28J !2010-11-29K !2010-11-30L !2010-12-04M !2010-12-05N !2010-12-08O !2010-12-11P !2010-12-14Q !2010-12-15R !2010-12-21S !2010-12-22T !2010-12-26U !2010-12-27V !2010-12-28W /%6GXiz$5FWhy#4EVgx !2010-12-30Y !2010-12-31Z !2011-01-01[ !2011-01-02\ !2011-01-03] !2011-01-04^ !2010-12-30Y !2010-12-31Z !2011-01-01[ !2011-01-02\ !2011-01-03] !2011-01-04^ !2011-01-05_ !2011-01-06` !2011-01-07a !2011-01-08b !2011-01-09c !2011-01-10d !2011-01-11e !2011-01-12f !2011-01-13g !2011-01-15h !2011-01-16i !2011-01-17j !2011-01-18k !2011-01-19l !2011-01-20m !2011-01-22n !2011-01-23o !2011-01-25p !2011-01-26q !2011-01-28r !2011-01-29s !2011-01-30t !2011-02-05u !2011-02-06v !2011-02-08w !2011-02-09x !2011-02-10y !2011-02-12z !2011-02-13{ !2011-02-14| !2011-02-15} !2011-02-16~ !2011-02-17 !2011-02-19 !2011-02-20 !2011-02-22 !2011-02-23 !2011-02-24 !2011-02-25 !2011-02-26 !2011-02-27 /%6GXiz$5FWhy#4EVgx !2011-03-03 !2011-03-06 !2011-03-07 !2011-03-08 !2011-03-09 !2011-03-10 !2011-03-03 !2011-03-06 !2011-03-07 !2011-03-08 !2011-03-09 !2011-03-10 !2011-03-11 !2011-03-12 !2011-03-13 !2011-03-14 !2011-03-15 !2011-03-16 !2011-03-21 !2011-03-22 !2011-03-23 !2011-03-24 !2011-03-25 !2011-03-26 !2011-03-27 !2011-03-28 !2011-03-29 !2011-03-30 !2011-03-31 !2011-04-01 !2011-04-02 !2011-04-03 !2011-04-04 !2011-04-05 !2011-04-07 !2011-04-08 !2011-04-10 !2011-04-11 !2011-04-12 !2011-04-13 !2011-04-14 !2011-04-15 !2011-04-16 !2011-04-18 !2011-04-19 !2011-04-20 !2011-04-22 !2011-04-23 !2011-04-24 !2011-04-25 !2011-04-26 !2011-04-27 !2011-04-28 /%6GXiz$5FWhy#4EVgx !2011-05-01 !2011-05-03 !2011-05-07 !2011-05-08 !2011-05-09 !2011-05-10 !2011-05-01 !2011-05-03 !2011-05-07 !2011-05-08 !2011-05-09 !2011-05-10 !2011-05-11 !2011-05-12 !2011-05-13 !2011-05-14 !2011-05-16 !2011-05-19 !2011-05-24 !2011-05-26 !2011-05-31 !2011-06-06 !2011-06-07 !2011-06-09 !2011-06-10 !2011-06-11 !2011-06-12 !2011-06-13 !2011-06-14 !2011-06-15 !2011-06-17 !2011-06-18 !2011-06-20 !2011-06-21 !2011-06-23 !2011-06-24 !2011-06-25 !2011-06-26 !2011-06-28 !2011-06-29 !2011-07-01 !2011-07-02 !2011-07-03 !2011-07-04 !2011-07-05 !2011-07-06 !2011-07-07 !2011-07-08 !2011-07-09 !2011-07-10 !2011-07-11 !2011-07-12 !2011-07-13 /%6GXiz$5FWhy#4EVgx !2011-07-16 !2011-07-17 !2011-07-18 !2011-07-19 !2011-07-21 !2011-07-22 !2011-07-16 !2011-07-17 !2011-07-18 !2011-07-19 !2011-07-21 !2011-07-22 !2011-07-23 !2011-07-24 !2011-07-25 !2011-07-26 !2011-07-29 !2011-07-30 !2011-07-31 !2011-08-01 !2011-08-02 !2011-08-03 !2011-08-04 !2011-08-05 !2011-08-06 !2011-08-07 !2011-08-08 !2011-08-10 !2011-08-11 !2011-08-13 !2011-08-14 !2011-08-15 !2011-08-16 !2011-08-17 !2011-08-19 !2011-08-20 !2011-08-21 !2011-08-22 !2011-08-23  !2011-08-24  !2011-08-25  !2011-08-26  !2011-08-27  !2011-08-28 !2011-08-29 !2011-08-30 !2011-08-31 !2011-09-01 !2011-09-02 !2011-09-03 !2011-09-04 !2011-09-05 !2011-09-06 /%6GXiz$5FWhy#4EVgx !2011-09-10 !2011-09-11 !2011-09-12 !2011-09-13 !2011-09-14 !2011-09-15 !2011-09-10 !2011-09-11 !2011-09-12 !2011-09-13 !2011-09-14 !2011-09-15 !2011-09-16 !2011-09-17  !2011-09-18! !2011-09-19" !2011-09-20# !2011-09-21$ !2011-09-22% !2011-09-23& !2011-09-24' !2011-09-25( !2011-09-26) !2011-09-27* !2011-09-28+ !2011-09-29, !2011-09-30- !2011-10-01. !2011-10-02/ !2011-10-030 !2011-10-041 !2011-10-052 !2011-10-063 !2011-10-074 !2011-10-085 !2011-10-096 !2011-10-107 !2011-10-118 !2011-10-129 !2011-10-13: !2011-10-14; !2011-10-15< !2011-10-17= !2011-10-18> !2011-10-19? !2011-10-20@ !2011-10-21A !2011-10-22B !2011-10-23C !2011-10-25D !2011-10-27E !2011-10-28F !2011-10-29G /%6GXiz$5FWhy#4EVgx !2011-10-31I !2011-11-01J !2011-11-02K !2011-11-03L !2011-11-04M !2011-11-05N !2011-10-31I !2011-11-01J !2011-11-02K !2011-11-03L !2011-11-04M !2011-11-05N !2011-11-06O !2011-11-07P !2011-11-08Q !2011-11-09R !2011-11-10S !2011-11-11T !2011-11-12U !2011-11-13V !2011-11-14W !2011-11-15X !2011-11-16Y !2011-11-17Z !2011-11-18[ !2011-11-19\ !2011-11-21] !2011-11-22^ !2011-11-23_ !2011-11-24` !2011-11-25a !2011-11-27b !2011-11-28c !2011-11-29d !2011-11-30e !2011-12-01f !2011-12-02g !2011-12-03h !2011-12-04i !2011-12-05j !2011-12-06k !2011-12-07l !2011-12-08m !2011-12-09n !2011-12-11o !2011-12-12p !2011-12-13q !2011-12-14r !2011-12-15s !2011-12-16t !2011-12-17u !2011-12-18v !2011-12-19w /%6GXiz$5FWhy#4EVgx !2011-12-21y !2011-12-22z !2011-12-23{ !2011-12-24| !2011-12-26} !2011-12-31~ !2011-12-21y !2011-12-22z !2011-12-23{ !2011-12-24| !2011-12-26} !2011-12-31~ !2012-01-02 !2012-01-03 !2012-01-04 !2012-01-05 !2012-01-06 !2012-01-07 !2012-01-08 !2012-01-10 !2012-01-11 !2012-01-13 !2012-01-14 !2012-01-15 !2012-01-16 !2012-01-17 !2012-01-18 !2012-01-19 !2012-01-20 !2012-01-21 !2012-01-23 !2012-01-24 !2012-01-25 !2012-01-26 !2012-01-27 !2012-01-28 !2012-01-29 !2012-01-30 !2012-01-31 !2012-02-01 !2012-02-02 !2012-02-03 !2012-02-04 !2012-02-05 !2012-02-06 !2012-02-07 !2012-02-08 !2012-02-09 !2012-02-10 !2012-02-11 !2012-02-12 !2012-02-13 !2012-02-14 /%6GXiz$5FWhy#4EVgx !2012-02-16 !2012-02-17 !2012-02-18 !2012-02-19 !2012-02-20 !2012-02-21 !2012-02-16 !2012-02-17 !2012-02-18 !2012-02-19 !2012-02-20 !2012-02-21 !2012-02-22 !2012-02-23 !2012-02-24 !2012-02-25 !2012-02-26 !2012-02-27 !2012-02-28 !2012-02-29 !2012-03-01 !2012-03-02 !2012-03-03 !2012-03-04 !2012-03-05 !2012-03-06 !2012-03-07 !2012-03-08 !2012-03-09 !2012-03-10 !2012-03-11 !2012-03-12 !2012-03-13 !2012-03-14 !2012-03-15 !2012-03-16 !2012-03-17 !2012-03-18 !2012-03-19 !2012-03-20 !2012-03-21 !2012-03-22 !2012-03-23 !2012-03-24 !2012-03-25 !2012-03-26 !2012-03-27 !2012-03-28 !2012-03-29 !2012-03-30 !2012-03-31 !2012-04-01 !2012-04-02 /%6GXiz$5FWhy#4EVgx !2012-04-04 !2012-04-05 !2012-04-06 !2012-04-07 !2012-04-08 !2012-04-09 !2012-04-04 !2012-04-05 !2012-04-06 !2012-04-07 !2012-04-08 !2012-04-09 !2012-04-10 !2012-04-11 !2012-04-12 !2012-04-13 !2012-04-14 !2012-04-15 !2012-04-16 !2012-04-17 !2012-04-18 !2012-04-19 !2012-04-20 !2012-04-21 !2012-04-22 !2012-04-23 !2012-04-24 !2012-04-25 !2012-04-26 !2012-04-27 !2012-04-28 !2012-04-29 !2012-04-30 !2012-05-01 !2012-05-02 !2012-05-03 !2012-05-04 !2012-05-05 !2012-05-06 !2012-05-07 !2012-05-08 !2012-05-09 !2012-05-10 !2012-05-11 !2012-05-12 !2012-05-13 !2012-05-14 !2012-05-15 !2012-05-16 !2012-05-17 !2012-05-18 !2012-05-19 !2012-05-20 1%6GXiz$5FWhy#4EVgx !2012-05-28 !2012-05-29 !2012-05-30 !2012-05-31 !2012-05-22  !2012-05-23  !2012-05-24  !2012-05-25  !2012-05-26  !2012-05-27 !2012-05-28 !2012-05-29 !2012-05-30 !2012-05-31 !2012-06-01 !2012-06-02 !2012-06-03 !2012-06-04 !2012-06-05 !2012-06-06 !2012-06-07 !2012-06-08 !2012-06-09 !2012-06-10 !2012-06-11 !2012-06-12 !2012-06-13 !2012-06-14  !2012-06-15! !2012-06-16" !2012-06-17# !2012-06-18$ !2012-06-19% !2012-06-20& !2012-06-21' !2012-06-22( !2012-06-23) !2012-06-24* !2012-06-25+ !2012-06-26, !2012-06-27- !2012-06-28. !2012-06-29/ !2012-06-300 !2012-07-011 !2012-07-022 !2012-07-033 !2012-07-054 !2012-07-065 !2012-07-076 !2012-07-087 !2012-07-098 !2012-07-109 0%6GXiz$5FWhy#4EVgx !2012-07-22E !2012-07-23F !2012-07-24G !2012-07-25H !2012-07-26I !2012-07-12; !2012-07-13< !2012-07-14= !2012-07-15> !2012-07-16? !2012-07-17@ !2012-07-18A !2012-07-19B !2012-07-20C !2012-07-21D !2012-07-22E !2012-07-23F !2012-07-24G !2012-07-25H !2012-07-26I !2012-07-27J !2012-07-28K !2012-07-29L !2012-07-30M !2012-07-31N !2012-08-01O !2012-08-02P !2012-08-03Q !2012-08-04R !2012-08-05S !2012-08-06T !2012-08-07U !2012-08-08V !2012-08-09W !2012-08-10X !2012-08-11Y !2012-08-12Z !2012-08-13[ !2012-08-14\ !2012-08-15] !2012-08-16^ !2012-08-17_ !2012-08-18` !2012-08-19a !2012-08-20b !2012-08-21c !2012-08-22d !2012-08-23e !2012-08-24f !2012-08-25g !2012-08-26h !2012-08-27i !2012-08-28j 4%6GXiz$5FWhy#4EVgx{ !2012-10-10 !2012-10-24 !2012-10-23 !2012-10-18 !2012-10-17 !2012-10-16 !2012-10-15 !2012-10-14 !2012-10-13 !2012-10-12 !2012-08-30l !2012-08-31m !2012-09-01n !2012-09-02o !2012-09-03p !2012-09-04q !2012-09-05r !2012-09-06s !2012-09-07t !2012-09-08u !2012-09-09v !2012-09-10w !2012-09-11x !2012-09-12y !2012-09-13z !2012-09-14{ !2012-09-15| !2012-09-16} !2012-09-17~ !2012-09-18 !2012-09-19 !2012-09-20 !2012-09-21 !2012-09-22 !2012-09-23 !2012-09-24 !2012-09-25 !2012-09-26 !2012-09-27 !2012-09-28 !2012-09-29 !2012-09-30 !2012-10-01 !2012-10-02 !2012-10-03 !2012-10-04 !2012-10-05 !2012-10-06 !2012-10-07 !2012-10-08 !2012-10-09 !2012-10-10 !2012-10-11 '?.  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspendLeeches1 sortIndex0pageSize4096e?hexCache{"7714278139299660113": "6b0e9f187f848151", "-3196723299912220334": "d3a2f5187f848152", "7691030065441964367": "6abc07187f84814f", "2342550310125601108": "208269187f848154", "-2642164819234094769": "db5525187f84814f"}D}cssCache.fm6abc07187f84814f {font-family:"Arial";font-size:25px;color:#000000;white-space:pre-wrap;} .fm6b0e9f187f848151 {font-family:"Arial";font-size:25px;color:#000000;white-space:pre-wrap;} #cmqd3a2f5187f848152 {text-align:center;} #cmq208269187f848154 {text-align:center;} #cmad3a2f5187f848152 {text-align:center;} #cma208269187f848154 {text-align:center;} .cmbd3a2f5187f848152 {background:#ffffff;} .cmb208269187f848154 {background:#ffffff;} !revSpacing0.1 [?- )mobileScalePad1.21' mediaLocation)latexPost\end{document}"9latexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \begin{document} *E`* 3##eviewacqCardsNewacqCardsNewCREATE VIEW acqCardsNew as select * from cards where type = 2 and isDue = 1 order by priority desc, due desc2##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, due /##eviewrevCardsNewrevCardsNewCREATE VIEW revCardsNew as select * from cards where type = 1 and isDue = 1 order by priority desc, interval0##[viewrevCardsDuerevCardsDueCREATE VIEW revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, due1))yviewrevCardsRandomrevCardsRandomCREATE VIEW revCardsRandom as select * from cards where type = 1 and isDue = 1 order by priority desc, factId, ordinalanki-2.0.20+dfsg/tests/support/diffmodels1.anki0000644000175000017500000011500012042736010021157 0ustar andreasandreasSQLite format 3@ M4N -ML1E.@*;&6"0*&#!       BB;''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) ) 39M'indexsqlite_autoindex_reviewHistory_1reviewHistoryJktablesourcessourcesCREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) )  " !2012-10-27"!2012-10-27"newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, PRIMARY KEY (id) ) {tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL,   `tablemediamedia CREATE TABLE media ( id INTEGER NOT NULL, filename TEXT NOT NULL, size INTEGER NOT NULL, created FLOAT NOT NULL, "originalPath" TEXT NOT NULL, description TEXT NOT NULL, PRIMARY KEY (id) ) /ۂՆE  A"#VA")BasicBasic?< ,,k]tablemodelsmodels CREATE TABLE models ( id INTEGER NOT NULL, "deckId" INTEGER, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, features TEXT NOT NULL, spacing FLOAT NOT NULL, "initialSpacing" FLOAT NOT NULL, source INTEGER NOT NULL, PRIMARY KEY (id) )r7tabledeckVarsdeckVarsCREATE TABLE "deckVars" ( "key" TEXT NOT NULL, value TEXT, PRIMARY KEY ("key") )Is !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspeHG uj\L=/) suspendLeeches sortIndex!revSpacing #revInactive revActive perDay pageSize!newSpacing#newInactive newActive mediaURL !leechFails latexPre latexPost hexCache cssCache @@q<q Atable/Cindexsqlite_autoindex_deckVars_1deckVars !!tablecardModelscardModelsCREATEq AtabledecksdecksCREATE TABLE decks ( id INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, description TEXT NOT NULL, version INTEGER NOT NULL, "currentModelId" INTEGER, "syncName" TEXT, "lastSync" FLOAT NOT NULV ##stablefieldModelsfieldModelsCREATE TABLE "fieldModels" ( id INTEGER NOT NULL, or eՆF  l:EForward%(Front)s%(Back)sArial#000000Arial#000000Arial#FFFFFF TABLE "cardModels" ( id INTEGER NOT NULL, ordinal INTEGER NOT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, active BOOLEAN NOT NULL, qformat TEXT NOT NULL, aformat TEXT NOT NULL, lformat TEXT, qedformat TEXT, aedformat TEXT, "questionInAnswer" BOOLEAN NOT NULL, "questionFontFamily" TEXT, "questionFontSize" INTEGER, "questionFontColour" VARCHAR(7), "questionAlign" INTEGER, "answerFontFamily" TEXT, "answerFontSize" INTEGER, "answerFontColour" VARCHAR(7), "answerAlign" INTEGER, "lastFontFamily" TEXT, "lastFontSize" INTEGER, "lastFontColour" VARCHAR(7), "editQuestionFontFamily" TEXT, "editQuestionFontSize" INTEGER, "editAnswerFontFamily" TEXT, "editAnswerFontSize" INTEGER, "allowEmptyAnswer" BOOLEAN NOT NULL, "typeAnswer" TEXT NOT NULL, PRIMARY KEY (id), CHECK (active IN (0, 1)), CHECK ("questionInAnswer" IN (0, 1)), CHECK ("allowEmptyAnswer" IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) ) y%   -%#   A"A"*Al:E?񙙙 XPriorityVeryHighPriorityHighPriorityLowXL, "hardIntervalMin" FLOAT NOT NULL, "hardIntervalMax" FLOAT NOT NULL, "midIntervalMin" FLOAT NOT NULL, "midIntervalMax" FLOAT NOT NULL, "easyIntervalMin" FLOAT NOT NULL, "easyIntervalMax" FLOAT NOT NULL, delay0 INTEGER NOT NULL, delay1 INTEGER NOT NULL, delay2 FLOAT NOT NULL, "collapseTime" INTEGER NOT NULL, "highPriority" TEXT NOT NULL, "medPriority" TEXT NOT NULL, "lowPriority" TEXT NOT NULL, suspended TEXT NOT NULL, "newCardOrder" INTEGER NOT NULL, "newCardSpacing" INTEGER NOT NULL, "failedCardMax" INTEGER NOT NULL, "newCardsPerDay" INTEGER NOT NULL, "sessionRepLimit" INTEGER NOT NULL, "sessionTimeLimit" INTEGER NOT NULL, "utcOffset" FLOAT NOT NULL, "cardCount" INTEGER NOT NULL, "factCount" INTEGER NOT NULL, "failedNowCount" INTEGER NOT NULL, "failedSoonCount" INTEGER NOT NULL, "revCount" INTEGER NOT NULL, "newCount" INTEGER NOT NULL, "revCardOrder" INTEGER NOT NULL, PRIMARY KEY (id), FOREIGN KEY("currentModelId") REFERENCES models (id) ) $聓ՆE l:EFrontArial1#ՆF  l:EBackArial1dinal INTEGER NOT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, features TEXT NOT NULL, required BOOLEAN NOT NULL, "unique" BOOLEAN NOT NULL, numeric BOOLEAN NOT NULL, "quizFontFamily" TEXT, "quizFontSize" INTEGER, "quizFontColour" VARCHAR(7), "editFontFamily" TEXT, "editFontSize" INTEGER, PRIMARY KEY (id), CHECK (numeric IN (0, 1)), CHECK ("unique" IN (0, 1)), CHECK (required IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) )   4 '''tablemodelsDeletedmodelsDeletedCREATE TABLE "modelsDeleted" ( "modelId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("modelId") REFERENCES models (id) )& +tablefactsfactsCREATE TABLE facts ( id INTEGER NOT NULL, "modelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, "spaceUntil" TEXT NOT NULL, "lastCardId" INTEGER, PRIMARY KEY (id), FOREIGN KEY("modelId") REFERENCES models (id) ) *Ն !l:EA"ޜeA"3front back Ն 5:2Б:FbackՆ5:M :Efront 8KtablefieldsfieldsCREATE TABLE fields ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "fieldModelId" INTEGER NOT NULL, ordinal INTEGER NOT NULL, value TEXT NOT NULL, PRIMARY KEY (id), FOREIGN KEY("fieldModelId") REFERENCES "fieldModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) ) 22CΎՆN' ge5::FA"ޜeA"ffrontbackA"ޜe@@A"ޜe rval FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, due FLOAT NOT NULL, "lastDue" FLOAT NOT NULL, factor FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "firstAnswered" FLOAT NOT NULL, reps INTEGER NOT NULL, successive INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, "yesCount" INTEGER NOT NULL, "noCount" INTEGER NOT NULL, "spaceUntil" FLOAT NOT NULL, "relativeDelay" FLOAT NOT NULL, "isDue" BOOLEAN NOT NULL, type INTEGER NOT NULL, "combinedDue" INTEGER NOT NULL, PRIMARY KEY (id), CHECK ("isDue" IN (0, 1)), FOREIGN KEY("cardModelId") REFERENCES "cardModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) ) 5ItablecardscardsCREATE TABLE cards ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "cardModelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, ordinal INTEGER NOT NULL, question TEXT NOT NULL, answer TEXT NOT NULL, priority INTEGER NOT NULL, inte &ݻ:"fA"}Z:]A"ܜ O.%%tablefactsDeletedfactsDeleted"CREATE TABLE "factsDeleted" ( "factId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("factId") REFERENCES facts (id) ).%%tablecardsDeletedcardsDeleted$CREATE TABLE "cardsDeleted" ( "cardId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("cardId") REFERENCES cards (id) )  a:*A")۲h/):DA":"XA"ه@  \0%%#tablemediaDeletedmediaDeleted%CREATE TABLE "mediaDeleted" ( "mediaId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("mediaId") REFERENCES cards (id) ) tabletagstags'CREATE TABLE tags ( id integer not null, tag text not null collate nocase, priority integer not null default 2, primary key(id))!tablecardTagscardTags(CREATE TABLE cardTags ( id integer not null, cardId integer not null, tagId integer not null, src integer not null, primary key(id))  Forward Basic-PriorityVeryHigh%PriorityHigh# PriorityLow 8q:N 8q:NK|P3lN)#9fieldsix_fields_fieldModelId2 1 +fieldsix_fields_value2 1 /factsix_facts_modified1 1% 7cardsix_cards_typeCombined1 1 1 1" 9cardsix_cards_relativeDelay1 1 /cardsix_cards_modified1 1/cardsix_cards_priority1 1+cardsix_cards_factor1 1 1+cardsix_cards_factId1 1*9#cardsix_cards_intervalDesc21 1 1 1 1 1$-#cardsix_cards_dueAsc21 1 1 1 1 1'cardsix_cards_sort1 1)%9cardsDeletedix_cardsDeleted_cardId3 1#tagsix_tags_tJ 11~TK%%[tablesqlite_stat1sqlite_stat1)CREATE TABLE sqlite_stat1(tbl,idx,stat)n7indexix_cards_typeCombinedcards+CREATE INDEX ix_cards_typeCombined on cards (type, combinedDue, factId)d9indexix_cards_relativeDelaycards,CREATE INDEX ix_cards_relativeDelay on cards (relativeDelay)T/qindexix_cards_modifiedcards-CREATE INDEX ix_cards_modified on cards (modified)T/qindexix_facts_modifiedfacts.CREATE INDEX ix_facts_modified on facts (modified) A"ޜe5:8q:N  8q:N A"f8q:N A"35:  8q:N [[WNT/qindexix_cards_prioritycards/CREATE INDEX ix_cards_priority on cards (priority)T+uindexix_cards_factorcards1CREATE INDEX ix_cards_factor on cards (type, factor)N+iindexix_cards_factIdcards2CREATE INDEX ix_cards_factId on cards (factId)S-qindexix_stats_typeDaystats3CREATE INDEX ix_stats_typeDay on stats (type, day)R-mindexix_fields_factIdfields4CREATE INDEX ix_fields_factId on fields (factId) @8q:N 5:8q:N  !2012-10-27! 2012-10-27 5:_:5:ˣ: M :Eˣ:2Б:F_: xx0$k"9%indexix_cardsDeleted_cardIdcardsDeleted9CREATE INDEX ix_cardsDeleted_cardIde9indexix_fields_fieldModelIdfields5CREATE INDEX ix_fields_fieldModelId on fields (fieldModelId)O +iindexix_fields_valuefields7CREATE INDEX ix_fields_value on fields (value)a!7indexix_media_originalPathmedia8CREATE INDEX ix_media_originalPath on media (originalPath)k"9%indexix_cardsDeleted_cardIdcardsDeleted9CREATE INDEX ix_cardsDeleted_cardId on cardsDeleted (cardId) frontˣ:back_:   /):D  :"X  a:*  KK,l%9%r#=' indexix_modelsDeleted_modelIdmodelsDeleted:CREATE INDEX ix_modelsDeleted_modelId on modelsDeleted (modelId)k$9%indexix_factsDeleted_factIdfactsDeletedCREATE INDEX ix_cardTags_tagCard on cardTags (tagId, cardId)   Z:] &ݻ:"f  8q:N  8q:N  8q:N  8q:N ;;(x)-Z'1uindexix_cardTags_cardIdcardTags?CREATE INDEX ix_cardTags_cardId on cardTags (cardId)(9Yindexix_cards_intervalDesc2cardsACREATE INDEX ix_cards_intervalDesc2 on cards (type, priority desc, interval desc, factId, combinedDue)x)-9indexix_cards_dueAsc2cardsBCREATE INDEX ix_cards_dueAsc2 on cards (type, priority desc, due, factId, combinedDue)\*'indexix_cards_sortcardsCCREATE INDEX ix_cards_sort on cards (question collate nocase) !5:A"ޜe8q:N )A"ޜe5:A"ޜe8q:N 8gfront8q:N  33k[+/indexix_media_filenamemediaDCREATE UNIQUE INDEX ix_media_filename on media (filename)H,#gindexix_tags_tagtagsFCREATE UNIQUE INDEX ix_tags_tag on tags (tag)-##gviewfailedCardsfailedCardsCREATE VIEW failedCards as select * from cards where type = 0 and isDue = 1 order by type, isDue, combinedDue.##oviewrevCardsOldrevCardsOldCREATE VIEW revCardsOld as select * from cards where type = 1 and isDue = 1 order by priority desc, interval desc -PriorityVeryHigh# PriorityLow%PriorityHigh Forward Basic s !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspendLeeches1 8ehexCache{"3661586178059337542": "32d0913aa1b4ff46", "-8256200675311681723": "8d6c153aa1b4ff45", "1045839219487211334": "e83913aa1b4ff46", "5593480884619902789": "4da0093aa1b4ff45"}& AcssCache.fm32d0913aa1b4ff46 {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm4da0093aa1b4ff45 {font-family:"Arial";font-size:20px;white-space:pre-wrap;} #cmqe83913aa1b4ff46 {text-align:center;} #cmae83913aa1b4ff46 {text-align:center;} .cmbe83913aa1b4ff46 {background:#FFFFFF;} pageSize4096 sortIndex0 )|P3lN)#9fieldsix_fields_fieldModelId2 1 +fieldsix_fields_value2 1 /factsix_facts_modified1 1% 7cardsix_cards_typeCombined1 1 1 1" 9cardsix_cards_relativeDelay1 1 /cardsix_cards_modified1 1/cardsix_cards_priority1 1+cardsix_cards_factor1 1 1+cardsix_cards_factId1 1*9#cardsix_cards_intervalDesc21 1 1 1 1 1$-#cardsix_cards_dueAsc21 1 1 1 1 1'cardsix_cards_sort1 1)%9cardsDeletedix_cardsDeleted_cardId3 1#tagsix_tags_tag5 1 wQ1 decks1)%9factsDeletedix_factsDeleted_factId2 1!cardModels1 media0+CdeckVarssqlite_autoindex_deckVars_116 1 models1'reviewHistory0-statsix_stats_typeDay2 1 1$3cardTagsix_cardTags_tagCard2 1 1!1cardTagsix_cardTags_cardId2 2 sources0%mediaDeleted0#fieldModels2'modelsDeleted0-fieldsix_fields_factId2 2 EE` /##eviewrevCardsNewrevCardsNewCREATE VIEW revCardsNew as select * from cards where type = 1 and isDue = 1 order by priority desc, interval0##[viewrevCardsDuerevCardsDueCREATE VIEW revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, due1))yviewrevCardsRandomrevCardsRandomCREATE VIEW revCardsRandom as select * from cards where type = 1 and isDue = 1 order by priority desc, factId, ordinal u 3##eviewacqCardsNewacqCardsNewCREATE VIEW acqCardsNew as select * from cards where type = 2 and isDue = 1 order by priority desc, due desc2##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, dueanki-2.0.20+dfsg/tests/support/anki2-alpha.anki20000644000175000017500000020000011755052155021141 0ustar andreasandreasSQLite format 3@ -   R#JaK %%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)H 'aindexix_notes_csumnotes CREATE INDEX ix_notes_csum on notes (csum)I 'aindexix_revlog_cidrevlog CREATE INDEX ix_revlog_cid on revlog (cid)U )yindexix_cards_schedcards CREATE INDEX ix_cards_sched on cards (did, queue, due)E %]indexix_cards_nidcards CREATE INDEX ix_cards_nid on cards (nid)I'aindexix_revlog_usnrevlog CREATE INDEX ix_revlog_usn on revlog (usn)E%]indexix_cards_usncardsCREATE INDEX ix_cards_usn on cards (usn)E%]indexix_notes_usnnotesCREATE INDEX ix_notes_usn on notes (usn)!tablegravesgravesCREATE TABLE graves ( usn integer not null, oid integer not null, type integer not null )ktablerevlogrevlogCREATE TABLE revlog ( id integer primary key, cid integer not null, usn integer not null, ease integer not null, ivl integer not null, lastIvl integer not null, factor integer not null, time integer not null, type integer not null )2CtablecardscardsCREATE TABLE cards ( id integer primary key, nid integer not null, did integer not null, ord integer not null, mod integer not null, usn integer not null, type integer not null, queue integer not null, due integer not null, ivl integer not null, factor integer not null, reps integer not null, lapses integer not null, left integer not null, edue integer not null, flags integer not null, data text not null )k5tablenotesnotesCREATE TABLE notes ( id integer primary key, guid text not null, mid integer not null, did integer not null, mod integer not null, usn integer not null, tags text not null, flds text not null, sfld integer not null, csum integer not null, flags integer not null, data text not null )wtablecolcolCREATE TABLE col ( id integer primary key, crt integer not null, mod integer not null, scm integer not null, ver integer not null, dty integer not null, usn integer not null, ls integer not null, conf text not null, models text not null, decks text not null, dconf text not null, tags text not null )  w !][6{"nextPos": 1, "estTimes": true, "sortBackwards": false, "sortType": "noteFld", "timeLim": 0, "activeDecks": [1], "curDeck": 1, "collapseTime": 1200, "dueCounts": true, "curModel": null, "newSpread": 0}{}{"1": {"name": "Default", "usn": 0, "a 7?][O\06Q6{"nextPos": 2, "estTimes": true, "activeDecks": [1], "sortType": "noteFld", "timeLim": 0, "sortBackwards": false, "curDeck": 1, "newSpread": 0, "dueCounts": true, "curModel": "1331523425753", "collapseTime": 1200}{"1331523425752": {"vers": [], "tags": [], "flds": [{"size": 20, "name": "Text", "media": [], "rtl": false, "ord": 0, "font": "Arial", "sticky": false}], "latexPost": "\\end{document}", "id": "1331523425752", "mod": 1331523425, "name": "Cloze", "did": 1, "usn": -1, "req": [[0, "all", [], ["{{c1::"]], [1, "all", [], ["{{c2::"]], [2, "all", [], ["{{c3::"]], [3, "all 3Z !   I{@40:/o>Y6O]oehellohello ]   6O]oe    6#  6  6#  66#    6#  6 col1", [], ["{{c4::"]], [4, "all", [], ["{{c5::"]], [5, "all", [], ["{{c6::"]], [6, "all", [], ["{{c7::"]], [7, "all", [], ["{{c8::"]]], "cloze": true, "sortf": 0, "tmpls": [{"afmt": "{{cloze:1:Text}}", "name": "Cloze 1", "qfmt": "{{cloze:1:Text}}", "did": null, "ord": 0, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:2:Text}}", "name": "Cloze 2", "qfmt": "{{cloze:2:Text}}", "did": null, "ord": 1, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:3:Text}}", "name": "Cloze 3", "qfmt": "{{cloze:3:Text}}", "did": null, "ord": 2, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:4:Text}}", "name": "Cloze 4", "qfmt": "{{cloze:4:Text}}", "did": null, "ord": 3, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:5:Text}}", "name": "Cloze 5", "qfmt": "{{cloze:5:Text}}", "did": null, "ord": 4, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:6:Text}}", "name": "Cloze 6", "qfmt": "{{cloze:6:Text}}", "did": null, "ord": 5, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:7:Text}}", "name": "Cloze 7", "qfmt": "{{cloze:7:Text}}", "did": null, "ord": 6, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:8:Text}}", "name": "Cloze 8", "qfmt": "{{cloze:8:Text}}", "did": null, "ord": 7, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}], "latexPre": "\\documentclass[12pt]{article}\n\\special{papersize=3in,5in}\n\\usepackage{amssymb,amsmath}\n\\pagestyle{empty}\n\\setlength{\\parindent}{0in}\n\\begin{document}\n"}, "1331523425753": {"vers": [], "tags": [], "flds": [{"size": 20, "name": "Front", "media": [], "rtl": false, "ord": 0, "font": "Arial", "sticky": false}, {"size": 20, "name": "Back", "media": [], "rtl": false, "ord": 1, "font": "Arial", "sticky": false}], "latexPost": "\\end{document}", "id": "1331523425753", "mod": 1331523429, "name": "Basic", "did": 1, "usn": -1, "req": [[0, "all", [0], []]], "cloze": false, "sortf": 0, "tmpls": [{"afmt": "{{Front}}\n\n
\n\n{{Back}}", "name": "Forward", "qfmt": "{{Front}}", "did": null, "ord": 0, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n"}], "latexPre": "\\documentclass[12pt]{article}\n\\special{papersize=3in,5in}\n\\usepackage{amssymb,amsmath}\n\\pagestyle{empty}\n\\setlength{\\parindent}{0in}\n\\begin{document}\n"}}{"1": {"name": "Default", "usn": 0, "newToday": [0, 0], "lrnToday": [0, 0], "conf": 1, "revToday": [0, 0], "timeToday": [0, 0], "id": 1, "mod": 1331523425, "desc": ""}}{"1": {"name": "Default", "usn": 0, "lapse": {"leechFails": 8, "minInt": 1, "delays": [1, 10], "leechAction": 0, "mult": 0}, "rev": {"perDay": 100, "fuzz": 0.05, "fi": [10, 10], "ease4": 1.3, "order": 0, "minSpace": 1}, "timer": 0, "maxTaken": 60, "new": {"separate": true, "delays": [1, 10], "perDay": 20, "ints": [1, 4, 7], "initialFactor": 2500, "order": 1}, "cram": {"reset": true, "minInt": 1, "delays": [1, 5, 10], "resched": true, "mult": 0}, "autoplay": true, "id": 1, "mod": 0}}{}], ["{{c4::"]], [4, "all", [], ["{{c5::"]], [5, "all", [], ["{{c6::"]], [6, "all", [], ["{{c7::"]], [7, "all", [], ["{{c8::"]]], "cloze": true, "sortf": 0, "tmpls": [{"afmt": "{{cloze:1:Text}}", "name": "Cloze 1", "qfmt": "{{cloze:1:Text}}", "did": null, "ord": 0, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:2:Text}}", "name": "Cloze 2", "qfmt": "{{cloze:2:Text}}", "did": null, "ord": 1, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:3:Text}}", "name": "Cloze 3", "qfmt": "{{cloze:3:Text}}", "did": null, "ord": 2, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:4:Text}}", "name": "Cloze 4", "qfmt": "{{cloze:4:Text}}", "did": null, "ord": 3, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:5:Text}}", "name": "Cloze 5", "qfmt": "{{cloze:5:Text}}", "did": null, "ord": 4, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:6:Text}}", "name": "Cloze 6", "qfmt": "{{cloze:6:Text}}", "did": null, "ord": 5, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:7:Text}}", "name": "Cloze 7", "qfmt": "{{cloze:7:Text}}", "did": null, "ord": 6, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}, {"afmt": "{{cloze:8:Text}}", "name": "Cloze 8", "qfmt": "{{cloze:8:Text}}", "did": null, "ord": 7, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\n.cloze {\n font-weight: bold;\n color: blue;\n}"}], "latexPre": "\\documentclass[12pt]{article}\n\\special{papersize=3in,5in}\n\\usepackage{amssymb,amsmath}\n\\pagestyle{empty}\n\\setlength{\\parindent}{0in}\n\\begin{document}\n"}, "1331523425753": {"vers": [], "tags": [], "flds": [{"size": 20, "name": "Front", "media": [], "rtl": false, "ord": 0, "font": "Arial", "sticky": false}, {"size": 20, "name": "Back", "media": [], "rtl": false, "ord": 1, "font": "Arial", "sticky": false}], "latexPost": "\\end{document}", "id": "1331523425753", "mod": 1331523429, "name": "Basic", "did": 1, "usn": -1, "req": [[0, "all", [0], []]], "cloze": false, "sortf": 0, "tmpls": [{"afmt": "{{Front}}\n\n
\n\n{{Back}}", "name": "Forward", "qfmt": "{{Front}}", "did": null, "ord": 0, "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n"}], "latexPre": "\\documentclass[12pt]{article}\n\\special{papersize=3in,5in}\n\\usepackage{amssymb,amsmath}\n\\pagestyle{empty}\n\\setlength{\\parindent}{0in}\n\\begin{document}\n"}}{"1": {"name": "Default", "usn": 0, "newToday": [0, 0], "lrnToday": [0, 0], "conf": 1, "revToday": [0, 0], "timeToday": [0, 0], "id": 1, "mod": 1331523425, "desc": ""}}{"1": {"name": "Default", "usn": 0, "lapse": {"leechFails": 8, "minInt": 1, "delays": [1, 10], "leechAction": 0, "mult": 0}, "rev": {"perDay": 100, "fuzz": 0.05, "fi": [10, 10], "ease4": 1.3, "order": 0, "minSpace": 1}, "timer": 0, "maxTaken": 60, "new": {"separate": true, "delays": [1, 10], "perDay": 20, "ints": [1, 4, 7], "initialFactor": 2500, "order": 1}, "cram": {"reset": true, "minInt": 1, "delays": [1, 5, 10], "resched": true, "mult": 0}, "autoplay": true, "id": 1, "mod": 0}}{}anki-2.0.20+dfsg/tests/support/update2.apkg0000644000175000017500000000611112225675305020344 0ustar andreasandreasPKhfCm collection.anki2oHhيӺm[!E2j$u[ 1R ήgg%Q 45C. ǜzH^s* -4E{of{;tI'\"fR\z0Jyy&)3]R.?/AanZi3˩ʯ+?T4;ߧށ&9~:wj…$F 2A lyo憱ykhEa5ޯ=5|8ܦI<եD͝6~b ʸ.M5 ˼˱qUJU|{S ~"6u̸J4.ڎ]345iXr;;J3T'N4 x\:Bщ̤A.T'(ѓH9W; Ztaf5 ~23}GVO]rg @P 2VӽI|`Is. AAAA/)ko?\:[^es@5^[vn kV(~()Z#A%r[7>u}ُQ(H 0ATOuhQ:f25l4WךՕs݈]+ʉKl c=_:'Taa/S^&e;6P EUjߪC02[6j +VfZ]duR}d8ǥR!Y!<3H] %vi_XVn2 F۶q/^B R'd7YF$]h{?jU>Kƒt]QcӁWxYD``,M_jH!cVUN*ij'?рFLFGd0HE/3!ng2r4V>e@(gf`D-n]au(})URWU`Y.aA*T-챞X7: ;^Ťioۑxp==l\gؿN^|t\;zsss8_Md qvvItI#< Ar=T 3F2Vmz6Q٣6Z2v?U[KԠbxOH2?QYsSh`;l.'EHaj7ھM$ʈ=ՃNF< x89{rxtPKhfCCmediaPKhfCm collection.anki2PKhfCC mediaPKq anki-2.0.20+dfsg/tests/support/diffmodels2-2.apkg0000644000175000017500000000616212042746222021335 0ustar andreasandreasPK[Ai collection.anki2o$Gg֞ݱ7^dE3(b73~FzaIXFBUMw͸rW @ (R.H\ācN\@ !N\PDgvOޫWޫ7^$Z^0r ;{27 ;ߟgz[ܙ|jCA?ΜdMm2遐Ls7_Y]Y[Vn Ml{eZc2gk=kI.L˷V5ԕv/MO 4| ˌJW5耪+e ߜ>=0& 06gꀺԥv޴̲^_XoպVtzRV W w#'nT:`axpzfEТ zbi5EΌa&v!Ӆ3O<UhEy:NQv~ZP0+yXs;]V&S4gsJ=#Q5艈YxAVZ"xYEC/憁DDxD.W,%0Nr"rhE$"g_D?6|E&~ؼ%3ӏo߲YȤsL?Z6kl2 0dH'jQQT6(mA}L9]|lnwB))yvlΞfߕ21sQH2 gz:$r!v#DX%b\~u*}#߱9cnvhDDkm8z C/Sv3$a^tH]LnlZ}#267l/sEAqs& |X|unί}?? K.A庾u Ρ۶Yj|@m%t[ZJiy7;`X4ozWK4eVR\ZZVs:(]פZp5s,[դ#*   8N oG    cTq*AAAg/_AAAAf&& O{5+/    N\nldp ݶ  krWŠ&o[nhzF[*k%(յZR) o+[&{m3,:s.ǚ0^5(vcvZQʹLs; ^(5QO3, *eQ5mїWLS{@da\1o$߻ Uhp,Zy+%jW*KKK5atF邁 Wk[̱n]2jR+U+VrVۭk ִax݄bܴiIMq<8h.pD*%\& ն\͒"u E,l39B 0g &,=b@\2I_FYݓ4a^ [UQ< $ W}48y!N ?&7U Bvmr]ZGzךiaVn_%)ɤL꧞L ZjoJl3Ddw 3Ԃh35B 6O!^ـBCWŸxMٽߤ?}%6qq6?l  G'G3zaIWI,-b[> s/WY%n3Cq5dl\2i9Cf7Q2E"n+vHs~p$.pf]%d05ؼ,q˽PWANEW iyhBJ'd-5BeǾm$wgvqYx!D_Qr/^ -v\LU s=tZ4jӲ\4/Kj]KBfpjd6$2EGXGzƒ%oNAGd+3A:& e:ɝ PK[ACmediaPK[Ai collection.anki2PK[AC mediaPKq anki-2.0.20+dfsg/tests/support/anki12-due.anki0000644000175000017500000016600011755052155020643 0ustar andreasandreasSQLite format 3@ ;2N - ;JktablesourcessourcesCREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) );''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) )9M'indexsqlit6--'!     " !2012-04-06"!2012-04-06 ::3J;''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) )9M'indexsqlite_autoindex_reviewHistory_1reviewHistoryJktablesourcessourcesCREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) )  {tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL, "newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, PRIMARY KEY (id) )`tablemediamediaCREATE TABLE media ( id INTEGER NOT NULL, filename TEXT NOT NULL, size INTEGER NOT NULL, created FLOAT NOT NULL, "originalPath" TEXT NOT NULL, description TEXT NOT NULL, PRIMARY KEY (id) )  /Ӵ]  AߘG ͟AߘG ͫBasicBasic?< e]tablemodelsmodels CREATE TABLE models ( id INTEGER NOT NULL, "deckId" INTEGER, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, features TEXT NOT NULL, spacing FLOAT NOT NULL, "initialSpacing" FLOAT NOT NULL, source INTEGER NOT NULL, PRIMARY KEY (id) )r7tabledeckVarsdeckVars CREATE TABLE "deckVars" ( "key" TEXT NOT NULL, value TEXT, PRIMARY KEY ("key") )/Cindexsqlite_autoindex_deckVars_1deckVars  !!tablecardModelscardModels CREATE TABLE "cardModels" ( id INTEGER NOT NULL, ordinal INTEGER NOq AtabledecksdecksCREATE TABLE decks ( id INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, description TEXT NOT NULL, version INTEGER NOT NULL, "currentModelId" INTEGER, "syncName" TEXT, "lastSync" FLOAT NOT:s( EcssCache.fm967d613685ab575d {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm9d82d13685ab575d {font-family:"Arial";font-size:20px;white-space:pre-wrap;} #cmqf4bb473685ab575d {text-align:center;} #cmq518bc13685ab575e {text-align:center;} #cmaf4bb473685ab575d {text-align:center;} #cma518bc13685ab575e {text-align:center;} .cmbf4bb473685ab575d {background:#FFFFFF;} .cmb518bc13685ab575e {background:#FFFFFF;}  !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspendLee9 8wiYJ8) suspendLeeches!revSpacing #revInactive revActive perDay!newSpacing#newInactive newActive mediaURL !leechFails latexPre latexPost hexCache cssCache ""e^   fU6W]Reverse%(Back)s%(Front)sArial#000000Arial#000000Arial#FFFFFFe]  fU6W]Forward%(Front)s%(Back)sArial#000000Arial#000000Arial#FFFFFFT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, active BOOLEAN NOT NULL, qformat TEXT NOT NULL, aformat TEXT NOT NULL, lformat TEXT, qedformat TEXT, aedformat TEXT, "questionInAnswer" BOOLEAN NOT NULL, "questionFontFamily" TEXT, "questionFontSize" INTEGER, "questionFontColour" VARCHAR(7), "questionAlign" INTEGER, "answerFontFamily" TEXT, "answerFontSize" INTEGER, "answerFontColour" VARCHAR(7), "answerAlign" INTEGER, "lastFontFamily" TEXT, "lastFontSize" INTEGER, "lastFontColour" VARCHAR(7), "editQuestionFontFamily" TEXT, "editQuestionFontSize" INTEGER, "editAnswerFontFamily" TEXT, "editAnswerFontSize" INTEGER, "allowEmptyAnswer" BOOLEAN NOT NULL, "typeAnswer" TEXT NOT NULL, PRIMARY KEY (id), CHECK (active IN (0, 1)), CHECK ("questionInAnswer" IN (0, 1)), CHECK ("allowEmptyAnswer" IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) ) {%   -%#  AߘGhAߘPfoobarAߘP;@@AߘP;@γ' ccx6Q6W^AߘP;AߘPbarfooAߘP;@@AߘP;interval FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, due FLOAT NOT NULL, "lastDue" FLOAT NOT NULL, factor FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "firstAnswered" FLOAT NOT NULL, reps INTEGER NOT NULL, successive INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, "yesCount" INTEGER NOT NULL, "noCount" INTEGER NOT NULL, "spaceUntil" FLOAT NOT NULL, "relativeDelay" FLOAT NOT NULL, "isDue" BOOLEAN NOT NULL, type INTEGER NOT NULL, "combinedDue" INTEGER NOT NULL, PRIMARY KEY (id), CHECK ("isDue" IN (0, 1)), FOREIGN KEY("cardModelId") REFERENCES "cardModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) )  bbw tabletagstagsCREATE TABLE tags ( id integer not null, tag text nK.%%tablefactsDeletedfactsDeletedCREATE TABLE "factsDeleted" ( "factId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("factId") REFERENCES facts (id) ).%%tablecardsDeletedcardsDeletedCREATE TABLE "cardsDeleted" ( "cardId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("cardId") REFERENCES cards (id) )0%%#tablemediaDeletedmediaDeletedCREATE TABLE "mediaDeleted" ( "mediaId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("mediaId") REFERENCES cards (id) ) tabletagstagsCREATE TABLE tags ( id integer not null, tag text not null collate nocase, priority integer not null default 2, primary key(id))!tablecardTagscardTagsCREATE TABLE cardTags ( id integer not null, cardId integer not null, tagId integer not null, src integer not null, primary key(id))K%%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)    Reverse Forward Basic-PriorityVeryHigh%PriorityHigh# PriorityLow 6 6Ns6 Ns6 wiZN:- decks1%factsDeleted0!cardModels0 media0+CdeckVarssqlite_autoindex_deckVars_112 1 models0 'reviewHistory0 stats0 cardTags0 sources0%mediaDeleted0#fieldModels0'modelsDeleted0 fields0 facts0 cards0%cardsDeleted0#tagsix_tags_tag3 1 AߘP;x6Ns6AߘP;x66 rrHJEn7indexix_cards_typeCombinedcards CREATE INDEX ix_cards_typeCombined on can7indexix_cards_typeCombinedcards CREATE INDEX ix_cards_typeCombined on cards (type, combinedDue, factId)d9indexix_cards_relativeDelaycards"CREATE INDEX ix_cards_relativeDelay on cards (relativeDelay)T/qindexix_cards_modifiedcards#CREATE INDEX ix_cards_modified on cards (modified)T/qindexix_facts_modifiedfacts$CREATE INDEX ix_facts_modified on facts (modified)T/qindexix_cards_prioritycards%CREATE INDEX ix_cards_priority on cards (priority)T+uindexix_cards_factorcards&CREATE INDEX ix_cards_factor on cards (type, factor)N+iindexix_cards_factIdcards'CREATE INDEX ix_cards_factId on cards (factId)S-qindexix_stats_typeDaystats(CREATE INDEX ix_stats_typeDay on stats (type, day)R-mindexix_fields_factIdfields)CREATE INDEX ix_fields_factId on fields (factId)e9indexix_fields_fieldModelIdfields*CREATE INDEX ix_fields_fieldModelId on fields (fieldModelId)  6 Ns6 AߘP=0l%9%inde(9Yindexix_cards_intervalDesc2cards4CREATE INDEX ix_cards_intervalDesc2 ona!7indexix_media_originalPathmedia,CREATE INDEX ix_media_oO +iindexix_fields_valuefields+CREATE INDEX ix_fields_value on fields (value)a!7indexix_media_originalPathmedia,CREATE INDEX ix_media_originalPath on media (originalPath)k"9%indexix_cardsDeleted_cardIdcardsDeleted.CREATE INDEX ix_cardsDeleted_cardId on cardsDeleted (cardId)r#=' indexix_modelsDeleted_modelIdmodelsDeleted/CREATE INDEX ix_modelsDeleted_modelId on modelsDeleted (modelId)k$9%indexix_factsDeleted_factIdfactsDeleted0CREATE INDEX ix_factsDeleted_factId on factsDeleted (factId)l%9%indexix_mediaDeleted_factIdmediaDeleted1CREATE INDEX ix_mediaDeleted_factId on mediaDeleted (mediaId)d&3indexix_cardTags_tagCardcardTags2CREATE INDEX ix_cardTags_tagCard on cardTags (tagId, cardId)Z'1uindexix_cardTags_cardIdcardTags3CREATE INDEX ix_cardTags_cardId on cardTags (cardId)     Ns666  Ns6  6 6 Ns6  Ns6 !x6AߘP;Ns6!x6AߘP;6 )AߘP;x6AߘP;Ns6)AߘP;x6AߘP;6 ((3kf-##oviewrevCardsOldrevCardsOldCREATE VIEW revCards/##[viewrevCardsDuerevCardsDueCREATE VIEW revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, du(9Yindexix_cards_intervalDesc2cards4CREATE INDEX ix_cards_intervalDesc2 on cards (type, priority desc, interval desc, factId, combinedDue)x)-9indexix_cards_dueAsc2cards5CREATE INDEX ix_cards_dueAsc2 on cards (type, priority desc, due, factId, combinedDue)[*/indexix_media_filenamemedia7CREATE UNIQUE INDEX ix_media_filename on media (filename)H+#gindexix_tags_tagtags8CREATE UNIQUE INDEX ix_tags_tag on tags (tag),##gviewfailedCardsfailedCardsCREATE VIEW failedCards as select * from cards where type = 0 and isDue = 1 order by type, isDue, combinedDue-##oviewrevCardsOldrevCardsOldCREATE VIEW revCardsOld as select * from cards where type = 1 and isDue = 1 order by priority desc, interval desc   Reverse-PriorityVeryHigh# PriorityLow%PriorityHigh Forward Basic s( EcssCache.fm967d613685ab575d {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm9d82d13685ab575d {font-family:"Arial";font-size:20px;white-space:pre-wrap;} #cmqf4bb473685ab575d {text-align:center;} #cmq518bc13685ab575e {text-align:center;} #cmaf4bb473685ab575d {text-align:center;} #cma518bc13685ab575e {text-align:center;} .cmbf4bb473685ab575d {background:#FFFFFF;} .cmb518bc13685ab575e {background:#FFFFFF;}  !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspendLeeches1 fAhexCache{"5876002578749937502": "518bc13685ab575e", "-811977008313837731": "f4bb473685ab575d", "-7602813709132802211": "967d613685ab575d", "-5087285036409202851": "b966553685ab575d", "-7096880030681442467": "9d82d13685ab575d"} *E`* 2##eviewacqCardsNewacqCardsNewCREATE VIEW acqCardsNew as select * from cards where type = 2 and isDue = 1 order by priority desc, due desc1##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, due .##eviewrevCardsNewrevCardsNewCREATE VIEW revCardsNew as select * from cards where type = 1 and isDue = 1 order by priority desc, interval/##[viewrevCardsDuerevCardsDueCREATE VIEW revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, due0))yviewrevCardsRandomrevCardsRandomCREATE VIEW revCardsRandom as select * from cards where type = 1 and isDue = 1 order by priority desc, factId, ordinalanki-2.0.20+dfsg/tests/support/mnemo.db0000644000175000017500000034000011755052155017553 0ustar andreasandreasSQLite format 3@  - M 9 Wnp;i-Ic/'indexi_tags_for_card_2tags_for_cardCREATE INDEX i_tags_for_card_2 on tags_for_card (_tag_id)`+'}indexi_tags_for_cardtags_for_cardCREATE INDEX i_tags_for_card on tags_for_card (_card_id)6Mindexi_tagstagsCREATE INDEX i_tags on tags (id)Hiindexi_cards_2cardsCREATE INDEX i_cards_2 on cards (fact_view_id):Qindexi_cardscardsCREATE INDEX i_cards on cards (id)`+'}indexi_data_for_factdata_for_factCREATE INDEX i_data_for_fact on data_for_fact (_fact_id):Qindexi_factsfactsCREATE INDEX i_facts on facts (id)1!!-tablecard_typescard_typesCREATE TABLE card_types( id text primary key, name text, fact_keys_and_names text, unique_fact_keys text, required_fact_keys text, fact_view_ids text, keyboard_shortcuts text, extra_data text default "" )3G!indexsqlite_autoindex_card_types_1card_types^!!tablefact_viewsfact_viewsCREATE TABLE fact_views( id text primary key, name text, q_fact_keys text, a_fact_keys text, q_fact_key_decorators text, a_fact_key_decorators text, a_on_top_of_q boolean default 0, type_answer boolean default 0, extra_data text default "" )3G!indexsqlite_autoindex_fact_views_1fact_viewsf +tablemediamedia CREATE TABLE media( filename text primary key, _hash text )) =indexsqlite_autoindex_media_1media %%Atablepartnershipspartnerships CREATE TABLE partnerships( partner text unique, _last_log_id integer )7 K%indexsqlite_autoindex_partnerships_1partnerships P ++Ytablesqlite_sequencesqlite_sequence CREATE TABLE sqlite_sequence(name,seq)tOtableloglog CREATE TABLE log( _id integer primary key autoincrement, /* Should never be reused. */ event_type integer, timestamp integer, object_id text, grade integer, easiness real, acq_reps integer, ret_reps integer, lapses integer, acq_reps_since_lapse integer, ret_reps_since_lapse integer, scheduled_interval integer, actual_interval integer, thinking_time integer, next_rep integer, /* Storing scheduler_data allows syncing the cramming scheduler */ scheduler_data integer )v--tableglobal_variablesglobal_variablesCREATE TABLE global_variables( key text, value text )tablecriteriacriteriaCREATE TABLE criteria( _id integer primary key, id text, name text, type text, data text )z''3tabletags_for_cardtags_for_cardCREATE TABLE tags_for_card( _card_id integer, _tag_id integer ) tabletagstagsCREATE TABLE tags( _id integer primary key, id text, name text, extra_data text default "" )tablecardscardsCREATE TABLE cards( _id integer primary key, id text, card_type_id text, _fact_id integer, fact_view_id text, question text, answer text, tags text, grade integer, next_rep integer, last_rep integer, easiness real, acq_reps integer, ret_reps integer, lapses integer, acq_reps_since_lapse integer, ret_reps_since_lapse integer, creation_time integer, modification_time integer, extra_data text default "", scheduler_data integer default 0, active boolean default 1 )''Mtabledata_for_factdata_for_factCREATE TABLE data_for_fact( _fact_id integer, key text, value text )itablefactsfactsCREATE TABLE facts( _id integer primary key, id text, extra_data text default "" ) tt9 Cswj5BiZZzRTlYpvZP4uM09 mxBDrkoww4OnB1QdewLXWj9 nxzAHXn81GIlCqkNw2PYXL9 ULrFxcsEmw8C7bLT5F5TIn9 Ny2IIajDQK3gEXNqGQWELt MyiXM fnew ffront-tag bback-tag'p_1pronunciation!fexpression nnotesm_1meaning%ffront-double#bback-double ffront bback  8T c b9 3 g0EVsfhQPYEA8hBiaR36D211.1newa longer tag, tag 1@ONONv93 Q1J34dopRCoazGpvlVta3x11.1front-tagback-taga longer tag, tag 1OVON@ONONw9I  lliWoHrGatAxS6jsgvOyNf33.2meaningexpression pronunciation notesOUSON@ONONw9!C  TDfMFmuwvRYJXDTtIUiLTx33.1expressionpronunciation meaning notesOUSON@ONONi9#%  xZDI66eVAl4RDnOIH6QWnx22.2back-doublefront-doubleOTON@ONONi9%#  P85YZagJouqjp8P5rOILjF22.1front-doubleback-doubleOTON@ONON[9  WvRqVVCkCHvtBX86ls0JDJ11.1frontbackOQ_ON@ONON '9% 7XWEvaROaU3ou3pmFkMQINa longer tag 9 rSmRHxVRPpbvUUrw16CGAGtag 1%% __UNTAGGED____UNTAGGED__   E##Q__DEFAULT____DEFAULT__default(set([]), set([1, 2, 3]), set([])) /versionMnemosyne SQL 1.0  \.` | N h : V ( ONON,9ONg0EVsfhQPYEA8hBiaR36D2,9ONCswj5BiZZzRTlYpvZP4uM0B9 ONWvRqVVCkCHvtBX86ls0JDJ@OQ_B9 ONQ1J34dopRCoazGpvlVta3x@OV,9ONQ1J34dopRCoazGpvlVta3x,9ONmxBDrkoww4OnB1QdewLXWj!#ON__DEFAULT__,9 ON7XWEvaROaU3ou3pmFkMQIN!#ON__DEFAULT__,9 ONrSmRHxVRPpbvUUrw16CGAGB9 ONlliWoHrGatAxS6jsgvOyNf@OUS,9ONlliWoHrGatAxS6jsgvOyNfB 9 ONTDfMFmuwvRYJXDTtIUiLTx@OUS, 9ONTDfMFmuwvRYJXDTtIUiLTx, 9ONnxzAHXn81GIlCqkNw2PYXLB 9 ONxZDI66eVAl4RDnOIH6QWnx@OT, 9ONxZDI66eVAl4RDnOIH6QWnxB9 ONP85YZagJouqjp8P5rOILjF@OT,9ONP85YZagJouqjp8P5rOILjF,9ONULrFxcsEmw8C7bLT5F5TIn,9ONWvRqVVCkCHvtBX86ls0JDJ,9ONNy2IIajDQK3gEXNqGQWELtON#'ONSM2 Mnemosyne4IONMnemosyne beta-11 posix darwin log  log.txt  log.txt       yy9nxzAHXn81GIlCqkNw2PYXL9mxBDrkoww4OnB1QdewLXWj9ULrFxcsEmw8C7bLT5F5TIn9Ny2IIajDQK3gEXNqGQWELt9Cswj5BiZZzRTlYpvZP4uM0     Cy^C9xZDI66eVAl4RDnOIH6QWnx9lliWoHrGatAxS6jsgvOyNf9g0EVsfhQPYEA8hBiaR36D29WvRqVVCkCHvtBX86ls0JDJ9TDfMFmuwvRYJXDTtIUiLTx9Q1J34dopRCoazGpvlVta3x9P85YZagJouqjp8P5rOILjF 3.23.12.22.11.11.11.1 9rSmRHxVRPpbvUUrw16CGAG%__UNTAGGED__97XWEvaROaU3ou3pmFkMQIN      ypg^ULC:1( ONONONONONONONONONONONONONONON ON ON ON ON ONONONONONONONON J!L`y B d % Y ,hLJM+kindexi_log_object_idlogCREATE INDEX i_log_object_id on log (object_id)itablefactsfactsCREATE TABLE facts( _id integer primary key, id text, extra_data text default "" )''Mtabledata_for_factdata_for_factCREATE TABLE data_for_fact( _fact_id integer, key text, value text )tablecardscardsCREATE TABLE cards( _id integer primary key, id text, card_type_id text, _fact_id integer, fact_view_id text, question text, answer text, tags text, grade integer, next_rep integer, last_rep integer, easiness real, acq_reps integer, ret_reps integer, lapses integer, acq_reps_since_lapse integer, ret_reps_since_lapse integer, creation_time integer, modification_time integer, extra_data text default "", scheduler_data integer default 0, active boolean default 1 ) tabletagstagsCREATE TABLE tags( _id integer primary key, id text, name text, extra_data text default "" )z''3tabletags_for_cardtags_for_cardCREATE TABLE tags_for_card( _card_id integer, _tag_id integer )tablecriteriacriteriaCREATE TABLE criteria( _id integer primary key, id text, name text, type text, data text )v--tableglobal_variablesglobal_variablesCREATE TABLE global_variables( key text, value text )tOtableloglog CREATE TABLE log( _id integer primary key autoincrement, /* Should never be reused. */ event_type integer, timestamp integer, object_id text, grade integer, easiness real, acq_reps integer, ret_reps integer, lapses integer, acq_reps_since_lapse integer, ret_reps_since_lapse integer, scheduled_interval integer, actual_interval integer, thinking_time integer, next_rep integer, /* Storing scheduler_data allows syncing the cramming scheduler */ scheduler_data integer )P ++Ytablesqlite_sequencesqlite_sequence CREATE TABLE sqlite_sequence(name,seq) %%Atablepartnershipspartnerships CREATE TABLE partnerships( partner text unique, _last_log_id integer )7 K%indexsqlite_autoindex_partnerships_1partnerships f +tablemediamedia CREATE TABLE media( filename text primary key, _hash text )) =indexsqlite_autoindex_media_1media^!!tablefact_viewsfact_viewsCREATE TABLE fact_views( id text primary key, name text, q_fact_keys text, a_fact_keys text, q_fact_key_decorators text, a_fact_key_decorators text, a_on_top_of_q boolean default 0, type_answer boolean default 0, extra_data text default "" )3G!indexsqlite_autoindex_fact_views_1fact_views1!!-tablecard_typescard_typesCREATE TABLE card_types( id text primary key, name text, fact_keys_and_names text, unique_fact_keys text, required_fact_keys text, fact_view_ids text, keyboard_shortcuts text, extra_data text default "" )3G!indexsqlite_autoindex_card_types_1card_types:Qindexi_factsfactsCREATE INDEX i_facts on facts (id)`+'}indexi_data_for_factdata_for_factCREATE INDEX i_data_for_fact on data_for_fact (_fact_id):Qindexi_cardscardsCREATE INDEX i_cards on cards (id)Hiindexi_cards_2cardsCREATE INDEX i_cards_2 on cards (fact_view_id)6Mindexi_tagstagsCREATE INDEX i_tags on tags (id)`+'}indexi_tags_for_cardtags_for_cardCREATE INDEX i_tags_for_card on tags_for_card (_card_id)c/'indexi_tags_for_card_2tags_for_cardCREATE INDEX i_tags_for_card_2 on tags_for_card (_tag_id)M+kindexi_log_timestamplogCREATE INDEX i_log_timestamp on log (timestamp)  }bG,xhX=" 9xZDI66eVAl4RDnOIH6QWnx 9xZDI66eVAl4RDnOIH6QWnx 9rSmRHxVRPpbvUUrw16CGAG9nxzAHXn81GIlCqkNw2PYXL 9mxBDrkoww4OnB1QdewLXWj9lliWoHrGatAxS6jsgvOyNf9lliWoHrGatAxS6jsgvOyNf9g0EVsfhQPYEA8hBiaR36D2#__DEFAULT__#__DEFAULT__9WvRqVVCkCHvtBX86ls0JDJ9WvRqVVCkCHvtBX86ls0JDJ9ULrFxcsEmw8C7bLT5F5TIn9TDfMFmuwvRYJXDTtIUiLTx 9TDfMFmuwvRYJXDTtIUiLTx 'SM2 Mnemosyne9Q1J34dopRCoazGpvlVta3x9Q1J34dopRCoazGpvlVta3x9P85YZagJouqjp8P5rOILjF9P85YZagJouqjp8P5rOILjF9Ny2IIajDQK3gEXNqGQWELt"IMnemosyne beta-11 posix darwin9Cswj5BiZZzRTlYpvZP4uM097XWEvaROaU3ou3pmFkMQINanki-2.0.20+dfsg/tests/support/anki12-broken.anki0000644000175000017500000017600012072552372021346 0ustar andreasandreasSQLite format 3@ ?6N  - ?/Cindexsqlite_autoindex_deckVars_1deckVars{tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL, "newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "mature>00*%#  <q<3 !   2011-03-18@x@2ڀ" !2011-03-073 ! 2011-03-06? @ 4!   2011-03-06@@5(;s !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspe: 9  pcXJ:+ ) suspendLeeches sortIndex!revSpacing #revInactive revActive perDay pageSize!newSpacing#newInactive newActive mediaURL 'mediaLocation!leechFails latexPre latexPost hexCache cssCache JJ[F{tablestatsstatsCREATE TABLE stats ( id INTEGER NOT NULL, type INTEGER NOT NULL, day DATE NOT NULL, reps INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "distractedTime" FLOAT NOT NULL, "distractedReps" INTEGER NOT NULL, "newEase0" INTEGER NOT NULL, "newEase1" INTEGER NOT NULL, "newEase2" INTEGER NOT NULL, "newEase3" INTEGER NOT NULL, "newEase4" INTEGER NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, PRIMARY KEY (id) )r7tabledeckVarsdeckVarsCREATE TABLE "deckVars" ( "key" TEXT NOT NULL, value TEXT, PRIMARY KEY ("key") )/Cindexsqlite_autoindex_deckVars_1deckVars y8=    -'.rA`0@&,@@@"9P .>A`8?U+@2\ս~@$-@@@|?  х.)A`\@&ֈ0:@@@eF   .>A\A`8.>A\< WWPS;''5tablereviewHistoryreviewHistoryCREATE TABLE "reviewHistory" ( "cardId" INTEGER NOT NULL, time FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, "nextInterval" FLOAT NOT NULL, ease INTEGER NOT NULL, delay FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "nextFactor" FLOAT NOT NULL, reps FLOAT NOT NULL, "thinkingTime" FLOAT NOT NULL, "yesCount" FLOAT NOT NULL, "noCount" FLOAT NOT NULL, PRIMARY KEY ("cardId", time) )9M'indexsqlite_autoindex_reviewHistory_1reviewHistoryJktablesourcessources CREATE TABLE sources ( id INTEGER NOT NULL, name TEXT NOT NULL, created FLOAT NOT NULL, "lastSync" FLOAT NOT NULL, "syncPeriod" INTEGER NOT NULL, PRIMARY KEY (id) )`tablemediamedia CREATE TABLE media ( id INTEGER NOT NULL, filename TEXT NOT NULL, size INTEGER NOT NULL, created FLOAT NOT NULL, "originalPath" TEXT NOT NULL, description TEXT NOT NULL, PRIMARY KEY (id) )   5Вɞ  A\ }A\ tJJapaneseJapanese?%(Meaning)sArial#000000Arial#000000Arial#FFFFFFeȏЍ   k. Reverse%(Back)s%(Front)sArial#000000Arial#000000Arial#FFFFFFeЍ  k. Forward%(Front)s%(Back)sArial#000000Arial#000000Arial#FFFFFFi ɞ  ## .IRecall%(Meaning)s%(Reading)sArial#000000Arial#000000Arial#FFFFFFT NULL, "modelId" INTEGER NOT NULL, name TEXT NOT NULL, description TEXT NOT NULL, active BOOLEAN NOT NULL, qformat TEXT NOT NULL, aformat TEXT NOT NULL, lformat TEXT, qedformat TEXT, aedformat TEXT, "questionInAnswer" BOOLEAN NOT NULL, "questionFontFamily" TEXT, "questionFontSize" INTEGER, "questionFontColour" VARCHAR(7), "questionAlign" INTEGER, "answerFontFamily" TEXT, "answerFontSize" INTEGER, "answerFontColour" VARCHAR(7), "answerAlign" INTEGER, "lastFontFamily" TEXT, "lastFontSize" INTEGER, "lastFontColour" VARCHAR(7), "editQuestionFontFamily" TEXT, "editQuestionFontSize" INTEGER, "editAnswerFontFamily" TEXT, "editAnswerFontSize" INTEGER, "allowEmptyAnswer" BOOLEAN NOT NULL, "typeAnswer" TEXT NOT NULL, PRIMARY KEY (id), CHECK ("allowEmptyAnswer" IN (0, 1)), CHECK ("questionInAnswer" IN (0, 1)), CHECK (active IN (0, 1)), FOREIGN KEY("modelId") REFERENCES models (id) )=)eЩ( eg>c. . A\ A`helloworldA`NA\@@A\%N@cF`@cF`A`NFо' cc    .)ԭ. A\ 9A`foobarA`cV@@A`c^A`cV@χ˲Һj' cc .*' }. A\PA\P_321123A\P@@A\P@ӲҺd' cc .*. A\PA\Pp123321A\P@@<Щ !!aM5ItablecardscardsCREATE TABLE cards ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "cardModelId" INTEGER NOT NULL, created FLOAT NOT NULL, modified FLOAT NOT NULL, tags TEXT NOT NULL, ordinal INTEGER NOT NULL, question TEXT NOT NULL, answer TEXT NOT NULL, priority INTEGER NOT NULL, 8KtablefieldsfieldsCREATE TABLE fields ( id INTEGER NOT NULL, "factId" INTEGER NOT NULL, "fieldModelId" INTEGER NOT NULL, ordinal INTEGER NOT NULL, value TEXT NOT NULL, PRIMARY KEY (id), FOREIGN KEY("fieldModelId") REFERENCES "fieldModels" (id), FOREIGN KEY("factId") REFERENCES facts (id) ).%%tablefactsDeletedfactsDeletedCREATE TABLE "factsDeleted" ( "factId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("factId") REFERENCES facts (id) )0%%#tablemediaDeletedmediaDeletedCREATE TABLE "mediaDeleted" ( "mediaId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("mediaId") REFERENCES cards (id) )interval FLOAT NOT NULL, "lastInterval" FLOAT NOT NULL, due FLOAT NOT NULL, "lastDue" FLOAT NOT NULL, factor FLOAT NOT NULL, "lastFactor" FLOAT NOT NULL, "firstAnswered" FLOAT NOT NULL, reps INTEGER NOT NULL, successive INTEGER NOT NULL, "averageTime" FLOAT NOT NULL, "reviewTime" FLOAT NOT NULL, "youngEase0" INTEGER NOT NULL, "youngEase1" INTEGER NOT NULL, "youngEase2" INTEGER NOT NULL, "youngEase3" INTEGER NOT NULL, "youngEase4" INTEGER NOT NULL, "matureEase0" INTEGER NOT NULL, "matureEase1" INTEGER NOT NULL, "matureEase2" INTEGER NOT NULL, "matureEase3" INTEGER NOT NULL, "matureEase4" INTEGER NOT NULL, "yesCount" INTEGER NOT NULL, "noCount" INTEGER NOT NULL, "spaceUntil" FLOAT NOT NULL, "relativeDelay" FLOAT NOT NULL, "isDue" BOOLEAN NOT NULL, type INTEGER NOT NULL, "combinedDue" INTEGER NOT NULL, PRIMARY KEY (id), FOREIGN KEY("cardModelId") REFERENCES "cardModels" (id), CHECK ("isDue" IN (0, 1)), FOREIGN KEY("factId") REFERENCES facts (id) ) *Z7\*(Dž/.UҰ.I今日[きょう]ו .Uj0q.ImeaningۜЩ .)-. bar.Um-.I今日ݲҪ  .*-. 321Р >c. -. world䘇Ҫ .*i. 123݆Щ.)i. fooݲР>c. i. hello    DD1~T.%%tablecardsDeletedcardsDeletedCREATE TABLE "cardsDeleted" ( "cardId" INTEGER NOT NULL, "deletedTime" FLOAT NOT NULL, FOREIGN KEY("cardId") REFERENCES cards (id) ) tabletagstagsCREATE TABLE tags ( id integer not null, tag text not null collate nocase, priority integer not null default 2, primary key(id))!tablecardTagscardTagsCREATE TABLE cardTags ( id integer not null, cardId integer not null, tagId integer not null, src integer not null, primary key(id))K%%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)n7indexix_cards_typeCombinedcards CREATE INDEX ix_cards_typeCombined on cards (type, combinedDue, factId)d9indexix_cards_relativeDelaycards!CREATE INDEX ix_cards_relativeDelay on cards (relativeDelay)T/qindexix_cards_modifiedcards"CREATE INDEX ix_cards_modified on cards (modified)T/qindexix_facts_modifiedfacts#CREATE INDEX ix_facts_modified on facts (modified) || #Recognition Japanese Reverse Forward Basic-PriorityVeryHigh%PriorityHigh# PriorityLow :|l[K: [.:j  [.:j r.:d  r.:d-'.r  -'.rW.? W.?.> .>х.) х.) hK, r_;dWD8'modelsDeleted0-fieldsix_fields_factId9 3#9fieldsix_fields_fieldModelId9 2+fieldsix_fields_value9 1 decks1%factsDeleted0 models26'MreviewHistorysqlite_autoindex_reviewHistory_15 2 1 media0!cardModels4 sources0+CdeckVarssqlite_autoindex_deckVars_116 1-statsix_stats_typeDay4 2 1%3cardTagsix_cardTags_tagCard12 3 1"1cardTagsix_cardTags_cardId12 2%mediaDeleted0 /factsix_facts_modified4 1 #fieldModels5% 7cardsix_cards_typeCombined6 2 1 1" 9cardsix_cards_relativeDelay6 2 /cardsix_cards_modified6 1/cardsix_cards_priority6 6+cardsix_cards_factor6 2 2+cardsix_cards_factId6 2*9#cardsix_cards_intervalDesc26 2 2 2 2 1$-#cardsix_cards_dueAsc26 2 2 1 1 1'cardsix_cards_sort6 1%cardsDeleted0#tagsix_tags_tag8 1 IhIA`.)W.?A\P .*[.:jA\P .*r.:d A`cV.).>A`.U-'.rA`N>c. х.)  W.? [.:j r.:d  .> -'.r х.) A`W.?A`.>A`m-'.rA`х.)A\P_[.:jA\Ppr.:d A`V`.)A]%9ɐ>c. A\a.U  -'.r W.? х.) .> [.:j r.:d __ [k!O +iindexix_fields_valuefields+CREATE INDEX ix_fields_valuT/qindexix_cards_prioritycards$CREATE INDEX ix_cards_priority on cards (priority)T+uindexix_cards_factorcards&CREATE INDEX ix_cards_factor on cards (type, factor)N+iindexix_cards_factIdcards'CREATE INDEX ix_cards_factId on cards (factId)S-qindexix_stats_typeDaystats(CREATE INDEX ix_stats_typeDay on stats (type, day)R-mindexix_fields_factIdfields)CREATE INDEX ix_fields_factId on fields (factId)e9indexix_fields_fieldModelIdfields*CREATE INDEX ix_fields_fieldModelId on fields (fieldModelId)O +iindexix_fields_valuefields+CREATE INDEX ix_fields_value on fields (value)a!7indexix_media_originalPathmedia,CREATE INDEX ix_media_originalPath on media (originalPath)k"9%indexix_cardsDeleted_cardIdcardsDeleted-CREATE INDEX ix_cardsDeleted_cardId on cardsDeleted (cardId)r#=' indexix_modelsDeleted_modelIdmodelsDeleted.CREATE INDEX ix_modelsDeleted_modelId on modelsDeleted (modelId) @W.?@[.:j@r.:d @.>@-'.r@х.) >c. х.) .*[.:j .*r.:d.U-'.r.)W.?.).>  !2011-03-18 !2011-03-07 !2011-03-06! 2011-03-06 Lt`L>c. ). >c. :.  .*z.* .*`9.*.Uw-.U.U)\.U.U.U.)#l.).)ԺS.) Lt`Lm-.I.Uj0q.I)\.Ui. `9.*i. S.)i. :. -. #l.)-. z.*-. ). .Iw-.U PA2/今日[きょう]w-.U今日.Uworld). meaning)\.UfooS.)bar#l.)ԁhello:. 321z.*123`9.*     g;([+/indexix_media_filenamemedia7CREATEk$9%indexix_factsDeleted_factIdfactsDeleted/CREATE INDEX ix_factsDelek$9%indexix_factsDeleted_factIdfactsDeleted/CREATE INDEX ix_factsDeleted_factId on factsk$9%indexix_factsDeleted_factIdfactsDeleted/CREATE INDEX ix_factsDeleted_factId on factsDeleted (factId)l%9%indexix_mediaDeleted_factIdmediaDeleted1CREATE INDEX ix_mediaDeleted_factId on mediaDeleted (mediaId)d&3indexix_cardTags_tagCardcardTags2CREATE INDEX ix_cardTags_tagCard on cardTags (tagId, cardId)Z'1uindexix_cardTags_cardIdcardTags3CREATE INDEX ix_cardTags_cardId on cardTags (cardId)(9Yindexix_cards_intervalDesc2cards4CREATE INDEX ix_cards_intervalDesc2 on cards (type, priority desc, interval desc, factId, combinedDue)x)-9indexix_cards_dueAsc2cards5CREATE INDEX ix_cards_dueAsc2 on cards (type, priority desc, due, factId, combinedDue)\*'indexix_cards_sortcards6CREATE INDEX ix_cards_sort on cards (question collate nocase)  Mzk\M -'.r-'.rW.?[.:j х.).>r.:d W.?  х.).>[.:j r.:d ere -'.r -'.r W.? W.? х.)  х.) .> .> [.:j [.:j r.:d r.:d 7{Y7! .*A\P[.:j! .*A\Pr.:d!.)A`W.?  .)A`cV.> >c. A`Nх.) .UA`-'.r [1)A\P .*A\P[.:j)A\P .*A\Pr.:d)A\ 9Ű.)A`W.?( A`cV.)A`cV.>(A`.UA`-'.r(A`N>c. A`Nх.) 0g06cbarW.?6c321[.:j9i今日-'.r6cfoo.>8ehelloх.)6c123r.:d   Reverse#Recognition -PriorityVeryHigh# PriorityLow%PriorityHigh Japanese Forward Basic s !revSpacing0.1 )latexPost\end{document}> qlatexPre\documentclass[12pt]{article} \special{papersize=3in,5in} \usepackage[utf8]{inputenc} \usepackage{amssymb,amsmath} \pagestyle{empty} \setlength{\parindent}{0in} \begin{document}  mediaURL!newSpacing60.0# revInactive# newInactive  revActive  newActive perDay1!leechFails16)suspendLeeches1 VV' CcssCache.fmb0999d2e8be8499e {font-family:"Arial";font-size:50px;white-space:pre-wrap;} .fmff152d2e8be80d02 {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm12e6692e8be80d02 {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm6a30712e8be8499e {font-family:"Arial";font-size:20px;white-space:pre-wrap;} .fm6d852d2e8be8499e {font-family:"ヒラギノ明朝 Pro W3";font-size:50px;white-space:pre-wrap;} #cmq8481c72e8be8499e {text-align:center;} #cmqad9ecf2e8be80d02 {text-align:center;} #cmq27207d2e8be80d02 {text-align:center;} #cmq32cfd92e8be8499e {text-align:center;} #cma8481c72e8be8499e {text-align:center;} #cmaad9ecf2e8be80d02 {text-align:center;} #cma27207d2e8be80d02 {text-align:center;} #cma32cfd92e8be8499e {text-align:center;} .cmb8481c72e8be8499e {background:#FFFFFF;} .cmbad9ecf2e8be80d02 {background:#FFFFFF;} .cmb27207d2e8be80d02 {background:#FFFFFF;} .cmb32cfd92e8be8499e {background:#FFFFFF;}  sortIndex0.'ImediaLocation/Users/dae/Dropbox/Public/AnkipageSize4096iGhexCache{"3661383816014481822": "32cfd92e8be8499e", "-66096941588017918": "ff152d2e8be80d02", "7651740211632163230": "6a30712e8be8499e", "-5936079460005049086": "ad9ecf2e8be80d02", "-8505492998582694654": "89f66b2e8be80d02", "-8898612385977710178": "8481c72e8be8499e", "-3822851096768394850": "caf2812e8be8499e", "2819391005603138818": "27207d2e8be80d02", "7891763599975664030": "6d852d2e8be8499e", "-5721369028356191842": "b0999d2e8be8499e", "1361891585962806530": "12e6692e8be80d02"} )5j)eЩ( eg>c. . A\ A`helloworldA`NA\@@A\%N@cF`@cF`A`NFо' cc    .)ԭ. A\ 9A`foobarA`cV@@A`c^A`cV@χ˲Һj' cc .*' }. A\PA\P_321123A\P@@A\P@ӲҺd' cc .*. A\PA\Pp123321A\P@@A\P 5ѕr( ie   .U2.IA\A`m今日今日[きょう]
meaningA`@@A`\@"8jp@"8jpA`@п' cc.)' }. A\ 9A`barfooA\ 9@@A` uPuJ@0##[2##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, dueH,#gindexix_tags_tagtags8CREATE UNIQUE INDEX ix_tags_tag on tag[+/indexix_media_filenamemedia7CREATE UNIQUE INDEX ix_media_filename on media (filename)H,#gindexix_tags_tagtags8CREATE UNIQUE INDEX ix_tags_tag on tags (tag)-##gviewfailedCardsfailedCardsCREATE VIEW failedCards as select * from cards where type = 0 and isDue = 1 order by type, isDue, combinedDue.##oviewrevCardsOldrevCardsOldCREATE VIEW revCardsOld as select * from cards where type = 1 and isDue = 1 order by priority desc, interval desc /##eviewrevCardsNewrevCardsNewCREATE VIEW revCardsNew as select * from cards where type = 1 and isDue = 1 order by priority desc, interval0##[viewrevCardsDuerevCardsDueCREATE VIEW revCardsDue as select * from cards where type = 1 and isDue = 1 order by priority desc, due EEp1))yviewrevCardsRandomrevCardsRandomCREATE VIEW revCardsRandom as select * from cards where type = 1 and isDue = 1 order by priority desc, factId, ordinal2##[viewacqCardsOldacqCardsOldCREATE VIEW acqCardsOld as select * from cards where type = 2 and isDue = 1 order by priority desc, due 3##eviewacqCardsNewacqCardsNewCREATE VIEW acqCardsNew as select * from cards where type = 2 and isDue = 1 order by priority desc, due descanki-2.0.20+dfsg/tests/support/supermemo1.xml0000644000175000017500000000311211755052155020750 0ustar andreasandreas 3572 1 Topic 40326 aoeu Topic 40327 1-400 Topic 40615 aoeu Topic 10247 Item aoeu aoeu 1844 7 0 19.09.2002 5,701 2,452 Topic aoeu 0 0 0 04.08.2000 3,000 0,000 anki-2.0.20+dfsg/tests/support/text-tags.txt0000644000175000017500000000003711755052155020615 0ustar andreasandreasfoo bar baz,qux foo2 bar2 baz2 anki-2.0.20+dfsg/tests/support/diffmodels2-1.apkg0000644000175000017500000000577612042746215021350 0ustar andreasandreasPK*[Ae" collection.anki2oH);m6,ZpEtĖpc;PM۴ Z(?  C9=hRM{PhiH(rvfޛ7yݡ;jgڪ/-P(O~bh |n SW O4JW*OazwNM+nh\XIwf-?5kW֬і%_ū>zbE.ꮣ)ͦjnv}XӠ驡&wEعxnRzaT\.]xԉb/S0骻)>j2YsNwyr|am7_WxSިJZY8Ѯ }& F' k''Y-PlQ'Ȩ91& 1Lդ!D5?|tr?Id\%')Ξ3h[AW{?שƟlg&137荤3ٳy/1ef)sL9t ͑{Cy=?]G[S'狿P|4ocH4w筚 F$8*"I5ؙ[d) e^z&yE3#f LxD. <6&pLȼ\DLρ=7=`* o 2 ALq4a5ʘ,XGjyۂy[Nw\h̬Yu9Ҭ?RG吹D)2| Vy:%rSȰZa{"zd^cK=ȌH|9zr{9z{cIs^N ]\lõFеqj/  ' ӥR\.''n'q%Ǫۡ4,jURKҳno_G:ܰ7NR"<n[W<jkik/ö́2 ]w=\NWԄ݉$gnNȫa7jLU| ]_-ז.h*j~vxiR"Tx73 \csT3kvjM AAAqL??AAAAo/    gJ//w^AAAA#Nf3%      86NMr_</    \ n0~jU\ϭ4+\/jPj\>좿 i;T9TQ^+v~\[`cG)?0Zq3`b5,&=&.gʻR-*Y/2u\b-+ %-Ȱiޖ94hЮ~uƕ]. t|TScekIk4Yg 8ֆRWPZĢ;ؾaBFmzo {k*m]q=PAa"hf]ecJ-fBh#Q*z^f?yk\9AYJNJH$ rSj^f$hbl;7XN[ԽxToUgz4GРtO% <ۥq-/u6ڏDl}ı } ^ܒ^a%cc2Ϯb曵3sJ42ԘEK `0ڗa8Īa9_0dΏX_lJc(Dɇ{ϵ'-&H/z15s Á  wL]׈Y}I€vZKf}Az\c-}7c`f7\ͦzLUi#3^3M0.ӽ<?ƀ1.Ca~1?cf=鏦D,\V!x' G)kͻ[ƍ76˪!JsX«ş>9sWfSjtUNJ:E L6٬2>|}+'V.\{ _^O+|wP8z7\^^lLۻZct957l+o  k毻|P(>rڬwqQ[~T\7Yr=*ďpu-|xmu-8CEMSj ׃r f$Pd" g˿&v{.H~p/9szz,zoK оUVTVVT'>l?Rls ׾'ij1؊WJ3I{ڵrf>}~g?m    Ǐ}'E#0+zWxOAAAęAAAq3"   ,17   ⌒gx?AAAAm׀AAAAg S|s>3EAAA|\\OAAAAAAqƇ}l_g    3E!7}Ѹ`«nM+;:יx* fvŒYuxia^SXǷC_:P'BEJ }d[2"suxDLxT 1}F,G4R)R0#]UqĎo=aw xoZyѪ^[YVW*+kkÎ"bqMMRy講,tx9#nV!VeĄے y~n6 m,v\š &|=о_#^Bk\iv}x(YߘL"[;PZbS8C\!q Cz` ,*& AHn'hCLV VP6CyAȓ0HC,J1 A͵(6׫,R#nj=veV\ZcEQkԎn!RcJpR;1t0ocz~6w㢥7tn&k `_)w,vHJ-a=Yqʔ*N&&?@[ ت|gZ⑝i y Xw9^h-8wn3W'*qgXZ=\?&MufpK*PT^U[=҇K"+UܾGGJY?davv9qut餞mo}_9L e֭>tY"ݥJL >eYwc2G"0Nv_~0r~*΋| Ի1狢U.U=%.I}J-VzJgQ]>?ʀ  m9GʏXhsӅv5b_qB#6>h݌*YF/dz%7=^?JCKSc5 *,JRu!e> +S]إSxxTYZ#l(t4ԋJ"TͿܺo^{$?\hl u-jż㞿A'DԬeTYܦ2q Z 'VUQr4+TZn0}P쌨,O*4 g4\?4w.gFV%f^["Dřم|a8'NڢBtjv-j6GC63uJv%-ȡi4ݤu2ˢw6 B\ ̻Bt!ªؾh p}+2B ^ud~-k[W#>i{e1t]֖ }6fqo7K,ڲ*Ioʪ4d;33mY[xleedkTv=Y] oX+U(>U^SԻ4hf!Ը˦l[EEҝ:*ͦt-K;SQlqlr]h֊ ( bENQ?[27srhtpxitleSnr(zIj:ҳjwҪGZ¥!ۻ"M9rA7_n2&+O-{JIÇ,c1u5J:0=S-wg/qlL3鞜Ǎte$ȟeE3.>؏{W=rʫ΀ܷp&lLv,Y2 hHy YUTHw1alp_Dh ZxPڥ0]^M˵(;D==b7kR\[eLшi+J^p;XMm+I^](d(׭UŽ"gd-w=oY-IqjFLw\+l0;`\1w-G ].I#kAm 38ʈټvUm«B.0^Rv>igrOK'?yG_TLɟ$ҙoUմ^{ozf%Ǚ:dv<P R+<ӗp:jz -Ɉ\x}+_yU[ G7 ]8O 8+??p ~B cd'?WǾVa49VBpn &_<ԂQ? ]8W%eLwPKk{5ANG0KLJPKt{5A"cumediaV2PRPJ+O,SPKt{5Acollection.anki2PKk{5ANG0PKt{5A"cumediaPK anki-2.0.20+dfsg/tests/support/text-update.txt0000644000175000017500000000000411755052155021133 0ustar andreasandreas1 x anki-2.0.20+dfsg/tests/__init__.py0000644000175000017500000000000010632344066016515 0ustar andreasandreasanki-2.0.20+dfsg/tests/test_media.py0000644000175000017500000000744012244712237017113 0ustar andreasandreas# coding: utf-8 import tempfile import os import time from shared import getEmptyDeck, testDir # copying files to media folder def test_add(): d = getEmptyDeck() dir = tempfile.mkdtemp(prefix="anki") path = os.path.join(dir, u"foo.jpg") open(path, "w").write("hello") # new file, should preserve name assert d.media.addFile(path) == "foo.jpg" # adding the same file again should not create a duplicate assert d.media.addFile(path) == "foo.jpg" # but if it has a different md5, it should open(path, "w").write("world") assert d.media.addFile(path) == "foo (1).jpg" def test_strings(): d = getEmptyDeck() mf = d.media.filesInStr mid = d.models.models.keys()[0] assert mf(mid, "aoeu") == [] assert mf(mid, "aoeuao") == ["foo.jpg"] assert mf(mid, "aoeuao") == ["foo.jpg"] assert mf(mid, "aoeuao") == [ "foo.jpg", "bar.jpg"] assert mf(mid, "aoeuao") == ["foo.jpg"] assert mf(mid, "") == ["one", "two"] assert mf(mid, "aoeuao") == ["foo.jpg"] assert mf(mid, "aoeuao") == [ "foo.jpg", "fo"] assert mf(mid, "aou[sound:foo.mp3]aou") == ["foo.mp3"] sp = d.media.strip assert sp("aoeu") == "aoeu" assert sp("aoeu[sound:foo.mp3]aoeu") == "aoeuaoeu" assert sp("aoeu") == "aoeu" es = d.media.escapeImages assert es("aoeu") == "aoeu" assert es("") == "" assert es('') == '' def test_deckIntegration(): d = getEmptyDeck() # create a media dir d.media.dir() # put a file into it file = unicode(os.path.join(testDir, "support/fake.png")) d.media.addFile(file) # add a note which references it f = d.newNote() f['Front'] = u"one"; f['Back'] = u"" d.addNote(f) # and one which references a non-existent file f = d.newNote() f['Front'] = u"one"; f['Back'] = u"" d.addNote(f) # and add another file which isn't used open(os.path.join(d.media.dir(), "foo.jpg"), "wb").write("test") # check media ret = d.media.check() assert ret[0] == ["fake2.png"] assert ret[1] == ["foo.jpg"] def test_changes(): d = getEmptyDeck() assert d.media._changed() def added(): return d.media.db.execute("select fname from log where type = 0") assert not list(added()) assert not list(d.media.removed()) # add a file dir = tempfile.mkdtemp(prefix="anki") path = os.path.join(dir, u"foo.jpg") open(path, "w").write("hello") time.sleep(1) path = d.media.addFile(path) # should have been logged d.media.findChanges() assert list(added()) assert not list(d.media.removed()) # if we modify it, the cache won't notice time.sleep(1) open(path, "w").write("world") assert len(list(added())) == 1 assert not list(d.media.removed()) # but if we add another file, it will time.sleep(1) open(path+"2", "w").write("yo") d.media.findChanges() assert len(list(added())) == 2 assert not list(d.media.removed()) # deletions should get noticed too time.sleep(1) os.unlink(path+"2") d.media.findChanges() assert len(list(added())) == 1 assert len(list(d.media.removed())) == 1 def test_illegal(): d = getEmptyDeck() aString = u"a:b|cd\\e/f\0g*h" good = u"abcdefgh" assert d.media.stripIllegal(aString) == good for c in aString: bad = d.media.hasIllegal("somestring"+c+"morestring") if bad: assert(c not in good) else: assert(c in good) anki-2.0.20+dfsg/tests/test_stats.py0000644000175000017500000000122112065175361017163 0ustar andreasandreas# coding: utf-8 import os from tests.shared import getEmptyDeck def test_stats(): d = getEmptyDeck() f = d.newNote() f['Front'] = "foo" d.addNote(f) c = f.cards()[0] # card stats assert d.cardStats(c) d.reset() c = d.sched.getCard() d.sched.answerCard(c, 3) d.sched.answerCard(c, 2) assert d.cardStats(c) def test_graphs_empty(): d = getEmptyDeck() assert d.stats().report() def test_graphs(): from anki import Collection as aopen d = aopen(os.path.expanduser("~/test.anki2")) g = d.stats() rep = g.report() open(os.path.expanduser("~/test.html"), "w").write(rep) return anki-2.0.20+dfsg/tests/shared.py0000644000175000017500000000107712225675305016246 0ustar andreasandreasimport tempfile, os, shutil from anki import Collection as aopen def assertException(exception, func): found = False try: func() except exception: found = True assert found def getEmptyDeck(**kwargs): (fd, nam) = tempfile.mkstemp(suffix=".anki2") os.unlink(nam) return aopen(nam, **kwargs) def getUpgradeDeckPath(name="anki12.anki"): src = os.path.join(testDir, "support", name) (fd, dst) = tempfile.mkstemp(suffix=".anki2") shutil.copy(src, dst) return unicode(dst, "utf8") testDir = os.path.dirname(__file__) anki-2.0.20+dfsg/tests/test_find.py0000644000175000017500000002457412023377276016770 0ustar andreasandreas# coding: utf-8 from anki.find import Finder from tests.shared import getEmptyDeck def test_parse(): f = Finder(None) assert f._tokenize("hello world") == ["hello", "world"] assert f._tokenize("hello world") == ["hello", "world"] assert f._tokenize("one -two") == ["one", "-", "two"] assert f._tokenize("one --two") == ["one", "-", "two"] assert f._tokenize("one - two") == ["one", "-", "two"] assert f._tokenize("one or -two") == ["one", "or", "-", "two"] assert f._tokenize("'hello \"world\"'") == ["hello \"world\""] assert f._tokenize('"hello world"') == ["hello world"] assert f._tokenize("one (two or ( three or four))") == [ "one", "(", "two", "or", "(", "three", "or", "four", ")", ")"] assert f._tokenize("embedded'string") == ["embedded'string"] assert f._tokenize("deck:'two words'") == ["deck:two words"] def test_findCards(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u'dog' f['Back'] = u'cat' f.tags.append(u"monkey") f1id = f.id deck.addNote(f) firstCardId = f.cards()[0].id f = deck.newNote() f['Front'] = u'goats are fun' f['Back'] = u'sheep' f.tags.append(u"sheep goat horse") deck.addNote(f) f2id = f.id f = deck.newNote() f['Front'] = u'cat' f['Back'] = u'sheep' deck.addNote(f) catCard = f.cards()[0] m = deck.models.current(); mm = deck.models t = mm.newTemplate("Reverse") t['qfmt'] = "{{Back}}" t['afmt'] = "{{Front}}" mm.addTemplate(m, t) mm.save(m) f = deck.newNote() f['Front'] = u'test' f['Back'] = u'foo bar' deck.addNote(f) latestCardIds = [c.id for c in f.cards()] # tag searches assert not deck.findCards("tag:donkey") assert len(deck.findCards("tag:sheep")) == 1 assert len(deck.findCards("tag:sheep tag:goat")) == 1 assert len(deck.findCards("tag:sheep tag:monkey")) == 0 assert len(deck.findCards("tag:monkey")) == 1 assert len(deck.findCards("tag:sheep -tag:monkey")) == 1 assert len(deck.findCards("-tag:sheep")) == 4 deck.tags.bulkAdd(deck.db.list("select id from notes"), "foo bar") assert (len(deck.findCards("tag:foo")) == len(deck.findCards("tag:bar")) == 5) deck.tags.bulkRem(deck.db.list("select id from notes"), "foo") assert len(deck.findCards("tag:foo")) == 0 assert len(deck.findCards("tag:bar")) == 5 # text searches assert len(deck.findCards("cat")) == 2 assert len(deck.findCards("cat -dog")) == 1 assert len(deck.findCards("cat -dog")) == 1 assert len(deck.findCards("are goats")) == 1 assert len(deck.findCards('"are goats"')) == 0 assert len(deck.findCards('"goats are"')) == 1 # card states c = f.cards()[0] c.queue = c.type = 2 assert deck.findCards("is:review") == [] c.flush() assert deck.findCards("is:review") == [c.id] assert deck.findCards("is:due") == [] c.due = 0; c.queue = 2 c.flush() assert deck.findCards("is:due") == [c.id] assert len(deck.findCards("-is:due")) == 4 c.queue = -1 # ensure this card gets a later mod time c.flush() deck.db.execute("update cards set mod = mod + 1 where id = ?", c.id) assert deck.findCards("is:suspended") == [c.id] # nids assert deck.findCards("nid:54321") == [] assert len(deck.findCards("nid:%d"%f.id)) == 2 assert len(deck.findCards("nid:%d,%d" % (f1id, f2id))) == 2 # templates assert len(deck.findCards("card:foo")) == 0 assert len(deck.findCards("'card:card 1'")) == 4 assert len(deck.findCards("card:reverse")) == 1 assert len(deck.findCards("card:1")) == 4 assert len(deck.findCards("card:2")) == 1 # fields assert len(deck.findCards("front:dog")) == 1 assert len(deck.findCards("-front:dog")) == 4 assert len(deck.findCards("front:sheep")) == 0 assert len(deck.findCards("back:sheep")) == 2 assert len(deck.findCards("-back:sheep")) == 3 assert len(deck.findCards("front:do")) == 0 assert len(deck.findCards("front:*")) == 5 # ordering deck.conf['sortType'] = "noteCrt" assert deck.findCards("front:*", order=True)[-1] in latestCardIds assert deck.findCards("", order=True)[-1] in latestCardIds deck.conf['sortType'] = "noteFld" assert deck.findCards("", order=True)[0] == catCard.id assert deck.findCards("", order=True)[-1] in latestCardIds deck.conf['sortType'] = "cardMod" assert deck.findCards("", order=True)[-1] in latestCardIds assert deck.findCards("", order=True)[0] == firstCardId deck.conf['sortBackwards'] = True assert deck.findCards("", order=True)[0] in latestCardIds # model assert len(deck.findCards("note:basic")) == 5 assert len(deck.findCards("-note:basic")) == 0 assert len(deck.findCards("-note:foo")) == 5 # deck assert len(deck.findCards("deck:default")) == 5 assert len(deck.findCards("-deck:default")) == 0 assert len(deck.findCards("-deck:foo")) == 5 assert len(deck.findCards("deck:def*")) == 5 assert len(deck.findCards("deck:*EFAULT")) == 5 assert len(deck.findCards("deck:*cefault")) == 0 # full search f = deck.newNote() f['Front'] = u'helloworld' f['Back'] = u'abc' deck.addNote(f) # as it's the sort field, it matches assert len(deck.findCards("helloworld")) == 2 #assert len(deck.findCards("helloworld", full=True)) == 2 # if we put it on the back, it won't (f['Front'], f['Back']) = (f['Back'], f['Front']) f.flush() assert len(deck.findCards("helloworld")) == 0 #assert len(deck.findCards("helloworld", full=True)) == 2 #assert len(deck.findCards("back:helloworld", full=True)) == 2 # searching for an invalid special tag should not error assert len(deck.findCards("is:invalid")) == 0 # should be able to limit to parent deck, no children id = deck.db.scalar("select id from cards limit 1") deck.db.execute("update cards set did = ? where id = ?", deck.decks.id("Default::Child"), id) assert len(deck.findCards("deck:default")) == 7 assert len(deck.findCards("deck:default::child")) == 1 assert len(deck.findCards("deck:default -deck:default::*")) == 6 # properties id = deck.db.scalar("select id from cards limit 1") deck.db.execute( "update cards set queue=2, ivl=10, reps=20, due=30, factor=2200 " "where id = ?", id) assert len(deck.findCards("prop:ivl>5")) == 1 assert len(deck.findCards("prop:ivl<5")) > 1 assert len(deck.findCards("prop:ivl>=5")) == 1 assert len(deck.findCards("prop:ivl=9")) == 0 assert len(deck.findCards("prop:ivl=10")) == 1 assert len(deck.findCards("prop:ivl!=10")) > 1 assert len(deck.findCards("prop:due>0")) == 1 # due dates should work deck.sched.today = 15 assert len(deck.findCards("prop:due=14")) == 0 assert len(deck.findCards("prop:due=15")) == 1 assert len(deck.findCards("prop:due=16")) == 0 # including negatives deck.sched.today = 32 assert len(deck.findCards("prop:due=-1")) == 0 assert len(deck.findCards("prop:due=-2")) == 1 # ease factors assert len(deck.findCards("prop:ease=2.3")) == 0 assert len(deck.findCards("prop:ease=2.2")) == 1 assert len(deck.findCards("prop:ease>2")) == 1 assert len(deck.findCards("-prop:ease>2")) > 1 # recently failed assert len(deck.findCards("rated:1:1")) == 0 assert len(deck.findCards("rated:1:2")) == 0 c = deck.sched.getCard() deck.sched.answerCard(c, 2) assert len(deck.findCards("rated:1:1")) == 0 assert len(deck.findCards("rated:1:2")) == 1 c = deck.sched.getCard() deck.sched.answerCard(c, 1) assert len(deck.findCards("rated:1:1")) == 1 assert len(deck.findCards("rated:1:2")) == 1 assert len(deck.findCards("rated:1")) == 2 assert len(deck.findCards("rated:0:2")) == 0 assert len(deck.findCards("rated:2:2")) == 1 # empty field assert len(deck.findCards("front:")) == 0 f = deck.newNote() f['Front'] = u'' f['Back'] = u'abc2' assert deck.addNote(f) == 1 assert len(deck.findCards("front:")) == 1 # OR searches and nesting assert len(deck.findCards("tag:monkey or tag:sheep")) == 2 assert len(deck.findCards("(tag:monkey OR tag:sheep)")) == 2 assert len(deck.findCards("-(tag:monkey OR tag:sheep)")) == 6 assert len(deck.findCards("tag:monkey or (tag:sheep sheep)")) == 2 assert len(deck.findCards("tag:monkey or (tag:sheep octopus)")) == 1 # invalid grouping shouldn't error assert len(deck.findCards(")")) == 0 assert len(deck.findCards("(()")) == 0 # added assert len(deck.findCards("added:0")) == 0 deck.db.execute("update cards set id = id - 86400*1000 where id = ?", id) assert len(deck.findCards("added:1")) == deck.cardCount() - 1 assert len(deck.findCards("added:2")) == deck.cardCount() def test_findReplace(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u'foo' f['Back'] = u'bar' deck.addNote(f) f2 = deck.newNote() f2['Front'] = u'baz' f2['Back'] = u'foo' deck.addNote(f2) nids = [f.id, f2.id] # should do nothing assert deck.findReplace(nids, "abc", "123") == 0 # global replace assert deck.findReplace(nids, "foo", "qux") == 2 f.load(); assert f['Front'] == "qux" f2.load(); assert f2['Back'] == "qux" # single field replace assert deck.findReplace(nids, "qux", "foo", field="Front") == 1 f.load(); assert f['Front'] == "foo" f2.load(); assert f2['Back'] == "qux" # regex replace assert deck.findReplace(nids, "B.r", "reg") == 0 f.load(); assert f['Back'] != "reg" assert deck.findReplace(nids, "B.r", "reg", regex=True) == 1 f.load(); assert f['Back'] == "reg" def test_findDupes(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u'foo' f['Back'] = u'bar' deck.addNote(f) f2 = deck.newNote() f2['Front'] = u'baz' f2['Back'] = u'bar' deck.addNote(f2) f3 = deck.newNote() f3['Front'] = u'quux' f3['Back'] = u'bar' deck.addNote(f3) f4 = deck.newNote() f4['Front'] = u'quuux' f4['Back'] = u'nope' deck.addNote(f4) r = deck.findDupes("Back") assert r[0][0] == "bar" assert len(r[0][1]) == 3 # valid search r = deck.findDupes("Back", "bar") assert r[0][0] == "bar" assert len(r[0][1]) == 3 # excludes everything r = deck.findDupes("Back", "invalid") assert not r # front isn't dupe assert deck.findDupes("Front") == [] anki-2.0.20+dfsg/tests/test_cards.py0000644000175000017500000000561412065175361017133 0ustar andreasandreas# coding: utf-8 from tests.shared import getEmptyDeck def test_previewCards(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u'1' f['Back'] = u'2' # non-empty and active cards = deck.previewCards(f, 0) assert len(cards) == 1 assert cards[0].ord == 0 # all templates cards = deck.previewCards(f, 2) assert len(cards) == 1 # add the note, and test existing preview deck.addNote(f) cards = deck.previewCards(f, 1) assert len(cards) == 1 assert cards[0].ord == 0 # make sure we haven't accidentally added cards to the db assert deck.cardCount() == 1 def test_delete(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u'1' f['Back'] = u'2' deck.addNote(f) cid = f.cards()[0].id deck.reset() deck.sched.answerCard(deck.sched.getCard(), 2) deck.remCards([cid]) assert deck.cardCount() == 0 assert deck.noteCount() == 0 assert deck.db.scalar("select count() from notes") == 0 assert deck.db.scalar("select count() from cards") == 0 assert deck.db.scalar("select count() from graves") == 2 def test_misc(): d = getEmptyDeck() f = d.newNote() f['Front'] = u'1' f['Back'] = u'2' d.addNote(f) c = f.cards()[0] id = d.models.current()['id'] assert c.template()['ord'] == 0 def test_genrem(): d = getEmptyDeck() f = d.newNote() f['Front'] = u'1' f['Back'] = u'' d.addNote(f) assert len(f.cards()) == 1 m = d.models.current() mm = d.models # adding a new template should automatically create cards t = mm.newTemplate("rev") t['qfmt'] = '{{Front}}' t['afmt'] = "" mm.addTemplate(m, t) mm.save(m, templates=True) assert len(f.cards()) == 2 # if the template is changed to remove cards, they'll be removed t['qfmt'] = "{{Back}}" mm.save(m, templates=True) d.remCards(d.emptyCids()) assert len(f.cards()) == 1 # if we add to the note, a card should be automatically generated f.load() f['Back'] = "1" f.flush() assert len(f.cards()) == 2 def test_gendeck(): d = getEmptyDeck() cloze = d.models.byName("Cloze") d.models.setCurrent(cloze) f = d.newNote() f['Text'] = u'{{c1::one}}' d.addNote(f) assert d.cardCount() == 1 assert f.cards()[0].did == 1 # set the model to a new default deck newId = d.decks.id("new") cloze['did'] = newId d.models.save(cloze) # a newly generated card should share the first card's deck f['Text'] += u'{{c2::two}}' f.flush() assert f.cards()[1].did == 1 # and same with multiple cards f['Text'] += u'{{c3::three}}' f.flush() assert f.cards()[2].did == 1 # if one of the cards is in a different deck, it should revert to the # model default c = f.cards()[1] c.did = newId c.flush() f['Text'] += u'{{c4::four}}' f.flush() assert f.cards()[3].did == newId anki-2.0.20+dfsg/tests/test_collection.py0000644000175000017500000000722512065175361020172 0ustar andreasandreas# coding: utf-8 import os from tests.shared import assertException, getEmptyDeck from anki.stdmodels import addBasicModel from anki import Collection as aopen newPath = None newMod = None def test_create(): global newPath, newMod path = "/tmp/test_attachNew.anki2" try: os.unlink(path) except OSError: pass deck = aopen(path) # for open() newPath = deck.path deck.close() newMod = deck.mod del deck def test_open(): deck = aopen(newPath) assert deck.mod == newMod deck.close() def test_openReadOnly(): # non-writeable dir assertException(Exception, lambda: aopen("/attachroot.anki2")) # reuse tmp file from before, test non-writeable file os.chmod(newPath, 0) assertException(Exception, lambda: aopen(newPath)) os.chmod(newPath, 0666) os.unlink(newPath) def test_noteAddDelete(): deck = getEmptyDeck() # add a note f = deck.newNote() f['Front'] = u"one"; f['Back'] = u"two" n = deck.addNote(f) assert n == 1 # test multiple cards - add another template m = deck.models.current(); mm = deck.models t = mm.newTemplate("Reverse") t['qfmt'] = "{{Back}}" t['afmt'] = "{{Front}}" mm.addTemplate(m, t) mm.save(m) # the default save doesn't generate cards assert deck.cardCount() == 1 # but when templates are edited such as in the card layout screen, it # should generate cards on close mm.save(m, templates=True) assert deck.cardCount() == 2 # creating new notes should use both cards f = deck.newNote() f['Front'] = u"three"; f['Back'] = u"four" n = deck.addNote(f) assert n == 2 assert deck.cardCount() == 4 # check q/a generation c0 = f.cards()[0] assert "three" in c0.q() # it should not be a duplicate assert not f.dupeOrEmpty() # now let's make a duplicate f2 = deck.newNote() f2['Front'] = u"one"; f2['Back'] = u"" assert f2.dupeOrEmpty() # empty first field should not be permitted either f2['Front'] = " " assert f2.dupeOrEmpty() def test_fieldChecksum(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u"new"; f['Back'] = u"new2" deck.addNote(f) assert deck.db.scalar( "select csum from notes") == int("c2a6b03f", 16) # changing the val should change the checksum f['Front'] = u"newx" f.flush() assert deck.db.scalar( "select csum from notes") == int("302811ae", 16) def test_addDelTags(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u"1" deck.addNote(f) f2 = deck.newNote() f2['Front'] = u"2" deck.addNote(f2) # adding for a given id deck.tags.bulkAdd([f.id], "foo") f.load(); f2.load() assert "foo" in f.tags assert "foo" not in f2.tags # should be canonified deck.tags.bulkAdd([f.id], "foo aaa") f.load() assert f.tags[0] == "aaa" assert len(f.tags) == 2 def test_timestamps(): deck = getEmptyDeck() assert len(deck.models.models) == 4 for i in range(100): addBasicModel(deck) assert len(deck.models.models) == 104 def test_furigana(): deck = getEmptyDeck() mm = deck.models m = mm.current() # filter should work m['tmpls'][0]['qfmt'] = '{{kana:Front}}' mm.save(m) n = deck.newNote() n['Front'] = 'foo[abc]' deck.addNote(n) c = n.cards()[0] assert c.q().endswith("abc") # and should avoid sound n['Front'] = 'foo[sound:abc.mp3]' n.flush() assert "sound:" in c.q(reload=True) # it shouldn't throw an error while people are editing m['tmpls'][0]['qfmt'] = '{{kana:}}' mm.save(m) c.q(reload=True) anki-2.0.20+dfsg/tests/test_models.py0000644000175000017500000002056012065175361017317 0ustar andreasandreas# coding: utf-8 from tests.shared import getEmptyDeck from anki.utils import stripHTML, joinFields def test_modelDelete(): deck = getEmptyDeck() f = deck.newNote() f['Front'] = u'1' f['Back'] = u'2' deck.addNote(f) assert deck.cardCount() == 1 deck.models.rem(deck.models.current()) assert deck.cardCount() == 0 def test_modelCopy(): deck = getEmptyDeck() m = deck.models.current() m2 = deck.models.copy(m) assert m2['name'] == "Basic copy" assert m2['id'] != m['id'] assert len(m2['flds']) == 2 assert len(m['flds']) == 2 assert len(m2['flds']) == len(m['flds']) assert len(m['tmpls']) == 1 assert len(m2['tmpls']) == 1 assert deck.models.scmhash(m) == deck.models.scmhash(m2) def test_fields(): d = getEmptyDeck() f = d.newNote() f['Front'] = u'1' f['Back'] = u'2' d.addNote(f) m = d.models.current() # make sure renaming a field updates the templates d.models.renameField(m, m['flds'][0], "NewFront") assert "{{NewFront}}" in m['tmpls'][0]['qfmt'] h = d.models.scmhash(m) # add a field f = d.models.newField(m) f['name'] = "foo" d.models.addField(m, f) assert d.getNote(d.models.nids(m)[0]).fields == ["1", "2", ""] assert d.models.scmhash(m) != h # rename it d.models.renameField(m, f, "bar") assert d.getNote(d.models.nids(m)[0])['bar'] == '' # delete back d.models.remField(m, m['flds'][1]) assert d.getNote(d.models.nids(m)[0]).fields == ["1", ""] # move 0 -> 1 d.models.moveField(m, m['flds'][0], 1) assert d.getNote(d.models.nids(m)[0]).fields == ["", "1"] # move 1 -> 0 d.models.moveField(m, m['flds'][1], 0) assert d.getNote(d.models.nids(m)[0]).fields == ["1", ""] # add another and put in middle f = d.models.newField(m) f['name'] = "baz" d.models.addField(m, f) f = d.getNote(d.models.nids(m)[0]) f['baz'] = "2" f.flush() assert d.getNote(d.models.nids(m)[0]).fields == ["1", "", "2"] # move 2 -> 1 d.models.moveField(m, m['flds'][2], 1) assert d.getNote(d.models.nids(m)[0]).fields == ["1", "2", ""] # move 0 -> 2 d.models.moveField(m, m['flds'][0], 2) assert d.getNote(d.models.nids(m)[0]).fields == ["2", "", "1"] # move 0 -> 1 d.models.moveField(m, m['flds'][0], 1) assert d.getNote(d.models.nids(m)[0]).fields == ["", "2", "1"] def test_templates(): d = getEmptyDeck() m = d.models.current(); mm = d.models t = mm.newTemplate("Reverse") t['qfmt'] = "{{Back}}" t['afmt'] = "{{Front}}" mm.addTemplate(m, t) mm.save(m) f = d.newNote() f['Front'] = u'1' f['Back'] = u'2' d.addNote(f) assert d.cardCount() == 2 (c, c2) = f.cards() # first card should have first ord assert c.ord == 0 assert c2.ord == 1 # switch templates d.models.moveTemplate(m, c.template(), 1) c.load(); c2.load() assert c.ord == 1 assert c2.ord == 0 # removing a template should delete its cards assert d.models.remTemplate(m, m['tmpls'][0]) assert d.cardCount() == 1 # and should have updated the other cards' ordinals c = f.cards()[0] assert c.ord == 0 assert stripHTML(c.q()) == "1" # it shouldn't be possible to orphan notes by removing templates t = mm.newTemplate(m) mm.addTemplate(m, t) assert not d.models.remTemplate(m, m['tmpls'][0]) def test_text(): d = getEmptyDeck() m = d.models.current() m['tmpls'][0]['qfmt'] = "{{text:Front}}" d.models.save(m) f = d.newNote() f['Front'] = u'helloworld' d.addNote(f) assert "helloworld" in f.cards()[0].q() def test_cloze(): d = getEmptyDeck() d.models.setCurrent(d.models.byName("Cloze")) f = d.newNote() assert f.model()['name'] == "Cloze" # a cloze model with no clozes is not empty f['Text'] = u'nothing' assert d.addNote(f) # try with one cloze f = d.newNote() f['Text'] = "hello {{c1::world}}" assert d.addNote(f) == 1 assert "hello [...]" in f.cards()[0].q() assert "hello world" in f.cards()[0].a() # and with a comment f = d.newNote() f['Text'] = "hello {{c1::world::typical}}" assert d.addNote(f) == 1 assert "[typical]" in f.cards()[0].q() assert "world" in f.cards()[0].a() # and with 2 clozes f = d.newNote() f['Text'] = "hello {{c1::world}} {{c2::bar}}" assert d.addNote(f) == 2 (c1, c2) = f.cards() assert "[...] bar" in c1.q() assert "world bar" in c1.a() assert "world [...]" in c2.q() assert "world bar" in c2.a() # if there are multiple answers for a single cloze, they are given in a # list f = d.newNote() f['Text'] = "a {{c1::b}} {{c1::c}}" assert d.addNote(f) == 1 assert "b c" in ( f.cards()[0].a()) # if we add another cloze, a card should be generated cnt = d.cardCount() f['Text'] = "{{c2::hello}} {{c1::foo}}" f.flush() assert d.cardCount() == cnt + 1 # 0 or negative indices are not supported f['Text'] += "{{c0::zero}} {{c-1:foo}}" f.flush() assert len(f.cards()) == 2 def test_modelChange(): deck = getEmptyDeck() basic = deck.models.byName("Basic") cloze = deck.models.byName("Cloze") # enable second template and add a note m = deck.models.current(); mm = deck.models t = mm.newTemplate("Reverse") t['qfmt'] = "{{Back}}" t['afmt'] = "{{Front}}" mm.addTemplate(m, t) mm.save(m) f = deck.newNote() f['Front'] = u'f' f['Back'] = u'b123' deck.addNote(f) # switch fields map = {0: 1, 1: 0} deck.models.change(basic, [f.id], basic, map, None) f.load() assert f['Front'] == 'b123' assert f['Back'] == 'f' # switch cards c0 = f.cards()[0] c1 = f.cards()[1] assert "b123" in c0.q() assert "f" in c1.q() assert c0.ord == 0 assert c1.ord == 1 deck.models.change(basic, [f.id], basic, None, map) f.load(); c0.load(); c1.load() assert "f" in c0.q() assert "b123" in c1.q() assert c0.ord == 1 assert c1.ord == 0 # .cards() returns cards in order assert f.cards()[0].id == c1.id # delete first card map = {0: None, 1: 1} deck.models.change(basic, [f.id], basic, None, map) f.load() c0.load() # the card was deleted try: c1.load() assert 0 except TypeError: pass # but we have two cards, as a new one was generated assert len(f.cards()) == 2 # an unmapped field becomes blank assert f['Front'] == 'b123' assert f['Back'] == 'f' deck.models.change(basic, [f.id], basic, map, None) f.load() assert f['Front'] == '' assert f['Back'] == 'f' # another note to try model conversion f = deck.newNote() f['Front'] = u'f2' f['Back'] = u'b2' deck.addNote(f) assert deck.models.useCount(basic) == 2 assert deck.models.useCount(cloze) == 0 map = {0: 0, 1: 1} deck.models.change(basic, [f.id], cloze, map, map) f.load() assert f['Text'] == "f2" assert len(f.cards()) == 2 # back the other way, with deletion of second ord deck.models.remTemplate(basic, basic['tmpls'][1]) assert deck.db.scalar("select count() from cards where nid = ?", f.id) == 2 deck.models.change(cloze, [f.id], basic, map, map) assert deck.db.scalar("select count() from cards where nid = ?", f.id) == 1 def test_availOrds(): d = getEmptyDeck() m = d.models.current(); mm = d.models t = m['tmpls'][0] f = d.newNote() f['Front'] = "1" # simple templates assert mm.availOrds(m, joinFields(f.fields)) == [0] t['qfmt'] = "{{Back}}" mm.save(m, templates=True) assert not mm.availOrds(m, joinFields(f.fields)) # AND t['qfmt'] = "{{#Front}}{{#Back}}{{Front}}{{/Back}}{{/Front}}" mm.save(m, templates=True) assert not mm.availOrds(m, joinFields(f.fields)) t['qfmt'] = "{{#Front}}\n{{#Back}}\n{{Front}}\n{{/Back}}\n{{/Front}}" mm.save(m, templates=True) assert not mm.availOrds(m, joinFields(f.fields)) # OR t['qfmt'] = "{{Front}}\n{{Back}}" mm.save(m, templates=True) assert mm.availOrds(m, joinFields(f.fields)) == [0] t['Front'] = "" t['Back'] = "1" assert mm.availOrds(m, joinFields(f.fields)) == [0] anki-2.0.20+dfsg/tests/test_importing.py0000644000175000017500000002422712240627114020041 0ustar andreasandreas# coding: utf-8 import os from tests.shared import getUpgradeDeckPath, getEmptyDeck from anki.upgrade import Upgrader from anki.utils import ids2str from anki.importing import Anki1Importer, Anki2Importer, TextImporter, \ SupermemoXmlImporter, MnemosyneImporter, AnkiPackageImporter testDir = os.path.dirname(__file__) srcNotes=None srcCards=None def test_anki2(): global srcNotes, srcCards # get the deck to import tmp = getUpgradeDeckPath() u = Upgrader() u.check(tmp) src = u.upgrade() srcpath = src.path srcNotes = src.noteCount() srcCards = src.cardCount() srcRev = src.db.scalar("select count() from revlog") # add a media file for testing open(os.path.join(src.media.dir(), "_foo.jpg"), "w").write("foo") src.close() # create a new empty deck dst = getEmptyDeck() # import src into dst imp = Anki2Importer(dst, srcpath) imp.run() def check(): assert dst.noteCount() == srcNotes assert dst.cardCount() == srcCards assert srcRev == dst.db.scalar("select count() from revlog") mids = [int(x) for x in dst.models.models.keys()] assert not dst.db.scalar( "select count() from notes where mid not in "+ids2str(mids)) assert not dst.db.scalar( "select count() from cards where nid not in (select id from notes)") assert not dst.db.scalar( "select count() from revlog where cid not in (select id from cards)") assert dst.fixIntegrity()[0].startswith("Database rebuilt") check() # importing should be idempotent imp.run() check() assert len(os.listdir(dst.media.dir())) == 1 def test_anki2_mediadupes(): tmp = getEmptyDeck() # add a note that references a sound n = tmp.newNote() n['Front'] = "[sound:foo.mp3]" mid = n.model()['id'] tmp.addNote(n) # add that sound to media folder open(os.path.join(tmp.media.dir(), "foo.mp3"), "w").write("foo") tmp.close() # it should be imported correctly into an empty deck empty = getEmptyDeck() imp = Anki2Importer(empty, tmp.path) imp.run() assert os.listdir(empty.media.dir()) == ["foo.mp3"] # and importing again will not duplicate, as the file content matches empty.remCards(empty.db.list("select id from cards")) imp = Anki2Importer(empty, tmp.path) imp.run() assert os.listdir(empty.media.dir()) == ["foo.mp3"] n = empty.getNote(empty.db.scalar("select id from notes")) assert "foo.mp3" in n.fields[0] # if the local file content is different, and import should trigger a # rename empty.remCards(empty.db.list("select id from cards")) open(os.path.join(empty.media.dir(), "foo.mp3"), "w").write("bar") imp = Anki2Importer(empty, tmp.path) imp.run() assert sorted(os.listdir(empty.media.dir())) == [ "foo.mp3", "foo_%s.mp3" % mid] n = empty.getNote(empty.db.scalar("select id from notes")) assert "_" in n.fields[0] # if the localized media file already exists, we rewrite the note and # media empty.remCards(empty.db.list("select id from cards")) open(os.path.join(empty.media.dir(), "foo.mp3"), "w").write("bar") imp = Anki2Importer(empty, tmp.path) imp.run() assert sorted(os.listdir(empty.media.dir())) == [ "foo.mp3", "foo_%s.mp3" % mid] assert sorted(os.listdir(empty.media.dir())) == [ "foo.mp3", "foo_%s.mp3" % mid] n = empty.getNote(empty.db.scalar("select id from notes")) assert "_" in n.fields[0] def test_apkg(): tmp = getEmptyDeck() apkg = unicode(os.path.join(testDir, "support/media.apkg")) imp = AnkiPackageImporter(tmp, apkg) assert os.listdir(tmp.media.dir()) == [] imp.run() assert os.listdir(tmp.media.dir()) == ['foo.wav'] # importing again should be idempotent in terms of media tmp.remCards(tmp.db.list("select id from cards")) imp = AnkiPackageImporter(tmp, apkg) imp.run() assert os.listdir(tmp.media.dir()) == ['foo.wav'] # but if the local file has different data, it will rename tmp.remCards(tmp.db.list("select id from cards")) open(os.path.join(tmp.media.dir(), "foo.wav"), "w").write("xyz") imp = AnkiPackageImporter(tmp, apkg) imp.run() assert len(os.listdir(tmp.media.dir())) == 2 def test_anki1(): # get the deck path to import tmp = getUpgradeDeckPath() # make sure media is imported properly through the upgrade mdir = tmp.replace(".anki2", ".media") if not os.path.exists(mdir): os.mkdir(mdir) open(os.path.join(mdir, "_foo.jpg"), "w").write("foo") # create a new empty deck dst = getEmptyDeck() # import src into dst imp = Anki1Importer(dst, tmp) imp.run() def check(): assert dst.noteCount() == srcNotes assert dst.cardCount() == srcCards assert len(os.listdir(dst.media.dir())) == 1 check() # importing should be idempotent imp = Anki1Importer(dst, tmp) imp.run() check() def test_anki1_diffmodels(): # create a new empty deck dst = getEmptyDeck() # import the 1 card version of the model tmp = getUpgradeDeckPath("diffmodels1.anki") imp = Anki1Importer(dst, tmp) imp.run() before = dst.noteCount() # repeating the process should do nothing imp = Anki1Importer(dst, tmp) imp.run() assert before == dst.noteCount() # then the 2 card version tmp = getUpgradeDeckPath("diffmodels2.anki") imp = Anki1Importer(dst, tmp) imp.run() after = dst.noteCount() # as the model schemas differ, should have been imported as new model assert after == before + 1 # repeating the process should do nothing beforeModels = len(dst.models.all()) imp = Anki1Importer(dst, tmp) imp.run() after = dst.noteCount() assert after == before + 1 assert beforeModels == len(dst.models.all()) def test_suspended(): # create a new empty deck dst = getEmptyDeck() # import the 1 card version of the model tmp = getUpgradeDeckPath("suspended12.anki") imp = Anki1Importer(dst, tmp) imp.run() assert dst.db.scalar("select due from cards") < 0 def test_anki2_diffmodels(): # create a new empty deck dst = getEmptyDeck() # import the 1 card version of the model tmp = getUpgradeDeckPath("diffmodels2-1.apkg") imp = AnkiPackageImporter(dst, tmp) imp.dupeOnSchemaChange = True imp.run() before = dst.noteCount() # repeating the process should do nothing imp = AnkiPackageImporter(dst, tmp) imp.dupeOnSchemaChange = True imp.run() assert before == dst.noteCount() # then the 2 card version tmp = getUpgradeDeckPath("diffmodels2-2.apkg") imp = AnkiPackageImporter(dst, tmp) imp.dupeOnSchemaChange = True imp.run() after = dst.noteCount() # as the model schemas differ, should have been imported as new model assert after == before + 1 # and the new model should have both cards assert dst.cardCount() == 3 # repeating the process should do nothing imp = AnkiPackageImporter(dst, tmp) imp.dupeOnSchemaChange = True imp.run() after = dst.noteCount() assert after == before + 1 assert dst.cardCount() == 3 def test_anki2_updates(): # create a new empty deck dst = getEmptyDeck() tmp = getUpgradeDeckPath("update1.apkg") imp = AnkiPackageImporter(dst, tmp) imp.run() assert imp.dupes == 0 assert imp.added == 1 assert imp.updated == 0 # importing again should be idempotent imp = AnkiPackageImporter(dst, tmp) imp.run() assert imp.dupes == 1 assert imp.added == 0 assert imp.updated == 0 # importing a newer note should update assert dst.noteCount() == 1 assert dst.db.scalar("select flds from notes").startswith("hello") tmp = getUpgradeDeckPath("update2.apkg") imp = AnkiPackageImporter(dst, tmp) imp.run() assert imp.dupes == 1 assert imp.added == 0 assert imp.updated == 1 assert dst.noteCount() == 1 assert dst.db.scalar("select flds from notes").startswith("goodbye") def test_csv(): deck = getEmptyDeck() file = unicode(os.path.join(testDir, "support/text-2fields.txt")) i = TextImporter(deck, file) i.initMapping() i.run() # four problems - too many & too few fields, a missing front, and a # duplicate entry assert len(i.log) == 5 assert i.total == 5 # if we run the import again, it should update instead i.run() assert len(i.log) == 10 assert i.total == 5 # but importing should not clobber tags if they're unmapped n = deck.getNote(deck.db.scalar("select id from notes")) n.addTag("test") n.flush() i.run() n.load() assert n.tags == ['test'] # if add-only mode, count will be 0 i.importMode = 1 i.run() assert i.total == 0 # and if dupes mode, will reimport everything assert deck.cardCount() == 5 i.importMode = 2 i.run() # includes repeated field assert i.total == 6 assert deck.cardCount() == 11 deck.close() def test_csv2(): deck = getEmptyDeck() mm = deck.models m = mm.current() f = mm.newField("Three") mm.addField(m, f) mm.save(m) n = deck.newNote() n['Front'] = "1" n['Back'] = "2" n['Three'] = "3" deck.addNote(n) # an update with unmapped fields should not clobber those fields file = unicode(os.path.join(testDir, "support/text-update.txt")) i = TextImporter(deck, file) i.initMapping() i.run() n.load() assert n['Front'] == "1" assert n['Back'] == "x" assert n['Three'] == "3" deck.close() def test_supermemo_xml_01_unicode(): deck = getEmptyDeck() file = unicode(os.path.join(testDir, "support/supermemo1.xml")) i = SupermemoXmlImporter(deck, file) #i.META.logToStdOutput = True i.run() assert i.total == 1 cid = deck.db.scalar("select id from cards") c = deck.getCard(cid) assert c.factor == 5701 assert c.reps == 7 deck.close() def test_mnemo(): deck = getEmptyDeck() file = unicode(os.path.join(testDir, "support/mnemo.db")) i = MnemosyneImporter(deck, file) i.run() assert deck.cardCount() == 7 assert "a_longer_tag" in deck.tags.all() assert deck.db.scalar("select count() from cards where type = 0") == 1 deck.close() anki-2.0.20+dfsg/tests/test_upgrade.py0000644000175000017500000000436612077700767017500 0ustar andreasandreas# coding: utf-8 import datetime, shutil from anki import Collection from anki.consts import * from shared import getUpgradeDeckPath, testDir from anki.upgrade import Upgrader from anki.utils import checksum def test_check(): dst = getUpgradeDeckPath() u = Upgrader() assert u.check(dst) == "ok" # if it's corrupted, will fail open(dst, "w+").write("foo") assert u.check(dst) == "invalid" # the upgrade should be able to fix non-fatal errors - # test with a deck that has cards with missing notes dst = getUpgradeDeckPath("anki12-broken.anki") assert "with missing fact" in u.check(dst) def test_upgrade1(): dst = getUpgradeDeckPath() csum = checksum(open(dst).read()) u = Upgrader() u.check(dst) deck = u.upgrade() # src file must not have changed assert csum == checksum(open(dst).read()) # creation time should have been adjusted d = datetime.datetime.fromtimestamp(deck.crt) assert d.hour == 4 and d.minute == 0 # 3 new, 2 failed, 1 due deck.reset() deck.conf['counts'] = COUNT_REMAINING assert deck.sched.counts() == (3,2,1) # modifying each note should not cause new cards to be generated assert deck.cardCount() == 6 for nid in deck.db.list("select id from notes"): note = deck.getNote(nid) note.flush() assert deck.cardCount() == 6 # now's a good time to test the integrity check too deck.fixIntegrity() # c = deck.sched.getCard() # print "--q", c.q() # print # print "--a", c.a() def test_upgrade1_due(): dst = getUpgradeDeckPath("anki12-due.anki") u = Upgrader() u.check(dst) deck = u.upgrade() assert not deck.db.scalar("select 1 from cards where due != 1") def test_invalid_ords(): dst = getUpgradeDeckPath("invalid-ords.anki") u = Upgrader() u.check(dst) deck = u.upgrade() assert deck.db.scalar("select count() from cards where ord = 0") == 1 assert deck.db.scalar("select count() from cards where ord = 1") == 1 def test_upgrade2(): p = "/tmp/alpha-upgrade.anki2" if os.path.exists(p): os.unlink(p) shutil.copy2(os.path.join(testDir, "support/anki2-alpha.anki2"), p) col = Collection(p) assert col.db.scalar("select ver from col") == SCHEMA_VERSION anki-2.0.20+dfsg/anki.desktop0000644000175000017500000000042612016171267015572 0ustar andreasandreas[Desktop Entry] Name=Anki Comment=An intelligent spaced-repetition memory training program GenericName=Flashcards Exec=anki TryExec=anki Icon=anki Categories=Education;Languages;KDE;Qt; Terminal=false Type=Application Version=1.0 MimeType=application/x-apkg;application/x-anki; anki-2.0.20+dfsg/designer/0000755000175000017500000000000012256137063015055 5ustar andreasandreasanki-2.0.20+dfsg/designer/browser.ui0000644000175000017500000003753012244725433017110 0ustar andreasandreas Dialog 0 0 750 400 750 400 Browser :/icons/find.png:/icons/find.png 0 0 Qt::Horizontal 1 0 QFrame::NoFrame false 1 4 0 Qt::Vertical 3 1 0 0 6 0 0 0 0 9 0 true QComboBox::NoInsert Search Preview Ctrl+Shift+P true 9 1 0 150 Qt::ActionsContextMenu QFrame::NoFrame QFrame::Plain Qt::ScrollBarAsNeeded QAbstractItemView::NoEditTriggers false true QAbstractItemView::SelectRows false false 20 true 0 0 1 0 0 0 0 1 50 200 0 0 750 22 &Edit &Go &Help :/icons/view-pim-calendar.png:/icons/view-pim-calendar.png &Reschedule... Select &All Ctrl+A :/icons/edit-undo.png:/icons/edit-undo.png &Undo Ctrl+Z &Invert Selection :/icons/document-preview.png:/icons/document-preview.png &Find Ctrl+F :/icons/Anki_Fact.png:/icons/Anki_Fact.png N&ote Ctrl+Shift+F :/icons/go-next.png:/icons/go-next.png &Next Card Ctrl+N :/icons/go-previous.png:/icons/go-previous.png &Previous Card Ctrl+P :/icons/help.png:/icons/help.png &Guide F1 :/icons/system-software-update.png:/icons/system-software-update.png Change Note Type... Ctrl+Shift+M Select &Notes Ctrl+Shift+A :/icons/edit-find-replace.png:/icons/edit-find-replace.png Find and Re&place... Ctrl+Alt+F :/icons/view-pim-calendar.png:/icons/view-pim-calendar.png &Cram... :/icons/anki-tag.png:/icons/anki-tag.png Fil&ters Ctrl+Shift+R :/icons/generate_07.png:/icons/generate_07.png Card List Ctrl+Shift+L :/icons/edit-find 2.png:/icons/edit-find 2.png Find &Duplicates... :/icons/view-sort-ascending.png:/icons/view-sort-ascending.png Reposition... :/icons/arrow-up.png:/icons/arrow-up.png First Card Home :/icons/arrow-down.png:/icons/arrow-down.png Last Card End Close Ctrl+W actionSelectAll triggered() tableView selectAll() -1 -1 299 279 actionClose activated() Dialog close() -1 -1 374 199 anki-2.0.20+dfsg/designer/stats.ui0000644000175000017500000000773012167474722016570 0ustar andreasandreas Dialog 0 0 607 556 Statistics 0 0 about:blank 8 6 Qt::Horizontal 40 20 deck true collection 1 month true 1 year deck life Qt::Horizontal QDialogButtonBox::Close QWebView QWidget
QtWebKit/QWebView
buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274
anki-2.0.20+dfsg/designer/addfield.ui0000644000175000017500000000712512167474722017164 0ustar andreasandreas Dialog 0 0 434 186 Add Field Front true 6 200 Field: Font: Size: Qt::Vertical 20 40 Back Add to: Qt::Vertical QDialogButtonBox::Cancel|QDialogButtonBox::Ok fields font size radioQ radioA buttonBox buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/importing.ui0000644000175000017500000001244712167474722017443 0ustar andreasandreas ImportDialog 0 0 553 466 Import Import options Type Deck Update existing notes when first field matches Ignore lines where first field matches existing note Import even if existing note has same first field Allow HTML in fields 0 0 Field mapping &Import true 0 0 400 150 QFrame::NoFrame true 0 0 402 206 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Help importButton buttonBox buttonBox accepted() ImportDialog accept() 248 254 157 274 buttonBox rejected() ImportDialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/debug.ui0000644000175000017500000000276312167474722016521 0ustar andreasandreas Dialog 0 0 643 580 Debug Console 0 1 16777215 100 QPlainTextEdit::NoWrap 0 8 Courier Qt::ClickFocus true anki-2.0.20+dfsg/designer/addmodel.ui0000644000175000017500000000355412167474722017203 0ustar andreasandreas Dialog 0 0 285 269 Add Note Type QAbstractItemView::NoEditTriggers true Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok buttonBox accepted() Dialog accept() 266 353 157 274 buttonBox rejected() Dialog reject() 334 353 286 274 anki-2.0.20+dfsg/designer/main.ui0000644000175000017500000001506612225675305016352 0ustar andreasandreas MainWindow 0 0 412 301 0 0 400 0 Anki :/icons/anki.png:/icons/anki.png 1 1 true 0 0 412 22 &Help &Edit &File &Tools &Add-ons :/icons/preferences-plugin.png:/icons/preferences-plugin.png E&xit Ctrl+Q &Preferences... Configure interface language and options Ctrl+P QAction::PreferencesRole &About... QAction::AboutRole false &Undo Ctrl+Z Check &Media... Check the files in the media directory &Open Add-ons Folder... &Support Anki... Browse && Install... &Check Database... &Guide... F1 &Switch Profile... Ctrl+Shift+P &Export... Ctrl+E &Import... Ctrl+I Study Deck... / Empty Cards... Create Filtered Deck... F Manage Note Types... anki-2.0.20+dfsg/designer/models.ui0000644000175000017500000000534612167474722016716 0ustar andreasandreas Dialog Qt::ApplicationModal 0 0 396 255 Note Types 0 6 0 0 12 Qt::Vertical QDialogButtonBox::Close|QDialogButtonBox::Help Qt::Vertical QSizePolicy::Minimum 20 6 modelsList buttonBox accepted() Dialog accept() 252 513 157 274 buttonBox rejected() Dialog reject() 320 513 286 274 anki-2.0.20+dfsg/designer/taglimit.ui0000644000175000017500000000574312167474722017246 0ustar andreasandreas Dialog 0 0 361 394 Selective Study Require one or more of these tags: false 0 2 QAbstractItemView::MultiSelection Select tags to exclude: true 0 2 QAbstractItemView::MultiSelection Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() Dialog accept() 358 264 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 activeCheck toggled(bool) activeList setEnabled(bool) 133 18 133 85 anki-2.0.20+dfsg/designer/dconf.ui0000644000175000017500000004724112230107536016507 0ustar andreasandreas Dialog 0 0 494 454 Options group: 3 0 16777215 32 :/icons/gears.png:/icons/gears.png Qt::ToolButtonTextBesideIcon Qt::NoArrow * { color: red } Qt::AlignCenter true 0 New Cards % Starting ease 130 999 Order 1 1 Easy interval Graduating interval 9999 New cards/day Steps (in minutes) Bury related new cards until the next day days 0 0 days Qt::Vertical 20 40 Reviews Easy bonus 100 1000 5 % % 0 9999 Interval modifier Maximum reviews/day Maximum interval 1 99999 days 0 0.000000000000000 999.000000000000000 1.000000000000000 100.000000000000000 Bury related reviews until the next day Qt::Vertical 20 152 Lapses Steps (in minutes) New interval Leech threshold 0 0 lapses Leech action 1 99 Minimum interval days Suspend Card Tag Only Qt::Horizontal 40 20 % 100 5 Qt::Vertical 20 72 General Ignore answer times longer than 30 3600 10 seconds Show answer timer Automatically play audio When answer shown, replay both question and answer audio false Qt::Vertical 20 199 Description Description to show on study screen (current deck only): Qt::Horizontal QDialogButtonBox::Help|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults dconf confOpts tabWidget lrnSteps newOrder newPerDay lrnGradInt lrnEasyInt lrnFactor bury revPerDay easyBonus fi1 maxIvl buryRev lapSteps lapMult lapMinInt leechThreshold leechAction maxTaken showTimer autoplaySounds replayQuestion buttonBox desc buttonBox accepted() Dialog accept() 254 320 157 274 buttonBox rejected() Dialog reject() 322 320 286 274 anki-2.0.20+dfsg/designer/reposition.ui0000644000175000017500000000670012167474722017621 0ustar andreasandreas Dialog 0 0 272 229 Reposition New Cards Start position: -20000000 200000000 0 Step: 1 10000 Randomize order Shift position of existing cards true Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok start step randomize shift buttonBox buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/browseropts.ui0000644000175000017500000000703512167474722020021 0ustar andreasandreas Dialog 0 0 288 195 Browser Options <b>Font</b>: <b>Font Size</b>: 75 0 <b>Line Size</b>: Qt::Horizontal 40 20 Search within formatting (slow) Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok fontCombo fontSize lineSize fullSearch buttonBox buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/edithtml.ui0000644000175000017500000000301112167474722017230 0ustar andreasandreas Dialog 0 0 400 300 HTML Editor false Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Help buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/dyndconf.ui0000644000175000017500000001123212167474722017226 0ustar andreasandreas Dialog 0 0 445 301 Dialog Filter Limit to Search 60 16777215 1 9999 cards selected by Options Reschedule cards based on my answers in this deck true Custom steps (in minutes) false 1 10 Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Help search limit order resched stepsOn steps buttonBox buttonBox accepted() Dialog accept() 254 295 157 274 buttonBox rejected() Dialog reject() 322 295 286 274 stepsOn toggled(bool) steps setEnabled(bool) 126 207 272 205 anki-2.0.20+dfsg/designer/icons.qrc0000644000175000017500000001053111757567175016717 0ustar andreasandreas icons/arrow-up.png icons/arrow-down.png icons/gears.png icons/green.png icons/clock-icon.png icons/plus-circle.png icons/text_clear.png icons/none.png icons/edit-find 2.png icons/edit-find-replace.png icons/user-identity.png icons/layout.png icons/view-sort-descending.png icons/view-refresh.png icons/emblem-important.png icons/view-sort-ascending.png icons/media-playback-start2.png icons/anki-logo-thin.png icons/download.png icons/preferences-plugin.png icons/system-software-update.png icons/media-playback-stop.png icons/media-record.png icons/view-calendar-tasks.png icons/help-hint.png icons/go-first.png icons/go-jump-today.png icons/go-last.png icons/go-next.png icons/go-previous.png icons/player-time.png icons/find.png icons/editclear.png icons/view-statistics.png icons/emblem-favorite.png icons/view-pim-calendar.png icons/anki-tag.png icons/edit-redo.png icons/text-xml.png icons/media-record.png icons/edit-rename.png icons/kblogger.png icons/khtml_kget.png icons/edit-find.png icons/colors.png icons/anki.png icons/ankibw.png icons/addtag.png icons/deletetag.png icons/application-exit.png icons/configure.png icons/contents.png icons/contents2.png icons/document-export.png icons/document-import.png icons/document-new.png icons/edit-undo.png icons/edit.png icons/editdelete.png icons/fileclose.png icons/folder_image.png icons/folder_sound.png icons/format-stroke-color.png icons/games-solve.png icons/help-contents.png icons/help.png icons/image.png icons/kbugbuster.png icons/kexi.png icons/kpersonalizer.png icons/list-add.png icons/math_matrix.png icons/math_sqrt.png icons/media-playback-pause.png icons/media-playback-start.png icons/media-playback-stop.png icons/package_games_card.png icons/preferences-desktop-font.png icons/rating.png icons/speaker.png icons/spreadsheet.png icons/sqlitebrowser.png icons/system-shutdown.png icons/tex.png icons/text-speak.png icons/text_bold.png icons/text_italic.png icons/text_under.png icons/view-pim-news.png icons/view_text.png icons/text_sub.png icons/text_super.png icons/text_remove.png icons/product_design.png icons/stock_new_template.png icons/stock_new_template_blue.png icons/stock_new_template_green.png icons/stock_new_template_red.png icons/stock_group.png icons/star16.png icons/star_off16.png icons/pause16.png icons/pause_off16.png icons/info.png icons/add16.png icons/delete16.png icons/addtag16.png icons/deletetag16.png icons/mail-attachment.png icons/deck16.png icons/clock16.png icons/plus16.png anki-2.0.20+dfsg/designer/browserdisp.ui0000644000175000017500000000576512221204444017762 0ustar andreasandreas Dialog 0 0 412 241 Browser Appearance Override front template: Override back template: Override font: 5 0 6 Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok qfmt afmt font fontSize buttonBox buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/editaddon.ui0000644000175000017500000000320212167474722017353 0ustar andreasandreas Dialog 0 0 753 475 Dialog Courier 10 Pitch Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Save buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/exporting.ui0000644000175000017500000000675112167474722017453 0ustar andreasandreas ExportDialog 0 0 295 202 Export 100 0 <b>Export format</b>: <b>Include</b>: Include scheduling information true Include media true Include tags true Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel format deck includeSched includeMedia includeTags buttonBox buttonBox accepted() ExportDialog accept() 248 254 157 274 buttonBox rejected() ExportDialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/finddupes.ui0000644000175000017500000000562012167474722017407 0ustar andreasandreas Dialog 0 0 531 345 Find Duplicates Optional limit: Look in field: QFrame::StyledPanel QFrame::Raised 0 about:blank Qt::Horizontal QDialogButtonBox::Close QWebView QWidget
QtWebKit/QWebView
fields webView buttonBox buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274
anki-2.0.20+dfsg/designer/changemap.ui0000644000175000017500000000372412167474722017354 0ustar andreasandreas ChangeMap 0 0 391 360 Import Target field: true Qt::Horizontal QDialogButtonBox::Ok buttonBox accepted() ChangeMap accept() 254 355 157 274 buttonBox rejected() ChangeMap reject() 322 355 286 274 fields doubleClicked(QModelIndex) ChangeMap accept() 99 123 193 5 anki-2.0.20+dfsg/designer/preferences.ui0000644000175000017500000003273112250251630017712 0ustar andreasandreas Preferences 0 0 405 450 Preferences Qt::StrongFocus 0 Basic 12 Show next review time above answer buttons Show remaining card count during review Strip HTML when pasting text Paste clipboard images as PNG When adding, default to current deck Change deck depending on note type Next day starts at 60 16777215 23 Learn ahead limit 60 16777215 999 mins Timebox time limit 9999 mins hours past midnight Qt::Vertical QSizePolicy::Preferred 20 20 Profile Password... false Network 10 10 <b>Synchronisation</b> true true Synchronize audio and images too Automatically sync on profile open/close On next sync, force changes in one direction Deauthorize false Qt::Horizontal 40 1 Qt::Vertical 20 40 Backups 10 <b>Backups</b><br>Anki will create a backup of your collection each time it is closed or synchronized. true Keep 60 0 60 16777215 backups Qt::Horizontal 40 20 Compress backups (slower) <a href="backups">Open backup folder</a> Note: Media is not backed up. Please create a periodic backup of your Anki folder to be safe. true Qt::Vertical 20 59 Some settings will take effect after you restart Anki. Qt::AlignCenter Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Help showEstimates showProgress stripHTML pastePNG useCurrent newSpread dayOffset lrnCutoff timeLimit profilePass syncMedia syncOnProgramOpen syncDeauth numBackups buttonBox tabWidget buttonBox accepted() Preferences accept() 285 439 157 274 buttonBox rejected() Preferences reject() 332 439 286 274 anki-2.0.20+dfsg/designer/customstudy.ui0000644000175000017500000001203512221204444020006 0ustar andreasandreas Dialog 0 0 332 380 Custom Study Review ahead Review forgotten cards Increase today's new card limit Increase today's review card limit Study by card state or tag Preview new cards ... ... ... Qt::Horizontal 40 20 0 New cards only Due cards only All cards in random order (cram mode) Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok radio1 radio2 radio3 radio4 radio6 spin buttonBox buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/editcurrent.ui0000644000175000017500000000307512167474722017760 0ustar andreasandreas Dialog 0 0 400 300 Dialog 3 12 Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/addcards.ui0000644000175000017500000000523312167474722017173 0ustar andreasandreas Dialog 0 0 453 366 Add :/icons/list-add.png:/icons/list-add.png 3 12 6 12 12 6 0 0 10 Qt::Horizontal 0 10 true Qt::Horizontal QDialogButtonBox::NoButton buttonBox buttonBox rejected() Dialog reject() 301 -1 286 274 anki-2.0.20+dfsg/designer/modelopts.ui0000644000175000017500000000527712167474722017444 0ustar andreasandreas Dialog Qt::ApplicationModal 0 0 276 323 0 LaTeX Header true Footer true Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Help qtabwidget buttonBox latexHeader latexFooter buttonBox accepted() Dialog accept() 275 442 157 274 buttonBox rejected() Dialog reject() 343 442 286 274 anki-2.0.20+dfsg/designer/findreplace.ui0000644000175000017500000000647012167474722017706 0ustar andreasandreas Dialog 0 0 367 209 Find and Replace <b>Find</b>: <b>Replace With</b>: <b>In</b>: Treat input as regular expression Ignore case true Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok find replace field ignoreCase re buttonBox buttonBox accepted() Dialog accept() 256 154 157 274 buttonBox rejected() Dialog reject() 290 154 286 274 anki-2.0.20+dfsg/designer/studydeck.ui0000644000175000017500000000341612167474722017426 0ustar andreasandreas Dialog 0 0 400 300 Study Deck Filter: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Help buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/getaddons.ui0000644000175000017500000000453012167474722017375 0ustar andreasandreas Dialog 0 0 367 204 Install Add-on To browse add-ons, please click the browse button below.<br><br>When you've found an add-on you like, please paste its code below. true Qt::Vertical 20 40 Code: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/fields.ui0000644000175000017500000001220712167474722016673 0ustar andreasandreas Dialog 0 0 412 352 Fields true 0 0 50 60 Add Delete Rename Reposition Qt::Vertical 20 40 Editing Font 0 25 Reverse text direction (RTL) 5 300 Remember last input when adding Options Sort by this field in the browser Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Help fieldList fieldAdd fieldDelete fieldRename fieldPosition fontFamily fontSize sortField sticky rtl buttonBox buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/setgroup.ui0000644000175000017500000000357312167474722017303 0ustar andreasandreas Dialog 0 0 433 143 Anki Move cards to deck: Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox buttonBox accepted() Dialog accept() 224 192 157 213 buttonBox rejected() Dialog reject() 292 198 286 213 anki-2.0.20+dfsg/designer/setlang.ui0000644000175000017500000000310612167474722017060 0ustar andreasandreas Dialog 0 0 400 300 Anki Interface language: Qt::Horizontal QDialogButtonBox::Ok buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/template.ui0000644000175000017500000001167112167474722017244 0ustar andreasandreas Form 0 0 470 569 0 0 Form 0 0 0 Front Template 0 0 0 Styling 0 0 0 Qt::Vertical QSizePolicy::Preferred 1 15 Qt::Vertical 1 40 Qt::Vertical QSizePolicy::Preferred 1 10 0 10 0 Back Template 0 0 anki-2.0.20+dfsg/designer/profiles.ui0000644000175000017500000000573412167474722017257 0ustar andreasandreas Dialog 0 0 352 283 Profiles :/icons/anki.png:/icons/anki.png Profile: Password: QLineEdit::Password Open Add Rename Delete Quit Qt::Vertical 20 40 profiles passEdit login add rename delete_2 quit anki-2.0.20+dfsg/designer/about.ui0000644000175000017500000000371612221204444016523 0ustar andreasandreas About 0 0 410 664 0 0 About Anki 0 about:blank Qt::Horizontal QDialogButtonBox::Ok QWebView QWidget
QtWebKit/QWebView
buttonBox accepted() About accept() 248 254 157 274 buttonBox rejected() About reject() 316 260 286 274
anki-2.0.20+dfsg/designer/reschedule.ui0000644000175000017500000001061512167474722017551 0ustar andreasandreas Dialog 0 0 325 144 Reschedule Place at end of new card queue true Place in review queue with interval between: false 20 0 0 0 ~ 9999 9999 days Qt::Horizontal 40 20 Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok asNew asRev min max buttonBox buttonBox accepted() Dialog accept() 222 144 157 157 buttonBox rejected() Dialog reject() 222 150 226 157 asRev toggled(bool) rangebox setEnabled(bool) 30 40 11 79 anki-2.0.20+dfsg/designer/changemodel.ui0000644000175000017500000001215312167474722017673 0ustar andreasandreas Dialog 0 0 362 391 Change Note Type 10 4 Current note type: 0 0 4 New note type: 0 0 0 0 Cards 0 0 0 true 0 0 330 120 0 0 Fields 0 0 0 true 0 0 330 119 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 anki-2.0.20+dfsg/designer/icons/0000755000175000017500000000000012256137063016170 5ustar andreasandreasanki-2.0.20+dfsg/designer/icons/kpersonalizer.png0000644000175000017500000000424011755052304021563 0ustar andreasandreasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxbdۭJ__{pzP'#F?@k1&ϩ,Rb]TtgM0sd 񟿒T䂚;%m3E]?aj o00'庁%@D;@:? 1(0)j ?7îb00pI::0u @XXyEY- 4/`K$ b !QX[k10c a;ߟj) bCb`p!m[f~ ߿3՘20ygP[;13H01|g°@`9q#|1a~1>~ߙL*:  gH]AQV  .z >b3pe`hdff @,Sc Ͽ uq`eeQc8`"sf`2xdgxw T;;Ê B@R X9X  ,"4LFa fRc/@8Y5>!3@-0ud0b=Y}*OvPA @,?'737b3a_~cXq8q_ي~0 <= ?Y>33#Cyx-CE 0 6`|K`\s o0Hr0L .Wd`dŴ@b% }Z1>e ,PUi @ Jj XĹ38c"\,LX>v L811eȰbH6acG 6/020 ,ʠ%` -dy|Onp Xl ;@;R  8^&XG}}AJTݷ7 :m H`_xn@>vc5Hc8a>8@0(&Aw@ 9jM8-" &!7%#~bX.N-\[Fr/!B 3t莃##!0@L< +Ѱ0GkOcu AC

2У?`S1:$:8~oϫ6z1ş@@3La>_߶PɐU˿2CoGh?{qu=}~77~)P9H3H srd}И<*,xpܗz{=n;r(ׯADD03X;w>yK;i"<6tthΘ1F0ƨN[@H^DVqJfL&uKc[y' \xQ PC;T&;aaa\.,xd2I>bn4evvjhnny5nxcϓH$^Yb@h(>MӧC@˲vHbܻw/533sIUq"v/'Kk7oʶm`y$`"bӯ^K.gsssUƘ2ִ ؞dt: 1TՌs]6@ gϼߪL=*0şV1@U/*r`7U@Q{ yT{ _ ䷍زiFo\wۣ ClPvhJj-,D `I"&$phDu<+u6=tO^gn2$u)HbZS QUї~2ъ>}ЇA>R PiK `Ke!=ν3s`sk-ʨ˫Qg"tu#f` w9=|#2bW]w؁o ̿.Ȩ94oڽ@FK:I*n` (Wū+K]\d6hu$RqkzR5HRCksA $UAMF+kaEDP*-IC(Vx(JœΙpNPZYf@ 7 JH Xkn Ha_\ QD UQϛ.e &.bZC( YkSMBO*AD1 [VAHHL BQKX5xAʾ؆g~U`Bbs奠s|(ң#2!c1ҨBdr:۳x-wR! H#;zh\_߲5:qs-/ ) bHB Bw1C% /Ʃs۞,Ӿu>b::SۤXc~ZZ! N0@T]*d>/R,rz_nܾ:<[7!0YxOu [gN_]"Y,3| e Q#5;w#|Г|#RF,F5_?r7 YB"pO>"OFY* gx3P:ϫJ_:{GY뼷zQJ_ `ob6G觿-[DQgrB^ȧd ((; FRNܿ9XconRfyO^~Vep,,V)F#+d&毧}>6I/vg?k<;0VE}=nj|$@72⏵qmjgF޶ EDL\^nGY7bxꥧumțt|w~ڄՋ.0'I{-# c}_.y5!qqYKT\Dj¥3= U>& g&kS8 )Lr1Iӎ0q;= we 0 'n;\<{e{qR2@[1bIENDB`anki-2.0.20+dfsg/designer/icons/media-playback-start.png0000644000175000017500000000210711755052304022671 0ustar andreasandreasPNG  IHDR ssRGBbKGD̿ pHYsvv}ՂtIME9u@fIDATH͕]hU?߻l/`3 +2"IUEԅwD!e !J iMPA F_ǜrt6?2\8-R[CFrXUdBs&}FU:O {[)כ`pv=fe<60 $&5ޔw_G˥qԑB(2~PSr|7{=^+Y*VA3dB"&$Xe"fxNd QC ͜b*+eE[ hadHSw"BBRDXi n2=t"d!b率B[z +γ Uz 7xd=0 (4>)Bbmzʹy.l L_BH;Y<<4 G*P4 GyzƯ\hh9Ǣ hb.vAvCLDByf0L3[cʸZm,lB(+!3$`{YG MDW+^`EDeFD@B#UA*@;w\reJRc-ҁPA(GUʏ䦙bFP$tdCdؓAĚ ,xe=p@,Nj!oG?S9"Hhb:Y=DCiG#e^%1CqHc ,)+Iyp=2SCVІ)Ϫ'0@?v]΋}>8ĀGP'O/ú1X>0X, 'y,QI>P M),E (?00'[.3T׷'x^?<%K <9O]2N'7#i-7eQh$}UG{@ΩtN_&{+W]$IMa??O˄XIENDB`anki-2.0.20+dfsg/designer/icons/edit.png0000644000175000017500000000313311755052304017620 0ustar andreasandreasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb;pΗF~! 0 Ad]x??00\ w⮪ @xKDRp]tmG@_@?0x 7oĚ @L$Zƅ @K6`20|˝pc`e(Q Hr(\Y!+?@Y #% &* (n @,X @?c|;si{6 y3021m&@?0',W_~2?w@䀿ԁ ?QKۖp1 @D; 7h`(1|N '+3 Gh~2M^5Lfo e}'/v@00d- "02a:'330{PyFB! r!0 JwV0pkOz3ܿvA4/h'lA@q( :/O8XMr@ tWn(>###!lw((8T^fi9Nb? /gWP4  _ ?jH #@tbnFvP_Pd`xCA_%䟟_&_aɗO @CZ} < `ŋ } ~f;?m Xp=[ ׀ 1<p AXCb^e JF9~1e8bwЮ@dj^KGO_D ObMd`': P(fR(?@`D{{371(>ʹr!?6+(q' i D |s-( s;; ''(MR8c X|/r@ Ïj!| h)++$tFlFbဿH ,LK!gZ̕,XJ1K!pŰm< 6!,ـqDv@`~c0@(0cӀ9 `eLC; FX>(`trIENDB`anki-2.0.20+dfsg/designer/icons/text_clear.png0000644000175000017500000000607511755052304021035 0ustar andreasandreasPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FhIDATxڤJAp"(vfm$`&T!UJI'V+QA,",l,|E?ȥHv;#ыq`ofvT$'gLn|RJljڹsvQ$z=WJrUOEιV1t~L9GoL;@DN HZ-0܋b<.˗x#P <wݎ15@6-*^Ux <]z~}B a""ړ:p B}`B.KpEq1[ 2OWJ0i 3o IENDB`anki-2.0.20+dfsg/designer/icons/speaker.png0000644000175000017500000000367411755052304020337 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<9IDATx[ls٫0RDh%Qڇ^EjU>TUX*CE! qSC& qM{zw3sߎjW.(Hpi9?z0 4"i$h9'oH{Lϱ}ԡ [`1SgLy28k?}(5Yg&HTf$M. d ۖs F K3\c`oԗ6 O#mG}N;x ECn!} {p:ZP9fz-  }/|%5zS8ۈ1;=g@DHIr;vt9tF02(.cWk䠞7܏[ԊM^yB@I屄EQ eqrY M`I>ϡd;UTXY[8.K5K[Z6zz9\w-V22@tUdg "k9mSO']W?H1<MD(<"u[LfA8\ yoA@ɋlYYD0M躎;^#?4rYxY['w>(`Kc}w".,'A8$NS"xG~d2iDc {gaҿ]ⳏt`x/bI)&1A,!?"EO$YX!v:T2o U-k :ұkE1ht "a 2AxNyPvh]=u4{M 8u;*XEBM$BHHdH.XLPUFżH=e Ma<= zQ.g! &c|2EjsʨA02p hkQU)i&D!I Q$Ʉ@WA`al={8ѣ;s,w1V>022nhɥe(,,d] @%^ ;˲15kg C&Xo]]]]iZV;GˆEcH.%IgX}AVPZR\;63,~NIeɂi^?j \[z=,S;:;ң5m/lrj~T'g ƽ/{ & MIENDB`anki-2.0.20+dfsg/designer/icons/gears.png0000644000175000017500000000127511755052304020001 0ustar andreasandreasPNG  IHDRaIDATxcd08}ϟ7prrJ|}2A;&ݻ@o 277wbfffx;w,t__X شqNs 7&?##D~7oL\]]bq]LLL8K/^0`߾}Lo߾MhPTThf8qZ))J{{یP71|2'O~ݺM-fdxǏ>/Z6Aaqƍ>>|`m[*}e7B xoҁAAfΜ9" 7wŵq9 ryڵ_>> 0Z}lٲ***b0֏?` 2腔p&M6ϟ? ~ ={JYwÇ2^^k=sa6Q޽{[aqdJB5k3gxY<==SOyxj?~G|7+2@+G]7o\653Kӓ.M5;Xy[XX%)WUUb f @/_Sr$ WIENDB`anki-2.0.20+dfsg/designer/icons/help.png0000644000175000017500000000306311755052304017625 0ustar andreasandreasPNG  IHDR szzbKGD pHYs  #utIME 0u?IDATxŗMl\~sr*R&FTi iQ$"@Y{($ҫ{񢗢HQuZh+;b&vR5-ڪAR!%XÒ)&K0ٙy/rhil5 LJƜ KlA,#oܙ ,`":yVBH,)|2m@` DÉGDA(]2r80ui:c.|.k[,qMX{J|Je h |&x.F 2]4Ft?=چM4}RgQ7J| Ú=3} a|O|*Ǝ֎3zyyi/?ͥmt,^mDssA 8UHe+PlgΡgƨWn"0jv מwT d/A"7pk g;q!wZJ]Pxn丆S w;7pmY뫐/W}4~Ʌwu恳q('4MnsNn&aYP,Mpʕ=h<fM"C0S)i nBmIs|X%V] 7,5 $+Rzn : IMFy6|hl;4 %%(|kzTZG%W@C?)AxKZkQ1"5e1PǏ_=WXڄ(^ zuB .K)~Fwm[ʩG@x\AqޓJOJoۃaI|U(g~&"mk|L K{PyD4ug$ki e6LDlI!I٠*hC;(.Utʹd[5,%#ֿS16P,y5!0@suqfu+Ǘ823FOHd 2Wj'fNH.+*='~^yU #Cm2yĥʹ\~@&>zT.G29FO_ِǬ2L&C‘0Nkx rA3;fNHf$w#dRwU{iPr;ݾɛ#M@]񩜙>dM +cm|XSgφ~oӒɤ珆HDCu]ZH#~s#bL26$ yqP,qL 6伀;.&B\g̺][z^N[ K dw..z f\\ {St5s;Ft(_myCIENDB`anki-2.0.20+dfsg/designer/icons/stock_new_template_red.png0000644000175000017500000000232311755052304023414 0ustar andreasandreasPNG  IHDR04fsgAMA asRGB cHRMz&u0`:pQ<bKGD̿ pHYs  IDATXõkAƵU*+bC=( -Bji)ڀD[!B($!HI[㛙&~l4}ۅ[7ӿO]@ݽ%>pc 7X=SՒ0SEGb~nl1Mw$-fxc Os 5 pwaR-9A 5Gn>[ONۺ% 9 VgClPa11w1Ý9;4xK7QGD0%yLe6 +a0`B}) o@6~-27"yꑶ需GpWI974G=D6vn@u}6YpڶCx#[A; [b!B@I.x+M$ղMA wniRb AAMInjyJbm!̈́B8_CtJxPcaƓR 40Y+YJkzAix!e@Ӳ=nT ׉OI,[0a9/wku{LCM>W0 nN oZg!p! v Hm!~M!:)\"!KjȾmW>g{%tEXtdate:create2011-12-15T16:40:56+09:00Zv)%tEXtdate:modify2011-12-15T16:40:56+09:00++IENDB`anki-2.0.20+dfsg/designer/icons/go-first.png0000644000175000017500000000307511755052304020432 0ustar andreasandreasPNG  IHDR szz pHYs^tIME 'f,bKGDIDATxklUw;v-PR4MJ"Q0hD*DIDT>Q A@JKiϹޙYh~z6f'=ܻ3rw-ND(7%&fd{zlX6suǾS/+I<@lD3G!gfILؔ dLF /o$b-H_3=u+*0{uh>&2)5 4Y,X "ЂRzl~Y5~;M-1 tGIA_ZOT]}Uu0cV-kF$ @% *q^B)% 66#tw@WVv?(q(ZXNzE?Z\=ĩآEpY HweTUl1*ZVdi1vEk8{}@wƋ%3 "3Xg@t_.pXYMnvӱC܉9.vO[+-~ɋ{]%f% 1vD#ZAю9CL" $yf `0pč/.b{[ܮ}$$J$ hH341{ ? A8,(I*4+#Kvmh;ظ%IJ(X0:U}{ -|AHbkwgf#5I| W/ն%>v5vfX#3Y֮*>ZH mNuf" . RtQ d^:jYIkt!|_7Ql+UgڝQɽ"Zg0+1ַ(bl=YC{` 0anf0yA^4 N/l'|'uXGP ؙN4IuV'i8y@nfIDDTh~~IpP(4MAӴ3a& J!ɓ'H$0 !"tڶMm봰@DDmoDT*ا"NDb;g@'3ض , mcff_~s<~D&zC vH}w"B,cL PV s666L&QV100D?/ܿ~`5MC.r( rR?c V۹ m4d2fS@Bq,0oi qETM+kmg61:'icÆ<83 ضܟH<.2/!$t]288sGSj |~-6!9yO3x.L0_JuͮrPfc$IZ-A JHrN^+^굯bQ4 #q"j h2bqƱsx^|3^퇇U=v"0M Td"ŕCC8>>9ad3} -2FZ=@ufq-h+UI?99|b㺇pǿx$~/_pR@F"OXXN" n"K˗pxXWbԙ=C8}FH.Q)aLʋi.W2m^.WsR7.B# 1_V Pt`r>N,Yfp굀bkL&p&p#޽7{M*BW[ud1(V턴cҠjFhєB)44v$c<8)=y9<^FD+pjcT+ϸ} m;c&Q06vDt y}d3ըFC<| 9@y#4}v]>A :n+mV~.I}bg0'hWs۶=:Νoe' ;Y<ꎺʼF4hC;d=_OCL\2\| j,dZ0CGSڒO&UQDT\$ek.,H{%e!s+LqmJ;H7ݿi<=?_9MnfDEziamB łP*'-=VM6\z/n 6OfD6CBYEx̛ @ n\)yo)Ze_UK޷zj[Y >0 ђ] f 53#~ؔT}u|f=?JDLn2殗7шͪ*]CC%VY{rT!6+uoH')R3dk˝?p .?W I/Dvr*QDwcmi8?wRILEG+ҥ$YGE\;bnܲ? ]][ɏ%&Vq5W{II/\|㒴^#$}n4c=;^bnNIENDB`anki-2.0.20+dfsg/designer/icons/go-last.png0000644000175000017500000000306411755052304020244 0ustar andreasandreasPNG  IHDR szzbKGD pHYs^tIME *{4IDATxWilTU}M@bY₈`PP7~\!$&Fшh0JV5FA-XR fN[ofL1hM3y1/J_v0V3v茇ja3`ieEͣ&bI?pMa1@Q M]N::p%Xtql~+w^1OǑJɔFrI껊{>}!5$S l]yv  ʹcR,j|Leg̀Rf f p)P{H w^W^vم['-,|&K7lNY%Y. JSj \.(i9wklƪN"ܻ6Z`uZ@Aχ,e֔Дat{5zWJTZBZ׷Y`z9wP\M #,:r* ԍ5\?0u_z+ ȟO.7妃C[ t復@hQ&Jd(08gM0jՍYj ¤eoCiei[۫b ʈef.7'0JKuR(db<{G^<4SR{qɤu 5N^^6{"$B`Dq HmSA xfY` 3 ]-G:mD<@ӈJ Pj kX)CJC ~F*%w"pZRẆ9,,jr#L& ţl鵣-De PJc@.TF5̶t;_(o7#7QR6 YUY4Ujd2,e!Lqb4fjTvʆM]yOk=% *'3ÛbNPux`o Hkw^ !ˌ,(]_.G)d1ī$HTmSR':bQ[c$2N 9("D|@  bLOMpgbm;ؼ{X4 m,p_SLnAQ-'PZ !Uc7" !gؼ5HJ-Wq4*A!DmPDeBv6IwۣC4MƯ_YAGDpIHqog/"p9ǿ RZQβhKXN ޚt( + ?G $Lt{`)'?.S?$;@'/&N)Uh /0$Z 3z HC 3/'#PYaf'aAN %}h. niEL( `@LNs,o3l`2~?`bbe`febU! h;ףR̈ >P.p $1Ba@@I`^P,k p: wWm"43Rcw6d *pЎ_BT͐AF0[r1 ɚ)MT0Y>=V9TYv A$ъWHy } g+Mg/@Oo?30`Pf[r/C1~;::"V= P0UgBkx>yC'01ϋ{\`71d?݆>+&ëWDEE>|Ƞps%0\:-d~'On pB8h{As_ `S S#999qqq!!!^^^NNN .C3* ÷ov / ŋ1v_g`aa&L&U|+~bƮKL9DykmNȈ3:u!22ѣG cbx=<#ӧ}Ā@ƍW @v>=z1ɖhSy^y!o23#޺u߿/ROO ׯ_g`gggr ۷o? )) p  0 ,՛W/D HY X\,ѿ~?~;ҥK ߁s">99/c^~  BK~p`L rr"Pغu+f.i:8P9BO>; hK_w08.އd`*K!ð-͍A!2' jjj`{͛ Ϟ=EX@127c;u 4;(x(W`6(nA⚚ R<~?<Ƞ&P` w޽@LΪw?{GS0KmՅ!id ,`lPip}P4ϟ? f,9? SUPab8aׯ_!crl vX 1`+Q眲Vw9jd`3N= sڬJcS'&&`a,QYfnD,1j,yNz^3rt:|,kJhhhȸ SiWNgʹ* 泡˹^'ӕ+H$mZ$!-Zŧ0br[nͭ&0::*y6mڄ/_J x<?z=޼y#PPPPTT$awE^^^rKJJښL&HRܸ2LOOK OFkk+߿'***D9rX2] 2 #:ò߿&8N<BAZ4::I'-HܹStC---qqG455E^ijjJ=z$j~ -#M`0ЩSD^o&RIݔ<MfիW4%>͛7dӨ-& O8Hqؾ}jm6X hiiQ󭃈'477NZh###5 [l+WPUU_ƅ . VU3F =z]&Sû ''V[(BSSf. p8!^ "37 x"޾}+ ann.?Nl EAП?J{<ȶ9qٿ?ڱ^KWIENDB`anki-2.0.20+dfsg/designer/icons/document-import.png0000644000175000017500000000233411755052304022023 0ustar andreasandreasPNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTETYYW\ZX]]Z^_[``\a`~~~agfbgg~~~xxO;tRNS !"$%&')+,-13569<>BDFIJR2IDATxmkAًˆ i ENQH%R ; oHacq 6BSSbP0Grs/wpwv;|w]x]I33gOX03ȭ<+= &!!qz[r~J ?ErD$6~|%"α7 %I\7'pm=^a6Y{v K_@,B&e4]#$/*&'(aT$ t! bO(NL3˹#G PWUx4QA[]?90/u{;|uҢ~p/ ;шkS߬~/q:*J{ qw%tz[ڒƊ1eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD pHYs  tIME  lIDAT8u[LwqZΨi= و%L/Xpa&1 ٌa;]x@6̋ (@ІR_S*$͛]EJLmUkpu97{f{KyJSIOXdpbVw;@mZ,^aZ8Fo3|.7(%J:P 2^])QzW숛EIENDB`anki-2.0.20+dfsg/designer/icons/text-speak.png0000644000175000017500000000473711755052304020773 0ustar andreasandreasPNG  IHDR szzbKGD pHYs^tIME 5z(k lIDATxڥW{{;;e_,""JkڴXjTcJIC`cBWբʳ, [Ve_93wo%-ggs~sik~;E1.M/Q%~s9p1qGCh;'7ηq?W=r3- w٭ѢpLMa)*nX%x1{?ݪnߕLNOpX=%fXaΌ,iG69\[oN7ޟjƮ:cn|Ml7x}23K*8/VoYXBWaQTydd_l_>ī⪯HIhr˘|S" .* Lg¥}9R {G5dG;זgva9(Ϣg,2ZR.´k4mr rh f`% t%Lyws C5sR>X>sȌSsR.L`i{r| *bռVܰs`C{.^pd[&5 @{C6tfD̎,99YTVc$JRyy\lVV}MpՋF16~^4Q Z8Y|p4]tͻrTDى1SS!bVfy%gXQ1Nmd^?ǔ@Ts$p!i$-Ģ\_X%gIZ(_-+l"\r0l2YVJ"Ҫt$C caF N]7ǭ>Q1?w jd |T'Yۖ;9 1Ƃ@Ḥd{y,ID@Kh/gASQS @ta9C8ڃoN!tLpqBS) 0("Q}v & D<σ` 5ho@sž-3#I̊v;Hst wU1 #' c"!f973 Q9)~H T8bR0ɱ|>IOs HRFFŤ! Q0kvN}CBRy]tebK4 l=GKZD 'x&Zu0<ѧfsރG~0@@i!'+ T-5Az`<= V?tu6nEUׂUxjp͊^朴 9PzOŅ>Oႃs5VN;Ȳ($#jUi8>fR-y4~(8 ZMx'qX<g$r1e['}\tw.yב[(:.&Y)13CNvqzPmx߃ɡfP giQ(<1 CR88R@[ZD1J#ߪ`tGƝV)}xXؘ`ڒF M^>84裞B8GVy@!={^ZO2H^=T7T=F*3Z8b11A,%YaSΌ=h<7G{xdoUXږc{M}LNȥ\w\5LZV$) &0UvFKʁ'_,| dR9 L0g'[2"=E'BجuvIENDB`anki-2.0.20+dfsg/designer/icons/document-new.png0000644000175000017500000000260211755052304021300 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڽ[hTW=sIc TBH̓V)B<ߤD)"ڂK DQZO-ATm!7zb.9gfw8=Lp_kuFR_"z2*؍A &8)Cc$KnP@BzGc7(g]kmkËhhӃ5\8,~W2c1uB*%jd3Fn&q1eͬ[+zy[__'r44,<b8!}U65m1=6z TSҾmyF,B@AdUg onEns9˂ht &䙊⩎|e "6A³*`yXq$Ȓ@]~X @/?l&!c<C[FK ЭDa& IXO0R dxX Z)d2DQH#ߕ>Y^8$%`-Mjq i hむ07{AIØ& 8I,*xj`gcƘH ~?,gXdI7zQn.4r-u 3k_,3L(i%Nڭ@QcV^Y PaQ2S0h wG~.RkJee%՝lnn]R)? ~ugtTx ;ИnկJ7{&pc N 8Msv`rHm ›崶r!|`tl [PY&,Sȉ0( +*  |h6}n=2(a,(t:aO*i3$Vhu]M@$ɭ {UƗ;{%PYI*"fddҚ8Nٹo_LJ-ex 2WY ~:2S{7'm]Bw?>>?sޣgGzUX,4`pFpwE^ K d%;bCTr3?߷طyqgTM>:pv}qS˅|C9Y8 "n׀&g$jH+IENDB`anki-2.0.20+dfsg/designer/icons/green.png0000644000175000017500000000115211755052304017772 0ustar andreasandreasPNG  IHDRasRGBbKGD pHYs  tIME 52FIDAT8˥N@82r-K BQHEO2J>kPT)BA(B(IAa&Fؙb9ޯ@U h:%bR,U*T*W+νs^;%.%m[/uA7rq#²cȱ{4SrVv!h™wmpSB= zsqXσh}p %2i,$p4*V%ca0D DFPB"єUUsaU3dIՄDNfeUƛ{: `:U(,WĹ7(@gɴ*Eփ %qJк?)NI^ek!}h 3}()8` f9#ߥ /f%p#^— l'?G{IU-4]a*X;e)$p%7?*HIENDB`anki-2.0.20+dfsg/designer/icons/application-exit.png0000644000175000017500000000334011755052304022145 0ustar andreasandreasPNG  IHDR szz pHYs^tIME kbKGDmIDATxW[lTU]ޙR>JUbĆ"HH0 ["9=g̙ kSY+͋AMSLhU:;3}}f9-I4Zuu eԨ}'O&ޡ rzM0^]h65 Pшn6\߉D]=R |֏P!|uh‘A'͜938S"? ep;MJ29g{[1b*;Vś_@ h`#obrV$WO j (_{O}E,)ą!b6=IΙqX)d>[kBaB&ۖSU,bz {w ;UD2Il/&e"RD[Oq XKY(Uasze 'WQ-lm%e1pgU1P, w׆h zZ̲yPH" Ȥ !@@{RA|ϞGDLop:>  ?͓"*8c1!oj07:,Gb /pC>Z2YDÜ.ЭWh4W{Q#(Ep%MsШ x .1=6tl,Ϧ {t ENXqitDu8>Ў0n/ye{f7vDhIENDB`anki-2.0.20+dfsg/designer/icons/deck16.png0000644000175000017500000000614011755052304017751 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYs  tIME  %@6IDAT(u1hFw&BmAq$BqtQt urҥ` urbSbmkBt-{v5t k>Y}0p;]89  ;[3S:D@{dgn9Wy/Ŀ ='lr-]u&k7PdhYlsCB mT>hSc_ H1Q4&?eEMLKR#RRЯ, m\:4QFDW]Ha5᲌wRלe~ȘRD)z,|•lu;^{d0O[ǧ${׫%#{S.fyxU<5 ;V)<zYIENDB`anki-2.0.20+dfsg/designer/icons/emblem-favorite.png0000644000175000017500000001314211755052304021752 0ustar andreasandreasPNG  IHDR #ꦷbKGD X pHYs7\7\Ǥ vpAg IDATxڕytTU6TUF21!B Qb3" -*h (sQDZ% F@0LÌI>]sbjsj @0e  _iǁ7 hiaywlRڔ0sqb`=IM Ƞ^\\ 7l܄}L0^-ϴ<=[ F viT~E//.g}8Gnux=ugG>; '@P n/W?9~2kƲ;9wr࿗A~l^l^z\jNݎ;״O>[1MD7MߢoC41sw֍{=ڦz ܭCN쭹e{< *)?iFcH 2{jgjNXiXiӑyJl7.zLj«wq7Zqb;You˛7eސ1+}eo) *e5/U#fw'߰[շF1cҏ- mu}DGOF**GX3 W-AX2t%ݢEC5kzif^ۼS\45kjOn_})mm5d&d{u}:zh0bevȬȬf\H:ً8C7ٛ .`aXaXQ,*tΣՈS#N:t0ӻW}z6=4i2 WECc閑fg%_iw)ɛf"zjl5#!%{.좍Bi&*P-z vU*zŬYYFG1 K_XހG#ڼHh:=l5ވ!y|/hEl510b1PĊXJ >J|r4?2>KfzJ<|iHk7_:q&eьps2>ܣG tZt71b66;nS>ཱི΢'G?::#:3,jDG 8]k ®+ !E!E':qujI&}E6|#+iv 3a9ywZ8+kUdQq_gEs]EȶOԖjyUR% cb"P ߥKt &Y{~Y ii~_Tqᮇ~瑥YYuszi$l`Q"Jx."l>/ɚû=bNWQWzqXL3 º-v],7?:nWPbAܶm9@B5ب7/z,2#U*hLc ^J4:: g &4mi^ <];;b5D_G;h`.?O8 λW.z( P@ZP,td-{/eBX]fզi( vie6Y,|3cĮ" Pde[.`|nr.‹sa0@O߲<'ɚ֬5n1 ?I3pXi,?ʺ"`uYi-wQ-?*Bj'.A!H| M&3k[5o9 G,h29+Y "t93 6[0x;R@acFP(tèŽ / ^b˹^tܲD-J{/V'6%ޤ[tK8Ȃ[# :R([K @n^cEUG~z#YPkNόV18!z.`uf߱O'?†I0. UEIv\jm c7o({G\c)gTs-Zpk3o=ۏM6[#qT@r ,j|5>|MaM!`=EOMx/DYwX/ +@{4HBYLSڻ3 YCx Bgg5;U[Z[ \JJ;~6Lvޞzj:f-⪵g,z uo)}SvF]倿ٽ{yΕ\d,%)1@Ĉ1@! ! @}3$ k1-} I9 U~v36xTAO1[̦(헾0/Bl cM?C1GukXX[кt`W͝-k=G}I] ꛠ,GG{=n mz[ meGqby*BߠHYQ&ZhW,>H[zYY@" lE,!|Hl楟1}D_Ds}& hD\yCi"/R5ò²k vOtu(OO}ލwl^+_~! oOe,-A~1c]*ku#F(dFShVމZ{u٤%/e33Z\lv#X*bW1`BF?11Ґv46~3.CIe\eIEI o0jQ XeZNSyeEuv2e,y<ȟO K%((ZYTEc p 8kIxG jLD u':^{iVUߒ~Fdhz)#{ʱeMک[uMo6*Q[^,2v{Bއen֢XV=8+ J4ɲh%Zи8iOQ!aSæ)Cͧh3ݧW^g@O /W?[3offCdU41 *_sMtrp Fh~Pt@Bfe]$O^/ҋ@,%V.ͰD岰? [A,XxHRH iBV%!!-tZ5r>n( V hZ_-lIْݏ.{lԲWoc&n 1A GGSN chlhL~`lX},`$a|`(X0TgeaRkR ~Իɻ ! , jRY*6RB֏TBpDaOa1JmyXu}8 2Z^sHkeSLx|/WPfs`t`S_PWdž)JwC*w=Le4*R6)- w|fwt\Z[|,Y%> &K#< |Dxվna;c0?5ROM?ԩÓ[PR&S!BM5ҕqI:wAlʔ[z2WlPig#ڛJ 2-9>Y 9mRMW/zEt 倲ݽg^W^@cTaMNvݑ2wP%vke"DDsf VڕSJ2k.?8׎:=oY#q|r󡡷O wJI܅Im CW>9ɕ LdwA;iW h2l)MU#[J)aاvR#rZ+ ˔?WZ^SRbb}_u#Cѥ?c9,7h&6wL(p$,eeQ?o6Vqґ^Ȼ,=hoZ .ҕQJ8hԷ]eȵל9nDZu;+Bdpګ =ewf\)#w:vWz"> 8/ B3]gϺ:JsVOe]1j=J1Pm()%h]WrpJW- z3]=W8_\Awfr"920]8*R{`JyBw]󬠝AKjW&Ӆy"zTXtSoftwarex+//.NN,H/J6XS\IENDB`anki-2.0.20+dfsg/designer/icons/editclear.png0000644000175000017500000000031511755052304020626 0ustar andreasandreasPNG  IHDR ggAMA a PLTE?'htRNS@fbKGDH pHYs  #utIME3E*IDATxc` 00 `c,#3N;haMIENDB`anki-2.0.20+dfsg/designer/icons/edit-find-replace.png0000644000175000017500000000373211755052304022154 0ustar andreasandreasPNG  IHDR szzIDATxWyTT*56 ʀ03 ; 0 a30 D7\K&$BSiLHi@-l(Jcay_}䝪Y\;|o`@`=Ku+,YĔ,.N|>BX 䳔>Gǯvl6e``PNCFVc,8;0$xyx"P*>>Qޞ^=~>h֌T|j5CCg4^ْ9ZxX7W7H47@J p>Pfz|˵gX-W2.^w~(9`QT͊3H}E)ܙt uX~Lst3HWd);d6 c9|>d@xyC(5ӿY d}}!BHAV(PH9991փΔT˨M{iBG,ra^tEx{{)9!BDge͛J2v$ظiS_$J\|EҼt|fև Ð B n%~\k!PFz Ml cCݱ5'M{D> Z  E^((A5V0ĭ[mx`ƐX q]w1..] &Qdx?7y@j"";;]wbppr{z{O 7G;l>H@yFALM-Q+K]25F+W!Mg#(_QԔ75s8BxZchxtCQl߹sH[a[4e[$ xk0low>,,,$X џO,AŁ̭Ih,(w!ʼn0'>>>۷Og \-I.CPH$ 6ftqDVpe?^&Y|dD;?-CVdhh[ũ1JJ$''CL(v {2ai)~RM3ݠ5+NV6tujj CYԽt1'I5F HAR,NWjwU/FnGtxB\eSxpAM%F S 3 '16궗YKV qdˏ0p98b``Tc6Zst`J軥#x!&a^g QGNـV0'NaC >_P6t9{49ʀw(/g". h٠40T&hw"Hte],a nV`j]]]f:^+#Cgs"27 ̺g?j8P6N8vPh4SLO=r87ڝϑm/;E5^ j<~P4rzx̆|AEb@k(SIܨى+!.'bpH jjjFۃq| <1z\**IFSej\!k/N|]r?nnkАw*,__(--- {*3gbb|Ӱ{z akQDM6DCH5ܼ+& |_0RIENDB`anki-2.0.20+dfsg/designer/icons/media-playback-stop.png0000644000175000017500000000221511755052304022521 0ustar andreasandreasPNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATx}UMh\U}o^2Q30VAu#DmV]_wB\2D Qq+2VE7PB6J)d潙KB8̽sw5;eFb'[JS  >r7>`*] #'  JaX5+KӐo#>,P ^7ñW%2gݝ">&]k! !܆u~60WBvC]+ߘ l '2*e9ҐoVP:gjPE?`[b̉u7p(V qL:y+x);Y4@/ᘟyOQŧYCGe,J`-=)(JY/浊M7E!?cT1f+T{7wƼd:BV"O*Glݞ 3ƅ-`)Ƙx2"<#gkJ اYO"UκJk0sv9?[܆D5ݥc$pl̪"?#C'^Őf8ZE ׫暡P%ǀu  x ! +3(hs\u,B?WA[/(Ӕtx}Vz)_09[O?fخzJ(=+ݔTt" SjA3V606#>; ^%WM} ?O_^*"ҙZ|L3ϧno*-dm-,ːlX%M0A3M d(ZPW\#TE{##jLHcS÷0X(n)j*5j`,5>DxpxBXv.â,ʐyO#U %^z^6Bgx]=!2ub'[8{~aQ }$*,+v—R&Ox\Uꇗ˨^8q=$),%q!C ?K` IENDB`anki-2.0.20+dfsg/designer/icons/view_text.png0000644000175000017500000000167011755052304020715 0ustar andreasandreasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<JIDATxb?@bWLeÿ? e#A?,?H_=`q<\ΧZGLDـ5o(dl@s-W gR8TMAFo0 DfDA?!|8H- @a o#`" _Hni`H_$ 4!0 PQ x @X ,9r#B⠿"ـ Dп!x`a Bgkcp^YP("#'6C1 \A X# uuuDʠ9ĂT-hkEQ@آ Oi9PDĂLB BIĤ!55X|JDR r,ǖ4n9rFJH@`mm$Bc: Xc0}P^^5$ d@x61 85  dCurwww Z@>/**'+$E@aS[Y1 w3k~޵c^?(Ip $ZHB8ѐ@HBHRU h@!Z]ݝٝ3G0EۡRzlwswϹ pnMi7R3 9t]6O՜:uJ-B}bUnnY8qaг۶m^NKҦ dϖJ>:6]ۗy,9lɩIͱXL^n*s|R"\FUЉ RS3(q$&:y_{㎎ZG@֟1\[ !G E!`$9{JJ|fcN$=k֬N'vMJ.Q|[D %JaYh~~FnwK)}d޽ @1AĐ#k 3m4da^u2"p99Bzz:]f9 \}{FNOPnE@LIOJJb@ `:!`Mn֖DF/&bT1ň`@q%LN%:";t۽brrrq7KO= s>Ni3Դ˪vdwu5kew^WN\m:MJ1o1&@G綃_]!}pPءNzs_ :$ `1onn>+KEHHrBǎPUxMc#Ha._^l ù\ 5&x3]fP.;[Iڽ"SSc)+ z?oJ?>zkiF  HB"AcC_v,>8>ԿZ8RGL}@yU~''UU$Wr~F:HmGH~7<\>5ӸA큥6#W FA33I3<_bT࠘2MK,IL4٧c.J7ʹE3jSBjC䒂-/OM*GdQx]WN(r9[E0wcܡFrpeU>MȼRb;-/&FRV!aJjFZcܬaa+ƀ-ߪ*e`%'XokH ůyKm/W?r8,2$@9:Z`Z̛W; /1h*o |u?R9〥9jCoA l))ٲ htjo$M>RӏI`+ۮ_Qye'2F}f;fv;lΛ𹹊{y"Cƍ*.?΀c~nB3=}cGv&xu1m+JA0vJ*2}8B<>Jp^ _G j\ޛ lu?c߹MTOb'$?å&{+rb8LY~tD+{ifAt3.N: H[z(Tj\47 qLΝ> TkmgěF?J>VF ʕ ϟD |jferVmrseL5Oȼg'P+<4ot4o&YPt,+qCdf1|4I3gHll ii''FtӠHWvTUEƊ.|%,Yxbv!)re|8HJr8_={Lt bTn^K:W6,ש$IP}\.צZ,ǁ$ ƳyAӮ1m,_ /ϟv: t"1fMHA'A9̀d?>p8`KBB/,' B`.a엾m%`[)))u,222Մ ܷҦp>XITk3]?/'%%% ̗Nãrѥ[wiMM`zzmx^Ymmm{{ǻq`ְFeYnBڂRHXNtvv*~)C4667[tS -[V`Eb>zǦ{}?E=DvY]]]Ϟ=Ikkk Ti hcbIENDB`anki-2.0.20+dfsg/designer/icons/tex.png0000644000175000017500000000426011755052304017475 0ustar andreasandreasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_F&IDATxb?C~~EEEE߿@ A!Pp1FFFO<:uT bI012ep 1 ǯ _~(A @P@051hH24Trx F *\Ato"WSPBH̋nEKit`ەaI5bAŅ [xPM #X;ЧL3: s&W30<| Fo? Ѡ1a F#8\FHDC s /'0 1*?g`eac:X6r,(d@@DDELQK"'#Mh 1@ 42 t pX\쳿q(7(CgD wex%4'@@11sdu,gbbbPSScFQ @,X Cv#T[[[Dt Cs ۷o( Rk[Y +pOEI,/ihL3ЕO |uN;Q`v0K돿1xq2Xx `YTRVAJ/Uvxʠ'g _}g`bmfR+r2gga CnR2 Oa8} 0|AY!'Pǯ yDQB PÅ/ڒ.*R X-30pK8N6V`Ej-`o2$3xj1+`N>| *L(-7bAnkp'/N ;LW30> +ì} eq20s 0r S B \|C/[yҪaW,?0t 7830!}c l%S(r0l&@pm'G&`B?` .fΝVQ!'@=~9B"4Ɉ7V899QJ=666w1־5kV̙3$j,1?~d{5m4; =D@3 ˁ7aY#888^~܌a9MB~ ۷oa~]=@0+ @qZĂ'Aoܸgɒ%̙r FPɹ,++{B|ŋOfϞmz/7#4 :rM@Pv0HyW;IENDB`anki-2.0.20+dfsg/designer/icons/go-next.png0000644000175000017500000000270111755052304020254 0ustar andreasandreasPNG  IHDR szz pHYs^tIME (SpbKGDNIDATxW[lTU]>fL[F&Tc!%H D( j@HI%BˣB}@[yi-ahX5LrkLwq;8~q]Coe$ "Rm5=g'yOAXaK$ǎog7 ^ $QlfO;> F 4\E1sCXd)DOxn9.JuÆa3#W)+cV%<u}!0Q6{򴂸qb[ܮ7gIOM_GM-lb,;eQݓ[Qr|Hձs%j.&8!Ck՟}+DP|/J]Uvi 귗TVwW#t QEGXB\J-"2gs?vx+me1䑗e vX ˲` ӄa4X>SSEj/dp!=[\}aM.*)' @Ȉ S&{({3~37\cGx|JjN"89q $2Y\P (&Qd`Lл% r]=E@gh΋*'C]رG fhDa , Zڐdaw͆V38} L% 1ȌTpL KxGcP<DiZ&,SAr,𸉜ǐ_b1ALڐ,n߶'YмaM L5pAAPI& ]z#UomؖO5{A"K$Af Щ)(Z%˨[Nx[ @ʞN]`0cDݙ 6IWʔ{) s6rcP,W^~x/o!nU^vRQ #$†@bY;X|(y/<4:3iSJhV |^NOy}W]xĮnjskoPǗUzݟ29W}N>6fG 0ʯS Kúnel2gs۽{F|x'O=ߺvu]S-JÇ0: D|#\aǮ ,m&G,J6ۗ6?mcȚ:+׼MxoNMչPER$3tq⊵~~nj?t$ШbΧ?_+7"ҰLܐZGj.k~~bĥcvw1seQ] 0!^aXYFq|SWr0KH,?Ҵ̨2Z 7ïxY6O.<-l }J}GRno}ӱēxey?>3с/LM3v7ws_9^h=sbX`w:ʢ:Wtnwß<Rr,ʯle2w<  &aIENDB`anki-2.0.20+dfsg/designer/icons/info.png0000644000175000017500000000603011755052304017625 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYs  tIME 4ZIDAT(E1KcA;3&nambI/]/ 6b^baaMZey3ZDWNs8 @A C_Sy3I&djd=*ļIzy_Yڂ(h֒_,U?Cȓ}_@x< >fd*&AO.vP#!p@B @"cd2]1 %͉޹"I!(H$3ә? $tiԶգNӚ,< lcdkI\|DJCc"ZCGvxu4*Qy,/`& [}߾VE 'W9IENDB`anki-2.0.20+dfsg/designer/icons/system-software-update.png0000644000175000017500000000503411755052304023331 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATxڝV TuԅTQwmUk C" V".cH0 -a ,!$Y >o&Mzs,9?sof>6ӟ`'rp}X?SV7~ @A˴}}zm<} IMݻ61daxhжK9(Wo r8NHLL}L XGFޫ6eV+׌iAK9(Wo :}:m'W狹 r+L}'R-mXMWU 7U`\P՝;B{C 6lĪ7_ŋӿkYW~@.1@ķ~y$F>Z?lM^X)f׳`?IhO6 ӲV7n0U/_ZgV/ێs58ޏ D$DkOf1i:f)t?!=Q-ql{y ه ox,ӀY\ʵ_4|3¢MM:tt@K[+>.O-s~+;pb')=qR5tAվ8 rnc:;~Tj:uvW$Y~=pǖuؚ 6b{f8n'abxJSӪE/.U!R`KԜ | Cb؋Rk2cm |OئB?n?|qNd9&a` F(qbNV&#߃3d|_c XZZm ~F;XlE)a2vX 9pM15m<=gcѥpHhVgRmC|;XqҒA<''juڧzdcM+LN%vNI8hݺ +V~q=V`x ?WY˱+.rG#fϓoٳ! M#8x0fGNǀy"u`Bk^UrFؘ=7|8mtk|)Yܵ!s[#\eᒻ F1D2PTZ8]v],/#g[;|~+[;nYK9[|Eb' &8xOg3\ HEd *Je(JJpyfp򾼾$B?Mm̏;_F/xSle܈][ EtvjRmj`H$CNU-B; bu ?(*XS瓓'r%!+EqqעT."ť˕"#…k(g5"=o묤QdL&-'A ™J :PmjH!=Gjo`wFF&p8'?,">S'8M'IXX{Wti69b0jP-I ,@}+*TxUD܉3X32t9+Ӭ?N0ųs$2W 2ZM5 Zvm8z6訨dA1jk)׺y.gM hl69[.y9|DUZVںŧ +jtOPzywccSkv^:BZtmYAx8E#|8v}Q,L?K2 a[VNsxDf! ]a߹H8:_H?A6َklDQM1J3 n;,}Yxv0.iVfnBUߠNׁRe'[\*jQF\|[LwLM͇XB<~F}K#TO4x\WJ9 EoKeoTxRLgho GHK+ } ǓRe - {C+1DR'.L&'Dܐm:4ꚡmlBCqk;^2 -#^dr^ѭjQM='ܹ/W`ffFPA%A!BQJ5 z4=mѣ[UU-y 9T(˧\sn?hE5{ XCkjH샂.)?Tdj-Op=ԑvrhɒ… a2JJ͕HSJu~OAss MM-$o"f<7i2D\WWR5Mg{{;(hbJqssKhԄ~X#ϜWN[wH\ݻ孭eZg7Ν2$EEeo/S03f~=4v ˈ6eZg7 ML]=S5QP?,hig4acf\^kچ`67\7ijCdIENDB`anki-2.0.20+dfsg/designer/icons/anki-logo_BW.svg0000644000175000017500000002607311755052304021166 0ustar andreasandreas image/svg+xml anki-2.0.20+dfsg/designer/icons/khtml_kget.png0000644000175000017500000000411211755052304021022 0ustar andreasandreasPNG  IHDR szzbKGDKdW pHYs  d_tIME 8_JqIDATx]dE陝agX CP2($J $/&"Ԅ uABVE]X{`gw{gz~affgI*տN9׍+sB ,̿4w]#/ A^㹞/p@DmJqlE?[/?y{~+H!S k-YϾ{Yv?\ o8Rl-ft ^=!"&"6(JOw ௟/? Wڐ65u&AB#[fCWǮܿ)PZ4ӔiT(ea][={'"IR#ؑ$Q_nJe3@fhc ׄ ڎ//p zcb~$ƽBwэ۱Io+`#>F'Sq/Zq=Ėdar7)pxSc\f B^K;.A>эrOYUGI<_ QPc`!@D`k=e6m`] )%9"ARc Axd0>ppq=:kS `ՙ*)K~[tIJ&AeF '<}f]ػ;Djqx@Z2u 1mZP]qM>EsBg8UC/l@Cýptlz}:s0FsǙ4]7pֺ 8`(>gބr/X BƧڑS`0 #IT@!F AXo&B* G|rJ.#P?AxW!{(9 B .Hϝ$!0V~nPBV"N~:%3A ;0)o'edJ#N2X!#$l-h)YfΎ1P`̌KA H3Vq;JUsHA$k*㓃1(ע;N[SY鹾坥PÀ p{߭7WՎY)mTMRgMMb,zJe]M` 8r+s Q|#B#ǑpZqs]983-3sC4[ژLgǗVL[ccc)G:0w/s|1 BAgseF&vJiJOWqيۙs$y"3zjae xz+o]^0dR(NCZncmh-KAdm!P/`_'jU\W0'uxlO395 0j- /:DI|O&a>.O{0`&0[0jkMd#DSg+c&x2BT6ՆoT*\bƣTFL=%!EA. eҺI5JTR#; 7t=C0^.ܲ >3I"6H$SKXIT~@%{OU>zSnﺎﺔ rCҁMRҖ҉IoLGo[!RσrB?Y Mg8a;::zSquC(IENDB`anki-2.0.20+dfsg/designer/icons/image.png0000644000175000017500000000354411755052304017763 0ustar andreasandreasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?C~~EraP0.02yPA8 (ٳ+SL 8##{aa' @lbAr7LUx8n o?3AR |b/Xo d`60!r@? 4P_123\c` @,.iz/0!b wf@gca3BD3`3hL QĂO: E23 t( 0M7U; ~@?1@@jeffadˁ@ '. $߀3y@$"b&&&`  R/A 0KA ```ee@8/666aPe0!;Gg ?~0y .\? `;vvvOhp o}dӅBq7444o0 B/Ab GqqqC+P$o`"f`x/f/_?30|W^^^YYY(Y a/A/"" **vHׯ;rP߻w+0n̟K;;SKk׮Ct?x.BĄ+#cXp鼼bCf8x`8?PH0@(!0>qOڱuýO $8d2?ZhE.S@ :|K' 1Pao 8883psqT 9www`yB@)  Wbp_M 1񋁛l(@VG@t总w2HHH e ׮\d 9& \ q(ò22 DXhfPpJIIs E8Ai\`KA9!@89a G%,ŠT4,YX<ҏĂ- d ' 1 += Β9@/i@A!rzA@,u75Ⱦa AJȋ/-E'ٳgrRHDv `ldˑs`H 'DPPҶ̙3#f̘@((G04FC x!8` Pz{ 8o6秨^@]A>ʷ&Mr ] lm>J!rqJ ] z?=[ZZN<r lqLih @(i%:'NKpp FP|^SSSDoVbXR:u#P2@`S 7&P`ixH]!X |!ƿ{IENDB`anki-2.0.20+dfsg/designer/icons/edit-rename.png0000644000175000017500000000076011755052304021070 0ustar andreasandreasPNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEbd`tvsz{x+S-(tRNS !$%&')+,-1369<>BDFI_dFQIDATx1@ oP;?xHpŗ"Jʍ#[Z)gt3dӯ,zȘ'R&X[n6f~ {ZT\*P{jeIS3[7_l!!WIENDB`anki-2.0.20+dfsg/designer/icons/kexi.png0000644000175000017500000000223311755052304017633 0ustar andreasandreasPNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATMow?3ƱMb'NB (BR%p (R)BBD(m楎o@J@))z+_̷I6B!^ؾqMgF88~ !B @Jw|ᧃI6B)T B%YM?"/+&JX'IH I+c{R௫@R:FSH*=Z+t:$2ÛoSWjDZJ:ZV;2TH: 3YVC_$*QP(BRHF[t !5:82j%*Пw @6Q I$LPAٳ$؂T0SxEzh>Tf݉]5Nۖ$k}lӒ=3T٨o%{]wܔM:ԮRBJVe+CF(bqEYOP!*7m3,KF:*##^ቹTP7ގ>c]HPKWR{e)7ّc,[V3t3O z K-T3ؑoG|Vb8 f;ǎ5(m:P(ZPv]L;C-ڦoyLVd`elqӂZwgn-dGVl1 Q 64JC[:+M LMe f1VIg_BV]wȚ5?rf>4s9B2qv]vu?_ƝjĆFF4P,8kiaC5_{.)^\?зnYBkf==S۶m>s/^7.Zwvu:!)[6};w@4gh~&NX㣸ݟs? H8ϝTT̟7nyx׿O)gKIENDB`anki-2.0.20+dfsg/designer/icons/arrow-up.png0000644000175000017500000000163711755052304020456 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxkU;wfvfi6 6!Ulc#QeAJ#VcSܴO m)AķB,IP HZ{#K(4Asv>9 si `~v78=Xjmp75%G߾,4^ .v2@?".rC Plvbd~~g`Bkp>*Pك]ݣ\>q$.Ɇw7'ыn *@IPqT~{n]),z k-5$KEP xe2·:RgݣXsZjGK@Ee~=K,~  $Cw-+U;nCGajc HB,`@4߳[詾.Sahl}P׸z>L`WDndIENDB`anki-2.0.20+dfsg/designer/icons/sqlitebrowser.png0000644000175000017500000000074611755052304021607 0ustar andreasandreasPNG  IHDRagAMA|Q cHRMz%u0`:oqIDATxb?% ( "޿ׯ_+|Rf#~~"""?ߊ hmm@)))SΞ=+''ghhȠŠ %%Th8ógܹp53F (x`_+3qI$78.0! `;cIENDB`anki-2.0.20+dfsg/designer/icons/media-playback-start2.png0000644000175000017500000000223111755052304022751 0ustar andreasandreasPNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx}kU}3IMk L[ BF+fU4-~P\JHi6(KM[EjkBDDE63Nׇ0C$/$k׉?$"fÅф5kX)p@+E&pe|M_hBBdɱ Qq76R_c}0RgYetM<1n>>`pїTel"ogBJCv~[en_: la%3 &q;l,v76x':.2‰xBgJݾ~ l<9mw-6O*2í .E^e{K<+Ѵ,j,pZL=|A:,ԩ3HYlAd˫Kf!N[Yc~d_ @]qnק"?-6bujTcG#+O5ZC) $@)>bmY c1sT2(e|ɓcw·?I[xbkk,r #h%[v`1ʼn`dB%xK]<܇_.'e93k-O' :i;S_q}P\.g[zvǵc rJ傻|6a9ßъIENDB`anki-2.0.20+dfsg/designer/icons/view-refresh.png0000644000175000017500000000615011755052304021303 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs B(xtIME %M~nxIDAT(%kq=SK׳ELdhJTx- -]raF5LӶ9o/ uIS e]ԏ  d{Ia!R;~dz_nOSG|U p<-8M. |%%r9W囧5N"@#ʃf{%SJ%FYh;~Ԡasu^уo6$u:e,A%z1HsW"gpphSEp9^VGĠZ&K?eq1"5Wڍto381xC 7wn'K=ky$ɷw yd ],@qt=go':hagMрFb 3aDÙ[[lk?nNIENDB`anki-2.0.20+dfsg/designer/icons/list-add.png0000644000175000017500000000237711755052304020405 0ustar andreasandreasPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATX͋E{gc7, x0ԛHn_1 AA=9AոBD!dQ1FםtU+n=0]EѼUݢTmg)D^ #1V,1FrֻUcڪ7Ɵ#'?8}bbJ8Nυ>~k5U8VI9: \À kUVv@Apx|;Ui&|JIr_!<;q⧀ 59N k|J|ԗNx( =Cx2 xLd_ጔ`铭щG]TT@)JРC/D B{W?vxsNE H\ d#/[f{| |x- ^L8q,o]0(@rNQs钍vkćriQ)Ѹ<q6.!ZQW XCۢ'ȑ!TG}?7WH!AAV .Ob<,X|mO.Jwgr(%p@QP|d 0*;|qޫ5./s}Ta*H auF:6~[{6 ?!(Zm B&QU+ |q[77Xdo_cX~{ x?IA=kk zٻ9ÍݍE@ȽDVfxJi+V4wC#Qj(·HPyQUzZEʜ,9`jS8lK޽}n^ս8:s>ͨیhҽ~vbŒIAh%mZIF 3(ǍAgOutVڦ7zTgo ?+Dk&-%@'N4lzsC 1 ͸I+iNc'Y PYшD3iw[qj6G sUBt'wf*AO38ILBըGI''`]!kGL#XU,gڧLd^Jmj($J$5TjqD&_b퍥1)jYIENDB`anki-2.0.20+dfsg/designer/icons/contents2.png0000644000175000017500000000415511755052304020617 0ustar andreasandreasPNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxb?02220`00dacg \|@HH8K y0O0\8aVKX1j0ȉ2߱jv`ff`dfeÅ 9 a!3^_Ij" B Z @ Æ.^Ơ`i('# 7k?' @`3v,^d 3 h-gfАXJfr 0<8~L[28i $KAA9d'"B j Jr ex@ R'to M/1C $vA:_ \\ P@P6`ۈl1a59A3o0,[LVQm  & ү~1pA3`(DC̹\}(so?10,X (Buu&R d<» ~fr`@J`Gl ,K{b]Ąƿ_>|gjbf!0man P3q: P{'YY  P>#9YF? v/: ϯ`dP`gx/((i&j=RxHцCB8_wNAL CPd``xO`hdjQB QpwM2| `?F`  gBԁ 0?Q "&Ĭ|RR( &TӃhx,XXrf#?A OGـC?85 L}X2fGh$w%Jin1 _ sX@`bw/8 A PL9,ڟ _#Yx@3v o޼c r57 22A1Rf ǰ3A|S? `bDϙ vf `ˁ7H"[\Td6VJܜ𗅕/4A,  Zv6`QGR [@LNFǏ]/@ jp1sC1gCf9 !`[4@  @ccb1 s qY`fĄ8h  C-0yyX~Ihl@ ,aQZ DMGHI p@` G;_8~UDCJ^;B-f&^!@6 {,630'AC)`5#('rȇ_>\"'> lY‹ U6Hlz |gx2 " & "| r_/tX|_^3|Vbl@-ac2fPfbt:3΋o 7}f~]?{ qfy2|ë}`ͧ ߿h/;jLqV"#09gP12_@wP+߿J/,vfw^}/ 30E3]`af|l5L$ \T 4_`%,IENDB`anki-2.0.20+dfsg/designer/icons/kbugbuster.png0000644000175000017500000000325511755052304021055 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<*IDATxW{LWwRmi)S@[t:I L͡Ӆ)Y͑:#nfԍD80+u,nI4:LQ9FYνws?=S<?\.F>iph4Ъ@4 < ."dlVݬT*F?Xqc-`l1Oll$ 1 T*?e ER͖\)͝ ʆHMEVaND8 A|2iĞBI=_`.Qx n.ڰ0> hp'+`%BNjRQz{S-ltDEEE{޵[zӦZ#9IӒ"1VW4ց2)C OT]]zADCA1K=߿׏p6d22L!555TUUEqqq1n؇5ᬄRB^j2XmT&Дa4қH#.:)7NF#7/)?YSa j"Mo'ߘr#^MJc34&^zދ4Sqxqy$DrU| _5:rSjj*eddP&BP /_9rk<r(0nwdb-zhoh{`Mb]*U111k렕 $CCT3(jԦS84?%s'ulBS=430j2glv tZ&dZM*>^(P<%FqdP~_;te8jNiS8zt+.D[.3׾[?;`{RZW Â__yXB7t)q5'$Й~} mp!nIjM_!4\?ݽg#"52qfi0Rf uSi;B~:pBQC&0`H9xFptT M ӁRJzԉe;as*;ƘiꀡeDڵ6!@^!RJDJ ϡ:Fـ ? ݴ\OC@i LÙfD+X 8dV?Ï ΎnC$瀣@#^6>uhB&lSj*nvchu 1c Y?TrFpb`=Xñ%[p"*ܹjkB@yG(9:L_X$yNbE|5C!EUlE8'U0n8@1AfMbwÁPbK`L7E)Ô7b8\m,JQXdkWs Uq@iϹz_F2q&S_^F_BDwsyj縚g4L1 cD'$`H1Z"97P4Wr\͉Qm 2L׀'IENDB`anki-2.0.20+dfsg/designer/icons/configure.png0000644000175000017500000000643311755052304020662 0ustar andreasandreasPNG  IHDR #ꦷ pHYs7\7\Ǥ vpAg bKGD X xIDATxgXTww`/Qc%U7 ؈ Rd R(5UHFq1F"(Hk5֕Ź{5&p`{ו@4 H$W}(-6>@4-j` +Hlsգ^pà=+ {(wW?Dމ݆nKe~'-Lei iwO7C\ ܥ-Suozs^0vpe{[x;\4{nkٿ'h};2~pfҿq< ;$N [G?wآmùJxˌ[m3eﭧDQ3B[5uaSiݜlfw2|0'n5rp=ϾV̏뀵/ OR6? (`^`+mAQD Vc|pV0wp9m7;(ZG[Յ!_x%4 P1]3r'ˏ`x1_29 D߁p( Z;T}E _pQ`n Dpl)'wz,__2=DA*Cš h/+xj0΁\ 8p9)&5Q%@@^>i=܃'POݜ7WF#^7D9 94 =?wh%4ˏK D@-ʾT7(~U M-@,ۃX];Ĝ`wсGO昃pp ~H1am@;lSŏ0)bσMrZeM%wWvg&-0C@/bÃ$Z&]AX>6V&]`Ψ1l{`?3U34J ^,^ȥ0&< [At;Q ̷ >BU7(2'/_tMz kh@b7s|GWQ j+鞣ag[Q@=+; %qX;|>őCbW`^#m c&jDa@cdŒͼ v1aKXk|nIWpQ}0 xbx/xΘDĒt0 ER{r)m+C#wwJnS먢 VQ &?W5OlqܲʶnD uEi`44 di FF;97Qρ`nYв1-E|>r{cr"uEFQRtZr+rʼup-l3l #R`{U̕oh=] B&LHLM.z|>zcIQzxCJmK=j_Nn0Xja!I9J;&֌ź'd^È^* B@mo_ AV*uOkN;$%Cɶ+DjӶR+H@R `Һ D"zTXtSoftwarex+//.NN,H/J6XS\IENDB`anki-2.0.20+dfsg/designer/icons/text-xml.png0000644000175000017500000000302111755052304020451 0ustar andreasandreasPNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE 񮮯ֵߜᒳ᥾☷z[_aeeih녯mnpu|쌴v|}터{4(tRNS $'(+/189::;<>?FvLIDATxmKTqu:8c|vQ-\*VQm6EP@[XEh(e䌚C33\'s|@(|tռUdN$ IрPm3@Z\({R˻_(MlZBrJ !4JH` o L 1pV]d?hId@$_$U3]pSqB^!/W%W[ F cgTU@TbfInYzYnjgGzY:ǹ0cZ<`@TG|؂g&sW; #ԫK`N%$lr$CpzTwWLu/mhpOsmg@}&&4,] MtyO :=o{{uCͳj$k L'+nhO_=]sxݬ-,w2J:`tkadtI>g۷clz; RIENDB`anki-2.0.20+dfsg/designer/icons/help-hint.png0000644000175000017500000000315111755052304020563 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵYhߙ3۝{-ɒRdY8vIN].]CmpB!}[i^66Bi0RB(KVe),EWWWm}eWZ9,c8 bv\cq!M _ \9ZiMwx5º8?ʬoa ǿMzBh2@JP LېFj=O0y1} {NPQ  vH!МHlsY?|+@C<+lLrS벩u8uߏzm+|'+O!h|1 ɪkZ1u&&ۼ/5s:a|yW)4u1.(@L,,KxTʫ} MN4'ykDm+{&+*@t FFl{Rz#Gp?eC6-G$LHa'%HZ9!1H,x`9Px(&nө3 iYuCҁ`톷g`jÔ% -8A7fHy5Jm>ޟ mEayDK?4~9K*1DN,?NP=p?8FQ[䙢T~;)S)s%>ԮnP1hr: J? 25T 16bҮEqQ5O.7D呋j[X޼ד[# BΜ$<''?~qv*F<_~O>P3+6fՉ59u@ ʖv3AE @$A=05Z&:RI`yyJAK"e8y 3cii Qs?}N|رcA)bZ#l6m… @w{yyܹK.wο47ߨV홙ߍD1OplIENDB`anki-2.0.20+dfsg/designer/icons/mail-attachment.png0000644000175000017500000000176011755052304021747 0ustar andreasandreasPNG  IHDR s pHYsvv}Ղ iCCPPhotoshop ICC profilexڭ=JADF"XO j͇`t!YfƘCx R^D,5רΡ(gyȕ3] P77_7Xv P>yAtav lĥ%& X?isJHPQbFE.u@T9tl6%;A>!DncZ goq^5]-^SleiPuӘ/MuЄwj~3ace-es^Eꊫ* l'!;z\7%+/ff=sI.XoJ&1,Eݼ9u1mySS9bRc5QLyΙ 83 ^8g@h1kb둇ƐFo~A!0H84N92%tEXtdate:create2012-04-22T11:18:06+09:00b~%tEXtdate:modify2012-04-22T11:18:06+09:00KIENDB`anki-2.0.20+dfsg/designer/icons/plus16.png0000644000175000017500000000622411755052304020031 0ustar andreasandreasPNG  IHDR7 %iCCPiccHǝwTTϽwz0tzRWQf "*QD)  EbE Q{@QldFJ|yy=gs{ߵ.$/?./ '{#~<s P +=KE$^o{4+/ 6'%<2YSS %(by1'.gEv3;8 v[="ޑ-q~6#"JqEVaf"+If"&C]E) \3IKnnkˠ{qrR9q iLY2EE6601PuoJEzg_f : !$E}k>4$ v999&\D\?xCw$0nt!dqys8|O.2./Qn+\j? Z$J'@5RTP"@b{ PFM.gA~*\,~dq?ǹYB~h@ *zX`; DU@l@%epC><AX Q H ҆ ! -!?(D V**Z:]B]h ~L  Cp" ]p9\ uxs@ QG HG6"HR ]H/r Efw( Q(/TDmD*QGQ-j MF+ vhot$:GmK!5at16/L&S9iŜ b1sX,Vku`X6[==qj8 .pMI<^ 5b|= ? B(!PNh!\"< $D[bKL,''^!ߑdH$WR IHE:B:OKzI&uNhHH~D~+A0`Klh)\/-,JrdI)SjT)9ittttU) [&OEq BѤRXz%CեzSoYYYKpղUgdGiMMKNІiT8r;ZnʽWwȷɿW++(QPxR4P RQ]ZX,,n/!/XiI˃w(VVۭ>ZX[mllmFTF qmb;;k; _S짖.,_:tu]F_вQGuGcc'M'SӤs1.f.|67v\ϻ!nnn2a<4<==f=3u>{,^[< >T$ۑ19xTw}W&9~Ⳅygέ=7w>̅ ݱ/F^ҕ/:pU1u\gm67lot .<{[n.}}hp𝑘;;SwSᄌ}o=R~T֣geVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD pHYs  tIME ;88,IDAT8MOe?K&BǬktdk&z /^hY1M$0n0@Y+(}_/*꜓s1>>)%Bhm!B yy*eAk1?Cu {n(m`3uV͸s\+3:|*|O~|i^p~gRnG(lc F o?5m'dzck1.zb:G9`lNһ%g['=ukAO,-Q9+T<(U!/P(dvwM(m"6F[Eil&ryUgk|-:PܯP(hhhOc7S⠤\l[r RJ,K0EBr Z뀭JQJe6{h [`5ѡزh6Zژj%^o-S_=Ij:f>CU]lۇRGεAJ[ń:)Q 6>ՌbBJx6H8u~BM$Nnr/ y2KN<ݡZ. 3P3:bq>1De3k2o\+U^!IϱtvI̮|tfZ+bZٶÍ=#WN_ ?YvnwAZSJ"Y@8- a-NiWf"dR"IENDB`anki-2.0.20+dfsg/designer/icons/package_games_card.png0000644000175000017500000000431511755052304022436 0ustar andreasandreasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<_IDATxb?@b!J #g߿3pss`@ul@Y@^:ŋ >@))U>>> ?~dx-ý{}b۟ߘY- ````g˓'O2ܺu ȎDv P۩3gu~F 20]<d0(= >>>vvv}} RgfQ` %Yr~30\ B(,`O &ws``:.|Dh,0|qf !Pbp ʪh%B;h\vr +9_APQt09X3S4~lllU9МĄT=&He&` JgYZH`dvwx (*0yde˖5eC &$YP ^߿~Yy2|e+?r ?5wxza1;x6(Aѣ. &Z:D-h}a+"e%ÏE@wX0gt$$ 0~U3S~} -Aщ'֬Yn!Bq7ȅ,k?Ǣ~:C'$@6}ვ7 ,AӧO` nʁZN k`v< /  0 _]#~K ? 82f;Ajr+¤\?>CtA X{ |7oހ\_ jxH4 (@ 9n~o B% _~La@$V1te?;8']l~UU8GZFgϞ / F'f+2W1ex3@ l[P TQ%4a - lV9Ba Aի ߽c ?X䀭"`!555 6ˁ8PC Vv`ӧ/`2j<9A⠶"l{u`V<̰ (@14O RhAn"`c-P z ƩSN5З޾ze >,-f7F q-`޵~c T? 8sPiuIENDB`anki-2.0.20+dfsg/designer/icons/math_matrix.png0000644000175000017500000000117511755052304021214 0ustar andreasandreasPNG  IHDR szzgAMA a pHYs  d_IDATx͗1hA=91Vb!A6Չ4ue!gHkT6+ !ceٳ"U0kvk,. z aOL{` fvh CcL Vbŕ^qhZdOs2&Y4k&8ր R<#+-wPϷdrBm%OoER2vx Dr/|5W! FmsrvHo^~Fgg8h %LE R̚@{U%i,npYg}Ԉ- W?Tu(w4FwgV$&?J)sz7' ;͚(a>P\٩NR\x+*@#M ij*_}ۧ|-`3|2f] z PȟgsbJm"IENDB`anki-2.0.20+dfsg/designer/icons/pause_off16.png0000644000175000017500000000075411755052304021017 0ustar andreasandreasPNG  IHDR7sRGBbKGD̿ pHYsvv}ՂtIME  .*o+pIDAT(U=KEС>ئKC 5n-[S% |y t-r<2Z/f#ljhK7[Sc1X5_XDW]ۓ _liY͓ tPX!u@݆bD(AQ# Z'j^C\8qv% \]j;Rz+fZQJG)ʙ=XiŴV7;#yp;^ lNN[W\Ɓ]C)!8O^ZƱ]4-kM o5IENDB`anki-2.0.20+dfsg/designer/icons/user-identity.png0000644000175000017500000000245011755052304021501 0ustar andreasandreasPNG  IHDR szzIDATxŕse=qQxW=xs<:E@,"-Д* i6%&II4_I6M2eϓݗ!ӯG߷_ 8O/ڇOLz츀E c.L_97z6]|ycxӗ7/|}vq=wYmp^=)=O_Df<ӈߓX߆p '7{ƒyn;1oH臋];I?V A ۠bEe ?.0q;{xr̉Zv 6 A-%, mgّ33mp,,BZf5KG- QmH89 qu̡^l *mqmqa{fne&l Ki)@LJ­ 5 (T Hh"mJmG ˦U9@=A"s )1wcohxzH|-D 9h?1eﻳ)GmI.Rybv_CUI/ȑ{P*B!4ud ub`Rh rJdp ,JڏӸ%07Bf z)RJIyF<P#$+2$#fL1ں$7@FUh7߯>@¹J`浚J7DlmCkۤRSZ3 ?cJ@*TLԈPo|{@}' rN>#+^'HN  Ӝ.⁄ 9 %i2fZKX.TSZlPB!PTg^Ѡܲ;FcኯthpA )a_Ya"9uwj}Š(9]qBWJ6MFD#cl W}Uy\(%#8!^إC[ ~f%Yv?jANj-WgXB\ w O(Q[-6(GgH?f5;Rq^>L@:-h1IEH 2UPsn1F>lxgSyV_OK׳`v<Х{,!ğHK%O0;9 nqy O!-Iz:qY"ߥŎM6 #!+(RӉ0MyxtM ;F'`D)LQG$0*ŕEIFcun2N4: DDEl@70;-V cS I 0d@ncKyDn? /l%aqɮ=Sj 9 zǼUSVp))HȈq}T*BJKd*r#Ivnwvvovv~jn~;s{uǮ;$}8 vSR 0|וK04{X,@p LϚ3o}2&𞞯| x XJ 1gZ'LRĤlL(U"0?> .GU=c^^c;ڔi2=5|vwvў]ĸ.KZA8~v6]a/ mcӦ ^JkxxUڰtDhQ \z9@kH{~>X\2-*r$,547:=8] 6coJn}'[ alZT`:;ڭ5B鴧 Wٷ<˾:|bbgGKR`d4^V6LJ=𸝐EL?D+<jPD>=Dw.f~2h = #zyZDצyur?wu +z-˼ ,IB>`u]Xmtdpۗ%CIRjBD>yI\ԦRI21c/x'aGÀdEI<>o'mO*.B:9* >.o4ʭI[? y&%} hM&CB*Nd_ӜESM*YU&X3LbSiTӈǏq=5<|Ʀ-P䁋ǟ Wx:s^'I[/偻)";U\jj* U Qюs/M!RZU!Yc|7(4)~ /zc?t[:S l9?Xoٯ#GBeS>EbGf۹^~t|yc}P,I/dyе-l`~sXl0X^f e[Q4IENDB`anki-2.0.20+dfsg/designer/icons/anki-logo2.svg0000644000175000017500000013413511755052304020657 0ustar andreasandreas image/svg+xml f c ! fc! fc! Anki Anki anki-2.0.20+dfsg/designer/icons/math_sqrt.png0000644000175000017500000000073211755052304020677 0ustar andreasandreasPNG  IHDR szzgAMA a pHYs  d_|IDATxA E [O8q ;MLBAJFEf~B:*h_/~ 77j\_Eu9@S&@ |N3|Hoۖ×8wg«riD,K#k=wd}wO4aG)d]a@nw5'jV' P'OI۴*|#w/&[eYV1ƍN1%n߼vG_?n~9cts]Gj]=>ip_U߼r2^G޷Vx&[,,,O˨TRZg^lZ׍ ڿgcZ?E'"\ԓ>: >lƵ+wK7?MRpV8|~o<<Ck<6GvwX1E6ZH1::*l]I|@ >L`x6M^%4Ғt } T[i:﷌'bVءRSH#ҝpva@wBB(j>$HҜFNBj pE{ wJ'iΩT #D/Y@2(`wfwcg hDު- hq>^"+:R$m$"^x°X [s PNb]H{ucV-^^YiI7ԫӋиrqj@NhwAvh$F˺Ⱦt_V* mwBs;aN']aw— Ƌ­ˌ ?4 Pwe^˕v'H$JWַ НS T\mXW/FWE9#8HS 3Uo_IENDB`anki-2.0.20+dfsg/designer/icons/system-shutdown.png0000644000175000017500000000333111755052304022070 0ustar andreasandreasPNG  IHDR szz pHYs^tIME  4isbKGDfIDATxW[lTU]ޙ{M)RZRK, 4Ab_?C&~Tb!>_j15 ؔ"-@mitfӽ'3$|@$skǝ̢'V0t7 |fr^I[J@fwmѢ Ȉ.Fy=~Y|`Ass}܎]eYжmMk"@/us& PjjKeJ%(iB=6x)6;q=ش?u\…_,hY(HT'QI {"d{ [idΟ++_YJP u\Jpj{f pa ؆ɕxuhU#>P%\Rh%l"G ].vQH,T ޽Tٟy-\W)̑ Hš-fřpYL} L]GW t)f` 3nDA؜"ދInOv|$_}MUyz3)x.35mWk>z]:Uig;ASa}Wd9a ]fF[Չ[]K5 M aR@c1cBznڊuqv#[8M Pຈ:C AK9>CvI,yީ}`Ym]ŕTb9e*5蓟q%Dm(7E,Q{wOs (s@2@ 8}?~Tһ|vwAɒ]YcxzZ"R9_"sF\C?FH+^~;^a|vUp늈P(P=3ap,=X6q0X^- D n?z[ĕ.< ~@W_!Ĺd4MYb1]Pn؂O_ 5fSGڏ=o :?TS ROVQU?q ?Չ$a[G=J 1k侜 BfHe%=OOT_$-v(ؐ(sZ3x_΋wr1ojk>s O^NYZoL˟v'5r *z&脰GklhhMazo]fN%_{wd&M[rÌ>t:{w's:O aHڋO>_.{ bIENDB`anki-2.0.20+dfsg/designer/icons/folder_sound.png0000644000175000017500000000531211755052304021357 0ustar andreasandreasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_F @IDATxbd ? 錄?>~%`P7æ mLDA^ |sB+D|@̌ e|G~č.fiz~1}ADo[ }BcZ`,`h'3w d`Pg~<8P ?E @ (%1ػ>3?x0V\w {^ ?Ë/ at1+ ,0ea-Mp{^:HNV@a ۧOڡWu%F_GSO>u0wT'YcXvb`b;W~)@ Y/Y&JqŘp3ȉ00| 2Ük̞1H0ۊ2<; >s3EcXsW`?lEX=pʐm ?g9Ql_ @ʃ nepUf֒ev Q m,?ged`*{@)FPN H9 'ķW0I0|be8xa)2/ G17/&uP $͘xS\ a!A <~rbPp@`Opjpc<7ÿ?;_^&FQ= 0e2 8X3; nl >B-/ L63(2~~`bbP[p?  7?A|/'2JbpKvc3ÇLMM~ŰfrDžXTՙv}w:P{bCwr}UZ~g32I2} 7/Ppɒ% ߾}CS0-,,̐hwa Lt @YJ3ŚKỿ e \BАR= A 6mb3"333EEE0߿x-x\|ŅaV$|cwD,T BJ0= 0b ߿-{=8ϟ?>|+8t4@U3@f(rT`bf78+J^ ^^pʆ\< BY-HL@@ xpmZ- kv RecX;1+߽{j<{ fggcbbx-ëWU@!W>?ռD8Ï?AVdxvPY/_Bt cn߾ R&|wi*aZvڒZ.HSW`b L12dCPe$ði*p-($266'H]]]exÇA۷O 0Zn}O5TDIXk `ٯLVtـA*uVpl,}3g9ʖN<9Z7K(f'hrZWGARX&w"_0m4`230HKK3 ?~/^ {,m'; 5J:<)W 0CGC KԦlE R!+~A ]Aƍ9@ pܝV񰧔 ?1̾pȖOlcjjAAA)))%%%p bKbPs r>,` -g}|{_OKs+`&0-S$~Ν;\Z0]:&@C.r I% qr e 2:w`˝@YTkVP"ֺ@%Xv>Cf A)hhT2!0' /竃˾=:zj1 xX;CN 6: C: t F"zat"uC}%+0_rF6? `Ca]][IENDB`anki-2.0.20+dfsg/designer/icons/format-stroke-color.png0000644000175000017500000001163111755052304022606 0ustar andreasandreasPNG  IHDR szz pHYsvv}Ղ OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxkU{sߗ30 TdqJTMLL?X?ԢiLcڊhLؤQmm} %u`T^e̝y9g~d~CI9Kߦiesν<ޘLw5@[/d |ԗMҔRR=]ԅ\ ?Q h!tO{΋/ݮZcѣ֖=ݮRc %b#:@)X՞VP|jwFj {{oHP=fD P\)DڏıTQA=sBᢩ#,P.N{c^;a 544$kXýKID{)Blzvwqg-71Fj&,Xzn# (5~iA4ZZ{^CĈ5XǬoY r3'=x/[Ʃm- !gV`!ǹ%/BEV'(T u | xuҍȶqJ`"B*C6iP 8C2 FqM9RP2lyA3kܹa%w7ٻi/>DYYx,i\ ,@ÿxQ3<~x%;O>PTОx6vkok|¯Ix:h4L>BRr?"g)@+ApcsUɪƀ漖P?ݨXOg:U;k8R`#Y"(؍ !G\OӇ0BqX,D}z%dt܈"0+h5]]|~)PsY5UJ$ʺ (#'\qn\PGy~ ^FT<3f7|rȶے ApP1\7s5rcH۝\ GCh,E \6@Q`RCcѲȩL![!5?w*^zV4:^#lk[QAA*܆ݓB B.SGoV_]Uj홚Z5knh0P3(b@)t~|׃{` J R'0\'^;aoX[Ol+'7nKC bD%&$̅Ehj1ήNY5~Θu TJjEAeT[oSC fzB'.5.ف^N^vu9]?{xn=|4󁁂ZLb;.IENDB`anki-2.0.20+dfsg/designer/icons/edit-redo.png0000644000175000017500000000371611755052304020556 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<KIDATxW[lG=]5Ys@\h$"xᢾ* T(TD@ UB&!Wgw3Qۄguvf;swYRHor%f9o!տvm|XZ f(֤O=;_-mIc[v fn6lؚ RTcΩyø)~G{6d/\}`OkP t2n(܉":4[Z=^e wk.>5rTۅwb/* ]wojkB)]2y[~vxm6][KKX*"4iMФjQ=Xo7'0g{z +" qwIoњv3V+ T'R-OW%Ld[R]V$N.bFiԸD X#-vK 'z#0 S[J4on É+pPo<#P:e՚ς/=\r.T0i7sX]ZQc_k{DT+J (FX_4`e9pJDP#Jk-/#l ܙz 3b%ֈ;'B hҲNtŭCYEir6a)yjU~+LRdT8+wfm-[$HԆ2qH$Lplec^rhr8NNO]nNO:SJT BU20%,f3\~Yz n5XEz" A{1H%!UR#wqoFR־ f5%Wf%mfD`^wjzfm- +s$&*wnHG \ t-'5$a; |IENDB`anki-2.0.20+dfsg/designer/icons/view-statistics.png0000644000175000017500000000604311755052304022040 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYs B(xtIME ! 8}eIDAT(mSAgfFq-; + -l}k ;6V'̽3ca6p7B:|p[ʟ| }vW[Ku{gͽgOj` dˆž u퀠>Ήg7O1"YLx9^Ljr1M1Kh** &-ʹ1Hft_(ALp0B;ڇ{}t}9{[B tz^~CCZFDB%E@^Zq:K?0(-8uEqyJ@O(_D#-ӑnˋ[k&mJ"D5?,F^Ǐ| 8O 9j9AhWq%\ {@^ŀgqq I|8)\eKcЅ B94_f>S|^|,Ϡ(-|i›p~x0v;~11AуC83h15>rҬp؇>tvf5%9}# /16.t۱_Ex(Ӂ:iayV Љmxh@+;YoG (lG$rdAh;aQFR(و-LIB ^q`7?S s5B Kn/6lBo.zRk+Y8b"r#mn;Hln%b/M)H\2,Eׅ6VO?xWVda )&_>&4' rs6:Z]r%c"" 7ٮF| QGN FXL/\XJ*B_.H:":Ef^"Mj M'nb6IW+0(bҀ1&cй t"Bu<GREc7D78$LB-Jh1vXzE7GM<?¤FXHɬH6R0>BL1S9 5fHDۉH.N31V#9 f4(IL( qJd@Z&K/)$FVdd`C/'dKU&K>a|锰drJ,e/+܇s93g(eSb7SH #"ƈZ٘'r;-Ys;f8t1lYc ʁc)5)ߐ$y6;x;7DK,X01ռ̜ V<ʻ~^ٍ_3螀ӗzf­q<&{d[w˸cd9͜Xte*c k:5ʤ+iIȠN%tEXtdate:create2011-12-15T16:40:56+09:00Zv)%tEXtdate:modify2011-12-15T16:40:56+09:00++tEXtSoftwarewww.inkscape.org<IENDB`anki-2.0.20+dfsg/designer/icons/text_bold.png0000644000175000017500000000046011755052304020657 0ustar andreasandreasPNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT(cπ2PKAyBS',aBq} V^1֧O+CAz}h_n-c(H|ߧX|Q ,a2yy4 /@SVjh l=']=K Tz\JZz_IENDB`anki-2.0.20+dfsg/designer/icons/star_off16.png0000644000175000017500000000607311755052304020653 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYsvv}ՂtIME .#jT/}IDAT(ύKHa>[`^~YK ! dҮh+!yA+AX DDpD рm,tl!:  /3@8{KWmٛ~xxG _ڞ肎Zn4۶uޭoTκ5i8GٓT1VM wږi;W)no~AQQJ,yvu(CL9L,a֚Zn]o$CY/w&xzQ|yY-HL_{$$q$)Rx<48DTʤz'`X* pP ?dבLvuuteP XF M^5=`7|0fIENDB`anki-2.0.20+dfsg/designer/icons/preferences-plugin.png0000644000175000017500000000334311755052304022473 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<`IDATxڭ[lUgtKri*JAE*QTB0Q|@&G& 1&<(cHDH)Wݙ̜ߞa[/73=gfZĖCc振J hrƿ7 ^m9< ~nP.}jӷ˞'k&Uc w+E!psOy<ã:01@ݾRKxG-qɹH=,<%(9ayCW{Ro*J` 0V?e` /۴Ҏ dSc"nl14uzd_w"%Z)/?؍.yĭ[mFwNc+smݸkj Ջgfs@ DȔ9 K $6KY Y TjEE}3Iٍ0O&( %Y Q_w@~+ L|qhZi䵐ڶ]Pks˒ &;YxI@OD"~:-&/4,;%G/"b·wIENDB`anki-2.0.20+dfsg/designer/icons/contents.png0000644000175000017500000000464311755052304020537 0ustar andreasandreasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe< 5IDATxb?@bDs紣,N,jQkoR &Jܯ Ƞ 13f'NlH:J ’I@!A f% lkmWO>h rXJ@[Z""(Ejӟ ĥ;ʾvPa,@,?(ԌR@R#z$P6F=S\\ @|J&J|>c-TYC2f r'?Uyťxy9^ZZ@śf Ll;=?ٍ?EEt|c`ebd畔>kf@gIv, , r߿?v V Wbۛ3 ,o R* ?aegt(]R 0aPf7?,? /cp4f`jÖHmyK!;QY6&aQ1Lǯ^} J l#|q0\؋7!H " {'`$Op_'"(A\>`sq2?\_QW}${ c)`e* NEߏ/#08G h0<{#AW "\g˃H XIs^ pb \G/>/LgI#?gbbdtTQ" %/ @8ۄVDZO~3  '? O^|B zg3鉣,d^ 7RcAɀ׈ϩp3P#S9v?- ̒ ^ @DE66S2 7` 7XYt5$Y-򗯿}`bggf8u==Ǐ'{^n]&4ft>_poY_AG Hióp[6ɘ)Nb W 1x̰s=3_/09喫$U ,Ծ!;J)S.6&pۧ Ͽcؾ.o^hG V3| ɷ |-c" \\g j[Ġߝ[} mAn@;%J^ bXmh~Z ޱAMUx_,`IENDB`anki-2.0.20+dfsg/designer/icons/view-sort-ascending.png0000644000175000017500000000221711755052304022565 0ustar andreasandreasPNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org< PLTEEFHI4k$iQA M KJ KI\\] ^ _ _ a!_!_!_!`!`!`!a"a"a"b"c"c#e#e#e#f$d$f$g$g$h%h%i&i&j&k'_'`'k'l,d1i1j3l=sSYZ\abbjrt{|~ӂۃӄՅԅ冫ֈֈֈ܍׍鑓ޒ욼ʮλҼͽξϿtRNS349IDATj\est!LhRUWo$؍gA҅*+S<'Yt/F毷O0mSHHim'0B~AE`!@7oN~\N> < qzZ GLI"T.]6 4ty+_1ҵ€8Irm@e@^kazU^ 8vm_WNT0{$̴8SNf6bӢu 83%@CPYa/rqKoK?AMVGO7dP]|0 gVͫg/oD~ao6ֳwA{0^k'}z9yv%6D@oŀ67F1&Im[ r :6?݇VIENDB`anki-2.0.20+dfsg/designer/icons/colors.png0000644000175000017500000000436711755052304020206 0ustar andreasandreasPNG  IHDR szzgAMA7IDATxilﵧ7kw_ 8-hT*!DiJU?TBD((U UA!iS hrNI^{]ۻL?ڎ)H}gg*\E ouClZ " VCgPu+t#~gsymaAYu׃yB}1 E_9y]-n7M ŷTCku=JTɄ{%f"1{j{7sb>5/#|5E߯]xᡇFNvX98\ ,bQ܊;ڕn ~BkYx")DKVXsϖoo֜+m91L/:~l2<^ћqy`8 1H[Ll+ 0Vd߶r[!/Lk:&=et3hx ;d(00KLK+'G'l ;6UچoRPWd$2)UWG`בF1,T.zf|Ș-ҟ Pr︵_n-_]'3|d6 ahMX x.&&W?#b:T\&L+G(pz;^ڛ\?E_|}m5VvM[SCCS T;py`Yh$12s$26x=L `#$K6h[ }fM@s"i&1cLA ]W7n`Gvd8,`ngr.ga,HBZ`t@2Q5u9@V&C%L! 5.U`:`AD5=H R2bMَ$c&G-XZ*Z  DXw&]*@d f3"$(r\G%:>\:<I-MyIls 2Dž=meͮjQPJ@,#I( IZ,46W)pnGŋ /ͻ¼Ŵc k8vD_. s{ k$[DX)h׻^^k U\v-fp1 dgm᩽cә=\T3IΰE01iޱ7;L6489%R12ƱipzNf6t OyߧbOSWG?YSߪR$]D_BS~ts=ܙS'E Zk=F:z#CM==`R|79qc5;7P a0KYpva6~TUGJF +]j=t<{GJ\ZBZ1ܬI7pܥ󹭵B߷96Kvaw^Tw #7G6pj?Uvjݠp$y\=IENDB`anki-2.0.20+dfsg/designer/icons/arrow-up-double.png0000644000175000017500000000250311755052304021717 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx_lUƿ3wlM(m h6JBĨ1}/&'EHnw{TPAb|f,I)q?Po^=>ٽkzCu:Dm:kM[/ce,5 =F% `0'E--/]vxEo{oPṫuWDɸL/Rhs++׬y`5)@.ed }IM .T;On|x-J'јx}rh?32)^XyN)9Uvjl8:4,ׂ`q[4@T v`mtz$>{bTks&t X5- 9AT]..ѻw eM)K͌sV"T+.W,+:.}hCE e! B-51WRc!rǙ"^)Џ@:-:_9rcg[,5ti\<  ЂAҒ)h3a{oU䁓3<7G04,"O(c^Vpy1-h5# Nc!Tg $_AXSfUF+u] q 1AHEM|HVQ6<6`5k5;3wea>'ts 13n "?dl-wztvb]H{~yp_mycÆY]~LyqφpG;Um0H=X2 ;o! ЁBP|Uʫ^ŌwFX+ؽrwA۫$hj^;a `3Bŋ|kX~w٦Wf pť=G"3OXw~u-F5 ! ;}гwb8~h]1=o}xؙۛY5S8uoR ;W`17 a4F` 3LtSc/:5@ THMmы3,d9 ,D{`΁۵6I3[~zі_]zf yU CD)`|sA׫@AF6KAg9kA fQx.ύ۾Pf %%TD%*#?Xo81b|)Z+Pƻ I> ?;6Z.!ݗn>r^ 2 C$1|+Zџ8o-l;vBW0u g:F=f-5ŽK,kxݗt#ZAN^13D F]hkC0ؘF-0!zEwUh׭Ot7?r07눈=s_ȀC@`*ÁUuV/ OQz8m-(ŰU(](ESDg2f%Pۣ1B+RI@*ejBJz;s%y/'`"pIu'-ݚ7 q. ꚬ8&-  E C6eVW3~i*_-2?N `i-tA(I!E̵y?j30L;3%M`4ZBIBlFH,ay&>M62I+ 191$G'cy85Zsa~`jwViN0^Ӝ"NlU"x¯<ͯ-rp̨D̎%H+zkiIg[yD濒r*A9rIENDB`anki-2.0.20+dfsg/designer/icons/deletetag16.png0000644000175000017500000000616511755052304021010 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYsvv}ՂtIME  #,[IDAT(UIHq-LaSQSm%-$ԥc,24HPjtL˩t($C A53Yvh]~Uˬ=},OW4ٰ]l^+vOc2{O wd \w?֬1֒ʩg&cO.LKpNk"(KuDʚDBL86g(̕dtJk$F"vÓȣeŖ$ RBߒJYZppd qL\jZK~_TQG`""1ظjģ,ܜ0-/K IIlB|lYܖ7vhw':Ցk~z^PlF_m j.BDFIJNRYj{{|^IDATxmMkQsMTD)BW]_.nT-P| TmkjI!M2s3w&Y$Cys,1`D` " PUH"\\D=3Eu[vp&+~s|B UbhҺQyRVyX)ZָVyUS"0(Un.sxrbM"R\x:w遧,\sͬ3#evڠc"@ʻi; \ Af^g|ြQfhC"dY{g`ND9ȯqY )ruyhAPC=&94r^8 M"?%mqȭ9tn2Y.y;^IDdeg_LE3hև$b9v٠|čt!FV:8 !ش]q(Rr/er;3tc649c/kR+,=S dd3|lIENDB`anki-2.0.20+dfsg/designer/icons/anki-logo_white.png0000644000175000017500000000360211755052304021754 0ustar andreasandreasPNG  IHDR@@iqsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATx[[h[]IoDCGVm-h`P(rCAc? DPH/?>BT_j}%&IMtLл`>ffϞgcǟ />_`'=:xP`Xwcf)cj6E\RZUP :& zz9˅7o$n7Wx"n$HbP,#bD"Id3a8 +6oz{{E87y"6״X,߄>8t:]A}:b1t e#% L&ryn \ɔ8g"@Y}rigH^`M]|Xr%d,d.Q dZF\@^ .pAp%Z j8z(Ѩa@xoN} Ǹ?<?zd2حwBMIENDB`anki-2.0.20+dfsg/designer/icons/stock_new_template_green.png0000644000175000017500000000420611755052304023744 0ustar andreasandreasPNG  IHDR04̓sRGBbKGD pHYs  tIME  "IDATh՚]l`wk[lnIjhE6T5-QګVԛpY&@jVĹ0A) OH\i)v08^Μsz>W4Z{sƳE_{y"RRtK)N*Kugfw*ceO#>?O`29\};&@=pH޽ICJ6m+_za@ PZQ&!!Z V  >'G>os3v&O#~*csϞH5hY4!9:3L%op<7 wMʒ( "-`;0LE UܩaC$5D#6doןk6,TbMZv^yW65}ajTS\jY?hRҹoŕ̘IH 4*a*yӿ,0na=%%S%1964mh/0bI9_(^ 9 V+__7ɪ,jJ1q$]}O';C+b?kx{Ô&"]׹&Rֽm*aaW ȟÔHbr[m?-iʚ,jK\=`u*s,RI[=o4BNxK%qarAռ*,UfvJ={{}Y-Ƨ-RkȪa-pn߇W{VYK%͔&GĩdJ$9?*Ia`I?tXւ W$7=h9s,@9UJMzSSWiYE&Fgm+>j+|Kۨ5xD"@)Es_D:l1Q tK ݹxrP! ,_tת7ױmu' @PhGg}N2u%^NgD畀a-dۦ~RZ1}=81Nݍ4W]Rij?#R~1L>>ׂ JKS}G"%M^Kq/p<>3 ǯb ӿ@,^N\L"t;U@*DS3P;w|7ZK/T`)*&p|nZapg\W 0=2ęYΈ/x3W瑦Q~yoPRdtSPQkbd_=j~c`5 >9_pk>IENDB`anki-2.0.20+dfsg/designer/icons/spreadsheet.png0000644000175000017500000000331411755052304021203 0ustar andreasandreasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FBIDATxb?C~~yEEad``a&3`X# ( ?=}zuԩdfdd)|A/? &Gf-?$``h5(!?HC $vV1 @,096e`8}flQ=ȈgQrYP@,0A)TT-Ш#8AQ 4 v:DP X:cN D .xx,c Mg71L2u 6C`'C?00331,R o% q:00`Ņp@`d?%VM my2 0V[̌:pWU.3Cof~;bnnn^^^8l! 5 ߿ RYoDB?Ԭ@,b_~988޼y۷o( N@AgdDo@!** \OOlPKII1pr@j@b* W4,AA @N RÂ&r ,; :ׯSA J| Ka>%<Aϟ?>~(G ' >|7@rP%FAi(Arr"0@e- s0 +@f0H E@au(HAA.$$(O?JpE(@QK(~2 %* ͲBGFF @9 @9n߾ t Ca4CMDIKX 1XԀ0°a@p9 XDJ< PQ PT GѣQ˂   FE(*@ ^-EL d R)P 2 X$`V0s ' ć 1i àE(8ae<(hT^Stȡ@8*`@|N9 @r uQyfx&h nV*? H #@rb0 cccuװ J555ogΜ9c  5-|=J A{;ydg @t(,rEEE((P9VD +++M4(tf@P>}": @A k/ Y0/ @P-jT/%}.k(Z[[A;[Q, AP܃ .,bA@SLqFst@ ^SWWׄ%|)r'%\jAv Ď@{ϔ8h8AxI@-@ @܉ IENDB`anki-2.0.20+dfsg/designer/icons/player-time.png0000644000175000017500000000457111755052304021132 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵWiLTY&813?zdڭ-qNpF : , ݴ( .Z,RBoJd,L%_{ss}f8v;8qZooo+jS ,ڸzNe?|={qǎ^3٥t>}~{E?~\ٰa5xҥK>{f͍6>377Ν;H`ӦM}MFHHRSSQYQEA~JPCɸp2o޼X!2kۑ-""4ƵGٰ{o>߈݋pTU u^x8DGGr@"""Ϟ=CB|fQ߈wl>}צzB4͛7Wƍ7fС2ek++f!?/_5!;svr28+O<ΰRvnw())Aks+ݻ6- 5t8v^4i҇ѣG?ɓ_z^ 0YFP~u wUgDܾ 3g/zp}ضͰgQN'-[,X 0k׮9r1UeO"C"'#Uee*/G(?/elbBGE!zKqJaCL2}EVc5Hh4EH$0ɚJoo@dd"IǏj7_%/+ yy{D]X+1h?x!e().AmM-$MCƛ ܺy驩JmUPK33{I]/egFE˗kiT ֖VH]1c|xb$% V rrP/ -_vphDx|tޫjbQwT_- P+ãTנcJ7 0m4ṂHEST9bJtP'Ib֮Ega)LNjn|!%D4z|} BKrUAe(dQ#2ӡ]qVK&d]]ү];;JL zG%X9ӛ"o7AzK33R m,--~#<,b@E}=JРg ޽oq ~s0J/i=DZ/vr /Ν;`\ nlhGa3|8mn{[[j(oP|2A jKsxM%ֶW^}59sfSq(/}ᄌ?".޿?XEoccJ]]]Ԥ)aI'<ٿ;6Tz3._R $ ^nfKX(8vJ9# ]tR+ziiiQ iGq #F;w..}'Yvb "؀;VD Ex'T1'po5{>^ R-OaڛGz!GjQIw'%~ܴ!&Yy`(t0*+'QWe`T{,E>m-+ɛ;8e L4 UDA\fJG2y(BHa_q"!#!닋1r9^Ͽ{~qziaJBgsMkʤ 7RR]h_ޚ,רIENDB`anki-2.0.20+dfsg/designer/icons/ankibw.png0000644000175000017500000000237211757567152020170 0ustar andreasandreasPNG  IHDR s pHYs   iCCPPhotoshop ICC profilexڭ=JADF"XO j͇`t!YfƘCx R^D,5רΡ(gyȕ3] P77_7Xv P>yAtaf^H/+Q(SBxK0RC U]y^eP U_ꭓzj^}O4 4&~&+^Y bw1=҄i`9_yS#(F!*򜑴1\z77lUj&v4b6oS0 x kJX]1 !-Cl 8J46_0>C2+,)+<֨#8c49~bq5@5.хlyAtaqŲEi%0UFU¼Ա8ujn[qژ׼Pކ7kTJ STm|D;hb_6lv4 ̝:hj0GB~oa+&_K'g:tIENDB`anki-2.0.20+dfsg/designer/icons/games-solve.png0000644000175000017500000000524011755052304021116 0ustar andreasandreasPNG  IHDR szz pHYs oybKGD IDATxڵyPTWƿ~ Mtɾ7AhDV&%S.ƩIL*dLt8Q#žH&IԸI48Y̅"ʚ?fۯ{wyFhC8v (!\7ED(,,p^|9_x x ! x#esU_hbt0EZAO5m?0F*fjV@Թ=)=זK_bӖhΩi}'o)m%rgm'(oY6ϻ @MD-ZvBxĔޫMŝĒId8t;t57ڋnsRLHeobOb.^_>ARΝ:C)(*=#U$v.{ToN8aOn`H#fH%T!o~sS+3[zRmD&OX*%Tʘm8/z{Tdt>^̸nY{gZ+s@`l֙G- UF.4id2F9l^\4R=Mn!T[ߤ|-Zj5n[Bvvߩ>7M]s>O)Eis`kJј8q$n_鴄7ZaD[N,fcn=%+V\6킁I4l9lj~ԛbޝ&6d xW3J#C 8xMN?FD`pauVw oãTQ}Boc/Ty@"[i ,rzau,ܹw.Θ^97+<&,#`\`5N`h„ T\ZLpjXmGeTN/.VgӮ@3bv]#t`er kM~FR^ŸҒR2;Q]7c+aGF^DZe|+6 :ε-41DV9B?diSgj4(990zR'^+]!003A NYYYVKNZpG)h5Z2 [e '>d28OC,\$J)--N{ ѵg{xǰXdkaaNh^_z 98$LXE-4:B5w;K< NTz tXƚLqڇxM0E H$21l սk;&[ -r "5FC/ ́ 'h+fBgEdG*AW_aox(>QOB*,Ğ bCTў`d `f}A * OZFۖb[Κ“22ď`X-ya3 %Cx Jk!"m yxx܈JJJBdd$kBqab3cc1 7qhqCň]33Srxϐ1шcX8φaͰQʒB,\DϺ"~"zTXtSoftwarex+//.NN,H/J6XS\IENDB`anki-2.0.20+dfsg/designer/icons/star16.png0000644000175000017500000000607011755052304020016 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYsvv}ՂtIME  bˤzIDAT(ύ=Ha@,%IQEZ %I( PpS " 5C}i338灃Ŀp#07<=6cuTo WoOotw"7ᚎΚF8'_~ {\ME  4FkmWsⶊq-E0 %96u}ޯn6NA!&b )O-Nn7tg$ZY֤7U|d2lΛ2KE  sdYJ Ifz9Ϟ( `0Y^K-^P| st~3;X z"8IENDB`anki-2.0.20+dfsg/designer/icons/addtag.png0000644000175000017500000000405211755052304020120 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATX}lW?{_ -!-/bu ƨ"ė97IC,یo395ӑL ̆ ؖkz=l-" n{|9)7J7Ŝ&D$t\rCk*X-V `<-'9?4~p%nη,()B,`6ov8H%ul>p7$;ꑑۿ~M_Y:OG?i h[bnvȱ'O>*>ZbAHx:}~TXf^åJ~$m0>A8EpBFL~y>L/R%@[CC='=$|u\K;B-s<76) ̙Q @;_ ގ, qI2pL>K6G&`Qgɍz8(Չ%L3@Pe$!v ?#zEXI0U=!vg4Z.=I!2aĖn|v7>PޭgS:I c)( ZLncK᫥c^I¦r|kI()j?|){z|3Qf4H- 0JlPAf0ٵj,sg\8W]p2]{3QU[uFr٢Qc:f( /!kC0"Ӌ8Mקч0b"|e Y 8E-,HC24ύ,) )Z UINZH%8')DJ8(Z; cM-'0vIaR\ 4FyzsjiT!B D)}z5yK>x]wO|]!mrc 4:Qe kH%b(w?ح/Yp 0n1. g0F㊀3gUR 7V?%߀=<kzi:klާP 'FۺM-N8.;t`ֿp?~acmۆOL(x- ),J յi%[?k D5_H݄:IENDB`anki-2.0.20+dfsg/designer/icons/deletetag.png0000644000175000017500000000420711755052304020634 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATX{pTwlv7 a!*OH`Z##m}am|Ӣ0 Ud@PЪQA^d7luDZB;|9PJ tx[r*7Q !x|)uö~ߋX)DSae`I+xV1\B׿ T?tֿ* 䯙O*]= O$ s T6==r[x@cim=FmΝo꤆ׄ)XwxN}H8L{w"˾!VL/wsj''X6 ;鬂=rYMl0!mFJn0"/8sR~Y yfϗҪ]}jllC+HKe3h5~u䔕1`us6?e{%4!nFI LS&eWl@7Fx^,Z v;nG:xpSgs aiL(=\lHR %2'f~cxf1!px \.<;]gGUbS&WU ϖמ:5=), et:AL PCWWw쥤0c7}5U^{<4`Mh\ڗf(O߀d & ke"=\n ]W[?OO |t]sYN־.1]\ϑ!TMWۆOϕm4JotL>k`- |i&ɇسf-X;C_Kɞ8s碻\\h#'N'}nE@ l'y% o >`29|c:\W1NxQvd3N޼ 23PWGbĶ佡2]XP4d9lxdxHfb<؊1W`6\c6_sGIvG@ )4:B5<Ψ]+!2 2CsЊ&5vzH=D^9Co< `pUm'@o.0R,}0A1`˶#beYXR8K_;p hw0VW*ps\`W}[Z֎aii;v^|f~e~[Rզei!.LfLgɱA.) -x!3iJև-])~axDD M*kg07%-xj`?dye~2;VMyPwm^rGqO7T IENDB`anki-2.0.20+dfsg/designer/icons/arrow-down-double.png0000644000175000017500000000257611755052304022254 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx[lU眹tm ȥ4IM bLL|"\IL|DI0CL|Q $ ҇!VLTmݹ>l;ֶ\*g|3om@ APLFߐ3ٝ%>3a  La㲟GoyL9IDAz3h p4wuj_ 3a6,ǂpBv͆C W*$ P`2 e@(cHoA+aed94>\s$TM Jl>,T ;"纏ZC ] Gi\uA*WGJY лDhƞz\phCAR@uf}գFP Ot\56=T5&*܄Db"L sm(.nc={.C.aEF ) --0}'+},='N@UDS5YMM:` U }2$@?}rN2L0d&"%8oCC8hc !Ll{vˊb+Ŕb%'anV;*fVˠzpd9GXj-0kRB;Qmyx%_~X;̜A+V2YԁvhO(K"<0i <\/#wxK/eB\LqVY$2ѨN(%Ēx~tp(* `SWwW:ZM ԅ3#1iM6RL.#\<7Rp -0]ѧ!yN9{r(Cg3-@͕E0 ghq_'ݼ NSgOEG g3/EؖGF?=M4߱ݽzy4e@5@*>8¶ cׁKOa.KŹQ(42,)5l1tk8ҩonmAũ Ê^Ltiӵkm@ 3@{X.{zcۚ"x dϔfYx+߅loQ? jIENDB`anki-2.0.20+dfsg/designer/icons/add16.png0000644000175000017500000000574511755052304017605 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYs  tIME  VI'IDAT(mJAEϛͪ@ +Nm iANlllmFPFE̳1n}p w^:Ҟ=lo+噜6e=rfCRYA𴵖 AL9Xg\kz<1j7H -72{I( +*TH Bݤwx!Q%.Ur buAXv+c-&⡍Ԙdd4mPJ: |M0E&i?v!mIENDB`anki-2.0.20+dfsg/designer/icons/anki-logo-thin.png0000644000175000017500000001416511755052304021522 0ustar andreasandreasPNG  IHDRVP7sRGBbKGD pHYsodtIME$FIDATx]wXrH `hkK@`)D551hK" BT~`9g;ه眝ݝ{OQ.@B Y%HP ̈́W%Hf Y%H6 J U AY%H :ulӫۈB(B#bb㏟x#9^9'ɿzpO}(j&2 36p_oJ+Ov_6~Ν^pDDVex?ZxRb$;w#8:iik,_kk'YMz[U$I?DBY |I=U-G鵜]hUv3zf%%%& =Ϟ=! (͝1 oANNA9Y+iZlBi)fTzܙˉ\qi!nׅa y7۰cU&''kY-,,J%EQU>Kq5Y!Ek_5%+G}FEE,˧s&&&">\ ?!vnB+D)R@[6kWr3~5_"H66[9vwsO[P d b^^ӧO씃Z `dd+! @łW 4iĉ4Mmťu֢hI֖6-_x80݋߿dddfff5YY$#2$ @ }a fM ?ٸUk)i ޼&SoL0ȩ{?sgoފ=L;z;&p o0jx΍V抴Lcz۬['O}9Anڱ +خw<>0 ?}kwB柃$#^9y&>:+z{5PNsoB4co|פX͌|&=16"[)Srvq"U/0D6wILp\CAj23-T5]8lb[Ĕ23psJHP ķ\9nռB[wBjחdBJNB9 Yr`JQBE4hdҕ-PFT[$a`nx|`݌/-~]5}XRa3#&+?F2D7q֭25QN[og/fuOZaoo_RFJFBUyPJQ\FY * #Lj& m[96t%>se¼euuF-&8V0s SʀaicRD {ޜ0p{15)h&5)M ؾ}Ν;yWW 9$P뫜2Pdzɳ2& VV[XiR8ݜ¼Oht<<\EX9o߃xuqk57"Dx[0qn ݾp$fffӧO}}}5m2nYGL->QVZhT[ܒg!Kc%/CUxR/]XߴcaAJz% ڵHmo+lA iג0338qMMM(۞,P3Uqr<(`TZGdۮ=6؅Ű֮^YPYEe 3 7W"oϙ7olV~ h20|u]jA/-fJjJR"!w5]Tt-1׷N-ͅ³}/z1ڴlkg8banfXHcPX}GY\ O-@M2eqEC<_&iO+ژSfM<˿(O~g3w>B!!J; V~eLg>ݪpssk߾=+Yc{9p+ȪB2re0C]AIf0\ $ D:<`TG!{1B޺uke A6_n%Hs[ Պ6 մ|YElZ~#SOwsXth9aa?N傋ql0777!!GS- nyeܕ,ՍE5PNi hK;zѺG׆hd݈ֆ8גN2,©F\Z[߹Ӽ҈^(gc'sJ3SU֤@rp>LU}Xȼ<6hyvle"{ˠűz}H$.`ͱe3ZhUSУ|zs}Қa;Da>.}drP ]iw#IªKvRq/*tU4&2Bp toGá <.e3 LN1kTJ6V-pYݱ"$/7 uvmZ#&A8::ֹBQQQ5Y)oqZk0pÆ 2Ņa<[DX~gu0l咁S8E&u8.'Gל;8uk)8 ptt4 OTnAKjժ7o>y$+++11~ >|0 P*H/aDKgB//m)bv)Ftu-\.};,MTZIh.'-b7Q(\~N5H}^Ӝk>غKɣDV@QH߀sZҍ`Z7%!0C5, SMi%ڶm[nn&ӦMc&%rGK}rCo&!? ^ 8%d+,MY}njbϹJ&4EP3|}}tUW)(dND79rHRR&#GXX^C+>{ᲠA}>/֦xITߏģ42YJ1W;eJg 000pĈrNAj֔5WpDZˍf̘!3̵Ԛ"-I߆7h{XXrLWa0$^ 6q4b~QCO'g˞WN>\[_ҵ90vx#lw<=$jX]hA RP3X^RJw?֔Ppuv%s L c4s\R ]W[k@J&k?ı-/4.mHaynDPk#Yxx$I| Lc{Oncka`ǓHKTmXTjTbg1rL?]KS5lK-O)u&L hݿ<R<DSƎ-9] 3|G+xq|C sxsNJP(/ӂFU#MLM$8wQo=pyo|pr?k97Ymp>vՍ(` "xm "Ё({`;mO|^ĈyvN$0 2_h~)厛3TЉrg!@p|P&1E(/…6oQM$Ձ$X#'`e)*DAe^R@14ZS)B֖:tw ?ut2m@% O0"fT DTct{W͵b>CZ \kaõ,, J#56\jbǜdΤf kCh;t<{+9fw>`ju xSWN*j׊S0pY^clw]ggBjD~Y,P:Ќ2YC. DW. FD1pp ل0*W$JGjQohpȸiه؏>$S2s̟"!@/^!hx!22Vŕ@Tx2]C+Ր(Uk>FٕL8CU(d z$6pzrځ; i% McOzhMJ|1]2 x \D58kJ1J^SߎͲ̾}34"/²~.x µ}CnKS[i"/"k}:vޱ["ֺ?99lgJ) TB)Xc׃ p) E);Lۏ' nN w0Fǥ b\bj @]ffԌ5XkoEU8˽:K?!h3A IENDB`anki-2.0.20+dfsg/designer/icons/view-pim-news.png0000644000175000017500000000212511755052304021402 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxWKkAͲ5K@Eċܽ (L%DP"ldnvmMw36]!_ݮS3]ѿ d+ |mڦi6R/ |t<&,I\.i0PY)uMʇM"@)EI>^F}K6ZJ image/svg+xml f c ! fc! fc! anki-2.0.20+dfsg/designer/icons/product_design.png0000644000175000017500000000213211755052304021702 0ustar andreasandreasPNG  IHDR sbKGD̿ pHYsHHFk>wIDATHǥ[oLQ׭uWv!D2E6ЦFQUQm&S$!$u!BҪvulu=uot$TJL{ɷ'TG̈Ipxu1R: p'鞼 7qOUS12;tU .g:f۱'`o(';5||AhHQmn?G0y$^Qs  {XB' >~GhF#b?=FUҁ{BU:Kd *Nӹ8xghG7^Y+ $Nʌ*C 7CJ*ک("jJ ,TT 8{ A;^p5,QE107xd11.}Wg@REF> XMDQs"b%͞D 02 *A+X@fԑG\dI4&c] N? |Pť0C|ZTT#nW 7j.r}TLd\O5O]Zͤ6 # Z8ÜY ٨3* ^5ZƝi?gT;J*`Tη$+*9=a635*gT Nlaw"=9}aɾux^~ A}5 un7%~{Xjܢ 5M"jiޯ ^Nw@ %tEXtdate:create2011-12-15T16:40:56+09:00Zv)%tEXtdate:modify2011-12-15T16:40:56+09:00++tEXtSoftwareAdobe ImageReadyqe<IENDB`anki-2.0.20+dfsg/designer/icons/stock_group.png0000644000175000017500000001071311755052304021234 0ustar andreasandreasPNG  IHDR szz CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD pHYs  tIME  5 IDATXŗSǿoC;0̔ p]R.s*%$U{INB.&ǽ,J 4堋K$NysuEpwMo}>}}?Cd2! jaիA}!7TIE $/lT*8$0a?$yoo$D,l8haGdY|``ROrA46VVP(D׷CRY(m&2JzBP6 NL]̰3:z{ӈFE|H&I84M kcOoߜpTs\ݻ;d4ia8449$agRA6]au* u[Mn<\_4AcXVCgN:㸘88v,x<Jކ8f!"|>fHӶD\KSx?+l`u H@6LNLMMe—!JѿA)JF1;;ׯ#!_@[ +_!B [D?mޫi LkW㒪˗/…q|Y EQ022CRX_ ۶8,ˢ+хT*5T|g>AӴTzaa,..BQAVaff`ppT7"n޼e;wض ۶a8Jh/ CpPT4Łb{{333p]###;D ssso%wB:%-h{Xs˥"8.^gbaa7n@P!cccp׮]CRݙZBCH*>C(Iβ04.]#?J/xi$ V <Ͽ1 333h.F bsOv%?q<:JFqGrIVGp8וeҞ=Y"/ BD(J8*2CҞ"(PU|o0Mw08z)Wa:Tg*>}U߿{w р$IxK}G*B(d,Z*Oa4Ҟ!UB l/2NZתxIj?|,M P2M4, BEQDVi6Jd,렔U-o^|,;l6AQ8&zkǰl%h$ 0CItui9JmC7 ض @ִjq4/KO,MJ9xhZ(0 P9pRM7ƬiҹW"/I)˳!0 X6IN{t.=F4(+-c9(o~Qz+Йc A@(#'OD0ɲ|kp/ѭ1WHIENDB`anki-2.0.20+dfsg/designer/icons/text_super.png0000644000175000017500000000045511755052304021101 0ustar andreasandreasPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%B0Mb0k:΄ҍ@ W߿x] ĿXz # > ĬP6Dqc=bbM ^eP@ď *VFl,xOT faK Ulaׇd7PZ ݡ|'3#d;>ݑ@?_ XDIENDB`anki-2.0.20+dfsg/designer/icons/edit-find.png0000644000175000017500000000275011755052304020542 0ustar andreasandreasPNG  IHDR DsBITO pHYs B(xtEXtSoftwarewww.inkscape.org<PLTE """ )))   !!!,,,333888 '''***@@@+++;;;FFFdddttt&&&444QQQRRRiii(((+++:::EEElllqqqrrr}}}   !!!"""###$$$$%$$&&%'''((((()))***,,,----...3334#4#444555666777888: :::<%<<<=(=5.===AAACCCDDDEEEGGGHHHK2&KKKLLLQQQR, SSSUUUVB8VVVW2XXXY)Y/ YYY[[[\-\\\]]]^3 ^^^_/ bO>eH6eeef8hhhiiijjjm3n5nnnpF sssu8uuuxxxyyy~~~K!V:>`G`E`DBIJY+Qe>M`8u^d;f>w_mELoPvSUUuä|YtRNS &16=LLP\^q{VeCIDAT8c`YQH]SbTbP l$bI9csZ1Qд!F0[wg%XY$eu[!)RX=m;S۷Ts^>v䥛ݴ4qS.q@({ӛ7Lo>u.we<ɞɓg^2!98.>y’u3'Oc vkk[{ǤEi{#c##{͘r]M[7.RIPiazJni'mbBFj݉)yK$vo]R1aE)7y$20%)>9Wc^j(XP1ȕז4z)2dV>IIQ5 5QII=t~uUf΢'Ϝ;l ftܙ;,es}Ɩg{JCF3{㛷=\P"k6|N1(1ރ[+g20:=e ,rdNoQc>cS`z0Jeז`B??/1cԩLXIENDB`anki-2.0.20+dfsg/designer/icons/clock16.png0000644000175000017500000000611311755052304020136 0ustar andreasandreasPNG  IHDR7 %iCCPiccHǝwTTϽwz0tzRWQf "*QD)  EbE Q{@QldFJ|yy=gs{ߵ.$/?./ '{#~<s P +=KE$^o{4+/ 6'%<2YSS %(by1'.gEv3;8 v[="ޑ-q~6#"JqEVaf"+If"&C]E) \3IKnnkˠ{qrR9q iLY2EE6601PuoJEzg_f : !$E}k>4$ v999&\D\?xCw$0nt!dqys8|O.2./Qn+\j? Z$J'@5RTP"@b{ PFM.gA~*\,~dq?ǹYB~h@ *zX`; DU@l@%epC><AX Q H ҆ ! -!?(D V**Z:]B]h ~L  Cp" ]p9\ uxs@ QG HG6"HR ]H/r Efw( Q(/TDmD*QGQ-j MF+ vhot$:GmK!5at16/L&S9iŜ b1sX,Vku`X6[==qj8 .pMI<^ 5b|= ? B(!PNh!\"< $D[bKL,''^!ߑdH$WR IHE:B:OKzI&uNhHH~D~+A0`Klh)\/-,JrdI)SjT)9ittttU) [&OEq BѤRXz%CեzSoYYYKpղUgdGiMMKNІiT8r;ZnʽWwȷɿW++(QPxR4P RQ]ZX,,n/!/XiI˃w(VVۭ>ZX[mllmFTF qmb;;k; _S짖.,_:tu]F_вQGuGcc'M'SӤs1.f.|67v\ϻ!nnn2a<4<==f=3u>{,^[< >T$ۑ19xTw}W&9~Ⳅygέ=7w>̅ ݱ/F^ҕ/:pU1u\gm67lot .<{[n.}}hp𝑘;;SwSᄌ}o=R~T֣g image/svg+xml anki-2.0.20+dfsg/designer/icons/delete16.png0000644000175000017500000000607711755052304020316 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYsvv}ՂtIME  :pbIDAT(EkSiZDhBPqcH FShmMF h]:TEDHKƜëzqp8`>P` LԀwYpqt_=h ]IAALb^/?^P}zIߒh8)$- !A}K߷TJn `3K^!h/+|g5e FZ! >`y#eAP4[RUK?[iG2[GePxK6~̩K:?R>97&Xa$pVݕAW`+Sn4s^akM8 Mn`sz<1MIENDB`anki-2.0.20+dfsg/designer/icons/view-calendar-tasks.png0000644000175000017500000000265111755052304022543 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<&IDATxڽyLTW0jݱUTdfa@D@cFִ%ikI[?*Z7EEZтFKi1MYʪLoD:ɏ9gpnC s/Jiiǀ~}(B3%N)+܋묶WsKsZ96z6Dt +㱺r >_>?"/rMqr]u[} $vu ܷn!j+w m$iiiNW 4ŧfc :5±(|^Õ1sS/;tt0]|8 )祁 \ceH l1ISU< ?ciVV sh/\3:~)kEǾAp[x`j?EEHrǔ1<s'#5 ,y7XQa;l<5W[+#1'τٟ:<&]1;0i'e_Drh*"N& ̈&re,^x2qZ fҥȨ߅܆ldէc+ux`gv<5SoLDP_< 'ҟ+c?} %r&%O!τ; l偵6 \+w{`Jc&1 k31"b*\3Xwq-ϗ-;]!^:6[99o'# 80 ƃD, qe<Rߡ0 ^ =B 5=&>j|iG ŵ6(*dEb <ټ\3"sMzpCOJh τ9m' ϰ$4y~ȚJXN d}x+T!D CZMxOO0 p:P PM$ s%Eahx]]PYYTUUT]]]OF ,;Axܰ())C@/ FaSQQNLphreh4FRɀM8TWW7[(:Lq{Ϡ@{g#IENDB`anki-2.0.20+dfsg/designer/icons/addtag16.png0000644000175000017500000000616311755052304020274 0ustar andreasandreasPNG  IHDR7 CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD̿ pHYsvv}ՂtIME  !9IDAT(]ѻkSa9ib5JrTUQ;ToKq (CE hbX*u]j]D\,R(bN4<7]r"Xgkxk@^QZC<>$8ąQ mtLl;w>᤹Q6&Uqz!7bT(8-X@)rrEMQTKylG,oK:n3 YFCav~.^"9-XWJ\N%qTǚXC@l"*g40};i$uHs6ouviňQ9]Y70s]2CE#b)'K?kVpY) K@ҭpڋީʿYs-#/;v1|SM !{IENDB`anki-2.0.20+dfsg/designer/icons/kblogger.png0000644000175000017500000000302411755052304020466 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxLSW똛E( Z@` $`S\4Q4DX%YR"UQ?lq"SE)Bdm=;I@K>ys{ Wo t7LX\8ܽ{giږ]y9_innpLP7J? ::z޽{qqq\cRR*h.NLZZZl E$κ d'/b,44eǎ#L궧InGb]'Jn~ ˷Ģs!:Utvvjp0ѝm\[ __E~~~_rNԎ׿܁͇B3###Ί:ŀ'Tq+2N Ho<j4Fvv2\m {A̩zHo3s>2a ?*oװ߀p"I cVg/jzc(Ռ͚oSk <6h}|V$+hݍo&t6 "-؜$pEGFp̯oppp؀Yjkk.]M}ŀݩ?>{$rRA#krw/Ca#F$@MY  y†a|(ąOEm[avAjCGˤElff}nPdHHA ?!t5!Cr1iРVVV%QR*ǡ @IENDB`anki-2.0.20+dfsg/designer/icons/anki.png0000644000175000017500000000327011755052304017617 0ustar andreasandreasPNG  IHDR szzbKGD pHYs  tIME#5 SuEIDATXåoS33; t D*RCCjX@jԥ^۫U\􂭨D*l' m&'ɱgzIbHf4>:3s,ΝcvZjk677?Zc.4h^9_khɵkL[cccmgE8F)t;9|ߧT*Q,T*Bl|||ٗj  gɤpg/wqBhgϞ}}7qԅT*%bPP(m(vra4H)q]SJ} cL"BkJnOXZriׯ3771uqJ)p"HKǍu^/rGhYQ@ cJF~ZX){ܚQ5EOcQWjgʉVJ)l~5rZBZlawq /H$ 즄֚t:vI**Q¢?Ixh4$\)%B9!lfpplEM:B'PՐR7,NđHx,B)"-b7FnGGG_t s̙`_k'ouvĉ:u veA xEfxk܀`zzz+++N7"ygꐼix!Z7D\۫ *ou]_)#r $BPɓWoB7Sg\.cK+8POlQIs|dd׻c|>`6+p;,tpmj/kR'ۺ.//@+ `\.ł.h6foU[q,GM`lu|/P ?~<*aeQ]/߻G.Ck$SSS$ < 2J%}ʃ(˲ZS.y%eUn޼Y\Ŷm< l ZfsBSc)c 8E K%9';O{IENDB`anki-2.0.20+dfsg/designer/icons/fileclose.png0000644000175000017500000000307211755052304020642 0ustar andreasandreasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?@bb`@,0###AQ @XzP>8!`zseb`e?߿ 5:!^-R8dc2945޼{c3\zׯ Imӧ~@j=(A2:1 Zc֯?Ȱm.ϟ?,EG3.`s@au@1 P==eӧfZp`hٳ/; 0 @CVVY) ˖mgػw(}s> ; eCP+1$&3q3|fà(`eeȠPj6  &,=羾. <<… ::a/^S&Tq?2y1I`hl'@@=PQQa' z JJR`R <> ܜꘘr@ r! 5~cyy 0 ""Wgc0 ( 8:xx@ 05ĂIA.}uP 72Re03cX[32{ n85aDTԌd@AJDD3#d`v#1  1amd"r>'b1@ x Lq6IENDB`anki-2.0.20+dfsg/designer/icons/media-record.png0000644000175000017500000000346311755052304021234 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڝW_LW?Z( Qcff}nxh@md,DA!d-Y!d#,Af(MH4ۤ56Ahrqozrw{ι{%jJss=X,{ /.c0#GWwEMMM.SJ&x)q#z:pQKhllLat,--"B!UDPl())RRRPA":DN;v,jN_XtEjbMǏW$P__6]fy*))͛7Sff2+Q@c!{TE299Iĉ/$pIX> p(V^ i͚5da)(, H~z*MMMQFFR?Gk'{oݺmFPRI@<Cy"+X!xA|( pL뢢"ھ};j\D /H0 Yxc ]xp=6s5m޽pnZ#1mmm*#Du`DΝ;)?? H`<,J70L`[ά;k׮SPgQ:Gff֛d<c# ]oqg9A-[PVVn,:|_CA^O /P'|4 r_xVKxTP2w @'Nd,BmL& bX(ي6^k億(o:ڰa&A- DǨ̀CY P.;#ڴiN .q".$( ! ؿQ"D3]I$`zsݺu.Cz)38LR9hǢ̇Ba ")BBt"6MN0ԣW') VĀU\c9"1Ă6D+tLA},k/G-%*]< ?HOOb'?垇d2?"X*XIJaF?wX":O@ȣGAm*xr%n/28p8[۽;(ӏue߿Pmp+ d:, s;x 5eTѮt}<0`[A_G =호#Nʮ"3" |8a%( ===BZR-qcX.ַ*01G8'"{U>~_aDTDz?5``>|hsdDRN188/LB}}}$oƱOJͤ Ȫ*ܔP%zpJO8;1,^x´*-gɇ2XŻw零2DO8F[wW|TVVr%yaGvSNNegg+Iz)ѽ{9%eNf0f\;ӏkY-}`iz)΄*1/8M,C򺋛{X˞܇K J/]!0FIENDB`anki-2.0.20+dfsg/designer/icons/go-jump-today.png0000644000175000017500000000264011755052304021371 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxWoTEfܻwwZ`LDijB$6 5ĉHe8/`n7~(6 ֈ'uIDOA xSqLOO#=чQcHHblV qa\ KN"rgfVscez<@A@OO8{jϾ݀i"n'O"L@%DT"y2̠'S'3(a = LG:(69^MB\ST6"TT 8G^)~xFoX-เgx09\x5WEUńm $K< fR9cZ$RGZHY+zך3XgCJ7%EF Q~"]ɔI "2 BHhp@A6q' KGzy¿۳WGPڈ'%"R\Qmcv @ĦJ4#/(9^U3v3 U7B΃C;A}0s7/j/\Źҝ 2smSg Z .wZ\06T>Box+7=pT@6c||\ZSQ[]Rtj\-@ֆqkkWә%(g-}rATڷqٜ qp=sg7u^j\n/a$NY868'pֈ; Sb;]_xa7'>2h( À,0=_l̂[tQbv#B^7pb| vOMT mS/:U@&%GbջT3J cWb3|S4O![W"*cr"O:ع!|n`M@Jj/cϖz|YWC,k[0;%Z]>SXm+j q{WԠX,f#pƀ{^tvv (8;;{U>!#ˁ~+_o_H$.\=QPJڵk;U~p}oS'q,8-3 IENDB`anki-2.0.20+dfsg/designer/icons/arrow-down.png0000644000175000017500000000175611755052304021003 0ustar andreasandreasPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<kIDATxkUƟs&iS )ExOHۛ"6BlIAŏ@Y&M;33g9z2g[fIp 4Y9\w4Kaڑ:dQ*9ط#QFً2Oe^8+q(getzʕ+^0c,g'MC~jS3o=<@UЅ]p^ yp=\s@E\>4MnǃE'&"t& C?zHS1HZ x~BMA~:fBJ磗F* sF+F'Y" :fζ5;6rEeh/%TdJtPVUp=C1yM[+6&;/F,c9p=Jx_(!0oеg`m(5|F*x B fHdp Y,]15NEJ^&2!snC4LGcyV1%Ux %Q:i?{:[&"xWaď)|(x@3m~awA]ňქ;c=\ϨccCYQDtgIENDB`anki-2.0.20+dfsg/designer/icons/edit-find 2.png0000644000175000017500000000313711755052304020664 0ustar andreasandreasPNG  IHDR szz&IDATxVYLTgFVPYgf}o0ðZW(-j["uTmjmҤOKCj]7ԴE[ܹs; bu %xW* ~¨&N޹+ؽi3I^&瑩`xx"@[`aB.B@a_k5ϧ%%AQlEl,aaP(g lV+$P*P?w"!ua*H%׷EBB-z`"2,G2;`6t8iw@&!|۴4 $Ȉ/s:7lD{[st8~G`ۂ ۉR4ÝlFa^n"1 l6<**""zFNj\tzd9hjlĖ>y ْ)2~UeՃK1o7p1 l0vը5-f4X 7I0-Гطg/.;+_F~~ϔKQ?8>U,S2DORB ȭQkaQW'pYTσs U܂::1xBCC/=C,vn pwWgVlb?4*5 ij"29pr{I˖VnCT?\" #yp9!Daa)|J`ܸqo ?5b|\<"##Ke8%*b& QD-H2 rW6lEn݊ヌWzں_~&d0̏҂\s!#p0S`C´;fTUIMIhf?w|^zE.5im Form 0 0 335 282 Form 0 Front Preview 0 Back Preview 0 anki-2.0.20+dfsg/runanki0000755000175000017500000000013512065021341014636 0ustar andreasandreas#!/usr/bin/env python import sys sys.path.insert(0, "/usr/share/anki") import aqt aqt.run() anki-2.0.20+dfsg/LICENSE0000644000175000017500000010550712065000223014253 0ustar andreasandreasAnki is licensed under the GNU Affero General Public License 3. A full copy of the license is included below. You are free to make changes to Anki and distribute those changes under the terms of the AGPL listed below. If you would like to contribute changes back to the official distribution, I ask that you license your code under the BSD three-clause (no advertising) license, as portions of this code are also used in the closed-source AnkiWeb. * Please see LICENSE.logo for the copyright and license of Anki's logo. * The translations are under BSD copyright, as mandated by Launchpad. * The icons are under a mix of GPL and more liberal licenses; most were taken from standard icons installed on a Linux system. * The anki/template/ folder is based off pystache, and a separate license is included within. * The Javascript files in js.py are subject to their respective licenses. * The SuperMemo importer was user-contributed and is GPL3 licensed. * Some third-party packages are distributed in the thirdparty/ folder. Please see the README file in that folder for more information. The AGPL3 license follows. GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . anki-2.0.20+dfsg/anki.bat0000755000175000017500000000005012065030727014662 0ustar andreasandreascd /d %~dp0 python runanki rem pause anki-2.0.20+dfsg/Makefile0000644000175000017500000000225612251230110014700 0ustar andreasandreasPREFIX=/usr all: @echo "You can run Anki with ./runanki" @echo "If you wish to install it system wide, type 'sudo make install'" @echo "Uninstall with 'sudo make uninstall'" install: rm -rf ${DESTDIR}${PREFIX}/share/anki mkdir -p ${DESTDIR}${PREFIX}/share/anki cp -av * ${DESTDIR}${PREFIX}/share/anki/ cd ${DESTDIR}${PREFIX}/share/anki && (\ mv runanki ${DESTDIR}${PREFIX}/local/bin/anki;\ test -d ${DESTDIR}${PREFIX}/share/pixmaps &&\ mv anki.xpm anki.png ${DESTDIR}${PREFIX}/share/pixmaps/;\ mv anki.desktop ${DESTDIR}${PREFIX}/share/applications;\ mv anki.1 ${DESTDIR}${PREFIX}/share/man/man1/) xdg-mime install anki.xml --novendor xdg-mime default anki.desktop application/x-anki xdg-mime default anki.desktop application/x-apkg @echo @echo "Install complete." uninstall: rm -rf ${DESTDIR}${PREFIX}/share/anki rm -rf ${DESTDIR}${PREFIX}/local/bin/anki rm -rf ${DESTDIR}${PREFIX}/share/pixmaps/anki.xpm rm -rf ${DESTDIR}${PREFIX}/share/pixmaps/anki.png rm -rf ${DESTDIR}${PREFIX}/share/applications/anki.desktop rm -rf ${DESTDIR}${PREFIX}/share/man/man1/anki.1 -xdg-mime uninstall ${DESTDIR}${PREFIX}/share/mime/packages/anki.xml @echo @echo "Uninstall complete." anki-2.0.20+dfsg/anki.10000644000175000017500000000424411755052304014262 0ustar andreasandreas.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH ANKI 1 "August 11, 2007" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME anki \- flexible, intelligent flashcard program .SH DESCRIPTION \fBAnki\fP is a program designed to help you remember facts (such as words and phrases in a foreign language) as easily, quickly and efficiently as possible. To do this, it tracks how well you remember each fact, and uses that information to optimally schedule review times. With a minimal amount of effort, you can greatly increase the amount of material you remember, making study more productive, and more fun. Anki is based on a theory called \fIspaced repetition\fP. In simple terms, it means that each time you review some material, you should wait longer than last time before reviewing it again. This maximizes the time spent studying difficult material and minimizes the time spent reviewing things you already know. The concept is simple, but the vast majority of memory trainers and flashcard programs out there either avoid the concept all together, or implement inflexible and suboptimal methods that were originally designed for pen and paper. .SH OPTIONS .B \-b ~/.anki Use ~/.anki instead of ~/Anki as Anki's base folder .B \-p ProfileName Load a specific profile .B \-l Start the program in a specific language (de=German, en=English, etc) .SH SEE ALSO Anki home page: .SH AUTHOR Anki was written by Damien Elmes . .PP This manual page was written by Nicholas Breen , for the Debian project (but may be used by others), and has been updated for Anki 2 by Damien Elmes. anki-2.0.20+dfsg/anki.png0000644000175000017500000010344311755052304014707 0ustar andreasandreasPNG  IHDR^ pHYs  "iCCPPhotoshop ICC profilexڭYy4Uo۾> 8cy2X,A0}U@ 7%W ~Dјa@M>FpB i9@t(NؿiդƿzuD|l4m ?5$H2fHnxo:eo`9x OO$DyY80#h rx+_^JoSp pufӘtuδF:y2ܽ@Y; lL `P !*a3Df`R'Vx/NR0 TD1SsL1s 0?{}M]!>_oHg04OkNj.c `O%(pqݸN\ TU\3׎k~O ! !L(/7ʥ¥  h["C%!"o&ic%fb@1QPt03Ì1]_w@&$BC&İBYVc0#YT5F_?G{@ H`1$o)o8]BO`&0<7P@$A@Al`-'FC8 vB&A8EPp h6[pCx0S0`A"‰#"""ڈb N;"aI@R $CH-riA:dy!gdšdJ *@QO4 CtDQt N'Sp.8\(ۆ*pV\7n7?F1cX ۇaF6a32/W0|>__?ďA"A`O#DJ kkW"(BT%]4"I\|wE= M Š)G8̔* QʥUP]pb~UTUO5BTu@ fPP{NVPOT?>!ᤑѤq*UVuZՌ֬|ŧV+]U볶6]X{h5jW7Q 93˯묻GKwIO_W7/_؀bj!paO#=#OQukׄZDƄfrdԔjhZn:j&mF30{e.kl^mB"GKMKeVFViV׬qv}6|6^6E6/lellOmfw?dAP0VmdG"WN*NLVgyau\sWE8+n7WbZ<'.pB} r* [яҧ̓'CLBBޅN 7 /(,UC ia176KnN<;gw$nȬGYV,7A)awXibq$喇ɼɌ-*[nybrr++U:ugXEډmȶm]e>nǩ;vKLKѺKb׎]w>ɕ|xOYշwc{h,ﻳ_kܾz$d|tЩ<޼ׇ7St@(фN*}S,sv9/:_~}-"?N4=3n!iXԺ<Kchh(N?\~/7Lpڸ O#(fͤ}laf2'7GWO߈,$,tX^WtB$IJ*/)c*"(XtA*^ޱUkhNn>ʐeTiܻ) ŖێdbajKA[MNwpO`yy{'lXvC}@M'heAU! a-##_DUc^Y! щqI[Zښ6\b 4vf1ͲkW'ACȟ.&%w0g~Z8.{\|-5P^xryUS^+Җz, vzoOC/|$籣o6S1s/Z_O}[cmiQc [^>b  R!j F" H"R!P6T ]W8*wC0sl+v +iRS0PHxJ k$cR"[ *^=dCN.aBnQr%C|()Ő2,,(*.$L>'/(F#.i,]25AZOz^9WyjE2[vգjW Z|ա]:M렧/k `a7Fր jJ44Ǜ[X[=~`cenкӀغd7Ywc/8||e׻lpaD mSP qoS؞𮈥(f|Y\s%؟d+!6}ǭt-Yf{{ޡD=^4QBřgO5uWܓ /n<׼5M}j}guzwS$gߍNM~(#sUvXnJ"UY_C5NzkM>-GCt5ŒM$\45(nmd'baqSO^||m VBgN >2"}L4cl\ܗ$|bZȖ[d=ܱ']?=Yٛr>O? ||#YG BKefO+XU\'kj,NK;#yZCy .y_^jjqlv%n}HS;>xhxI3K/_~zx|ۉ ĔtÇOԙ5Vs~e~?Y?ΛW/p./Z^Y,_XZڲԵ4,찜\ܻcEnueJ @|jm@Ȗ++s [[[sVs97Y)ŧ?i>V~$r >y#-];'>'БHPhr3`o|o[[[GAJ`0@JI$ C$3::u|?/}mmmCƘ:/MS~~7Mb$ϧ3CTđ`<$v=Ͼ6C6:)FecW2)$IsځN7~7Ր+_?sFQ%25o~{!DymeyYkqΑ)'N8[`sy߁DvDbƝ%Fn\}w="̘1)qdt3(pDQG?Qvvv}z=!B8f<)Yͽ7z5~z=>~| _Ox\Sכ?[F{)ee\mk;NqgC=z~cѽoy nf9tDQDGqdH#NWw7ylˡED,F6\~)%B,yWz~,˪n%MӅcp8~o{gfY+pﺈ\d+<B竫q|L #9ȱVIIn Y;fOqg7o߾̃gx n;GBCXs哟$??)8Zzoֽ~<گ/~n yYϙ9)euclllTx %׆:Jq2"QXzDP߹7_1qE/ivXk9{,'yӛTRSA{ckkU7__w -rrngt-E }+siiH;DuF<euh2"#.܀ǯibw4EQy|gcc}(n{(1^vwwoẀRl{E_oþ!>h,mg]huGQ@.Jxn26tLjsVywr~O:ʰ+<5;]0XcG:pV[>O1T {G]E "~ܱ76o\g؇ċ•y> u:c1,7VW#"GJ#tśWx>2DC m::T?0HӔ^^e~3T U00F|/a1AVEaBB2 XIpƺr\#:<9Ž“:b^>O3t:VJ1I2yzs 7~7aEEhE)EqCȪ(*>Gfa!\`H-OsFQ婝svv(m'XoAx[e ێyxsHdf&qdFc[s;%(Q((E.cطkSrİ?HxҀf5iV(??F=.Z3Emλwk~hȹ.JJK)QJռA"7X42#x3"8>r;|\IL#el5)h\Z0i(!H+ČH/ !F$dց+xM&c1 ~_mw#1VWW+߽ڲ~ www7׀>ē!amD{y>v V[ɸ&7(:42k na/|ų΋<; r1v'\ 9#1z=1$38Llw/"{{{dYVp{WBO(":^& c[`kv }^8 D :؀!% U#>OH?O1[H40AG7`>wޅ:f04^}ooK/$ +++lllLߧ뱲B߯8ڿ1Sx'_tZ;›)޶mxR.,+JӔ~sS$ *̪:\+FunuF> Kk 1_{DYr95"ydA|XV<7Y%7s|೟+Uӕ+Wr PT xY]]ĉlllT8o>+aTIA[zx0F|gZH^̾h8R!lHp@y GD D!ƌwq ?{yrq n&E<\q? MIynؿy/677#m~ ﳵ/\R3gΰ 7{g)[1k3YF1Kǭ,إs` E幨y)%Y@Z Sz?|*"Z{(3BYqĒ@~_駟w3o^Y/ v/h ^"4c.9 sps' d:# ݮvqDA_N),1ӊ㘍 /ۿۼ dYV|yBE>l_x {'d`e8իW+Oɓ'9y$z=8 `7 o;;;\r{g}K.qMvwwEY>5zH5y~&ܳjog}}}fT w)@` d˗ vS?`0& __YY;\z՞twM:zksR3 `e}._\UN>ͩS*t*.ϾZ g5gZх@H7eTV}|jؤpG7NH7?cߴĉNeXRP'>>~ *9A.$ Pn\2 9ccc󬮮/Fy"^NapM]t =(YԐl^1xѳ7=vwwy*MΝ̙3Vi&?RcHtHo[PgB^ ԍڹ !(BXg}gR$""uvXSK|) "V.??:_߯OU:<4siΝ;ٳg9uyW •6+\0A{)ߩS8{,묭MUό|#G5Nqbbčfl+Ye̚ !6?9#G$,E).QҲk:37Y.7bDơpƳC.\|r|2={ӧOs n ﶳSzQ=x;KULmzc C]O?Mǜ>}5Ξ=ɓ'+ßC3sq<=DoXXsDH8t BB>@b>4abhrX .[+y<#( DGþŷ//s͚t:5{qQ81qc`ܳ aȴ%8{'OBx`CJɓO> Nܹs>} )Qrm08xV(l0)8}n.8"3dTj\Wd]b̏tb)",0Ou:ss|0Xf>y! w)2PR*7pu\SO=^ロ5666lnd N0@Q vU;W駆7)N̶Fї.Ǭs1(r)cਹУ9\X@a ~?c a[iToP^C 5{{{qe(bmm;n jxtB9i/`ej-b 'BڴmaGTp-ջF|ڵk<裬psΞ=K׫؊}V#`Cue>EZ.2Z[@y}%qm04Zk677y&O?4^(~YVWWc #mbT1 OgTIM NԍP,EK\BE,Ds\au;uv+,ug (|DYn[4H\myy@g2}Kc#p+&ʝ#%ylbȒb: ی̘x)R J:dK$΁s"^G4ܪjE| kc 7odkk^x;9q.\`ơbo*໗UybWBA`k<BШˠ0|t"86]}9',R,NYJ@)oIopYs)!x<`ŋYZZ{%qQ2+5XPbeFJomB CIj4#Z˟/FB_pB?40\"8ȸ8T5Zk/X^z&YWyi*C`H0Sɷrnmwv9x)঍)F;ʁ>ۙ`gg]VJb8J\ 8u֗jBɇDDD&Azf1 9nڰ*Z Xh*qiɫ4ju2SLc^5yq[ҍ9prùU1d$(*"I 7 { '-t*Jq Ρ 8` CDCaQ 7kT*e5Rt_$^F Rx=x֣}S4S[XJY|*@+P5a@sr2)µ^9qemKpOSb@;\6@" Bsc%Fj ~)#X G-,X0ig r2#KTu|g pX8Dx7B^ZGY[[o?BZ^faQj,[{'zHK$%*TY^9 jGpz;7gK/JmYm]GJEY<0"KMr >02HA."8'ၜgb'|O9a!ge,OٳS J;FX 'Y2u)N[E?m@5tR{yVV;F/#L4))WݸU LTZZI1e)R8-N$Ѡ j=DZ (4lz[ìq Սjv.f2Ʀ*CiˢAGĊ+ST cgN. ]gזs 0c,hCܷ)em% !ƍFc@eNA h3Pt$ڕa1)pJVgDz&x7G g!/Jor'?msIQ\ H+\jI(n r kYqs/:E<_r_sz 'z,=7fO;JDմ$),C%(e%|@memiS) Ps"-Gea((aZI6{twϽ'Uk.Mo*YUwwwY__*! n! b 坬I|(ە?e sz,XSUI,ADln^g8bK\A CfsrT("#SӆL8%̴6gzߣ$(Kv {z^~KKK|C҇ ,YT*_Jq8QBN05abG 'SFVo\ZJÚY،ɅũH$IĺEFO C4W-&`A;lt9Gyo,vww&J)y[ i -9rxf!d)f"MH]tq-ι0$qBn8PȤ󜭱6 8˸qMM"c{( :g|M7 tbB(?ȢAOBVi9^9gϞs_ب vh}8WȵïgmV0B^-FRT%K"@sYyv7 +wtq#EDDH)NL,1w )+bCynU{dqxocX^^]z ;1v >lh0DDlQla1rDʑ QDAWKlֲ%BΊ 6RUsᱫb-F7u}ù-Aw#,Adѭ$ ~mڣB{qb'/C?:jeߝg>g#}g4tԧ>Ň?*6Ov sxMA]u,da<)x..FtæA璍~VI˨$H:!egK%?9-GuŰo{pvpaMqaYUnD]0s%NZP Nb'ebo 8j}<0;D`*Ty ,//C}{,O$_v.IGNt`MʈE[zofM6&H"1\prc9D?]r$N+t k4Ί#RCiYZ=*k<gfN ??_y}vYX/*2 ^:RlpF!U3U3s!;?3no'k(Í>E睯7O$Qamibew^͸7涵.׻l$YCf5N :+qg"#33q R;kRjx<&I~>rYN81eG5ޅ؈:CsD"GItEPfpA.|LlqU P&@Jpo`rieQ2 v,/ nqj+ =EGrvڕ<駧 pys&:a*7ĞwO|uJ'Hb4ꯚ#VChZ"4O<^'m45ਏ A>U )c5ߚU% qyPybq&'! 6Jɝ⩭1qj+}n_H#" r(Er;qe,1p,ӧyyGx] l>3)%wy'ЇЇ>w] o_d{7 SkHqf5Pb0$@8x܃Wnt%wiɁIY{$߽ߟ뢽S*]cЪNJD.&#Tpm-KyBK .]tOtŲ9*2mnhgq)IFڲ; 4#.8]߳8m0{X:d P׈xQ7FyG?QwuMfZW%(}Y|^0'P(h7.gǮئIGLv:Jƽ6 Fu,Z[bHL+槪=O\t *lMDe N VQ'/¦}.u8X w+$ƚ"!]ױz,//~Oecn6x>p~ܕauKmP ފI"mw?Bƕ}1(IңE JaQ[FokBNFZGV)]--8 '2yQ4hpu\{u6Ve ,Y VDc;uOuD +5,krހW KAkwy'>ƅ jlE 4 VG|nQܰLpD\w.|/g/\vk, +2C'M+*GL<)ɜ^]F9N6Լ5lሂ1 $ȋd2yYP(Y1!h{Z2m[Sz)뽔4s3^ '1n7O}~vP VKI^={?y קYg"^ǹ!>ri'LPPV̧-5  5c=vu6+Sً͉6%V_ 9ig7ۆh]qN+柃kBzE DK#ևS:ш`@$z=1Yt*mX~xYYYdRWvoѰC ["g It"q$|n}FN,6Е0}7:hGCVMχ|u-Ff &usn]d#1F. vZrfû y7oJC<+C .?|#a}}}&t-i'%E1TAkJ w #+g/+{\w}\=c,Ŏש\zgz09/,xܩaNZM\=w~}kS|f*iR%ƒ E/۲oq>?Ӝ9sl, auOa>@# .2c$)As -#Ϟɡb<*d\u&BjF Wәz1 R ENg!0J4w 1Վ*ڇO͉QV*U\!\Nn,,b8iVJJ4||3<&\O6EXvd2^d=ZK_{*Kxu:= :QL$6S Q\K]{^@ cEhŸJ'+4L+矟las&-wRJpwIoyyh}s}陼fzaO7=kၝLatҋX@:kžňI#VCrGҍSlM$ʘ[RU vx3:4rɁwZrHs" $x;9}4??OOT̂7Z‚ɰ9$bEK007-߼S\>F0$J DFBHb0bdQ29QyPM%<#Paiؚw O]'<;êZ<8.wq=:gӲ!dQWguO۫a=E> ??V Ml;k\eqweYF(p DX!##cRXG.,7:U a|歷VmzfIhtNԼ:< [".+$# p-uXSuTSY~_y[x6wu4Mn|G6T]ZF8.FH "-mԕ\-*"DNWsj ɚlg`G߲2#fUb_5XlȖc,3uMJ{P  ʕS-D n;WSug*cG?ʯrI1i\WуHƠlvȐŖnIRq-o_|kk6YYYa0O|Us\5BkvHo_yqגILL_ f9Fʰ |D QUL]Pg:iִpv&s8?;hޙ=,T^Q ]RT.17MS;ɟɚoaqB[ EeiXlq/:~CT$CVټ\($*"K&X$JϦ&"&-:%@ܸrb B17S/5Y$ 1dM+Uˎ#f{F 8%9oL\VR/j^ф]%3Ko֚~χ>!N8ql5#&eNb\@F$IF~~1O^$l2s"E(ZSE͕$Q''sD#8ijЀ L@*t /t7T]Ŗ3Y1wTM 4v[ig mC懹*3pi>яV88:k6B*).Gcp*fOD<#717\,cDF1RIiI frҹ-=DϭG̲5%[{TŻrNn/ePbTCLiE=%gk<C#oJ)j2o}ԇE Q!wed] cbx%vyn1]"աgD5J(ݲ(#%&D96wySs=cO0vz΄9mUtSzηRklcF^J͛78=DFܿ N"jUc;&uJַY,T!¶ Q{13S\T @Nգ([`BςFlhB?oYGs7_ܲ,c}}7S}3oaG<(:kUr?F+}N-uѣMȰΡ"A:R {b%(3B15URG+̆$W%IQ'j=QKpռV\ dharQ#G9S߳օ+Ͽ<;wDs`cu~ѷ}^VWWbp4V8e8 3EtE&.p"s=='8(bbr #ELz8VEbd9dʘ>/RP.Yde "0:/i56#vUЈ &s7.!QqCJcϕյQ:x' H29|{x}ַE)I￿ }qAkD fEZT;V,E22Z)Ҳ \[$ЉUIBΗlϸE"nB4 0|,8Vϖf\esϒbM<8?&^:oCy_ἱкCyϽg}sQEQ.+կ7=F}>;ΒR  :l $QtT[M8ƒjyg  DD=$v=߂x\Ѳ:;IW  ^XΔ)N$DN _;'j|nOٟ!3֚J(fo (|l^F&3!B&EgDSs iz/8WJ>W\fccjqm0gɭ-JĽ [HH1VD=a-Tl4dh' @G:[ngCHA:$z=ǭ`󰡀 6񞲪4a} ν H=ġjxs&iOp9#!6 oj ܱjl=P߿71` GW^e8r]w\JGّ2T`BLTdE1Yk BĐs]|v'z,EE7ͱqdV(P+Ko,l Aʹv[*k`RUgצ&v09U H]ٵ絅Dl? ciB gqկ~:N SiBت z顔(z cK/.?q#ksDž>oj.m x*YSI]I @u&)*n_ᇜ|u.mZ׺`':;CQ/ܐ/^|(m!fӔ.USu }TͯYTwôq8MJŋFvm3l zEDTR^ R袒IV֊**GB9:p'g#M1: mɈdLB77#rS!r}c w'ux*Q3rRTTE3Z.=};AlӮ)(JTɂLQq䈕CbW$ `L9\)5vrU&*y\ꞮG40!SVaԤfy&8Y~<֣y:т[xxn?4yy';v8F R!vra=+qx'$qcjkA P2"euE%n6J助G-qk:t Mkśx\Ҡ*Lμ&m saqU+N~.\Q>8fss~F#nv~V |5$ J} n))$.]bmms!?5dx#֔TE4JZPHpnX|8Z;EHIqe JFO75(r W劚BL[g\ҵKՌdݪ^"H|v021D/LWvC8(3_?9/_gooSN\x5|sh-1LH2Y̨؜3])֗@`rX֕^!W8PSr͠[8ߵ3Va74tZ?3i U 5a!* ZUv@a>:xӐCqZ^y}Q{9$̙35L"^ȡjVD =D|rAuuYfu2Aˑ ˒7JN'3Z0)Jx͐Y*NIEf{8ּ[RzydvA^+e]/e z{!,5"RI\f ҂('vXgZ5˻xd'|w?ҥK<<裤iJC]?|q:1W"VR*!C%cdNu3 x3K8a:d &*k5 \; SŤ`V<â>ޙ6Ya7?&T˗/o}^z 5KKKr^<j0tB)%P:Yܾ)eCDh3bƪCjC AmŜ,<$ 0!/D6mB*X !MOhZy fwnBpcB,#%:iZ RhT?h4b}}^z.a6PYC$,p#V1Z&傑X$fnEoҶEYbrmz"p9 gPp Cmr&Jڔo4Xf !/|dgJ)<jdmE裏կ~+WrZWwY}'[vH)mыY (fh](:aA5QtEaܓmȐS%?M dOyn<$l0beym~k0j Vn޸=>x74h)%> =x;8u?tX8D) ([rgO\ޘt4p-k~p7b?(",d/^&.]""VWWhSޥf'>& 8W,%8ʗhU8Lc5˛\}{&LUqZtP7@SmALCC=Ņcg}Qǵ~8y7Lwvv~׿ux 1kkk,--X`s` #hIqBr}^j(!xZT !$1Ι<IJ/ݬخrjOxol k[w:>oy衇ͳ$E> ay\zVRzϞ//0KQa&Q FS`kECyMHulv>\ymöM ]Eg쯝|qfM1W-Jc~gwSANz= 1K s } rs&E2.7i{ 4)UiAv(ÿ ~Wq́'͆ݍ6]^T46ss ;moAyy$Q(CnRJ|ueW\'_*/^$sVVVjY0I)1q fvLr0^*E1I1A9Ȱ5߬ f5.i4rSFAL`ΐN5K\M,S2O<ۼA޶ML+g|CxL_9wo}[y{=P +ܲ=>}5)L,gW8rq[#!<զwpRAPcWZeT(Av 4.t-9Z*tXd5ouE |I~i .wlllT/e3cIlltY YI݀ۺK^^%lфoj^}};Wc=T<؜mo{t8L 7Oqz-rS7)xK/c=׾5^~esKAF+ОQVȴ\9'y׾ֳEi6vA[)WLjf6Q;fRHٙp=:2ĩQ=dz g%Ppf,ЅIQK`E}˞ tY!103=U=(Kj=9an,Dz׻'>["M<#\)/KZZ}pMAيMC!J͸À9/ou)nb:V,`$;h9~?PGf^4Iq\V珽4S)UFo<<?c.^?A>ZCy1 j$Brܶ0\sj@=l2`ۅɇZ& 2aas@}&ݤ+"l62'x?oE+/jl3a8^\U)uh,#I$(_|h>1N<9[/աX_D]LˇR@sD# BHNԓ9 |p1<ۘ5> [/r^x+\aw\ÜdYV%;֌F 'IW|SsXѹ:˃XBRV}6}BJWbGwt ,յFe3ŮtN8Ag0z?nu6A޽IZ$qzC}ROOy]x'ΐzw%Wy8); Eo-iA ˸H`x;Җх{zydX $НX$ԡW. fvY'#_xޢzy_:ԗqXMwf{1kzgR@ $cbe04 cRDJґбTHLLbbbēpQu02kpI֊4ϼ@z&EMPWx$իKq P`Rմi2 `ΡJKAd?}Zc2F4v*1lM\Ch;pXkX]ZjSӦR@OWtYR!,A~y>_)>_PJUTq}8 w|eYVsBpR> 2Dmrwv53cn~v}Kʲ/!q,9n"޸l9!4(KđU?9D$GCk[׷s=<dYvs\ã=gl_R4D!+ױg\t&crb$Q-`kYjz7 T0ɛ)AVQ)BXqj%ErK" D ccz{O#k }Aڇ =uJJUNYqeώ⹏>ZkEk]9#`ɚ%tneV-tl33F KE%ghT$ȣ.\ӓ7lpdB*9."fC㡇ҫGx}"e0a=k-[[[U{\$V(Yp.(r3a}84d%J)e>!Ա|_*VN : s]v˰,- ǰonnw~~JK駟8!xGQ-Cj{{5N 8UD: =ˢZYb 1vr.d5Ta)H%XwXGMA(AfZsblq +ܳ.XPQ<n-'N;GW^xg;.|PC wa]FѱzTA,D1w2<[܁נ)i2ص9~j<䪀HRD8Ipv:x/T-RatmK&sxa e1Ѓ>s{Ba02H " ڈr%T\1e9;E!e(A;v%dhge-+䈲My$ _җ`0 M: | 02 Xˆc*#RZ qx?./.g.8[ BJзF8Wŀ~~M[V\RMt:f e:M9ԽZH),ۤHH`p 3OX0T)Ҭ #OԠ֚=ά(EJKy8t&9R*y677yꩧ tݪQ Mv4> ;UA56%p+xB ]ܘ^d1u".lcj*ax!n;v8.<v< .]ƍ9uT31XkVVS)',5MɏbΟ??cRYƒ]gh҃j18MgŌ#5է ]#5Xs~Ir}c*H‚-z&".]bgg|w&KKKlllpmO??>ݿwҥKlnnp84{5>x}@Un'NnWW_oX) #IENDB`anki-2.0.20+dfsg/anki/0000755000175000017500000000000012256150141014167 5ustar andreasandreasanki-2.0.20+dfsg/anki/models.py0000644000175000017500000004447212227223667016053 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import copy, re from anki.utils import intTime, joinFields, splitFields, ids2str,\ checksum, json from anki.lang import _ from anki.consts import * from anki.hooks import runHook import time # Models ########################################################################## # - careful not to add any lists/dicts/etc here, as they aren't deep copied defaultModel = { 'sortf': 0, 'did': 1, 'latexPre': """\ \\documentclass[12pt]{article} \\special{papersize=3in,5in} \\usepackage[utf8]{inputenc} \\usepackage{amssymb,amsmath} \\pagestyle{empty} \\setlength{\\parindent}{0in} \\begin{document} """, 'latexPost': "\\end{document}", 'mod': 0, 'usn': 0, 'vers': [], # FIXME: remove when other clients have caught up 'type': MODEL_STD, 'css': """\ .card { font-family: arial; font-size: 20px; text-align: center; color: black; background-color: white; } """ } defaultField = { 'name': "", 'ord': None, 'sticky': False, # the following alter editing, and are used as defaults for the # template wizard 'rtl': False, 'font': "Arial", 'size': 20, # reserved for future use 'media': [], } defaultTemplate = { 'name': "", 'ord': None, 'qfmt': "", 'afmt': "", 'did': None, 'bqfmt': "", 'bafmt': "", # we don't define these so that we pick up system font size until set #'bfont': "Arial", #'bsize': 12, } class ModelManager(object): # Saving/loading registry ############################################################# def __init__(self, col): self.col = col def load(self, json_): "Load registry from JSON." self.changed = False self.models = json.loads(json_) def save(self, m=None, templates=False): "Mark M modified if provided, and schedule registry flush." if m and m['id']: m['mod'] = intTime() m['usn'] = self.col.usn() self._updateRequired(m) if templates: self._syncTemplates(m) self.changed = True runHook("newModel") def flush(self): "Flush the registry if any models were changed." if self.changed: self.col.db.execute("update col set models = ?", json.dumps(self.models)) self.changed = False # Retrieving and creating models ############################################################# def current(self, forDeck=True): "Get current model." m = self.get(self.col.decks.current().get('mid')) if not forDeck or not m: m = self.get(self.col.conf['curModel']) return m or self.models.values()[0] def setCurrent(self, m): self.col.conf['curModel'] = m['id'] self.col.setMod() def get(self, id): "Get model with ID, or None." id = str(id) if id in self.models: return self.models[id] def all(self): "Get all models." return self.models.values() def allNames(self): return [m['name'] for m in self.all()] def byName(self, name): "Get model with NAME." for m in self.models.values(): if m['name'] == name: return m def new(self, name): "Create a new model, save it in the registry, and return it." # caller should call save() after modifying m = defaultModel.copy() m['name'] = name m['mod'] = intTime() m['flds'] = [] m['tmpls'] = [] m['tags'] = [] m['id'] = None return m def rem(self, m): "Delete model, and all its cards/notes." self.col.modSchema() current = self.current()['id'] == m['id'] # delete notes/cards self.col.remCards(self.col.db.list(""" select id from cards where nid in (select id from notes where mid = ?)""", m['id'])) # then the model del self.models[str(m['id'])] self.save() # GUI should ensure last model is not deleted if current: self.setCurrent(self.models.values()[0]) def add(self, m): self._setID(m) self.update(m) self.setCurrent(m) self.save(m) def ensureNameUnique(self, m): for mcur in self.all(): if (mcur['name'] == m['name'] and mcur['id'] != m['id']): m['name'] += "-" + checksum(str(time.time()))[:5] break def update(self, m): "Add or update an existing model. Used for syncing and merging." self.ensureNameUnique(m) self.models[str(m['id'])] = m # mark registry changed, but don't bump mod time self.save() def _setID(self, m): while 1: id = str(intTime(1000)) if id not in self.models: break m['id'] = id def have(self, id): return str(id) in self.models def ids(self): return self.models.keys() # Tools ################################################## def nids(self, m): "Note ids for M." return self.col.db.list( "select id from notes where mid = ?", m['id']) def useCount(self, m): "Number of note using M." return self.col.db.scalar( "select count() from notes where mid = ?", m['id']) def tmplUseCount(self, m, ord): return self.col.db.scalar(""" select count() from cards, notes where cards.nid = notes.id and notes.mid = ? and cards.ord = ?""", m['id'], ord) # Copying ################################################## def copy(self, m): "Copy, save and return." m2 = copy.deepcopy(m) m2['name'] = _("%s copy") % m2['name'] self.add(m2) return m2 # Fields ################################################## def newField(self, name): f = defaultField.copy() f['name'] = name return f def fieldMap(self, m): "Mapping of field name -> (ord, field)." return dict((f['name'], (f['ord'], f)) for f in m['flds']) def fieldNames(self, m): return [f['name'] for f in m['flds']] def sortIdx(self, m): return m['sortf'] def setSortIdx(self, m, idx): assert idx >= 0 and idx < len(m['flds']) self.col.modSchema() m['sortf'] = idx self.col.updateFieldCache(self.nids(m)) self.save(m) def addField(self, m, field): # only mod schema if model isn't new if m['id']: self.col.modSchema() m['flds'].append(field) self._updateFieldOrds(m) self.save(m) def add(fields): fields.append("") return fields self._transformFields(m, add) def remField(self, m, field): self.col.modSchema() # save old sort field sortFldName = m['flds'][m['sortf']]['name'] idx = m['flds'].index(field) m['flds'].remove(field) # restore old sort field if possible, or revert to first field m['sortf'] = 0 for c, f in enumerate(m['flds']): if f['name'] == sortFldName: m['sortf'] = c break self._updateFieldOrds(m) def delete(fields): del fields[idx] return fields self._transformFields(m, delete) if m['flds'][m['sortf']]['name'] != sortFldName: # need to rebuild sort field self.col.updateFieldCache(self.nids(m)) # saves self.renameField(m, field, None) def moveField(self, m, field, idx): self.col.modSchema() oldidx = m['flds'].index(field) if oldidx == idx: return # remember old sort field sortf = m['flds'][m['sortf']] # move m['flds'].remove(field) m['flds'].insert(idx, field) # restore sort field m['sortf'] = m['flds'].index(sortf) self._updateFieldOrds(m) self.save(m) def move(fields, oldidx=oldidx): val = fields[oldidx] del fields[oldidx] fields.insert(idx, val) return fields self._transformFields(m, move) def renameField(self, m, field, newName): self.col.modSchema() pat = r'{{([:#^/]|[^:#/^}][^:}]*?:|)%s}}' def wrap(txt): def repl(match): return '{{' + match.group(1) + txt + '}}' return repl for t in m['tmpls']: for fmt in ('qfmt', 'afmt'): if newName: t[fmt] = re.sub( pat % re.escape(field['name']), wrap(newName), t[fmt]) else: t[fmt] = re.sub( pat % re.escape(field['name']), "", t[fmt]) field['name'] = newName self.save(m) def _updateFieldOrds(self, m): for c, f in enumerate(m['flds']): f['ord'] = c def _transformFields(self, m, fn): # model hasn't been added yet? if not m['id']: return r = [] for (id, flds) in self.col.db.execute( "select id, flds from notes where mid = ?", m['id']): r.append((joinFields(fn(splitFields(flds))), intTime(), self.col.usn(), id)) self.col.db.executemany( "update notes set flds=?,mod=?,usn=? where id = ?", r) # Templates ################################################## def newTemplate(self, name): t = defaultTemplate.copy() t['name'] = name return t def addTemplate(self, m, template): "Note: should col.genCards() afterwards." if m['id']: self.col.modSchema() m['tmpls'].append(template) self._updateTemplOrds(m) self.save(m) def remTemplate(self, m, template): "False if removing template would leave orphan notes." assert len(m['tmpls']) > 1 # find cards using this template ord = m['tmpls'].index(template) cids = self.col.db.list(""" select c.id from cards c, notes f where c.nid=f.id and mid = ? and ord = ?""", m['id'], ord) # all notes with this template must have at least two cards, or we # could end up creating orphaned notes if self.col.db.scalar(""" select nid, count() from cards where nid in (select nid from cards where id in %s) group by nid having count() < 2 limit 1""" % ids2str(cids)): return False # ok to proceed; remove cards self.col.modSchema() self.col.remCards(cids) # shift ordinals self.col.db.execute(""" update cards set ord = ord - 1, usn = ?, mod = ? where nid in (select id from notes where mid = ?) and ord > ?""", self.col.usn(), intTime(), m['id'], ord) m['tmpls'].remove(template) self._updateTemplOrds(m) self.save(m) return True def _updateTemplOrds(self, m): for c, t in enumerate(m['tmpls']): t['ord'] = c def moveTemplate(self, m, template, idx): oldidx = m['tmpls'].index(template) if oldidx == idx: return oldidxs = dict((id(t), t['ord']) for t in m['tmpls']) m['tmpls'].remove(template) m['tmpls'].insert(idx, template) self._updateTemplOrds(m) # generate change map map = [] for t in m['tmpls']: map.append("when ord = %d then %d" % (oldidxs[id(t)], t['ord'])) # apply self.save(m) self.col.db.execute(""" update cards set ord = (case %s end),usn=?,mod=? where nid in ( select id from notes where mid = ?)""" % " ".join(map), self.col.usn(), intTime(), m['id']) def _syncTemplates(self, m): rem = self.col.genCards(self.nids(m)) # Model changing ########################################################################## # - maps are ord->ord, and there should not be duplicate targets # - newModel should be self if model is not changing def change(self, m, nids, newModel, fmap, cmap): self.col.modSchema() assert newModel['id'] == m['id'] or (fmap and cmap) if fmap: self._changeNotes(nids, newModel, fmap) if cmap: self._changeCards(nids, m, newModel, cmap) self.col.genCards(nids) def _changeNotes(self, nids, newModel, map): d = [] nfields = len(newModel['flds']) for (nid, flds) in self.col.db.execute( "select id, flds from notes where id in "+ids2str(nids)): newflds = {} flds = splitFields(flds) for old, new in map.items(): newflds[new] = flds[old] flds = [] for c in range(nfields): flds.append(newflds.get(c, "")) flds = joinFields(flds) d.append(dict(nid=nid, flds=flds, mid=newModel['id'], m=intTime(),u=self.col.usn())) self.col.db.executemany( "update notes set flds=:flds,mid=:mid,mod=:m,usn=:u where id = :nid", d) self.col.updateFieldCache(nids) def _changeCards(self, nids, oldModel, newModel, map): d = [] deleted = [] for (cid, ord) in self.col.db.execute( "select id, ord from cards where nid in "+ids2str(nids)): # if the src model is a cloze, we ignore the map, as the gui # doesn't currently support mapping them if oldModel['type'] == MODEL_CLOZE: new = ord if newModel['type'] != MODEL_CLOZE: # if we're mapping to a regular note, we need to check if # the destination ord is valid if len(newModel['tmpls']) <= ord: new = None else: # mapping from a regular note, so the map should be valid new = map[ord] if new is not None: d.append(dict( cid=cid,new=new,u=self.col.usn(),m=intTime())) else: deleted.append(cid) self.col.db.executemany( "update cards set ord=:new,usn=:u,mod=:m where id=:cid", d) self.col.remCards(deleted) # Schema hash ########################################################################## def scmhash(self, m): "Return a hash of the schema, to see if models are compatible." s = "" for f in m['flds']: s += f['name'] for t in m['tmpls']: s += t['name'] return checksum(s) # Required field/text cache ########################################################################## def _updateRequired(self, m): if m['type'] == MODEL_CLOZE: # nothing to do return req = [] flds = [f['name'] for f in m['flds']] for t in m['tmpls']: ret = self._reqForTemplate(m, flds, t) req.append((t['ord'], ret[0], ret[1])) m['req'] = req def _reqForTemplate(self, m, flds, t): a = [] b = [] for f in flds: a.append("ankiflag") b.append("") data = [1, 1, m['id'], 1, t['ord'], "", joinFields(a)] full = self.col._renderQA(data)['q'] data = [1, 1, m['id'], 1, t['ord'], "", joinFields(b)] empty = self.col._renderQA(data)['q'] # if full and empty are the same, the template is invalid and there is # no way to satisfy it if full == empty: return "none", [], [] type = 'all' req = [] for i in range(len(flds)): tmp = a[:] tmp[i] = "" data[6] = joinFields(tmp) # if no field content appeared, field is required if "ankiflag" not in self.col._renderQA(data)['q']: req.append(i) if req: return type, req # if there are no required fields, switch to any mode type = 'any' req = [] for i in range(len(flds)): tmp = b[:] tmp[i] = "1" data[6] = joinFields(tmp) # if not the same as empty, this field can make the card non-blank if self.col._renderQA(data)['q'] != empty: req.append(i) return type, req def availOrds(self, m, flds): "Given a joined field string, return available template ordinals." if m['type'] == MODEL_CLOZE: return self._availClozeOrds(m, flds) fields = {} for c, f in enumerate(splitFields(flds)): fields[c] = f.strip() avail = [] for ord, type, req in m['req']: # unsatisfiable template if type == "none": continue # AND requirement? elif type == "all": ok = True for idx in req: if not fields[idx]: # missing and was required ok = False break if not ok: continue # OR requirement? elif type == "any": ok = False for idx in req: if fields[idx]: ok = True break if not ok: continue avail.append(ord) return avail def _availClozeOrds(self, m, flds, allowEmpty=True): sflds = splitFields(flds) map = self.fieldMap(m) ords = set() matches = re.findall("{{cloze:(.+?)}}", m['tmpls'][0]['qfmt']) matches += re.findall("<%cloze:(.+?)%>", m['tmpls'][0]['qfmt']) for fname in matches: if fname not in map: continue ord = map[fname][0] ords.update([int(m)-1 for m in re.findall( "{{c(\d+)::.+?}}", sflds[ord])]) if -1 in ords: ords.remove(-1) if not ords and allowEmpty: # empty clozes use first ord return [0] return list(ords) # Sync handling ########################################################################## def beforeUpload(self): for m in self.all(): m['usn'] = 0 self.save() anki-2.0.20+dfsg/anki/cards.py0000644000175000017500000001252612242063474015652 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import pprint import time from anki.hooks import runHook from anki.utils import intTime, timestampID, joinFields from anki.consts import * # Cards ########################################################################## # Type: 0=new, 1=learning, 2=due # Queue: same as above, and: # -1=suspended, -2=user buried, -3=sched buried # Due is used differently for different queues. # - new queue: note id or random int # - rev queue: integer day # - lrn queue: integer timestamp class Card(object): def __init__(self, col, id=None): self.col = col self.timerStarted = None self._qa = None self._note = None if id: self.id = id self.load() else: # to flush, set nid, ord, and due self.id = timestampID(col.db, "cards") self.did = 1 self.crt = intTime() self.type = 0 self.queue = 0 self.ivl = 0 self.factor = 0 self.reps = 0 self.lapses = 0 self.left = 0 self.odue = 0 self.odid = 0 self.flags = 0 self.data = "" def load(self): (self.id, self.nid, self.did, self.ord, self.mod, self.usn, self.type, self.queue, self.due, self.ivl, self.factor, self.reps, self.lapses, self.left, self.odue, self.odid, self.flags, self.data) = self.col.db.first( "select * from cards where id = ?", self.id) self._qa = None self._note = None def flush(self): self.mod = intTime() self.usn = self.col.usn() # bug check if self.queue == 2 and self.odue and not self.col.decks.isDyn(self.did): runHook("odueInvalid") assert self.due < 4294967296 self.col.db.execute( """ insert or replace into cards values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", self.id, self.nid, self.did, self.ord, self.mod, self.usn, self.type, self.queue, self.due, self.ivl, self.factor, self.reps, self.lapses, self.left, self.odue, self.odid, self.flags, self.data) self.col.log(self) def flushSched(self): self.mod = intTime() self.usn = self.col.usn() # bug checks if self.queue == 2 and self.odue and not self.col.decks.isDyn(self.did): runHook("odueInvalid") assert self.due < 4294967296 self.col.db.execute( """update cards set mod=?, usn=?, type=?, queue=?, due=?, ivl=?, factor=?, reps=?, lapses=?, left=?, odue=?, odid=?, did=? where id = ?""", self.mod, self.usn, self.type, self.queue, self.due, self.ivl, self.factor, self.reps, self.lapses, self.left, self.odue, self.odid, self.did, self.id) self.col.log(self) def q(self, reload=False, browser=False): return self.css() + self._getQA(reload, browser)['q'] def a(self): return self.css() + self._getQA()['a'] def css(self): return "" % self.model()['css'] def _getQA(self, reload=False, browser=False): if not self._qa or reload: f = self.note(reload); m = self.model(); t = self.template() data = [self.id, f.id, m['id'], self.odid or self.did, self.ord, f.stringTags(), f.joinedFields()] if browser: args = (t.get('bqfmt'), t.get('bafmt')) else: args = tuple() self._qa = self.col._renderQA(data, *args) return self._qa def note(self, reload=False): if not self._note or reload: self._note = self.col.getNote(self.nid) return self._note def model(self): return self.col.models.get(self.note().mid) def template(self): m = self.model() if m['type'] == MODEL_STD: return self.model()['tmpls'][self.ord] else: return self.model()['tmpls'][0] def startTimer(self): self.timerStarted = time.time() def timeLimit(self): "Time limit for answering in milliseconds." conf = self.col.decks.confForDid(self.odid or self.did) return conf['maxTaken']*1000 def shouldShowTimer(self): conf = self.col.decks.confForDid(self.odid or self.did) return conf['timer'] def timeTaken(self): "Time taken to answer card, in integer MS." total = int((time.time() - self.timerStarted)*1000) return min(total, self.timeLimit()) def isEmpty(self): ords = self.col.models.availOrds( self.model(), joinFields(self.note().fields)) if self.ord not in ords: return True def __repr__(self): d = dict(self.__dict__) # remove non-useful elements del d['_note'] del d['_qa'] del d['col'] del d['timerStarted'] return pprint.pformat(d, width=300) anki-2.0.20+dfsg/anki/stdmodels.py0000644000175000017500000000460012043563545016551 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from anki.lang import _ from anki.consts import MODEL_CLOZE models = [] # Basic ########################################################################## def addBasicModel(col): mm = col.models m = mm.new(_("Basic")) fm = mm.newField(_("Front")) mm.addField(m, fm) fm = mm.newField(_("Back")) mm.addField(m, fm) t = mm.newTemplate(_("Card 1")) t['qfmt'] = "{{"+_("Front")+"}}" t['afmt'] = "{{FrontSide}}\n\n


\n\n"+"{{"+_("Back")+"}}" mm.addTemplate(m, t) mm.add(m) return m models.append((lambda: _("Basic"), addBasicModel)) # Forward & Reverse ########################################################################## def addForwardReverse(col): mm = col.models m = addBasicModel(col) m['name'] = _("Basic (and reversed card)") t = mm.newTemplate(_("Card 2")) t['qfmt'] = "{{"+_("Back")+"}}" t['afmt'] = "{{FrontSide}}\n\n
\n\n"+"{{"+_("Front")+"}}" mm.addTemplate(m, t) return m models.append((lambda: _("Forward & Reverse"), addForwardReverse)) # Forward & Optional Reverse ########################################################################## def addForwardOptionalReverse(col): mm = col.models m = addBasicModel(col) m['name'] = _("Basic (optional reversed card)") fm = mm.newField(_("Add Reverse")) mm.addField(m, fm) t = mm.newTemplate(_("Card 2")) t['qfmt'] = "{{#Add Reverse}}{{"+_("Back")+"}}{{/Add Reverse}}" t['afmt'] = "{{FrontSide}}\n\n
\n\n"+"{{"+_("Front")+"}}" mm.addTemplate(m, t) return m models.append((lambda: _("Forward & Optional Reverse"), addForwardOptionalReverse)) # Cloze ########################################################################## def addClozeModel(col): mm = col.models m = mm.new(_("Cloze")) m['type'] = MODEL_CLOZE txt = _("Text") fm = mm.newField(txt) mm.addField(m, fm) fm = mm.newField(_("Extra")) mm.addField(m, fm) t = mm.newTemplate(_("Cloze")) fmt = "{{cloze:%s}}" % txt m['css'] += """ .cloze { font-weight: bold; color: blue; }""" t['qfmt'] = fmt t['afmt'] = fmt + "
\n{{%s}}" % _("Extra") mm.addTemplate(m, t) mm.add(m) return m models.append((lambda: _("Cloze"), addClozeModel)) anki-2.0.20+dfsg/anki/sync.py0000644000175000017500000006367612251547027015547 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import urllib import sys import gzip import random from cStringIO import StringIO import httplib2 from anki.db import DB from anki.utils import ids2str, intTime, json, isWin, isMac, platDesc, checksum from anki.consts import * from hooks import runHook import anki # syncing vars HTTP_TIMEOUT = 90 HTTP_PROXY = None # badly named; means no retries httplib2.RETRIES = 1 try: # httplib2 >=0.7.7 _proxy_info_from_environment = httplib2.proxy_info_from_environment _proxy_info_from_url = httplib2.proxy_info_from_url except AttributeError: # httplib2 <0.7.7 _proxy_info_from_environment = httplib2.ProxyInfo.from_environment _proxy_info_from_url = httplib2.ProxyInfo.from_url # Httplib2 connection object ###################################################################### def httpCon(): certs = os.path.join(os.path.dirname(__file__), "ankiweb.certs") if not os.path.exists(certs): if isWin: certs = os.path.join( os.path.dirname(os.path.abspath(sys.argv[0])), "ankiweb.certs") elif isMac: certs = os.path.join( os.path.dirname(os.path.abspath(sys.argv[0])), "../Resources/ankiweb.certs") else: assert 0, "Your distro has not packaged Anki correctly." return httplib2.Http( timeout=HTTP_TIMEOUT, ca_certs=certs, proxy_info=HTTP_PROXY, disable_ssl_certificate_validation=not not HTTP_PROXY) # Proxy handling ###################################################################### def _setupProxy(): global HTTP_PROXY # set in env? p = _proxy_info_from_environment() if not p: # platform-specific fetch url = None if isWin: r = urllib.getproxies_registry() if 'https' in r: url = r['https'] elif 'http' in r: url = r['http'] elif isMac: r = urllib.getproxies_macosx_sysconf() if 'https' in r: url = r['https'] elif 'http' in r: url = r['http'] if url: p = _proxy_info_from_url(url, _proxyMethod(url)) if p: p.proxy_rdns = True HTTP_PROXY = p def _proxyMethod(url): if url.lower().startswith("https"): return "https" else: return "http" _setupProxy() # Incremental syncing ########################################################################## class Syncer(object): def __init__(self, col, server=None): self.col = col self.server = server def sync(self): "Returns 'noChanges', 'fullSync', 'success', etc" self.syncMsg = "" self.uname = "" # if the deck has any pending changes, flush them first and bump mod # time self.col.save() # step 1: login & metadata runHook("sync", "login") meta = self.server.meta() self.col.log("rmeta", meta) if not meta: return "badAuth" rscm = meta['scm'] rts = meta['ts'] self.rmod = meta['mod'] self.maxUsn = meta['usn'] self.mediaUsn = meta['musn'] self.syncMsg = meta['msg'] # this is a temporary measure to address the problem of users # forgetting which email address they've used - it will be removed # when enough time has passed self.uname = meta.get("uname", "") # server requested abort? if not meta['cont']: return "serverAbort" else: # don't abort, but ui should show message after sync finishes # and require confirmation if it's non-empty pass meta = self.meta() self.col.log("lmeta", meta) self.lmod = meta['mod'] self.minUsn = meta['usn'] lscm = meta['scm'] lts = meta['ts'] if abs(rts - lts) > 300: self.col.log("clock off") return "clockOff" if self.lmod == self.rmod: self.col.log("no changes") return "noChanges" elif lscm != rscm: self.col.log("schema diff") return "fullSync" self.lnewer = self.lmod > self.rmod # step 1.5: check collection is valid if not self.col.basicCheck(): self.col.log("basic check") return "basicCheckFailed" # step 2: deletions runHook("sync", "meta") lrem = self.removed() rrem = self.server.start( minUsn=self.minUsn, lnewer=self.lnewer, graves=lrem) self.remove(rrem) # ...and small objects lchg = self.changes() rchg = self.server.applyChanges(changes=lchg) self.mergeChanges(lchg, rchg) # step 3: stream large tables from server runHook("sync", "server") while 1: runHook("sync", "stream") chunk = self.server.chunk() self.col.log("server chunk", chunk) self.applyChunk(chunk=chunk) if chunk['done']: break # step 4: stream to server runHook("sync", "client") while 1: runHook("sync", "stream") chunk = self.chunk() self.col.log("client chunk", chunk) self.server.applyChunk(chunk=chunk) if chunk['done']: break # step 5: sanity check runHook("sync", "sanity") c = self.sanityCheck() ret = self.server.sanityCheck2(client=c) if ret['status'] != "ok": # roll back and force full sync self.col.rollback() self.col.modSchema() self.col.save() return "sanityCheckFailed" # finalize runHook("sync", "finalize") mod = self.server.finish() self.finish(mod) return "success" def meta(self): return dict( mod=self.col.mod, scm=self.col.scm, usn=self.col._usn, ts=intTime(), musn=0, msg="", cont=True ) def changes(self): "Bundle up small objects." d = dict(models=self.getModels(), decks=self.getDecks(), tags=self.getTags()) if self.lnewer: d['conf'] = self.getConf() d['crt'] = self.col.crt return d def applyChanges(self, changes): self.rchg = changes lchg = self.changes() # merge our side before returning self.mergeChanges(lchg, self.rchg) return lchg def mergeChanges(self, lchg, rchg): # then the other objects self.mergeModels(rchg['models']) self.mergeDecks(rchg['decks']) self.mergeTags(rchg['tags']) if 'conf' in rchg: self.mergeConf(rchg['conf']) # this was left out of earlier betas if 'crt' in rchg: self.col.crt = rchg['crt'] self.prepareToChunk() def sanityCheck(self): if not self.col.basicCheck(): return "failed basic check" for t in "cards", "notes", "revlog", "graves": if self.col.db.scalar( "select count() from %s where usn = -1" % t): return "%s had usn = -1" % t for g in self.col.decks.all(): if g['usn'] == -1: return "deck had usn = -1" for t, usn in self.col.tags.allItems(): if usn == -1: return "tag had usn = -1" found = False for m in self.col.models.all(): if self.col.server: # the web upgrade was mistakenly setting usn if m['usn'] < 0: m['usn'] = 0 found = True else: if m['usn'] == -1: return "model had usn = -1" if found: self.col.models.save() self.col.sched.reset() # check for missing parent decks self.col.sched.deckDueList() # return summary of deck return [ list(self.col.sched.counts()), self.col.db.scalar("select count() from cards"), self.col.db.scalar("select count() from notes"), self.col.db.scalar("select count() from revlog"), self.col.db.scalar("select count() from graves"), len(self.col.models.all()), len(self.col.decks.all()), len(self.col.decks.allConf()), ] def sanityCheck2(self, client): server = self.sanityCheck() if client != server: return dict(status="bad", c=client, s=server) return dict(status="ok") def usnLim(self): if self.col.server: return "usn >= %d" % self.minUsn else: return "usn = -1" def finish(self, mod=None): if not mod: # server side; we decide new mod time mod = intTime(1000) self.col.ls = mod self.col._usn = self.maxUsn + 1 # ensure we save the mod time even if no changes made self.col.db.mod = True self.col.save(mod=mod) return mod # Chunked syncing ########################################################################## def prepareToChunk(self): self.tablesLeft = ["revlog", "cards", "notes"] self.cursor = None def cursorForTable(self, table): lim = self.usnLim() x = self.col.db.execute d = (self.maxUsn, lim) if table == "revlog": return x(""" select id, cid, %d, ease, ivl, lastIvl, factor, time, type from revlog where %s""" % d) elif table == "cards": return x(""" select id, nid, did, ord, mod, %d, type, queue, due, ivl, factor, reps, lapses, left, odue, odid, flags, data from cards where %s""" % d) else: return x(""" select id, guid, mid, mod, %d, tags, flds, '', '', flags, data from notes where %s""" % d) def chunk(self): buf = dict(done=False) lim = 2500 while self.tablesLeft and lim: curTable = self.tablesLeft[0] if not self.cursor: self.cursor = self.cursorForTable(curTable) rows = self.cursor.fetchmany(lim) fetched = len(rows) if fetched != lim: # table is empty self.tablesLeft.pop(0) self.cursor = None # if we're the client, mark the objects as having been sent if not self.col.server: self.col.db.execute( "update %s set usn=? where usn=-1"%curTable, self.maxUsn) buf[curTable] = rows lim -= fetched if not self.tablesLeft: buf['done'] = True return buf def applyChunk(self, chunk): if "revlog" in chunk: self.mergeRevlog(chunk['revlog']) if "cards" in chunk: self.mergeCards(chunk['cards']) if "notes" in chunk: self.mergeNotes(chunk['notes']) # Deletions ########################################################################## def removed(self): cards = [] notes = [] decks = [] if self.col.server: curs = self.col.db.execute( "select oid, type from graves where usn >= ?", self.minUsn) else: curs = self.col.db.execute( "select oid, type from graves where usn = -1") for oid, type in curs: if type == REM_CARD: cards.append(oid) elif type == REM_NOTE: notes.append(oid) else: decks.append(oid) if not self.col.server: self.col.db.execute("update graves set usn=? where usn=-1", self.maxUsn) return dict(cards=cards, notes=notes, decks=decks) def start(self, minUsn, lnewer, graves): self.maxUsn = self.col._usn self.minUsn = minUsn self.lnewer = not lnewer lgraves = self.removed() self.remove(graves) return lgraves def remove(self, graves): # pretend to be the server so we don't set usn = -1 wasServer = self.col.server self.col.server = True # notes first, so we don't end up with duplicate graves self.col._remNotes(graves['notes']) # then cards self.col.remCards(graves['cards'], notes=False) # and decks for oid in graves['decks']: self.col.decks.rem(oid, childrenToo=False) self.col.server = wasServer # Models ########################################################################## def getModels(self): if self.col.server: return [m for m in self.col.models.all() if m['usn'] >= self.minUsn] else: mods = [m for m in self.col.models.all() if m['usn'] == -1] for m in mods: m['usn'] = self.maxUsn self.col.models.save() return mods def mergeModels(self, rchg): for r in rchg: l = self.col.models.get(r['id']) # if missing locally or server is newer, update if not l or r['mod'] > l['mod']: self.col.models.update(r) # Decks ########################################################################## def getDecks(self): if self.col.server: return [ [g for g in self.col.decks.all() if g['usn'] >= self.minUsn], [g for g in self.col.decks.allConf() if g['usn'] >= self.minUsn] ] else: decks = [g for g in self.col.decks.all() if g['usn'] == -1] for g in decks: g['usn'] = self.maxUsn dconf = [g for g in self.col.decks.allConf() if g['usn'] == -1] for g in dconf: g['usn'] = self.maxUsn self.col.decks.save() return [decks, dconf] def mergeDecks(self, rchg): for r in rchg[0]: l = self.col.decks.get(r['id'], False) # if missing locally or server is newer, update if not l or r['mod'] > l['mod']: self.col.decks.update(r) for r in rchg[1]: try: l = self.col.decks.getConf(r['id']) except KeyError: l = None # if missing locally or server is newer, update if not l or r['mod'] > l['mod']: self.col.decks.updateConf(r) # Tags ########################################################################## def getTags(self): if self.col.server: return [t for t, usn in self.col.tags.allItems() if usn >= self.minUsn] else: tags = [] for t, usn in self.col.tags.allItems(): if usn == -1: self.col.tags.tags[t] = self.maxUsn tags.append(t) self.col.tags.save() return tags def mergeTags(self, tags): self.col.tags.register(tags, usn=self.maxUsn) # Cards/notes/revlog ########################################################################## def mergeRevlog(self, logs): self.col.db.executemany( "insert or ignore into revlog values (?,?,?,?,?,?,?,?,?)", logs) def newerRows(self, data, table, modIdx): ids = (r[0] for r in data) lmods = {} for id, mod in self.col.db.execute( "select id, mod from %s where id in %s and %s" % ( table, ids2str(ids), self.usnLim())): lmods[id] = mod update = [] for r in data: if r[0] not in lmods or lmods[r[0]] < r[modIdx]: update.append(r) self.col.log(table, data) return update def mergeCards(self, cards): self.col.db.executemany( "insert or replace into cards values " "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", self.newerRows(cards, "cards", 4)) def mergeNotes(self, notes): rows = self.newerRows(notes, "notes", 3) self.col.db.executemany( "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", rows) self.col.updateFieldCache([f[0] for f in rows]) # Col config ########################################################################## def getConf(self): return self.col.conf def mergeConf(self, conf): self.col.conf = conf # Local syncing for unit tests ########################################################################## class LocalServer(Syncer): # serialize/deserialize payload, so we don't end up sharing objects # between cols def applyChanges(self, changes): l = json.loads; d = json.dumps return l(d(Syncer.applyChanges(self, l(d(changes))))) # HTTP syncing tools ########################################################################## # Calling code should catch the following codes: # - 501: client needs upgrade # - 502: ankiweb down # - 503/504: server too busy class HttpSyncer(object): def __init__(self, hkey=None, con=None): self.hkey = hkey self.skey = checksum(str(random.random()))[:8] self.con = con or httpCon() def assertOk(self, resp): if resp['status'] != '200': raise Exception("Unknown response code: %s" % resp['status']) # Posting data as a file ###################################################################### # We don't want to post the payload as a form var, as the percent-encoding is # costly. We could send it as a raw post, but more HTTP clients seem to # support file uploading, so this is the more compatible choice. def req(self, method, fobj=None, comp=6, badAuthRaises=True, hkey=True): BOUNDARY="Anki-sync-boundary" bdry = "--"+BOUNDARY buf = StringIO() # compression flag and session key as post vars vars = {} vars['c'] = 1 if comp else 0 if hkey: vars['k'] = self.hkey vars['s'] = self.skey for (key, value) in vars.items(): buf.write(bdry + "\r\n") buf.write( 'Content-Disposition: form-data; name="%s"\r\n\r\n%s\r\n' % (key, value)) # payload as raw data or json if fobj: # header buf.write(bdry + "\r\n") buf.write("""\ Content-Disposition: form-data; name="data"; filename="data"\r\n\ Content-Type: application/octet-stream\r\n\r\n""") # write file into buffer, optionally compressing if comp: tgt = gzip.GzipFile(mode="wb", fileobj=buf, compresslevel=comp) else: tgt = buf while 1: data = fobj.read(65536) if not data: if comp: tgt.close() break tgt.write(data) buf.write('\r\n' + bdry + '--\r\n') size = buf.tell() # connection headers headers = { 'Content-Type': 'multipart/form-data; boundary=%s' % BOUNDARY, 'Content-Length': str(size), } body = buf.getvalue() buf.close() resp, cont = self.con.request( SYNC_URL+method, "POST", headers=headers, body=body) if not badAuthRaises: # return false if bad auth instead of raising if resp['status'] == '403': return False self.assertOk(resp) return cont # Incremental sync over HTTP ###################################################################### class RemoteServer(HttpSyncer): def __init__(self, hkey): HttpSyncer.__init__(self, hkey) def hostKey(self, user, pw): "Returns hkey or none if user/pw incorrect." ret = self.req( "hostKey", StringIO(json.dumps(dict(u=user, p=pw))), badAuthRaises=False, hkey=False) if not ret: # invalid auth return self.hkey = json.loads(ret)['key'] return self.hkey def meta(self): ret = self.req( "meta", StringIO(json.dumps(dict( v=SYNC_VER, cv="ankidesktop,%s,%s"%(anki.version, platDesc())))), badAuthRaises=False) if not ret: # invalid auth return return json.loads(ret) def applyChanges(self, **kw): return self._run("applyChanges", kw) def start(self, **kw): return self._run("start", kw) def chunk(self, **kw): return self._run("chunk", kw) def applyChunk(self, **kw): return self._run("applyChunk", kw) def sanityCheck2(self, **kw): return self._run("sanityCheck2", kw) def finish(self, **kw): return self._run("finish", kw) def _run(self, cmd, data): return json.loads( self.req(cmd, StringIO(json.dumps(data)))) # Full syncing ########################################################################## class FullSyncer(HttpSyncer): def __init__(self, col, hkey, con): HttpSyncer.__init__(self, hkey, con) self.col = col def download(self): runHook("sync", "download") self.col.close() cont = self.req("download") tpath = self.col.path + ".tmp" if cont == "upgradeRequired": runHook("sync", "upgradeRequired") return open(tpath, "wb").write(cont) # check the received file is ok d = DB(tpath) assert d.scalar("pragma integrity_check") == "ok" d.close() # overwrite existing collection os.unlink(self.col.path) os.rename(tpath, self.col.path) self.col = None def upload(self): "True if upload successful." runHook("sync", "upload") # make sure it's ok before we try to upload if self.col.db.scalar("pragma integrity_check") != "ok": return False if not self.col.basicCheck(): return False # apply some adjustments, then upload self.col.beforeUpload() if self.req("upload", open(self.col.path, "rb")) != "OK": return False return True # Media syncing ########################################################################## class MediaSyncer(object): def __init__(self, col, server=None): self.col = col self.server = server self.added = None def sync(self, mediaUsn): # step 1: check if there have been any changes runHook("sync", "findMedia") lusn = self.col.media.usn() # if first sync or resync, clear list of files we think we've sent if not lusn: self.col.media.forceResync() self.col.media.findChanges() if lusn == mediaUsn and not self.col.media.hasChanged(): return "noChanges" # step 1.5: if resyncing, we need to get the list of files the server # has and remove them from our local list of files to sync if not lusn: files = self.server.mediaList() need = self.col.media.removeExisting(files) else: need = None # step 2: send/recv deletions runHook("sync", "removeMedia") lrem = self.removed() rrem = self.server.remove(fnames=lrem, minUsn=lusn) self.remove(rrem) # step 3: stream files from server runHook("sync", "server") while 1: runHook("sync", "streamMedia") usn = self.col.media.usn() zip = self.server.files(minUsn=usn, need=need) if self.addFiles(zip=zip): break # step 4: stream files to the server runHook("sync", "client") while 1: runHook("sync", "streamMedia") zip, fnames = self.files() if not fnames: # finished break usn = self.server.addFiles(zip=zip) # after server has replied, safe to remove from log self.col.media.forgetAdded(fnames) self.col.media.setUsn(usn) # step 5: sanity check during beta testing # NOTE: when removing this, need to move server tidyup # back from sanity check to addFiles c = self.mediaSanity() s = self.server.mediaSanity(client=c) self.col.log("mediaSanity", c, s) if c != s: # if the sanity check failed, force a resync self.col.media.forceResync() return "sanityCheckFailed" def removed(self): return self.col.media.removed() def remove(self, fnames, minUsn=None): self.col.media.syncRemove(fnames) if minUsn is not None: # we're the server return self.col.media.removed() def files(self): return self.col.media.zipAdded() def addFiles(self, zip): "True if zip is the last in set. Server returns new usn instead." return self.col.media.syncAdd(zip) def mediaSanity(self): return self.col.media.sanityCheck() # Remote media syncing ########################################################################## class RemoteMediaServer(HttpSyncer): def __init__(self, hkey, con): HttpSyncer.__init__(self, hkey, con) def remove(self, **kw): return json.loads( self.req("remove", StringIO(json.dumps(kw)))) def files(self, **kw): return self.req("files", StringIO(json.dumps(kw))) def addFiles(self, zip): # no compression, as we compress the zip file instead return json.loads( self.req("addFiles", StringIO(zip), comp=0)) def mediaSanity(self, **kw): return json.loads( self.req("mediaSanity", StringIO(json.dumps(kw)))) def mediaList(self): return json.loads( self.req("mediaList")) # only for unit tests def mediatest(self, n): return json.loads( self.req("mediatest", StringIO( json.dumps(dict(n=n))))) anki-2.0.20+dfsg/anki/importing/0000755000175000017500000000000012256137063016207 5ustar andreasandreasanki-2.0.20+dfsg/anki/importing/base.py0000644000175000017500000000164012065175361017475 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from anki.utils import maxID # Base importer ########################################################################## class Importer(object): needMapper = False needDelimiter = False def __init__(self, col, file): self.file = file self.log = [] self.col = col self.total = 0 def run(self): pass # Timestamps ###################################################################### # It's too inefficient to check for existing ids on every object, # and a previous import may have created timestamps in the future, so we # need to make sure our starting point is safe. def _prepareTS(self): self._ts = maxID(self.dst.db) def ts(self): self._ts += 1 return self._ts anki-2.0.20+dfsg/anki/importing/pauker.py0000644000175000017500000000464012221204444020042 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Andreas Klauer # License: BSD-3 import gzip, math, random, time, cgi import xml.etree.ElementTree as ET from anki.importing.noteimp import NoteImporter, ForeignNote, ForeignCard from anki.stdmodels import addForwardReverse ONE_DAY = 60*60*24 class PaukerImporter(NoteImporter): '''Import Pauker 1.8 Lesson (*.pau.gz)''' needMapper = False allowHTML = True def run(self): model = addForwardReverse(self.col) model['name'] = "Pauker" self.col.models.save(model) self.col.models.setCurrent(model) self.model = model self.initMapping() NoteImporter.run(self) def fields(self): '''Pauker is Front/Back''' return 2 def foreignNotes(self): '''Build and return a list of notes.''' notes = [] try: f = gzip.open(self.file) tree = ET.parse(f) lesson = tree.getroot() assert lesson.tag == "Lesson" finally: f.close() index = -4 for batch in lesson.findall('./Batch'): index += 1 for card in batch.findall('./Card'): # Create a note for this card. front = card.findtext('./FrontSide/Text') back = card.findtext('./ReverseSide/Text') note = ForeignNote() note.fields = [cgi.escape(x.strip()).replace('\n','
').replace(' ','  ') for x in [front,back]] notes.append(note) # Determine due date for cards. frontdue = card.find('./FrontSide[@LearnedTimestamp]') backdue = card.find('./ReverseSide[@Batch][@LearnedTimestamp]') if frontdue is not None: note.cards[0] = self._learnedCard(index, int(frontdue.attrib['LearnedTimestamp'])) if backdue is not None: note.cards[1] = self._learnedCard(int(backdue.attrib['Batch']), int(backdue.attrib['LearnedTimestamp'])) return notes def _learnedCard(self, batch, timestamp): ivl = math.exp(batch) now = time.time() due = ivl - (now - timestamp/1000.0)/ONE_DAY fc = ForeignCard() fc.due = self.col.sched.today + int(due+0.5) fc.ivl = random.randint(int(ivl*0.90), int(ivl+0.5)) fc.factor = random.randint(1500,2500) return fc anki-2.0.20+dfsg/anki/importing/apkg.py0000644000175000017500000000261112225675305017505 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import zipfile, os import unicodedata from anki.utils import tmpfile, json from anki.importing.anki2 import Anki2Importer class AnkiPackageImporter(Anki2Importer): def run(self): # extract the deck from the zip file self.zip = z = zipfile.ZipFile(self.file) col = z.read("collection.anki2") colpath = tmpfile(suffix=".anki2") open(colpath, "wb").write(col) self.file = colpath # we need the media dict in advance, and we'll need a map of fname -> # number to use during the import self.nameToNum = {} for k, v in json.loads(z.read("media")).items(): self.nameToNum[v] = k # run anki2 importer Anki2Importer.run(self) # import static media for file, c in self.nameToNum.items(): if not file.startswith("_") and not file.startswith("latex-"): continue path = os.path.join(self.col.media.dir(), unicodedata.normalize("NFC", file)) if not os.path.exists(path): open(path, "wb").write(z.read(c)) def _srcMediaData(self, fname): if fname in self.nameToNum: return self.zip.read(self.nameToNum[fname]) return None anki-2.0.20+dfsg/anki/importing/anki2.py0000644000175000017500000003505512225675305017577 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import os import unicodedata from anki import Collection from anki.utils import intTime, splitFields, joinFields, incGuid from anki.importing.base import Importer from anki.lang import _ from anki.lang import ngettext GUID = 1 MID = 2 MOD = 3 class Anki2Importer(Importer): needMapper = False deckPrefix = None allowUpdate = True dupeOnSchemaChange = False def run(self, media=None): self._prepareFiles() if media is not None: # Anki1 importer has provided us with a custom media folder self.src.media._dir = media try: self._import() finally: self.src.close(save=False) def _prepareFiles(self): self.dst = self.col self.src = Collection(self.file) def _import(self): self._decks = {} if self.deckPrefix: id = self.dst.decks.id(self.deckPrefix) self.dst.decks.select(id) self._prepareTS() self._prepareModels() self._importNotes() self._importCards() self._importStaticMedia() self._postImport() self.dst.db.execute("vacuum") self.dst.db.execute("analyze") # Notes ###################################################################### def _importNotes(self): # build guid -> (id,mod,mid) hash & map of existing note ids self._notes = {} existing = {} for id, guid, mod, mid in self.dst.db.execute( "select id, guid, mod, mid from notes"): self._notes[guid] = (id, mod, mid) existing[id] = True # we may need to rewrite the guid if the model schemas don't match, # so we need to keep track of the changes for the card import stage self._changedGuids = {} # iterate over source collection add = [] update = [] dirty = [] usn = self.dst.usn() dupes = 0 dupesIgnored = [] for note in self.src.db.execute( "select * from notes"): # turn the db result into a mutable list note = list(note) shouldAdd = self._uniquifyNote(note) if shouldAdd: # ensure id is unique while note[0] in existing: note[0] += 999 existing[note[0]] = True # bump usn note[4] = usn # update media references in case of dupes note[6] = self._mungeMedia(note[MID], note[6]) add.append(note) dirty.append(note[0]) # note we have the added the guid self._notes[note[GUID]] = (note[0], note[3], note[MID]) else: # a duplicate or changed schema - safe to update? dupes += 1 if self.allowUpdate: oldNid, oldMod, oldMid = self._notes[note[GUID]] # will update if incoming note more recent if oldMod < note[MOD]: # safe if note types identical if oldMid == note[MID]: # incoming note should use existing id note[0] = oldNid note[4] = usn note[6] = self._mungeMedia(note[MID], note[6]) update.append(note) dirty.append(note[0]) else: dupesIgnored.append("%s: %s" % ( self.col.models.get(oldMid)['name'], note[6].replace("\x1f", ",") )) if dupes: up = len(update) self.log.append(_("Updated %(a)d of %(b)d existing notes.") % dict( a=len(update), b=dupes)) if dupesIgnored: self.log.append(_("Some updates were ignored because note type has changed:")) self.log.extend(dupesIgnored) # export info for calling code self.dupes = dupes self.added = len(add) self.updated = len(update) # add to col self.dst.db.executemany( "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", add) self.dst.db.executemany( "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", update) self.dst.updateFieldCache(dirty) self.dst.tags.registerNotes(dirty) # determine if note is a duplicate, and adjust mid and/or guid as required # returns true if note should be added def _uniquifyNote(self, note): origGuid = note[GUID] srcMid = note[MID] dstMid = self._mid(srcMid) # duplicate schemas? if srcMid == dstMid: return origGuid not in self._notes # differing schemas and note doesn't exist? note[MID] = dstMid if origGuid not in self._notes: return True # as the schemas differ and we already have a note with a different # note type, this note needs a new guid if not self.dupeOnSchemaChange: return False while True: note[GUID] = incGuid(note[GUID]) self._changedGuids[origGuid] = note[GUID] # if we don't have an existing guid, we can add if note[GUID] not in self._notes: return True # if the existing guid shares the same mid, we can reuse if dstMid == self._notes[note[GUID]][MID]: return False # Models ###################################################################### # Models in the two decks may share an ID but not a schema, so we need to # compare the field & template signature rather than just rely on ID. If # the schemas don't match, we increment the mid and try again, creating a # new model if necessary. def _prepareModels(self): "Prepare index of schema hashes." self._modelMap = {} def _mid(self, srcMid): "Return local id for remote MID." # already processed this mid? if srcMid in self._modelMap: return self._modelMap[srcMid] mid = srcMid srcModel = self.src.models.get(srcMid) srcScm = self.src.models.scmhash(srcModel) while True: # missing from target col? if not self.dst.models.have(mid): # copy it over model = srcModel.copy() model['id'] = mid model['mod'] = intTime() model['usn'] = self.col.usn() self.dst.models.update(model) break # there's an existing model; do the schemas match? dstModel = self.dst.models.get(mid) dstScm = self.dst.models.scmhash(dstModel) if srcScm == dstScm: # they do; we can reuse this mid break # as they don't match, try next id mid += 1 # save map and return new mid self._modelMap[srcMid] = mid return mid # Decks ###################################################################### def _did(self, did): "Given did in src col, return local id." # already converted? if did in self._decks: return self._decks[did] # get the name in src g = self.src.decks.get(did) name = g['name'] # if there's a prefix, replace the top level deck if self.deckPrefix: tmpname = "::".join(name.split("::")[1:]) name = self.deckPrefix if tmpname: name += "::" + tmpname # manually create any parents so we can pull in descriptions head = "" for parent in name.split("::")[:-1]: if head: head += "::" head += parent idInSrc = self.src.decks.id(head) self._did(idInSrc) # create in local newid = self.dst.decks.id(name) # pull conf over if 'conf' in g and g['conf'] != 1: self.dst.decks.updateConf(self.src.decks.getConf(g['conf'])) g2 = self.dst.decks.get(newid) g2['conf'] = g['conf'] self.dst.decks.save(g2) # save desc deck = self.dst.decks.get(newid) deck['desc'] = g['desc'] self.dst.decks.save(deck) # add to deck map and return self._decks[did] = newid return newid # Cards ###################################################################### def _importCards(self): # build map of (guid, ord) -> cid and used id cache self._cards = {} existing = {} for guid, ord, cid in self.dst.db.execute( "select f.guid, c.ord, c.id from cards c, notes f " "where c.nid = f.id"): existing[cid] = True self._cards[(guid, ord)] = cid # loop through src cards = [] revlog = [] cnt = 0 usn = self.dst.usn() aheadBy = self.src.sched.today - self.dst.sched.today for card in self.src.db.execute( "select f.guid, f.mid, c.* from cards c, notes f " "where c.nid = f.id"): guid = card[0] if guid in self._changedGuids: guid = self._changedGuids[guid] # does the card's note exist in dst col? if guid not in self._notes: continue dnid = self._notes[guid] # does the card already exist in the dst col? ord = card[5] if (guid, ord) in self._cards: # fixme: in future, could update if newer mod time continue # doesn't exist. strip off note info, and save src id for later card = list(card[2:]) scid = card[0] # ensure the card id is unique while card[0] in existing: card[0] += 999 existing[card[0]] = True # update cid, nid, etc card[1] = self._notes[guid][0] card[2] = self._did(card[2]) card[4] = intTime() card[5] = usn # review cards have a due date relative to collection if card[7] in (2, 3) or card[6] == 2: card[8] -= aheadBy # if odid true, convert card from filtered to normal if card[15]: # odid card[15] = 0 # odue card[8] = card[14] card[14] = 0 # queue if card[6] == 1: # type card[7] = 0 else: card[7] = card[6] # type if card[6] == 1: card[6] = 0 cards.append(card) # we need to import revlog, rewriting card ids and bumping usn for rev in self.src.db.execute( "select * from revlog where cid = ?", scid): rev = list(rev) rev[1] = card[0] rev[2] = self.dst.usn() revlog.append(rev) cnt += 1 # apply self.dst.db.executemany(""" insert or ignore into cards values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""", cards) self.dst.db.executemany(""" insert or ignore into revlog values (?,?,?,?,?,?,?,?,?)""", revlog) self.log.append(ngettext("%d card imported.", "%d cards imported.", cnt) % cnt) # Media ###################################################################### # note: this func only applies to imports of .anki2. for .apkg files, the # apkg importer does the copying def _importStaticMedia(self): # Import any '_foo' prefixed media files regardless of whether # they're used on notes or not dir = self.src.media.dir() if not os.path.exists(dir): return for fname in os.listdir(dir): if fname.startswith("_") and not self.dst.media.have(fname): self._writeDstMedia(fname, self._srcMediaData(fname)) def _mediaData(self, fname, dir=None): if not dir: dir = self.src.media.dir() path = os.path.join(dir, fname) try: return open(path, "rb").read() except (IOError, OSError): return def _srcMediaData(self, fname): "Data for FNAME in src collection." return self._mediaData(fname, self.src.media.dir()) def _dstMediaData(self, fname): "Data for FNAME in dst collection." return self._mediaData(fname, self.dst.media.dir()) def _writeDstMedia(self, fname, data): path = os.path.join(self.dst.media.dir(), unicodedata.normalize("NFC", fname)) try: open(path, "wb").write(data) except (OSError, IOError): # the user likely used subdirectories pass def _mungeMedia(self, mid, fields): fields = splitFields(fields) def repl(match): fname = match.group("fname") srcData = self._srcMediaData(fname) dstData = self._dstMediaData(fname) if not srcData: # file was not in source, ignore return match.group(0) # if model-local file exists from a previous import, use that name, ext = os.path.splitext(fname) lname = "%s_%s%s" % (name, mid, ext) if self.dst.media.have(lname): return match.group(0).replace(fname, lname) # if missing or the same, pass unmodified elif not dstData or srcData == dstData: # need to copy? if not dstData: self._writeDstMedia(fname, srcData) return match.group(0) # exists but does not match, so we need to dedupe self._writeDstMedia(lname, srcData) return match.group(0).replace(fname, lname) for i in range(len(fields)): fields[i] = self.dst.media.transformNames(fields[i], repl) return joinFields(fields) # Post-import cleanup ###################################################################### def _postImport(self): for did in self._decks.values(): self.col.sched.maybeRandomizeDeck(did) # make sure new position is correct self.dst.conf['nextPos'] = self.dst.db.scalar( "select max(due)+1 from cards where type = 0") or 0 self.dst.save() anki-2.0.20+dfsg/anki/importing/anki1.py0000644000175000017500000000306112221204444017552 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import traceback, os, re from anki.lang import _ from anki.upgrade import Upgrader from anki.importing.anki2 import Anki2Importer class Anki1Importer(Anki2Importer): dupeOnSchemaChange = True def run(self): u = Upgrader() # check res = u.check(self.file) if res == "invalid": self.log.append(_( "File is invalid. Please restore from backup.")) raise Exception("invalidFile") # upgrade if res != "ok": self.log.append( "Problems fixed during upgrade:\n***\n%s\n***\n" % res) try: deck = u.upgrade() except: traceback.print_exc() self.log.append(traceback.format_exc()) return # save the conf for later conf = deck.decks.confForDid(1) # merge deck.close() mdir = re.sub(r"\.anki2?$", ".media", self.file) self.deckPrefix = re.sub(r"\.anki$", "", os.path.basename(self.file)) self.file = deck.path Anki2Importer.run(self, mdir) # set imported deck to saved conf id = self.col.decks.confId(self.deckPrefix) conf['id'] = id conf['name'] = self.deckPrefix conf['usn'] = self.col.usn() self.col.decks.updateConf(conf) did = self.col.decks.id(self.deckPrefix) d = self.col.decks.get(did) self.col.decks.setConf(d, id) anki-2.0.20+dfsg/anki/importing/supermemo_xml.py0000644000175000017500000005352212221204444021452 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: petr.michalec@gmail.com # License: GNU GPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import sys from anki.stdmodels import addBasicModel from anki.importing.noteimp import NoteImporter, ForeignNote, ForeignCard from anki.lang import _ from anki.lang import ngettext from xml.dom import minidom from types import DictType, InstanceType from string import capwords import re, unicodedata, time class SmartDict(dict): """ See http://www.peterbe.com/plog/SmartDict Copyright 2005, Peter Bengtsson, peter@fry-it.com A smart dict can be instanciated either from a pythonic dict or an instance object (eg. SQL recordsets) but it ensures that you can do all the convenient lookups such as x.first_name, x['first_name'] or x.get('first_name'). """ def __init__(self, *a, **kw): if a: if type(a[0]) is DictType: kw.update(a[0]) elif type(a[0]) is InstanceType: kw.update(a[0].__dict__) elif hasattr(a[0], '__class__') and a[0].__class__.__name__=='SmartDict': kw.update(a[0].__dict__) dict.__init__(self, **kw) self.__dict__ = self class SuperMemoElement(SmartDict): "SmartDict wrapper to store SM Element data" def __init__(self, *a, **kw): SmartDict.__init__(self, *a, **kw) #default content self.__dict__['lTitle'] = None self.__dict__['Title'] = None self.__dict__['Question'] = None self.__dict__['Answer'] = None self.__dict__['Count'] = None self.__dict__['Type'] = None self.__dict__['ID'] = None self.__dict__['Interval'] = None self.__dict__['Lapses'] = None self.__dict__['Repetitions'] = None self.__dict__['LastRepetiton'] = None self.__dict__['AFactor'] = None self.__dict__['UFactor'] = None # This is an AnkiImporter class SupermemoXmlImporter(NoteImporter): needMapper = False allowHTML = True """ Supermemo XML export's to Anki parser. Goes through a SM collection and fetch all elements. My SM collection was a big mess where topics and items were mixed. I was unable to parse my content in a regular way like for loop on minidom.getElementsByTagName() etc. My collection had also an limitation, topics were splited into branches with max 100 items on each. Learning themes were in deep structure. I wanted to have full title on each element to be stored in tags. Code should be upgrade to support importing of SM2006 exports. """ def __init__(self, *args): """Initialize internal varables. Pameters to be exposed to GUI are stored in self.META""" NoteImporter.__init__(self, *args) m = addBasicModel(self.col) m['name'] = "Supermemo" self.col.models.save(m) self.initMapping() self.lines = None self.numFields=int(2) # SmXmlParse VARIABLES self.xmldoc = None self.pieces = [] self.cntBuf = [] #to store last parsed data self.cntElm = [] #to store SM Elements data self.cntCol = [] #to store SM Colections data # store some meta info related to parse algorithm # SmartDict works like dict / class wrapper self.cntMeta = SmartDict() self.cntMeta.popTitles = False self.cntMeta.title = [] # META stores controls of import scritp, should be # exposed to import dialog. These are default values. self.META = SmartDict() self.META.resetLearningData = False # implemented self.META.onlyMemorizedItems = False # implemented self.META.loggerLevel = 2 # implemented 0no,1info,2error,3debug self.META.tagAllTopics = True self.META.pathsToBeTagged = ['English for begginers', 'Advanced English 97', 'Phrasal Verbs'] # path patterns to be tagged - in gui entered like 'Advanced English 97|My Vocablary' self.META.tagMemorizedItems = True # implemented self.META.logToStdOutput = False # implemented self.notes = [] ## TOOLS def _fudgeText(self, text): "Replace sm syntax to Anki syntax" text = text.replace("\n\r", u"
") text = text.replace("\n", u"
") return text def _unicode2ascii(self,str): "Remove diacritic punctuation from strings (titles)" return u"".join([ c for c in unicodedata.normalize('NFKD', str) if not unicodedata.combining(c)]) def _decode_htmlescapes(self,s): """Unescape HTML code.""" #In case of bad formated html you can import MinimalSoup etc.. see btflsoup source code from BeautifulSoup import BeautifulStoneSoup as btflsoup #my sm2004 also ecaped & char in escaped sequences. s = re.sub(u'&',u'&',s) #unescaped solitary chars < or > that were ok for minidom confuse btfl soup #s = re.sub(u'>',u'>',s) #s = re.sub(u'<',u'<',s) return unicode(btflsoup(s,convertEntities=btflsoup.HTML_ENTITIES )) def _unescape(self,s,initilize): """Note: This method is not used, BeautifulSoup does better job. """ if self._unescape_trtable == None: self._unescape_trtable = ( ('€',u'€'), (' ',u' '), ('!',u'!'), ('"',u'"'), ('#',u'#'), ('$',u'$'), ('%',u'%'), ('&',u'&'), (''',u"'"), ('(',u'('), (')',u')'), ('*',u'*'), ('+',u'+'), (',',u','), ('-',u'-'), ('.',u'.'), ('/',u'/'), ('0',u'0'), ('1',u'1'), ('2',u'2'), ('3',u'3'), ('4',u'4'), ('5',u'5'), ('6',u'6'), ('7',u'7'), ('8',u'8'), ('9',u'9'), (':',u':'), (';',u';'), ('<',u'<'), ('=',u'='), ('>',u'>'), ('?',u'?'), ('@',u'@'), ('A',u'A'), ('B',u'B'), ('C',u'C'), ('D',u'D'), ('E',u'E'), ('F',u'F'), ('G',u'G'), ('H',u'H'), ('I',u'I'), ('J',u'J'), ('K',u'K'), ('L',u'L'), ('M',u'M'), ('N',u'N'), ('O',u'O'), ('P',u'P'), ('Q',u'Q'), ('R',u'R'), ('S',u'S'), ('T',u'T'), ('U',u'U'), ('V',u'V'), ('W',u'W'), ('X',u'X'), ('Y',u'Y'), ('Z',u'Z'), ('[',u'['), ('\',u'\\'), (']',u']'), ('^',u'^'), ('_',u'_'), ('`',u'`'), ('a',u'a'), ('b',u'b'), ('c',u'c'), ('d',u'd'), ('e',u'e'), ('f',u'f'), ('g',u'g'), ('h',u'h'), ('i',u'i'), ('j',u'j'), ('k',u'k'), ('l',u'l'), ('m',u'm'), ('n',u'n'), ('o',u'o'), ('p',u'p'), ('q',u'q'), ('r',u'r'), ('s',u's'), ('t',u't'), ('u',u'u'), ('v',u'v'), ('w',u'w'), ('x',u'x'), ('y',u'y'), ('z',u'z'), ('{',u'{'), ('|',u'|'), ('}',u'}'), ('~',u'~'), (' ',u' '), ('¡',u'¡'), ('¢',u'¢'), ('£',u'£'), ('¤',u'¤'), ('¥',u'¥'), ('¦',u'¦'), ('§',u'§'), ('¨',u'¨'), ('©',u'©'), ('ª',u'ª'), ('«',u'«'), ('¬',u'¬'), ('­',u'­'), ('®',u'®'), ('¯',u'¯'), ('°',u'°'), ('±',u'±'), ('²',u'²'), ('³',u'³'), ('´',u'´'), ('µ',u'µ'), ('¶',u'¶'), ('·',u'·'), ('¸',u'¸'), ('¹',u'¹'), ('º',u'º'), ('»',u'»'), ('¼',u'¼'), ('½',u'½'), ('¾',u'¾'), ('¿',u'¿'), ('À',u'À'), ('Á',u'Á'), ('Â',u'Â'), ('Ã',u'Ã'), ('Ä',u'Ä'), ('Å',u'Å'), ('Å',u'Å'), ('Æ',u'Æ'), ('Ç',u'Ç'), ('È',u'È'), ('É',u'É'), ('Ê',u'Ê'), ('Ë',u'Ë'), ('Ì',u'Ì'), ('Í',u'Í'), ('Î',u'Î'), ('Ï',u'Ï'), ('Ð',u'Ð'), ('Ñ',u'Ñ'), ('Ò',u'Ò'), ('Ó',u'Ó'), ('Ô',u'Ô'), ('Õ',u'Õ'), ('Ö',u'Ö'), ('×',u'×'), ('Ø',u'Ø'), ('Ù',u'Ù'), ('Ú',u'Ú'), ('Û',u'Û'), ('Ü',u'Ü'), ('Ý',u'Ý'), ('Þ',u'Þ'), ('ß',u'ß'), ('à',u'à'), ('á',u'á'), ('â',u'â'), ('ã',u'ã'), ('ä',u'ä'), ('å',u'å'), ('æ',u'æ'), ('ç',u'ç'), ('è',u'è'), ('é',u'é'), ('ê',u'ê'), ('ë',u'ë'), ('ì',u'ì'), ('í',u'í'), ('í',u'í'), ('î',u'î'), ('ï',u'ï'), ('ð',u'ð'), ('ñ',u'ñ'), ('ò',u'ò'), ('ó',u'ó'), ('ô',u'ô'), ('õ',u'õ'), ('ö',u'ö'), ('÷',u'÷'), ('ø',u'ø'), ('ù',u'ù'), ('ú',u'ú'), ('û',u'û'), ('ü',u'ü'), ('ý',u'ý'), ('þ',u'þ'), ('ÿ',u'ÿ'), ('Ā',u'Ā'), ('ā',u'ā'), ('Ă',u'Ă'), ('ă',u'ă'), ('Ą',u'Ą'), ('ą',u'ą'), ('Ć',u'Ć'), ('ć',u'ć'), ('Ĉ',u'Ĉ'), ('ĉ',u'ĉ'), ('Ċ',u'Ċ'), ('ċ',u'ċ'), ('Č',u'Č'), ('č',u'č'), ('Ď',u'Ď'), ('ď',u'ď'), ('Đ',u'Đ'), ('đ',u'đ'), ('Ē',u'Ē'), ('ē',u'ē'), ('Ĕ',u'Ĕ'), ('ĕ',u'ĕ'), ('Ė',u'Ė'), ('ė',u'ė'), ('Ę',u'Ę'), ('ę',u'ę'), ('Ě',u'Ě'), ('ě',u'ě'), ('Ĝ',u'Ĝ'), ('ĝ',u'ĝ'), ('Ğ',u'Ğ'), ('ğ',u'ğ'), ('Ġ',u'Ġ'), ('ġ',u'ġ'), ('Ģ',u'Ģ'), ('ģ',u'ģ'), ('Ĥ',u'Ĥ'), ('ĥ',u'ĥ'), ('Ħ',u'Ħ'), ('ħ',u'ħ'), ('Ĩ',u'Ĩ'), ('ĩ',u'ĩ'), ('Ī',u'Ī'), ('ī',u'ī'), ('Ĭ',u'Ĭ'), ('ĭ',u'ĭ'), ('Į',u'Į'), ('į',u'į'), ('İ',u'İ'), ('ı',u'ı'), ('IJ',u'IJ'), ('ij',u'ij'), ('Ĵ',u'Ĵ'), ('ĵ',u'ĵ'), ('Ķ',u'Ķ'), ('ķ',u'ķ'), ('ĸ',u'ĸ'), ('Ĺ',u'Ĺ'), ('ĺ',u'ĺ'), ('Ļ',u'Ļ'), ('ļ',u'ļ'), ('Ľ',u'Ľ'), ('ľ',u'ľ'), ('Ŀ',u'Ŀ'), ('ŀ',u'ŀ'), ('Ł',u'Ł'), ('ł',u'ł'), ('Ń',u'Ń'), ('ń',u'ń'), ('Ņ',u'Ņ'), ('ņ',u'ņ'), ('Ň',u'Ň'), ('ň',u'ň'), ('ʼn',u'ʼn'), ('Ŋ',u'Ŋ'), ('ŋ',u'ŋ'), ('Ō',u'Ō'), ('ō',u'ō'), ('Ŏ',u'Ŏ'), ('ŏ',u'ŏ'), ('Ő',u'Ő'), ('ő',u'ő'), ('Œ',u'Œ'), ('œ',u'œ'), ('Ŕ',u'Ŕ'), ('ŕ',u'ŕ'), ('Ŗ',u'Ŗ'), ('ŗ',u'ŗ'), ('Ř',u'Ř'), ('ř',u'ř'), ('Ś',u'Ś'), ('ś',u'ś'), ('Ŝ',u'Ŝ'), ('ŝ',u'ŝ'), ('Ş',u'Ş'), ('ş',u'ş'), ('Š',u'Š'), ('š',u'š'), ('Ţ',u'Ţ'), ('ţ',u'ţ'), ('Ť',u'Ť'), ('ť',u'ť'), ('Ŧ',u'Ŧ'), ('ŧ',u'ŧ'), ('Ũ',u'Ũ'), ('ũ',u'ũ'), ('Ū',u'Ū'), ('ū',u'ū'), ('Ŭ',u'Ŭ'), ('ŭ',u'ŭ'), ('Ů',u'Ů'), ('ů',u'ů'), ('Ű',u'Ű'), ('ű',u'ű'), ('Ų',u'Ų'), ('ų',u'ų'), ('Ŵ',u'Ŵ'), ('ŵ',u'ŵ'), ('Ŷ',u'Ŷ'), ('ŷ',u'ŷ'), ('Ÿ',u'Ÿ'), ('Ź',u'Ź'), ('ź',u'ź'), ('Ż',u'Ż'), ('ż',u'ż'), ('Ž',u'Ž'), ('ž',u'ž'), ('ſ',u'ſ'), ('Ŕ',u'Ŕ'), ('ŕ',u'ŕ'), ('Ŗ',u'Ŗ'), ('ŗ',u'ŗ'), ('Ř',u'Ř'), ('ř',u'ř'), ('Ś',u'Ś'), ('ś',u'ś'), ('Ŝ',u'Ŝ'), ('ŝ',u'ŝ'), ('Ş',u'Ş'), ('ş',u'ş'), ('Š',u'Š'), ('š',u'š'), ('Ţ',u'Ţ'), ('ţ',u'ţ'), ('Ť',u'Ť'), ('Ɂ',u'ť'), ('Ŧ',u'Ŧ'), ('ŧ',u'ŧ'), ('Ũ',u'Ũ'), ('ũ',u'ũ'), ('Ū',u'Ū'), ('ū',u'ū'), ('Ŭ',u'Ŭ'), ('ŭ',u'ŭ'), ('Ů',u'Ů'), ('ů',u'ů'), ('Ű',u'Ű'), ('ű',u'ű'), ('Ų',u'Ų'), ('ų',u'ų'), ('Ŵ',u'Ŵ'), ('ŵ',u'ŵ'), ('Ŷ',u'Ŷ'), ('ŷ',u'ŷ'), ('Ÿ',u'Ÿ'), ('Ź',u'Ź'), ('ź',u'ź'), ('Ż',u'Ż'), ('ż',u'ż'), ('Ž',u'Ž'), ('ž',u'ž'), ('ſ',u'ſ'), ) #m = re.match() #s = s.replace(code[0], code[1]) ## DEFAULT IMPORTER METHODS def foreignNotes(self): # Load file and parse it by minidom self.loadSource(self.file) # Migrating content / time consuming part # addItemToCards is called for each sm element self.logger(u'Parsing started.') self.parse() self.logger(u'Parsing done.') # Return imported cards self.total = len(self.notes) self.log.append(ngettext("%d card imported.", "%d cards imported.", self.total) % self.total) return self.notes def fields(self): return 2 ## PARSER METHODS def addItemToCards(self,item): "This method actually do conversion" # new anki card note = ForeignNote() # clean Q and A note.fields.append(self._fudgeText(self._decode_htmlescapes(item.Question))) note.fields.append(self._fudgeText(self._decode_htmlescapes(item.Answer))) note.tags = [] # pre-process scheduling data # convert learning data if (not self.META.resetLearningData and item.Interval >= 1 and getattr(item, "LastRepetition", None)): # migration of LearningData algorithm tLastrep = time.mktime(time.strptime(item.LastRepetition, '%d.%m.%Y')) tToday = time.time() card = ForeignCard() card.ivl = int(item.Interval) card.lapses = int(item.Lapses) card.reps = int(item.Repetitions) + int(item.Lapses) nextDue = tLastrep + (float(item.Interval) * 86400.0) remDays = int((nextDue - time.time())/86400) card.due = self.col.sched.today+remDays card.factor = int(float(item.AFactor.replace(',','.'))*1000) note.cards[0] = card # categories & tags # it's worth to have every theme (tree structure of sm collection) stored in tags, but sometimes not # you can deceide if you are going to tag all toppics or just that containing some pattern tTaggTitle = False for pattern in self.META.pathsToBeTagged: if item.lTitle != None and pattern.lower() in u" ".join(item.lTitle).lower(): tTaggTitle = True break if tTaggTitle or self.META.tagAllTopics: # normalize - remove diacritic punctuation from unicode chars to ascii item.lTitle = [ self._unicode2ascii(topic) for topic in item.lTitle] # Transfrom xyz / aaa / bbb / ccc on Title path to Tag xyzAaaBbbCcc # clean things like [999] or [111-2222] from title path, example: xyz / [1000-1200] zyx / xyz # clean whitespaces # set Capital letters for first char of the word tmp = list(set([ re.sub('(\[[0-9]+\])' , ' ' , i ).replace('_',' ') for i in item.lTitle ])) tmp = list(set([ re.sub('(\W)',' ', i ) for i in tmp ])) tmp = list(set([ re.sub( '^[0-9 ]+$','',i) for i in tmp ])) tmp = list(set([ capwords(i).replace(' ','') for i in tmp ])) tags = [ j[0].lower() + j[1:] for j in tmp if j.strip() <> ''] note.tags += tags if self.META.tagMemorizedItems and item.Interval >0: note.tags.append("Memorized") self.logger(u'Element tags\t- ' + `note.tags`, level=3) self.notes.append(note) def logger(self,text,level=1): "Wrapper for Anki logger" dLevels={0:'',1:u'Info',2:u'Verbose',3:u'Debug'} if level<=self.META.loggerLevel: #self.deck.updateProgress(_(text)) if self.META.logToStdOutput: print self.__class__.__name__+ u" - " + dLevels[level].ljust(9) +u' -\t'+ _(text) # OPEN AND LOAD def openAnything(self,source): "Open any source / actually only openig of files is used" if source == "-": return sys.stdin # try to open with urllib (if source is http, ftp, or file URL) import urllib try: return urllib.urlopen(source) except (IOError, OSError): pass # try to open with native open function (if source is pathname) try: return open(source) except (IOError, OSError): pass # treat source as string import StringIO return StringIO.StringIO(str(source)) def loadSource(self, source): """Load source file and parse with xml.dom.minidom""" self.source = source self.logger(u'Load started...') sock = open(self.source) self.xmldoc = minidom.parse(sock).documentElement sock.close() self.logger(u'Load done.') # PARSE def parse(self, node=None): "Parse method - parses document elements" if node==None and self.xmldoc<>None: node = self.xmldoc _method = "parse_%s" % node.__class__.__name__ if hasattr(self,_method): parseMethod = getattr(self, _method) parseMethod(node) else: self.logger(u'No handler for method %s' % _method, level=3) def parse_Document(self, node): "Parse XML document" self.parse(node.documentElement) def parse_Element(self, node): "Parse XML element" _method = "do_%s" % node.tagName if hasattr(self,_method): handlerMethod = getattr(self, _method) handlerMethod(node) else: self.logger(u'No handler for method %s' % _method, level=3) #print traceback.print_exc() def parse_Text(self, node): "Parse text inside elements. Text is stored into local buffer." text = node.data self.cntBuf.append(text) #def parse_Comment(self, node): # """ # Source can contain XML comments, but we ignore them # """ # pass # DO def do_SuperMemoCollection(self, node): "Process SM Collection" for child in node.childNodes: self.parse(child) def do_SuperMemoElement(self, node): "Process SM Element (Type - Title,Topics)" self.logger('='*45, level=3) self.cntElm.append(SuperMemoElement()) self.cntElm[-1]['lTitle'] = self.cntMeta['title'] #parse all child elements for child in node.childNodes: self.parse(child) #strip all saved strings, just for sure for key in self.cntElm[-1].keys(): if hasattr(self.cntElm[-1][key], 'strip'): self.cntElm[-1][key]=self.cntElm[-1][key].strip() #pop current element smel = self.cntElm.pop() # Process cntElm if is valid Item (and not an Topic etc..) # if smel.Lapses != None and smel.Interval != None and smel.Question != None and smel.Answer != None: if smel.Title == None and smel.Question != None and smel.Answer != None: if smel.Answer.strip() !='' and smel.Question.strip() !='': # migrate only memorized otherway skip/continue if self.META.onlyMemorizedItems and not(int(smel.Interval) > 0): self.logger(u'Element skiped \t- not memorized ...', level=3) else: #import sm element data to Anki self.addItemToCards(smel) self.logger(u"Import element \t- " + smel['Question'], level=3) #print element self.logger('-'*45, level=3) for key in smel.keys(): self.logger('\t%s %s' % ((key+':').ljust(15),smel[key]), level=3 ) else: self.logger(u'Element skiped \t- no valid Q and A ...', level=3) else: # now we know that item was topic # parseing of whole node is now finished # test if it's really topic if smel.Title != None: # remove topic from title list t = self.cntMeta['title'].pop() self.logger(u'End of topic \t- %s' % (t), level=2) def do_Content(self, node): "Process SM element Content" for child in node.childNodes: if hasattr(child,'tagName') and child.firstChild != None: self.cntElm[-1][child.tagName]=child.firstChild.data def do_LearningData(self, node): "Process SM element LearningData" for child in node.childNodes: if hasattr(child,'tagName') and child.firstChild != None: self.cntElm[-1][child.tagName]=child.firstChild.data # It's being processed in do_Content now #def do_Question(self, node): # for child in node.childNodes: self.parse(child) # self.cntElm[-1][node.tagName]=self.cntBuf.pop() # It's being processed in do_Content now #def do_Answer(self, node): # for child in node.childNodes: self.parse(child) # self.cntElm[-1][node.tagName]=self.cntBuf.pop() def do_Title(self, node): "Process SM element Title" t = self._decode_htmlescapes(node.firstChild.data) self.cntElm[-1][node.tagName] = t self.cntMeta['title'].append(t) self.cntElm[-1]['lTitle'] = self.cntMeta['title'] self.logger(u'Start of topic \t- ' + u" / ".join(self.cntMeta['title']), level=2) def do_Type(self, node): "Process SM element Type" if len(self.cntBuf) >=1 : self.cntElm[-1][node.tagName]=self.cntBuf.pop() if __name__ == '__main__': # for testing you can start it standalone #file = u'/home/epcim/hg2g/dev/python/sm2anki/ADVENG2EXP.xxe.esc.zaloha_FINAL.xml' #file = u'/home/epcim/hg2g/dev/python/anki/libanki/tests/importing/supermemo/original_ENGLISHFORBEGGINERS_noOEM.xml' #file = u'/home/epcim/hg2g/dev/python/anki/libanki/tests/importing/supermemo/original_ENGLISHFORBEGGINERS_oem_1250.xml' file = str(sys.argv[1]) impo = SupermemoXmlImporter(Deck(),file) impo.foreignCards() sys.exit(1) # vim: ts=4 sts=2 ft=python anki-2.0.20+dfsg/anki/importing/__init__.py0000644000175000017500000000161512225675305020325 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from anki.importing.csvfile import TextImporter from anki.importing.apkg import AnkiPackageImporter from anki.importing.anki2 import Anki2Importer from anki.importing.anki1 import Anki1Importer from anki.importing.supermemo_xml import SupermemoXmlImporter from anki.importing.mnemo import MnemosyneImporter from anki.importing.pauker import PaukerImporter from anki.lang import _ Importers = ( (_("Text separated by tabs or semicolons (*)"), TextImporter), (_("Packaged Anki Deck (*.apkg *.zip)"), AnkiPackageImporter), (_("Anki 1.2 Deck (*.anki)"), Anki1Importer), (_("Mnemosyne 2.0 Deck (*.db)"), MnemosyneImporter), (_("Supermemo XML export (*.xml)"), SupermemoXmlImporter), (_("Pauker 1.8 Lesson (*.pau.gz)"), PaukerImporter), ) anki-2.0.20+dfsg/anki/importing/csvfile.py0000644000175000017500000001060712221204444020206 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import codecs import csv import re from anki.importing.noteimp import NoteImporter, ForeignNote from anki.lang import _ class TextImporter(NoteImporter): needDelimiter = True patterns = ("\t", ";") def __init__(self, *args): NoteImporter.__init__(self, *args) self.lines = None self.fileobj = None self.delimiter = None self.tagsToAdd = [] def foreignNotes(self): self.open() # process all lines log = [] notes = [] lineNum = 0 ignored = 0 if self.delimiter: reader = csv.reader(self.data, delimiter=self.delimiter, doublequote=True) else: reader = csv.reader(self.data, self.dialect, doublequote=True) try: for row in reader: row = [unicode(x, "utf-8") for x in row] if len(row) != self.numFields: if row: log.append(_( "'%(row)s' had %(num1)d fields, " "expected %(num2)d") % { "row": u" ".join(row), "num1": len(row), "num2": self.numFields, }) ignored += 1 continue note = self.noteFromFields(row) notes.append(note) except (csv.Error), e: log.append(_("Aborted: %s") % str(e)) self.log = log self.ignored = ignored self.fileobj.close() return notes def open(self): "Parse the top line and determine the pattern and number of fields." # load & look for the right pattern self.cacheFile() def cacheFile(self): "Read file into self.lines if not already there." if not self.fileobj: self.openFile() def openFile(self): self.dialect = None self.fileobj = open(self.file, "rbU") self.data = self.fileobj.read() if self.data.startswith(codecs.BOM_UTF8): self.data = self.data[len(codecs.BOM_UTF8):] def sub(s): return re.sub("^\#.*$", "__comment", s) self.data = [sub(x)+"\n" for x in self.data.split("\n") if sub(x) != "__comment"] if self.data: if self.data[0].startswith("tags:"): tags = unicode(self.data[0][5:], "utf8").strip() self.tagsToAdd = tags.split(" ") del self.data[0] self.updateDelimiter() if not self.dialect and not self.delimiter: raise Exception("unknownFormat") def updateDelimiter(self): def err(): raise Exception("unknownFormat") self.dialect = None sniffer = csv.Sniffer() delims = [',', '\t', ';', ':'] if not self.delimiter: try: self.dialect = sniffer.sniff("\n".join(self.data[:10]), delims) except: try: self.dialect = sniffer.sniff(self.data[0], delims) except: pass if self.dialect: try: reader = csv.reader(self.data, self.dialect, doublequote=True) except: err() else: if not self.delimiter: if "\t" in self.data[0]: self.delimiter = "\t" elif ";" in self.data[0]: self.delimiter = ";" elif "," in self.data[0]: self.delimiter = "," else: self.delimiter = " " reader = csv.reader(self.data, delimiter=self.delimiter, doublequote=True) try: while True: row = reader.next() if row: self.numFields = len(row) break except: err() self.initMapping() def fields(self): "Number of fields." self.open() return self.numFields def noteFromFields(self, fields): note = ForeignNote() note.fields.extend([x.strip().replace("\n", "
") for x in fields]) note.tags.extend(self.tagsToAdd) return note anki-2.0.20+dfsg/anki/importing/noteimp.py0000644000175000017500000002273212236707074020245 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import cgi from anki.consts import NEW_CARDS_RANDOM from anki.lang import _ from anki.utils import fieldChecksum, guid64, timestampID, \ joinFields, intTime, splitFields from anki.importing.base import Importer from anki.lang import ngettext # Stores a list of fields, tags and deck ###################################################################### class ForeignNote(object): "An temporary object storing fields and attributes." def __init__(self): self.fields = [] self.tags = [] self.deck = None self.cards = {} # map of ord -> card class ForeignCard(object): def __init__(self): self.due = 0 self.ivl = 1 self.factor = 2500 self.reps = 0 self.lapses = 0 # Base class for CSV and similar text-based imports ###################################################################### # The mapping is list of input fields, like: # ['Expression', 'Reading', '_tags', None] # - None means that the input should be discarded # - _tags maps to note tags # If the first field of the model is not in the map, the map is invalid. # The import mode is one of: # 0: update if first field matches existing note # 1: ignore if first field matches existing note # 2: import even if first field matches existing note class NoteImporter(Importer): needMapper = True needDelimiter = False allowHTML = False importMode = 0 def __init__(self, col, file): Importer.__init__(self, col, file) self.model = col.models.current() self.mapping = None self._deckMap = {} def run(self): "Import." assert self.mapping c = self.foreignNotes() self.importNotes(c) def fields(self): "The number of fields." return 0 def initMapping(self): flds = [f['name'] for f in self.model['flds']] # truncate to provided count flds = flds[0:self.fields()] # if there's room left, add tags if self.fields() > len(flds): flds.append("_tags") # and if there's still room left, pad flds = flds + [None] * (self.fields() - len(flds)) self.mapping = flds def mappingOk(self): return self.model['flds'][0]['name'] in self.mapping def foreignNotes(self): "Return a list of foreign notes for importing." assert 0 def open(self): "Open file and ensure it's in the right format." return def importNotes(self, notes): "Convert each card into a note, apply attributes and add to col." assert self.mappingOk() # note whether tags are mapped self._tagsMapped = False for f in self.mapping: if f == "_tags": self._tagsMapped = True # gather checks for duplicate comparison csums = {} for csum, id in self.col.db.execute( "select csum, id from notes where mid = ?", self.model['id']): if csum in csums: csums[csum].append(id) else: csums[csum] = [id] firsts = {} fld0idx = self.mapping.index(self.model['flds'][0]['name']) self._fmap = self.col.models.fieldMap(self.model) self._nextID = timestampID(self.col.db, "notes") # loop through the notes updates = [] updateLog = [] updateLogTxt = _("First field matched: %s") dupeLogTxt = _("Added duplicate with first field: %s") new = [] self._ids = [] self._cards = [] self._emptyNotes = False for n in notes: if not self.allowHTML: for c in range(len(n.fields)): n.fields[c] = cgi.escape(n.fields[c]) fld0 = n.fields[fld0idx] csum = fieldChecksum(fld0) # first field must exist if not fld0: self.log.append(_("Empty first field: %s") % " ".join(n.fields)) continue # earlier in import? if fld0 in firsts and self.importMode != 2: # duplicates in source file; log and ignore self.log.append(_("Appeared twice in file: %s") % fld0) continue firsts[fld0] = True # already exists? found = False if csum in csums: # csum is not a guarantee; have to check for id in csums[csum]: flds = self.col.db.scalar( "select flds from notes where id = ?", id) sflds = splitFields(flds) if fld0 == sflds[0]: # duplicate found = True if self.importMode == 0: data = self.updateData(n, id, sflds) if data: updates.append(data) updateLog.append(updateLogTxt % fld0) found = True break elif self.importMode == 2: # allow duplicates in this case updateLog.append(dupeLogTxt % fld0) found = False # newly add if not found: data = self.newData(n) if data: new.append(data) # note that we've seen this note once already firsts[fld0] = True self.addNew(new) self.addUpdates(updates) # make sure to update sflds, etc self.col.updateFieldCache(self._ids) # generate cards if self.col.genCards(self._ids): self.log.insert(0, _( "Empty cards found. Please run Tools>Empty Cards.")) # apply scheduling updates self.updateCards() # we randomize or order here, to ensure that siblings # have the same due# did = self.col.decks.selected() conf = self.col.decks.confForDid(did) # in order due? if conf['new']['order'] == NEW_CARDS_RANDOM: self.col.sched.randomizeCards(did) else: self.col.sched.orderCards(did) part1 = ngettext("%d note added", "%d notes added", len(new)) % len(new) part2 = ngettext("%d note updated", "%d notes updated", self.updateCount) % self.updateCount self.log.append("%s, %s." % (part1, part2)) self.log.extend(updateLog) if self._emptyNotes: self.log.append(_("""\ One or more notes were not imported, because they didn't generate any cards. \ This can happen when you have empty fields or when you have not mapped the \ content in the text file to the correct fields.""")) self.total = len(self._ids) def newData(self, n): id = self._nextID self._nextID += 1 self._ids.append(id) if not self.processFields(n): return # note id for card updates later for ord, c in n.cards.items(): self._cards.append((id, ord, c)) self.col.tags.register(n.tags) return [id, guid64(), self.model['id'], intTime(), self.col.usn(), self.col.tags.join(n.tags), n.fieldsStr, "", "", 0, ""] def addNew(self, rows): self.col.db.executemany( "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", rows) # need to document that deck is ignored in this case def updateData(self, n, id, sflds): self._ids.append(id) if not self.processFields(n, sflds): return if self._tagsMapped: self.col.tags.register(n.tags) tags = self.col.tags.join(n.tags) return [intTime(), self.col.usn(), n.fieldsStr, tags, id, n.fieldsStr, tags] else: return [intTime(), self.col.usn(), n.fieldsStr, id, n.fieldsStr] def addUpdates(self, rows): old = self.col.db.totalChanges() if self._tagsMapped: self.col.db.executemany(""" update notes set mod = ?, usn = ?, flds = ?, tags = ? where id = ? and (flds != ? or tags != ?)""", rows) else: self.col.db.executemany(""" update notes set mod = ?, usn = ?, flds = ? where id = ? and flds != ?""", rows) self.updateCount = self.col.db.totalChanges() - old def processFields(self, note, fields=None): if not fields: fields = [""]*len(self.model['flds']) for c, f in enumerate(self.mapping): if not f: continue elif f == "_tags": note.tags.extend(self.col.tags.split(note.fields[c])) else: sidx = self._fmap[f][0] fields[sidx] = note.fields[c] note.fieldsStr = joinFields(fields) ords = self.col.models.availOrds(self.model, note.fieldsStr) if not ords: self._emptyNotes = True return ords def updateCards(self): data = [] for nid, ord, c in self._cards: data.append((c.ivl, c.due, c.factor, c.reps, c.lapses, nid, ord)) # we assume any updated cards are reviews self.col.db.executemany(""" update cards set type = 2, queue = 2, ivl = ?, due = ?, factor = ?, reps = ?, lapses = ? where nid = ? and ord = ?""", data) anki-2.0.20+dfsg/anki/importing/mnemo.py0000644000175000017500000001511112221204444017661 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import time, re from anki.db import DB from anki.importing.noteimp import NoteImporter, ForeignNote, ForeignCard from anki.stdmodels import addBasicModel, addClozeModel from anki.lang import ngettext class MnemosyneImporter(NoteImporter): needMapper = False update = False allowHTML = True def run(self): db = DB(self.file) ver = db.scalar( "select value from global_variables where key='version'") assert ver.startswith('Mnemosyne SQL 1') # gather facts into temp objects curid = None notes = {} note = None for _id, id, k, v in db.execute(""" select _id, id, key, value from facts f, data_for_fact d where f._id=d._fact_id"""): if id != curid: if note: notes[note['_id']] = note note = {'_id': _id} curid = id note[k] = v if note: notes[note['_id']] = note # gather cards front = [] frontback = [] vocabulary = [] cloze = {} for row in db.execute(""" select _fact_id, fact_view_id, tags, next_rep, last_rep, easiness, acq_reps+ret_reps, lapses, card_type_id from cards"""): # categorize note note = notes[row[0]] if row[1].endswith(".1"): if row[1].startswith("1.") or row[1].startswith("1::"): front.append(note) elif row[1].startswith("2.") or row[1].startswith("2::"): frontback.append(note) elif row[1].startswith("3.") or row[1].startswith("3::"): vocabulary.append(note) elif row[1].startswith("5.1"): cloze[row[0]] = note # merge tags into note tags = row[2].replace(", ", "\x1f").replace(" ", "_") tags = tags.replace("\x1f", " ") if "tags" not in note: note['tags'] = [] note['tags'] += self.col.tags.split(tags) note['tags'] = self.col.tags.canonify(note['tags']) # if it's a new card we can go with the defaults if row[3] == -1: continue # add the card c = ForeignCard() c.factor = int(row[5]*1000) c.reps = row[6] c.lapses = row[7] # ivl is inferred in mnemosyne next, prev = row[3:5] c.ivl = max(1, (next - prev)/86400) # work out how long we've got left rem = int((next - time.time())/86400) c.due = self.col.sched.today+rem # get ord m = re.search(".(\d+)$", row[1]) ord = int(m.group(1))-1 if 'cards' not in note: note['cards'] = {} note['cards'][ord] = c self._addFronts(front) total = self.total self._addFrontBacks(frontback) total += self.total self._addVocabulary(vocabulary) self.total += total self._addCloze(cloze) self.total += total self.log.append(ngettext("%d note imported.", "%d notes imported.", self.total) % self.total) def fields(self): return self._fields def _mungeField(self, fld): # \n -> br fld = re.sub("\r?\n", "
", fld) # latex differences fld = re.sub("(?i)<(/?(\$|\$\$|latex))>", "[\\1]", fld) # audio differences fld = re.sub(")?", "[sound:\\1]", fld) return fld def _addFronts(self, notes, model=None, fields=("f", "b")): data = [] for orig in notes: # create a foreign note object n = ForeignNote() n.fields = [] for f in fields: fld = self._mungeField(orig.get(f, '')) n.fields.append(fld) n.tags = orig['tags'] n.cards = orig.get('cards', {}) data.append(n) # add a basic model if not model: model = addBasicModel(self.col) model['name'] = "Mnemosyne-FrontOnly" mm = self.col.models mm.save(model) mm.setCurrent(model) self.model = model self._fields = len(model['flds']) self.initMapping() # import self.importNotes(data) def _addFrontBacks(self, notes): m = addBasicModel(self.col) m['name'] = "Mnemosyne-FrontBack" mm = self.col.models t = mm.newTemplate("Back") t['qfmt'] = "{{Back}}" t['afmt'] = t['qfmt'] + "\n\n
\n\n{{Front}}" mm.addTemplate(m, t) self._addFronts(notes, m) def _addVocabulary(self, notes): mm = self.col.models m = mm.new("Mnemosyne-Vocabulary") for f in "Expression", "Pronunciation", "Meaning", "Notes": fm = mm.newField(f) mm.addField(m, fm) t = mm.newTemplate("Recognition") t['qfmt'] = "{{Expression}}" t['afmt'] = t['qfmt'] + """\n\n
\n\n\ {{Pronunciation}}
\n{{Meaning}}
\n{{Notes}}""" mm.addTemplate(m, t) t = mm.newTemplate("Production") t['qfmt'] = "{{Meaning}}" t['afmt'] = t['qfmt'] + """\n\n
\n\n\ {{Expression}}
\n{{Pronunciation}}
\n{{Notes}}""" mm.addTemplate(m, t) mm.add(m) self._addFronts(notes, m, fields=("f", "p_1", "m_1", "n")) def _addCloze(self, notes): data = [] notes = notes.values() for orig in notes: # create a foreign note object n = ForeignNote() n.fields = [] fld = orig.get("text", "") fld = re.sub("\r?\n", "
", fld) state = dict(n=1) def repl(match): # replace [...] with cloze refs res = ("{{c%d::%s}}" % (state['n'], match.group(1))) state['n'] += 1 return res fld = re.sub("\[(.+?)\]", repl, fld) fld = self._mungeField(fld) n.fields.append(fld) n.fields.append("") # extra n.tags = orig['tags'] n.cards = orig.get('cards', {}) data.append(n) # add cloze model model = addClozeModel(self.col) model['name'] = "Mnemosyne-Cloze" mm = self.col.models mm.save(model) mm.setCurrent(model) self.model = model self._fields = len(model['flds']) self.initMapping() self.importNotes(data) anki-2.0.20+dfsg/anki/sched.py0000644000175000017500000014343112245423152015640 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from __future__ import division import time import random import itertools from operator import itemgetter from heapq import * #from anki.cards import Card from anki.utils import ids2str, intTime, fmtTimeSpan from anki.lang import _ from anki.consts import * from anki.hooks import runHook # queue types: 0=new/cram, 1=lrn, 2=rev, 3=day lrn, -1=suspended, -2=buried # revlog types: 0=lrn, 1=rev, 2=relrn, 3=cram # positive revlog intervals are in days (rev), negative in seconds (lrn) class Scheduler(object): name = "std" haveCustomStudy = True _spreadRev = True _burySiblingsOnAnswer = True def __init__(self, col): self.col = col self.queueLimit = 50 self.reportLimit = 1000 self.reps = 0 self.today = None self._haveQueues = False self._updateCutoff() def getCard(self): "Pop the next card from the queue. None if finished." self._checkDay() if not self._haveQueues: self.reset() card = self._getCard() if card: self.col.log(card) if not self._burySiblingsOnAnswer: self._burySiblings(card) self.reps += 1 card.startTimer() return card def reset(self): self._updateCutoff() self._resetLrn() self._resetRev() self._resetNew() self._haveQueues = True def answerCard(self, card, ease): self.col.log() assert ease >= 1 and ease <= 4 self.col.markReview(card) if self._burySiblingsOnAnswer: self._burySiblings(card) card.reps += 1 # former is for logging new cards, latter also covers filt. decks card.wasNew = card.type == 0 wasNewQ = card.queue == 0 if wasNewQ: # came from the new queue, move to learning card.queue = 1 # if it was a new card, it's now a learning card if card.type == 0: card.type = 1 # init reps to graduation card.left = self._startingLeft(card) # dynamic? if card.odid and card.type == 2: if self._resched(card): # reviews get their ivl boosted on first sight card.ivl = self._dynIvlBoost(card) card.odue = self.today + card.ivl self._updateStats(card, 'new') if card.queue in (1, 3): self._answerLrnCard(card, ease) if not wasNewQ: self._updateStats(card, 'lrn') elif card.queue == 2: self._answerRevCard(card, ease) self._updateStats(card, 'rev') else: raise Exception("Invalid queue") self._updateStats(card, 'time', card.timeTaken()) card.mod = intTime() card.usn = self.col.usn() card.flushSched() def counts(self, card=None): counts = [self.newCount, self.lrnCount, self.revCount] if card: idx = self.countIdx(card) if idx == 1: counts[1] += card.left // 1000 else: counts[idx] += 1 return tuple(counts) def dueForecast(self, days=7): "Return counts over next DAYS. Includes today." daysd = dict(self.col.db.all(""" select due, count() from cards where did in %s and queue = 2 and due between ? and ? group by due order by due""" % self._deckLimit(), self.today, self.today+days-1)) for d in range(days): d = self.today+d if d not in daysd: daysd[d] = 0 # return in sorted order ret = [x[1] for x in sorted(daysd.items())] return ret def countIdx(self, card): if card.queue == 3: return 1 return card.queue def answerButtons(self, card): if card.odue: # normal review in dyn deck? if card.odid and card.queue == 2: return 4 conf = self._lrnConf(card) if card.type in (0,1) or len(conf['delays']) > 1: return 3 return 2 elif card.queue == 2: return 4 else: return 3 def unburyCards(self): "Unbury cards." self.col.conf['lastUnburied'] = self.today self.col.log( self.col.db.list("select id from cards where queue = -2")) self.col.db.execute( "update cards set queue=type where queue = -2") def unburyCardsForDeck(self): sids = ids2str(self.col.decks.active()) self.col.log( self.col.db.list("select id from cards where queue = -2 and did in %s" % sids)) self.col.db.execute( "update cards set mod=?,usn=?,queue=type where queue = -2 and did in %s" % sids, intTime(), self.col.usn()) # Rev/lrn/time daily stats ########################################################################## def _updateStats(self, card, type, cnt=1): key = type+"Today" for g in ([self.col.decks.get(card.did)] + self.col.decks.parents(card.did)): # add g[key][1] += cnt self.col.decks.save(g) def extendLimits(self, new, rev): cur = self.col.decks.current() parents = self.col.decks.parents(cur['id']) children = [self.col.decks.get(did) for (name, did) in self.col.decks.children(cur['id'])] for g in [cur] + parents + children: # add g['newToday'][1] -= new g['revToday'][1] -= rev self.col.decks.save(g) def _walkingCount(self, limFn=None, cntFn=None): tot = 0 pcounts = {} # for each of the active decks for did in self.col.decks.active(): # early alphas were setting the active ids as a str did = int(did) # get the individual deck's limit lim = limFn(self.col.decks.get(did)) if not lim: continue # check the parents parents = self.col.decks.parents(did) for p in parents: # add if missing if p['id'] not in pcounts: pcounts[p['id']] = limFn(p) # take minimum of child and parent lim = min(pcounts[p['id']], lim) # see how many cards we actually have cnt = cntFn(did, lim) # if non-zero, decrement from parent counts for p in parents: pcounts[p['id']] -= cnt # we may also be a parent pcounts[did] = lim - cnt # and add to running total tot += cnt return tot # Deck list ########################################################################## def deckDueList(self): "Returns [deckname, did, rev, lrn, new]" self._checkDay() self.col.decks.recoverOrphans() decks = self.col.decks.all() decks.sort(key=itemgetter('name')) lims = {} data = [] def parent(name): parts = name.split("::") if len(parts) < 2: return None parts = parts[:-1] return "::".join(parts) for deck in decks: # if we've already seen the exact same deck name, remove the # invalid duplicate and reload if deck['name'] in lims: self.col.decks.rem(deck['id'], cardsToo=False, childrenToo=True) return self.deckDueList() p = parent(deck['name']) # new nlim = self._deckNewLimitSingle(deck) if p: if p not in lims: # if parent was missing, this deck is invalid, and we # need to reload the deck list self.col.decks.rem(deck['id'], cardsToo=False, childrenToo=True) return self.deckDueList() nlim = min(nlim, lims[p][0]) new = self._newForDeck(deck['id'], nlim) # learning lrn = self._lrnForDeck(deck['id']) # reviews rlim = self._deckRevLimitSingle(deck) if p: rlim = min(rlim, lims[p][1]) rev = self._revForDeck(deck['id'], rlim) # save to list data.append([deck['name'], deck['id'], rev, lrn, new]) # add deck as a parent lims[deck['name']] = [nlim, rlim] return data def deckDueTree(self): return self._groupChildren(self.deckDueList()) def _groupChildren(self, grps): # first, split the group names into components for g in grps: g[0] = g[0].split("::") # and sort based on those components grps.sort(key=itemgetter(0)) # then run main function return self._groupChildrenMain(grps) def _groupChildrenMain(self, grps): tree = [] # group and recurse def key(grp): return grp[0][0] for (head, tail) in itertools.groupby(grps, key=key): tail = list(tail) did = None rev = 0 new = 0 lrn = 0 children = [] for c in tail: if len(c[0]) == 1: # current node did = c[1] rev += c[2] lrn += c[3] new += c[4] else: # set new string to tail c[0] = c[0][1:] children.append(c) children = self._groupChildrenMain(children) # tally up children counts for ch in children: rev += ch[2] lrn += ch[3] new += ch[4] # limit the counts to the deck's limits conf = self.col.decks.confForDid(did) deck = self.col.decks.get(did) if not conf['dyn']: rev = max(0, min(rev, conf['rev']['perDay']-deck['revToday'][1])) new = max(0, min(new, conf['new']['perDay']-deck['newToday'][1])) tree.append((head, did, rev, lrn, new, children)) return tuple(tree) # Getting the next card ########################################################################## def _getCard(self): "Return the next due card id, or None." # learning card due? c = self._getLrnCard() if c: return c # new first, or time for one? if self._timeForNewCard(): c = self._getNewCard() if c: return c # card due for review? c = self._getRevCard() if c: return c # day learning card due? c = self._getLrnDayCard() if c: return c # new cards left? c = self._getNewCard() if c: return c # collapse or finish return self._getLrnCard(collapse=True) # New cards ########################################################################## def _resetNewCount(self): cntFn = lambda did, lim: self.col.db.scalar(""" select count() from (select 1 from cards where did = ? and queue = 0 limit ?)""", did, lim) self.newCount = self._walkingCount(self._deckNewLimitSingle, cntFn) def _resetNew(self): self._resetNewCount() self._newDids = self.col.decks.active()[:] self._newQueue = [] self._updateNewCardRatio() def _fillNew(self): if self._newQueue: return True if not self.newCount: return False while self._newDids: did = self._newDids[0] lim = min(self.queueLimit, self._deckNewLimit(did)) if lim: # fill the queue with the current did self._newQueue = self.col.db.list(""" select id from cards where did = ? and queue = 0 order by due limit ?""", did, lim) if self._newQueue: self._newQueue.reverse() return True # nothing left in the deck; move to next self._newDids.pop(0) if self.newCount: # if we didn't get a card but the count is non-zero, # we need to check again for any cards that were # removed from the queue but not buried self._resetNew() return self._fillNew() def _getNewCard(self): if self._fillNew(): self.newCount -= 1 return self.col.getCard(self._newQueue.pop()) def _updateNewCardRatio(self): if self.col.conf['newSpread'] == NEW_CARDS_DISTRIBUTE: if self.newCount: self.newCardModulus = ( (self.newCount + self.revCount) // self.newCount) # if there are cards to review, ensure modulo >= 2 if self.revCount: self.newCardModulus = max(2, self.newCardModulus) return self.newCardModulus = 0 def _timeForNewCard(self): "True if it's time to display a new card when distributing." if not self.newCount: return False if self.col.conf['newSpread'] == NEW_CARDS_LAST: return False elif self.col.conf['newSpread'] == NEW_CARDS_FIRST: return True elif self.newCardModulus: return self.reps and self.reps % self.newCardModulus == 0 def _deckNewLimit(self, did, fn=None): if not fn: fn = self._deckNewLimitSingle sel = self.col.decks.get(did) lim = -1 # for the deck and each of its parents for g in [sel] + self.col.decks.parents(did): rem = fn(g) if lim == -1: lim = rem else: lim = min(rem, lim) return lim def _newForDeck(self, did, lim): "New count for a single deck." if not lim: return 0 lim = min(lim, self.reportLimit) return self.col.db.scalar(""" select count() from (select 1 from cards where did = ? and queue = 0 limit ?)""", did, lim) def _deckNewLimitSingle(self, g): "Limit for deck without parent limits." if g['dyn']: return self.reportLimit c = self.col.decks.confForDid(g['id']) return max(0, c['new']['perDay'] - g['newToday'][1]) def totalNewForCurrentDeck(self): return self.col.db.scalar( """ select count() from cards where id in ( select id from cards where did in %s and queue = 0 limit ?)""" % ids2str(self.col.decks.active()), self.reportLimit) # Learning queues ########################################################################## def _resetLrnCount(self): # sub-day self.lrnCount = self.col.db.scalar(""" select sum(left/1000) from (select left from cards where did in %s and queue = 1 and due < ? limit %d)""" % ( self._deckLimit(), self.reportLimit), self.dayCutoff) or 0 # day self.lrnCount += self.col.db.scalar(""" select count() from cards where did in %s and queue = 3 and due <= ? limit %d""" % (self._deckLimit(), self.reportLimit), self.today) def _resetLrn(self): self._resetLrnCount() self._lrnQueue = [] self._lrnDayQueue = [] self._lrnDids = self.col.decks.active()[:] # sub-day learning def _fillLrn(self): if not self.lrnCount: return False if self._lrnQueue: return True self._lrnQueue = self.col.db.all(""" select due, id from cards where did in %s and queue = 1 and due < :lim limit %d""" % (self._deckLimit(), self.reportLimit), lim=self.dayCutoff) # as it arrives sorted by did first, we need to sort it self._lrnQueue.sort() return self._lrnQueue def _getLrnCard(self, collapse=False): if self._fillLrn(): cutoff = time.time() if collapse: cutoff += self.col.conf['collapseTime'] if self._lrnQueue[0][0] < cutoff: id = heappop(self._lrnQueue)[1] card = self.col.getCard(id) self.lrnCount -= card.left // 1000 return card # daily learning def _fillLrnDay(self): if not self.lrnCount: return False if self._lrnDayQueue: return True while self._lrnDids: did = self._lrnDids[0] # fill the queue with the current did self._lrnDayQueue = self.col.db.list(""" select id from cards where did = ? and queue = 3 and due <= ? limit ?""", did, self.today, self.queueLimit) if self._lrnDayQueue: # order r = random.Random() r.seed(self.today) r.shuffle(self._lrnDayQueue) # is the current did empty? if len(self._lrnDayQueue) < self.queueLimit: self._lrnDids.pop(0) return True # nothing left in the deck; move to next self._lrnDids.pop(0) def _getLrnDayCard(self): if self._fillLrnDay(): self.lrnCount -= 1 return self.col.getCard(self._lrnDayQueue.pop()) def _answerLrnCard(self, card, ease): # ease 1=no, 2=yes, 3=remove conf = self._lrnConf(card) if card.odid and not card.wasNew: type = 3 elif card.type == 2: type = 2 else: type = 0 leaving = False # lrnCount was decremented once when card was fetched lastLeft = card.left # immediate graduate? if ease == 3: self._rescheduleAsRev(card, conf, True) leaving = True # graduation time? elif ease == 2 and (card.left%1000)-1 <= 0: self._rescheduleAsRev(card, conf, False) leaving = True else: # one step towards graduation if ease == 2: # decrement real left count and recalculate left today left = (card.left % 1000) - 1 card.left = self._leftToday(conf['delays'], left)*1000 + left # failed else: card.left = self._startingLeft(card) resched = self._resched(card) if 'mult' in conf and resched: # review that's lapsed card.ivl = max(1, conf['minInt'], card.ivl*conf['mult']) else: # new card; no ivl adjustment pass if resched and card.odid: card.odue = self.today + 1 delay = self._delayForGrade(conf, card.left) if card.due < time.time(): # not collapsed; add some randomness delay *= random.uniform(1, 1.25) card.due = int(time.time() + delay) # due today? if card.due < self.dayCutoff: self.lrnCount += card.left // 1000 # if the queue is not empty and there's nothing else to do, make # sure we don't put it at the head of the queue and end up showing # it twice in a row card.queue = 1 if self._lrnQueue and not self.revCount and not self.newCount: smallestDue = self._lrnQueue[0][0] card.due = max(card.due, smallestDue+1) heappush(self._lrnQueue, (card.due, card.id)) else: # the card is due in one or more days, so we need to use the # day learn queue ahead = ((card.due - self.dayCutoff) // 86400) + 1 card.due = self.today + ahead card.queue = 3 self._logLrn(card, ease, conf, leaving, type, lastLeft) def _delayForGrade(self, conf, left): left = left % 1000 try: delay = conf['delays'][-left] except IndexError: if conf['delays']: delay = conf['delays'][0] else: # user deleted final step; use dummy value delay = 1 return delay*60 def _lrnConf(self, card): if card.type == 2: return self._lapseConf(card) else: return self._newConf(card) def _rescheduleAsRev(self, card, conf, early): lapse = card.type == 2 if lapse: if self._resched(card): card.due = max(self.today+1, card.odue) else: card.due = card.odue card.odue = 0 else: self._rescheduleNew(card, conf, early) card.queue = 2 card.type = 2 # if we were dynamic, graduating means moving back to the old deck resched = self._resched(card) if card.odid: card.did = card.odid card.odue = 0 card.odid = 0 # if rescheduling is off, it needs to be set back to a new card if not resched and not lapse: card.queue = card.type = 0 card.due = self.col.nextID("pos") def _startingLeft(self, card): if card.type == 2: conf = self._lapseConf(card) else: conf = self._lrnConf(card) tot = len(conf['delays']) tod = self._leftToday(conf['delays'], tot) return tot + tod*1000 def _leftToday(self, delays, left, now=None): "The number of steps that can be completed by the day cutoff." if not now: now = intTime() delays = delays[-left:] ok = 0 for i in range(len(delays)): now += delays[i]*60 if now > self.dayCutoff: break ok = i return ok+1 def _graduatingIvl(self, card, conf, early, adj=True): if card.type == 2: # lapsed card being relearnt if card.odid: if conf['resched']: return self._dynIvlBoost(card) return card.ivl if not early: # graduate ideal = conf['ints'][0] else: # early remove ideal = conf['ints'][1] if adj: return self._adjRevIvl(card, ideal) else: return ideal def _rescheduleNew(self, card, conf, early): "Reschedule a new card that's graduated for the first time." card.ivl = self._graduatingIvl(card, conf, early) card.due = self.today+card.ivl card.factor = conf['initialFactor'] def _logLrn(self, card, ease, conf, leaving, type, lastLeft): lastIvl = -(self._delayForGrade(conf, lastLeft)) ivl = card.ivl if leaving else -(self._delayForGrade(conf, card.left)) def log(): self.col.db.execute( "insert into revlog values (?,?,?,?,?,?,?,?,?)", int(time.time()*1000), card.id, self.col.usn(), ease, ivl, lastIvl, card.factor, card.timeTaken(), type) try: log() except: # duplicate pk; retry in 10ms time.sleep(0.01) log() def removeLrn(self, ids=None): "Remove cards from the learning queues." if ids: extra = " and id in "+ids2str(ids) else: # benchmarks indicate it's about 10x faster to search all decks # with the index than scan the table extra = " and did in "+ids2str(self.col.decks.allIds()) # review cards in relearning self.col.db.execute(""" update cards set due = odue, queue = 2, mod = %d, usn = %d, odue = 0 where queue in (1,3) and type = 2 %s """ % (intTime(), self.col.usn(), extra)) # new cards in learning self.forgetCards(self.col.db.list( "select id from cards where queue in (1,3) %s" % extra)) def _lrnForDeck(self, did): cnt = self.col.db.scalar( """ select sum(left/1000) from (select left from cards where did = ? and queue = 1 and due < ? limit ?)""", did, intTime() + self.col.conf['collapseTime'], self.reportLimit) or 0 return cnt + self.col.db.scalar( """ select count() from (select 1 from cards where did = ? and queue = 3 and due <= ? limit ?)""", did, self.today, self.reportLimit) # Reviews ########################################################################## def _deckRevLimit(self, did): return self._deckNewLimit(did, self._deckRevLimitSingle) def _deckRevLimitSingle(self, d): if d['dyn']: return self.reportLimit c = self.col.decks.confForDid(d['id']) return max(0, c['rev']['perDay'] - d['revToday'][1]) def _revForDeck(self, did, lim): lim = min(lim, self.reportLimit) return self.col.db.scalar( """ select count() from (select 1 from cards where did = ? and queue = 2 and due <= ? limit ?)""", did, self.today, lim) def _resetRevCount(self): def cntFn(did, lim): return self.col.db.scalar(""" select count() from (select id from cards where did = ? and queue = 2 and due <= ? limit %d)""" % lim, did, self.today) self.revCount = self._walkingCount( self._deckRevLimitSingle, cntFn) def _resetRev(self): self._resetRevCount() self._revQueue = [] self._revDids = self.col.decks.active()[:] def _fillRev(self): if self._revQueue: return True if not self.revCount: return False while self._revDids: did = self._revDids[0] lim = min(self.queueLimit, self._deckRevLimit(did)) if lim: # fill the queue with the current did self._revQueue = self.col.db.list(""" select id from cards where did = ? and queue = 2 and due <= ? limit ?""", did, self.today, lim) if self._revQueue: # ordering if self.col.decks.get(did)['dyn']: # dynamic decks need due order preserved self._revQueue.reverse() else: # random order for regular reviews r = random.Random() r.seed(self.today) r.shuffle(self._revQueue) # is the current did empty? if len(self._revQueue) < lim: self._revDids.pop(0) return True # nothing left in the deck; move to next self._revDids.pop(0) if self.revCount: # if we didn't get a card but the count is non-zero, # we need to check again for any cards that were # removed from the queue but not buried self._resetRev() return self._fillRev() def _getRevCard(self): if self._fillRev(): self.revCount -= 1 return self.col.getCard(self._revQueue.pop()) def totalRevForCurrentDeck(self): return self.col.db.scalar( """ select count() from cards where id in ( select id from cards where did in %s and queue = 2 and due <= ? limit ?)""" % ids2str(self.col.decks.active()), self.today, self.reportLimit) # Answering a review card ########################################################################## def _answerRevCard(self, card, ease): delay = 0 if ease == 1: delay = self._rescheduleLapse(card) else: self._rescheduleRev(card, ease) self._logRev(card, ease, delay) def _rescheduleLapse(self, card): conf = self._lapseConf(card) card.lastIvl = card.ivl if self._resched(card): card.lapses += 1 card.ivl = self._nextLapseIvl(card, conf) card.factor = max(1300, card.factor-200) card.due = self.today + card.ivl # if it's a filtered deck, update odue as well if card.odid: card.odue = card.due # if suspended as a leech, nothing to do delay = 0 if self._checkLeech(card, conf) and card.queue == -1: return delay # if no relearning steps, nothing to do if not conf['delays']: return delay # record rev due date for later if not card.odue: card.odue = card.due delay = self._delayForGrade(conf, 0) card.due = int(delay + time.time()) card.left = self._startingLeft(card) # queue 1 if card.due < self.dayCutoff: self.lrnCount += card.left // 1000 card.queue = 1 heappush(self._lrnQueue, (card.due, card.id)) else: # day learn queue ahead = ((card.due - self.dayCutoff) // 86400) + 1 card.due = self.today + ahead card.queue = 3 return delay def _nextLapseIvl(self, card, conf): return max(conf['minInt'], int(card.ivl*conf['mult'])) def _rescheduleRev(self, card, ease): # update interval card.lastIvl = card.ivl if self._resched(card): self._updateRevIvl(card, ease) # then the rest card.factor = max(1300, card.factor+[-150, 0, 150][ease-2]) card.due = self.today + card.ivl else: card.due = card.odue if card.odid: card.did = card.odid card.odid = 0 card.odue = 0 def _logRev(self, card, ease, delay): def log(): self.col.db.execute( "insert into revlog values (?,?,?,?,?,?,?,?,?)", int(time.time()*1000), card.id, self.col.usn(), ease, -delay or card.ivl, card.lastIvl, card.factor, card.timeTaken(), 1) try: log() except: # duplicate pk; retry in 10ms time.sleep(0.01) log() # Interval management ########################################################################## def _nextRevIvl(self, card, ease): "Ideal next interval for CARD, given EASE." delay = self._daysLate(card) conf = self._revConf(card) fct = card.factor / 1000 ivl2 = self._constrainedIvl((card.ivl + delay // 4) * 1.2, conf, card.ivl) ivl3 = self._constrainedIvl((card.ivl + delay // 2) * fct, conf, ivl2) ivl4 = self._constrainedIvl( (card.ivl + delay) * fct * conf['ease4'], conf, ivl3) if ease == 2: interval = ivl2 elif ease == 3: interval = ivl3 elif ease == 4: interval = ivl4 # interval capped? return min(interval, conf['maxIvl']) def _fuzzedIvl(self, ivl): min, max = self._fuzzIvlRange(ivl) return random.randint(min, max) def _fuzzIvlRange(self, ivl): if ivl < 2: return [1, 1] elif ivl == 2: return [2, 3] elif ivl < 7: fuzz = int(ivl*0.25) elif ivl < 30: fuzz = max(2, int(ivl*0.15)) else: fuzz = max(4, int(ivl*0.05)) # fuzz at least a day fuzz = max(fuzz, 1) return [ivl-fuzz, ivl+fuzz] def _constrainedIvl(self, ivl, conf, prev): "Integer interval after interval factor and prev+1 constraints applied." new = ivl * conf.get('ivlFct', 1) return int(max(new, prev+1)) def _daysLate(self, card): "Number of days later than scheduled." due = card.odue if card.odid else card.due return max(0, self.today - due) def _updateRevIvl(self, card, ease): idealIvl = self._nextRevIvl(card, ease) card.ivl = self._adjRevIvl(card, idealIvl) def _adjRevIvl(self, card, idealIvl): if self._spreadRev: idealIvl = self._fuzzedIvl(idealIvl) return idealIvl # Dynamic deck handling ########################################################################## def rebuildDyn(self, did=None): "Rebuild a dynamic deck." did = did or self.col.decks.selected() deck = self.col.decks.get(did) assert deck['dyn'] # move any existing cards back first, then fill self.emptyDyn(did) ids = self._fillDyn(deck) if not ids: return # and change to our new deck self.col.decks.select(did) return ids def _fillDyn(self, deck): search, limit, order = deck['terms'][0] orderlimit = self._dynOrder(order, limit) search += " -is:suspended -is:buried -deck:filtered" try: ids = self.col.findCards(search, order=orderlimit) except: ids = [] return ids # move the cards over self.col.log(deck['id'], ids) self._moveToDyn(deck['id'], ids) return ids def emptyDyn(self, did, lim=None): if not lim: lim = "did = %s" % did self.col.log(self.col.db.list("select id from cards where %s" % lim)) # move out of cram queue self.col.db.execute(""" update cards set did = odid, queue = (case when type = 1 then 0 else type end), type = (case when type = 1 then 0 else type end), due = odue, odue = 0, odid = 0, usn = ?, mod = ? where %s""" % lim, self.col.usn(), intTime()) def remFromDyn(self, cids): self.emptyDyn(None, "id in %s and odid" % ids2str(cids)) def _dynOrder(self, o, l): if o == DYN_OLDEST: t = "c.mod" elif o == DYN_RANDOM: t = "random()" elif o == DYN_SMALLINT: t = "ivl" elif o == DYN_BIGINT: t = "ivl desc" elif o == DYN_LAPSES: t = "lapses desc" elif o == DYN_ADDED: t = "n.id" elif o == DYN_REVADDED: t = "n.id desc" elif o == DYN_DUE: t = "c.due" elif o == DYN_DUEPRIORITY: t = "(case when queue=2 and due <= %d then (ivl / cast(%d-due+0.001 as real)) else 10000+due end)" % ( self.today, self.today) else: # if we don't understand the term, default to due order t = "c.due" return t + " limit %d" % l def _moveToDyn(self, did, ids): deck = self.col.decks.get(did) data = [] t = intTime(); u = self.col.usn() for c, id in enumerate(ids): # start at -100000 so that reviews are all due data.append((did, -100000+c, t, u, id)) # due reviews stay in the review queue. careful: can't use # "odid or did", as sqlite converts to boolean queue = """ (case when type=2 and (case when odue then odue <= %d else due <= %d end) then 2 else 0 end)""" queue %= (self.today, self.today) self.col.db.executemany(""" update cards set odid = (case when odid then odid else did end), odue = (case when odue then odue else due end), did = ?, queue = %s, due = ?, mod = ?, usn = ? where id = ?""" % queue, data) def _dynIvlBoost(self, card): assert card.odid and card.type == 2 assert card.factor elapsed = card.ivl - (card.odue - self.today) factor = ((card.factor/1000)+1.2)/2 ivl = int(max(card.ivl, elapsed * factor, 1)) conf = self._revConf(card) return min(conf['maxIvl'], ivl) # Leeches ########################################################################## def _checkLeech(self, card, conf): "Leech handler. True if card was a leech." lf = conf['leechFails'] if not lf: return # if over threshold or every half threshold reps after that if (card.lapses >= lf and (card.lapses-lf) % (max(lf // 2, 1)) == 0): # add a leech tag f = card.note() f.addTag("leech") f.flush() # handle a = conf['leechAction'] if a == 0: # if it has an old due, remove it from cram/relearning if card.odue: card.due = card.odue if card.odid: card.did = card.odid card.odue = card.odid = 0 card.queue = -1 # notify UI runHook("leech", card) return True # Tools ########################################################################## def _cardConf(self, card): return self.col.decks.confForDid(card.did) def _newConf(self, card): conf = self._cardConf(card) # normal deck if not card.odid: return conf['new'] # dynamic deck; override some attributes, use original deck for others oconf = self.col.decks.confForDid(card.odid) delays = conf['delays'] or oconf['new']['delays'] return dict( # original deck ints=oconf['new']['ints'], initialFactor=oconf['new']['initialFactor'], bury=oconf['new'].get("bury", True), # overrides delays=delays, separate=conf['separate'], order=NEW_CARDS_DUE, perDay=self.reportLimit ) def _lapseConf(self, card): conf = self._cardConf(card) # normal deck if not card.odid: return conf['lapse'] # dynamic deck; override some attributes, use original deck for others oconf = self.col.decks.confForDid(card.odid) delays = conf['delays'] or oconf['lapse']['delays'] return dict( # original deck minInt=oconf['lapse']['minInt'], leechFails=oconf['lapse']['leechFails'], leechAction=oconf['lapse']['leechAction'], mult=oconf['lapse']['mult'], # overrides delays=delays, resched=conf['resched'], ) def _revConf(self, card): conf = self._cardConf(card) # normal deck if not card.odid: return conf['rev'] # dynamic deck return self.col.decks.confForDid(card.odid)['rev'] def _deckLimit(self): return ids2str(self.col.decks.active()) def _resched(self, card): conf = self._cardConf(card) if not conf['dyn']: return True return conf['resched'] # Daily cutoff ########################################################################## def _updateCutoff(self): oldToday = self.today # days since col created self.today = int((time.time() - self.col.crt) // 86400) # end of day cutoff self.dayCutoff = self.col.crt + (self.today+1)*86400 if oldToday != self.today: self.col.log(self.today, self.dayCutoff) # update all daily counts, but don't save decks to prevent needless # conflicts. we'll save on card answer instead def update(g): for t in "new", "rev", "lrn", "time": key = t+"Today" if g[key][0] != self.today: g[key] = [self.today, 0] for deck in self.col.decks.all(): update(deck) # unbury if the day has rolled over unburied = self.col.conf.get("lastUnburied", 0) if unburied < self.today: self.unburyCards() def _checkDay(self): # check if the day has rolled over if time.time() > self.dayCutoff: self.reset() # Deck finished state ########################################################################## def finishedMsg(self): return (""+_( "Congratulations! You have finished this deck for now.")+ "

" + self._nextDueMsg()) def _nextDueMsg(self): line = [] # the new line replacements are so we don't break translations # in a point release if self.revDue(): line.append(_("""\ Today's review limit has been reached, but there are still cards waiting to be reviewed. For optimum memory, consider increasing the daily limit in the options.""").replace("\n", " ")) if self.newDue(): line.append(_("""\ There are more new cards available, but the daily limit has been reached. You can increase the limit in the options, but please bear in mind that the more new cards you introduce, the higher your short-term review workload will become.""").replace("\n", " ")) if self.haveBuried(): if self.haveCustomStudy: now = " " + _("To see them now, click the Unbury button below.") else: now = "" line.append(_("""\ Some related or buried cards were delayed until a later session.""")+now) if self.haveCustomStudy and not self.col.decks.current()['dyn']: line.append(_("""\ To study outside of the normal schedule, click the Custom Study button below.""")) return "

".join(line) def revDue(self): "True if there are any rev cards due." return self.col.db.scalar( ("select 1 from cards where did in %s and queue = 2 " "and due <= ? limit 1") % self._deckLimit(), self.today) def newDue(self): "True if there are any new cards due." return self.col.db.scalar( ("select 1 from cards where did in %s and queue = 0 " "limit 1") % self._deckLimit()) def haveBuried(self): sdids = ids2str(self.col.decks.active()) cnt = self.col.db.scalar( "select 1 from cards where queue = -2 and did in %s limit 1" % sdids) return not not cnt # Next time reports ########################################################################## def nextIvlStr(self, card, ease, short=False): "Return the next interval for CARD as a string." ivl = self.nextIvl(card, ease) if not ivl: return _("(end)") s = fmtTimeSpan(ivl, short=short) if ivl < self.col.conf['collapseTime']: s = "<"+s return s def nextIvl(self, card, ease): "Return the next interval for CARD, in seconds." if card.queue in (0,1,3): return self._nextLrnIvl(card, ease) elif ease == 1: # lapsed conf = self._lapseConf(card) if conf['delays']: return conf['delays'][0]*60 return self._nextLapseIvl(card, conf)*86400 else: # review return self._nextRevIvl(card, ease)*86400 # this isn't easily extracted from the learn code def _nextLrnIvl(self, card, ease): if card.queue == 0: card.left = self._startingLeft(card) conf = self._lrnConf(card) if ease == 1: # fail return self._delayForGrade(conf, len(conf['delays'])) elif ease == 3: # early removal if not self._resched(card): return 0 return self._graduatingIvl(card, conf, True, adj=False) * 86400 else: left = card.left%1000 - 1 if left <= 0: # graduate if not self._resched(card): return 0 return self._graduatingIvl(card, conf, False, adj=False) * 86400 else: return self._delayForGrade(conf, left) # Suspending ########################################################################## def suspendCards(self, ids): "Suspend cards." self.col.log(ids) self.remFromDyn(ids) self.removeLrn(ids) self.col.db.execute( "update cards set queue=-1,mod=?,usn=? where id in "+ ids2str(ids), intTime(), self.col.usn()) def unsuspendCards(self, ids): "Unsuspend cards." self.col.log(ids) self.col.db.execute( "update cards set queue=type,mod=?,usn=? " "where queue = -1 and id in "+ ids2str(ids), intTime(), self.col.usn()) def buryCards(self, cids): self.col.log(cids) self.remFromDyn(cids) self.removeLrn(cids) self.col.db.execute(""" update cards set queue=-2,mod=?,usn=? where id in """+ids2str(cids), intTime(), self.col.usn()) def buryNote(self, nid): "Bury all cards for note until next session." cids = self.col.db.list( "select id from cards where nid = ? and queue >= 0", nid) self.buryCards(cids) # Sibling spacing ########################################################################## def _burySiblings(self, card): toBury = [] nconf = self._newConf(card) buryNew = nconf.get("bury", True) rconf = self._revConf(card) buryRev = rconf.get("bury", True) # loop through and remove from queues for cid,queue in self.col.db.execute(""" select id, queue from cards where nid=? and id!=? and (queue=0 or (queue=2 and due<=?))""", card.nid, card.id, self.today): if queue == 2: if buryRev: toBury.append(cid) # if bury disabled, we still discard to give same-day spacing try: self._revQueue.remove(cid) except ValueError: pass else: # if bury disabled, we still discard to give same-day spacing if buryNew: toBury.append(cid) try: self._newQueue.remove(cid) except ValueError: pass # then bury if toBury: self.col.db.execute( "update cards set queue=-2,mod=?,usn=? where id in "+ids2str(toBury), intTime(), self.col.usn()) self.col.log(toBury) # Resetting ########################################################################## def forgetCards(self, ids): "Put cards at the end of the new queue." self.remFromDyn(ids) self.col.db.execute( "update cards set type=0,queue=0,ivl=0,due=0,odue=0,factor=?" " where id in "+ids2str(ids), 2500) pmax = self.col.db.scalar( "select max(due) from cards where type=0") or 0 # takes care of mod + usn self.sortCards(ids, start=pmax+1) self.col.log(ids) def reschedCards(self, ids, imin, imax): "Put cards in review queue with a new interval in days (min, max)." d = [] t = self.today mod = intTime() for id in ids: r = random.randint(imin, imax) d.append(dict(id=id, due=r+t, ivl=max(1, r), mod=mod, usn=self.col.usn(), fact=2500)) self.remFromDyn(ids) self.col.db.executemany(""" update cards set type=2,queue=2,ivl=:ivl,due=:due,odue=0, usn=:usn,mod=:mod,factor=:fact where id=:id""", d) self.col.log(ids) def resetCards(self, ids): "Completely reset cards for export." sids = ids2str(ids) # we want to avoid resetting due number of existing new cards on export nonNew = self.col.db.list( "select id from cards where id in %s and (queue != 0 or type != 0)" % sids) # reset all cards self.col.db.execute( "update cards set reps=0,lapses=0,odid=0,odue=0,queue=0" " where id in %s" % sids ) # and forget any non-new cards, changing their due numbers self.forgetCards(nonNew) self.col.log(ids) # Repositioning new cards ########################################################################## def sortCards(self, cids, start=1, step=1, shuffle=False, shift=False): scids = ids2str(cids) now = intTime() nids = [] nidsSet = set() for id in cids: nid = self.col.db.scalar("select nid from cards where id = ?", id) if nid not in nidsSet: nids.append(nid) nidsSet.add(nid) if not nids: # no new cards return # determine nid ordering due = {} if shuffle: random.shuffle(nids) for c, nid in enumerate(nids): due[nid] = start+c*step high = start+c*step # shift? if shift: low = self.col.db.scalar( "select min(due) from cards where due >= ? and type = 0 " "and id not in %s" % scids, start) if low is not None: shiftby = high - low + 1 self.col.db.execute(""" update cards set mod=?, usn=?, due=due+? where id not in %s and due >= ? and queue = 0""" % scids, now, self.col.usn(), shiftby, low) # reorder cards d = [] for id, nid in self.col.db.execute( "select id, nid from cards where type = 0 and id in "+scids): d.append(dict(now=now, due=due[nid], usn=self.col.usn(), cid=id)) self.col.db.executemany( "update cards set due=:due,mod=:now,usn=:usn where id = :cid", d) def randomizeCards(self, did): cids = self.col.db.list("select id from cards where did = ?", did) self.sortCards(cids, shuffle=True) def orderCards(self, did): cids = self.col.db.list("select id from cards where did = ? order by id", did) self.sortCards(cids) def resortConf(self, conf): for did in self.col.decks.didsForConf(conf): if conf['new']['order'] == 0: self.randomizeCards(did) else: self.orderCards(did) # for post-import def maybeRandomizeDeck(self, did=None): if not did: did = self.col.decks.selected() conf = self.col.decks.confForDid(did) # in order due? if conf['new']['order'] == NEW_CARDS_RANDOM: self.randomizeCards(did) anki-2.0.20+dfsg/anki/utils.py0000644000175000017500000002577712237514122015725 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from __future__ import division import re import os import random import time import math import htmlentitydefs import subprocess import tempfile import shutil import string import sys import locale from hashlib import sha1 import platform from anki.lang import _, ngettext if sys.version_info[1] < 5: def format_string(a, b): return a % b locale.format_string = format_string try: import simplejson as json # make sure simplejson's loads() always returns unicode # we don't try to support .load() origLoads = json.loads def loads(s, *args, **kwargs): if not isinstance(s, unicode): s = unicode(s, "utf8") return origLoads(s, *args, **kwargs) json.loads = loads except ImportError: import json # Time handling ############################################################################## def intTime(scale=1): "The time in integer seconds. Pass scale=1000 to get milliseconds." return int(time.time()*scale) timeTable = { "years": lambda n: ngettext("%s year", "%s years", n), "months": lambda n: ngettext("%s month", "%s months", n), "days": lambda n: ngettext("%s day", "%s days", n), "hours": lambda n: ngettext("%s hour", "%s hours", n), "minutes": lambda n: ngettext("%s minute", "%s minutes", n), "seconds": lambda n: ngettext("%s second", "%s seconds", n), } afterTimeTable = { "years": lambda n: ngettext("%s year", "%s years", n), "months": lambda n: ngettext("%s month", "%s months", n), "days": lambda n: ngettext("%s day", "%s days", n), "hours": lambda n: ngettext("%s hour", "%s hours", n), "minutes": lambda n: ngettext("%s minute", "%s minutes", n), "seconds": lambda n: ngettext("%s second", "%s seconds", n), } def shortTimeFmt(type): return { "years": _("%sy"), "months": _("%smo"), "days": _("%sd"), "hours": _("%sh"), "minutes": _("%sm"), "seconds": _("%ss"), }[type] def fmtTimeSpan(time, pad=0, point=0, short=False, after=False, unit=99): "Return a string representing a time span (eg '2 days')." (type, point) = optimalPeriod(time, point, unit) time = convertSecondsTo(time, type) if not point: time = int(round(time)) if short: fmt = shortTimeFmt(type) else: if after: fmt = afterTimeTable[type](_pluralCount(time, point)) else: fmt = timeTable[type](_pluralCount(time, point)) timestr = "%(a)d.%(b)df" % {'a': pad, 'b': point} return locale.format_string("%" + (fmt % timestr), time) def optimalPeriod(time, point, unit): if abs(time) < 60 or unit < 1: type = "seconds" point -= 1 elif abs(time) < 3600 or unit < 2: type = "minutes" elif abs(time) < 60 * 60 * 24 or unit < 3: type = "hours" elif abs(time) < 60 * 60 * 24 * 30 or unit < 4: type = "days" elif abs(time) < 60 * 60 * 24 * 365 or unit < 5: type = "months" point += 1 else: type = "years" point += 1 return (type, max(point, 0)) def convertSecondsTo(seconds, type): if type == "seconds": return seconds elif type == "minutes": return seconds / 60 elif type == "hours": return seconds / 3600 elif type == "days": return seconds / 86400 elif type == "months": return seconds / 2592000 elif type == "years": return seconds / 31536000 assert False def _pluralCount(time, point): if point: return 2 return math.floor(time) # Locale ############################################################################## def fmtPercentage(float_value, point=1): "Return float with percentage sign" fmt = '%' + "0.%(b)df" % {'b': point} return locale.format_string(fmt, float_value) + "%" def fmtFloat(float_value, point=1): "Return a string with decimal separator according to current locale" fmt = '%' + "0.%(b)df" % {'b': point} return locale.format_string(fmt, float_value) # HTML ############################################################################## reStyle = re.compile("(?s).*?") reScript = re.compile("(?s).*?") reTag = re.compile("<.*?>") reEnts = re.compile("&#?\w+;") reMedia = re.compile("]+src=[\"']?([^\"'>]+)[\"']?[^>]*>") def stripHTML(s): s = reStyle.sub("", s) s = reScript.sub("", s) s = reTag.sub("", s) s = entsToTxt(s) return s def stripHTMLMedia(s): "Strip HTML but keep media filenames" s = reMedia.sub(" \\1 ", s) return stripHTML(s) def minimizeHTML(s): "Correct Qt's verbose bold/underline/etc." s = re.sub('(.*?)', '\\1', s) s = re.sub('(.*?)', '\\1', s) s = re.sub('(.*?)', '\\1', s) return s def entsToTxt(html): # entitydefs defines nbsp as \xa0 instead of a standard space, so we # replace it first html = html.replace(" ", " ") def fixup(m): text = m.group(0) if text[:2] == "&#": # character reference try: if text[:3] == "&#x": return unichr(int(text[3:-1], 16)) else: return unichr(int(text[2:-1])) except ValueError: pass else: # named entity try: text = unichr(htmlentitydefs.name2codepoint[text[1:-1]]) except KeyError: pass return text # leave as is return reEnts.sub(fixup, html) # IDs ############################################################################## def hexifyID(id): return "%x" % int(id) def dehexifyID(id): return int(id, 16) def ids2str(ids): """Given a list of integers, return a string '(int1,int2,...)'.""" return "(%s)" % ",".join(str(i) for i in ids) def timestampID(db, table): "Return a non-conflicting timestamp for table." # be careful not to create multiple objects without flushing them, or they # may share an ID. t = intTime(1000) while db.scalar("select id from %s where id = ?" % table, t): t += 1 return t def maxID(db): "Return the first safe ID to use." now = intTime(1000) for tbl in "cards", "notes": now = max(now, db.scalar( "select max(id) from %s" % tbl)) return now + 1 # used in ankiweb def base62(num, extra=""): s = string; table = s.ascii_letters + s.digits + extra buf = "" while num: num, i = divmod(num, len(table)) buf = table[i] + buf return buf _base91_extra_chars = "!#$%&()*+,-./:;<=>?@[]^_`{|}~" def base91(num): # all printable characters minus quotes, backslash and separators return base62(num, _base91_extra_chars) def guid64(): "Return a base91-encoded 64bit random number." return base91(random.randint(0, 2**64-1)) # increment a guid by one, for note type conflicts def incGuid(guid): return _incGuid(guid[::-1])[::-1] def _incGuid(guid): s = string; table = s.ascii_letters + s.digits + _base91_extra_chars idx = table.index(guid[0]) if idx + 1 == len(table): # overflow guid = table[0] + _incGuid(guid[1:]) else: guid = table[idx+1] + guid[1:] return guid # Fields ############################################################################## def joinFields(list): return "\x1f".join(list) def splitFields(string): return string.split("\x1f") # Checksums ############################################################################## def checksum(data): if isinstance(data, unicode): data = data.encode("utf-8") return sha1(data).hexdigest() def fieldChecksum(data): # 32 bit unsigned number from first 8 digits of sha1 hash return int(checksum(stripHTMLMedia(data).encode("utf-8"))[:8], 16) # Temp files ############################################################################## _tmpdir = None def tmpdir(): "A reusable temp folder which we clean out on each program invocation." global _tmpdir if not _tmpdir: def cleanup(): shutil.rmtree(_tmpdir) import atexit atexit.register(cleanup) _tmpdir = unicode(os.path.join(tempfile.gettempdir(), "anki_temp"), sys.getfilesystemencoding()) if not os.path.exists(_tmpdir): os.mkdir(_tmpdir) return _tmpdir def tmpfile(prefix="", suffix=""): (fd, name) = tempfile.mkstemp(dir=tmpdir(), prefix=prefix, suffix=suffix) os.close(fd) return name def namedtmp(name, rm=True): "Return tmpdir+name. Deletes any existing file." path = os.path.join(tmpdir(), name) if rm: try: os.unlink(path) except (OSError, IOError): pass return path # Cmd invocation ############################################################################## def call(argv, wait=True, **kwargs): "Execute a command. If WAIT, return exit code." # ensure we don't open a separate window for forking process on windows if isWin: si = subprocess.STARTUPINFO() try: si.dwFlags |= subprocess.STARTF_USESHOWWINDOW except: si.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW else: si = None # run try: o = subprocess.Popen(argv, startupinfo=si, **kwargs) except OSError: # command not found return -1 # wait for command to finish if wait: while 1: try: ret = o.wait() except OSError: # interrupted system call continue break else: ret = 0 return ret # OS helpers ############################################################################## isMac = sys.platform.startswith("darwin") isWin = sys.platform.startswith("win32") invalidFilenameChars = ":*?\"<>|" def invalidFilename(str, dirsep=True): for c in invalidFilenameChars: if c in str: return c if (dirsep or isWin) and "/" in str: return "/" elif (dirsep or not isWin) and "\\" in str: return "\\" def platDesc(): # we may get an interrupted system call, so try this in a loop n = 0 theos = "unknown" while n < 100: n += 1 try: system = platform.system() if isMac: theos = "mac:%s" % (platform.mac_ver()[0]) elif isWin: theos = "win:%s" % (platform.win32_ver()[0]) elif system == "Linux": dist = platform.dist() theos = "lin:%s:%s" % (dist[0], dist[1]) else: theos = system break except: continue return theos anki-2.0.20+dfsg/anki/js.py0000644000175000017500000000222712256150141015160 0ustar andreasandreasbrowserSel = '''/* CSS Browser Selector v0.4.0 (Nov 02, 2010) Rafael Lima (http://rafael.adm.br) */function css_browser_selector(u){var ua=u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1},g='gecko',w='webkit',s='safari',o='opera',m='mobile',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3.6')?g+' ff3 ff3_6':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('blackberry')?m+' blackberry':is('android')?m+' android':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?m+' j2me':is('iphone')?m+' iphone':is('ipod')?m+' ipod':is('ipad')?m+' ipad':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win'+(is('windows nt 6.0')?' vista':''):is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);''' anki-2.0.20+dfsg/anki/storage.py0000644000175000017500000002557512241123624016223 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import os import copy import re from anki.lang import _ from anki.utils import intTime, json from anki.db import DB from anki.collection import _Collection from anki.consts import * from anki.stdmodels import addBasicModel, addClozeModel, addForwardReverse, \ addForwardOptionalReverse def Collection(path, lock=True, server=False, sync=True, log=False): "Open a new or existing collection. Path must be unicode." assert path.endswith(".anki2") path = os.path.abspath(path) create = not os.path.exists(path) if create: base = os.path.basename(path) for c in ("/", ":", "\\"): assert c not in base # connect db = DB(path) if create: ver = _createDB(db) else: ver = _upgradeSchema(db) db.execute("pragma temp_store = memory") if sync: db.execute("pragma cache_size = 10000") db.execute("pragma journal_mode = wal") else: db.execute("pragma synchronous = off") # add db to col and do any remaining upgrades col = _Collection(db, server, log) if ver < SCHEMA_VERSION: _upgrade(col, ver) elif create: # add in reverse order so basic is default addClozeModel(col) addForwardOptionalReverse(col) addForwardReverse(col) addBasicModel(col) col.save() if lock: col.lock() return col def _upgradeSchema(db): ver = db.scalar("select ver from col") if ver == SCHEMA_VERSION: return ver # add odid to cards, edue->odue ###################################################################### if db.scalar("select ver from col") == 1: db.execute("alter table cards rename to cards2") _addSchema(db, setColConf=False) db.execute(""" insert into cards select id, nid, did, ord, mod, usn, type, queue, due, ivl, factor, reps, lapses, left, edue, 0, flags, data from cards2""") db.execute("drop table cards2") db.execute("update col set ver = 2") _updateIndices(db) # remove did from notes ###################################################################### if db.scalar("select ver from col") == 2: db.execute("alter table notes rename to notes2") _addSchema(db, setColConf=False) db.execute(""" insert into notes select id, guid, mid, mod, usn, tags, flds, sfld, csum, flags, data from notes2""") db.execute("drop table notes2") db.execute("update col set ver = 3") _updateIndices(db) return ver def _upgrade(col, ver): if ver < 3: # new deck properties for d in col.decks.all(): d['dyn'] = 0 d['collapsed'] = False col.decks.save(d) if ver < 4: col.modSchema() clozes = [] for m in col.models.all(): if not "{{cloze:" in m['tmpls'][0]['qfmt']: m['type'] = MODEL_STD col.models.save(m) else: clozes.append(m) for m in clozes: _upgradeClozeModel(col, m) col.db.execute("update col set ver = 4") if ver < 5: col.db.execute("update cards set odue = 0 where queue = 2") col.db.execute("update col set ver = 5") if ver < 6: col.modSchema() import anki.models for m in col.models.all(): m['css'] = anki.models.defaultModel['css'] for t in m['tmpls']: if 'css' not in t: # ankidroid didn't bump version continue m['css'] += "\n" + t['css'].replace( ".card ", ".card%d "%(t['ord']+1)) del t['css'] col.models.save(m) col.db.execute("update col set ver = 6") if ver < 7: col.modSchema() col.db.execute( "update cards set odue = 0 where (type = 1 or queue = 2) " "and not odid") col.db.execute("update col set ver = 7") if ver < 8: col.modSchema() col.db.execute( "update cards set due = due / 1000 where due > 4294967296") col.db.execute("update col set ver = 8") if ver < 9: # adding an empty file to a zip makes python's zip code think it's a # folder, so remove any empty files changed = False dir = col.media.dir() if dir: for f in os.listdir(col.media.dir()): if os.path.isfile(f) and not os.path.getsize(f): os.unlink(f) col.media.db.execute( "delete from log where fname = ?", f) col.media.db.execute( "delete from media where fname = ?", f) changed = True if changed: col.media.db.commit() col.db.execute("update col set ver = 9") if ver < 10: col.db.execute(""" update cards set left = left + left*1000 where queue = 1""") col.db.execute("update col set ver = 10") if ver < 11: col.modSchema() for d in col.decks.all(): if d['dyn']: order = d['order'] # failed order was removed if order >= 5: order -= 1 d['terms'] = [[d['search'], d['limit'], order]] del d['search'] del d['limit'] del d['order'] d['resched'] = True d['return'] = True else: if 'extendNew' not in d: d['extendNew'] = 10 d['extendRev'] = 50 col.decks.save(d) for c in col.decks.allConf(): r = c['rev'] r['ivlFct'] = r.get("ivlfct", 1) if 'ivlfct' in r: del r['ivlfct'] r['maxIvl'] = 36500 col.decks.save(c) for m in col.models.all(): for t in m['tmpls']: t['bqfmt'] = '' t['bafmt'] = '' col.models.save(m) col.db.execute("update col set ver = 11") def _upgradeClozeModel(col, m): m['type'] = MODEL_CLOZE # convert first template t = m['tmpls'][0] for type in 'qfmt', 'afmt': t[type] = re.sub("{{cloze:1:(.+?)}}", r"{{cloze:\1}}", t[type]) t['name'] = _("Cloze") # delete non-cloze cards for the model rem = [] for t in m['tmpls'][1:]: if "{{cloze:" not in t['qfmt']: rem.append(t) for r in rem: col.models.remTemplate(m, r) del m['tmpls'][1:] col.models._updateTemplOrds(m) col.models.save(m) # Creating a new collection ###################################################################### def _createDB(db): db.execute("pragma page_size = 4096") db.execute("pragma legacy_file_format = 0") db.execute("vacuum") _addSchema(db) _updateIndices(db) db.execute("analyze") return SCHEMA_VERSION def _addSchema(db, setColConf=True): db.executescript(""" create table if not exists col ( id integer primary key, crt integer not null, mod integer not null, scm integer not null, ver integer not null, dty integer not null, usn integer not null, ls integer not null, conf text not null, models text not null, decks text not null, dconf text not null, tags text not null ); create table if not exists notes ( id integer primary key, /* 0 */ guid text not null, /* 1 */ mid integer not null, /* 2 */ mod integer not null, /* 3 */ usn integer not null, /* 4 */ tags text not null, /* 5 */ flds text not null, /* 6 */ sfld integer not null, /* 7 */ csum integer not null, /* 8 */ flags integer not null, /* 9 */ data text not null /* 10 */ ); create table if not exists cards ( id integer primary key, /* 0 */ nid integer not null, /* 1 */ did integer not null, /* 2 */ ord integer not null, /* 3 */ mod integer not null, /* 4 */ usn integer not null, /* 5 */ type integer not null, /* 6 */ queue integer not null, /* 7 */ due integer not null, /* 8 */ ivl integer not null, /* 9 */ factor integer not null, /* 10 */ reps integer not null, /* 11 */ lapses integer not null, /* 12 */ left integer not null, /* 13 */ odue integer not null, /* 14 */ odid integer not null, /* 15 */ flags integer not null, /* 16 */ data text not null /* 17 */ ); create table if not exists revlog ( id integer primary key, cid integer not null, usn integer not null, ease integer not null, ivl integer not null, lastIvl integer not null, factor integer not null, time integer not null, type integer not null ); create table if not exists graves ( usn integer not null, oid integer not null, type integer not null ); insert or ignore into col values(1,0,0,%(s)s,%(v)s,0,0,0,'','{}','','','{}'); """ % ({'v':SCHEMA_VERSION, 's':intTime(1000)})) if setColConf: _addColVars(db, *_getColVars(db)) def _getColVars(db): import anki.collection import anki.decks g = copy.deepcopy(anki.decks.defaultDeck) g['id'] = 1 g['name'] = _("Default") g['conf'] = 1 g['mod'] = intTime() gc = copy.deepcopy(anki.decks.defaultConf) gc['id'] = 1 return g, gc, anki.collection.defaultConf.copy() def _addColVars(db, g, gc, c): db.execute(""" update col set conf = ?, decks = ?, dconf = ?""", json.dumps(c), json.dumps({'1': g}), json.dumps({'1': gc})) def _updateIndices(db): "Add indices to the DB." db.executescript(""" -- syncing create index if not exists ix_notes_usn on notes (usn); create index if not exists ix_cards_usn on cards (usn); create index if not exists ix_revlog_usn on revlog (usn); -- card spacing, etc create index if not exists ix_cards_nid on cards (nid); -- scheduling and deck limiting create index if not exists ix_cards_sched on cards (did, queue, due); -- revlog by card create index if not exists ix_revlog_cid on revlog (cid); -- field uniqueness create index if not exists ix_notes_csum on notes (csum); """) anki-2.0.20+dfsg/anki/tags.py0000644000175000017500000001233212221204444015476 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from anki.utils import intTime, ids2str, json from anki.hooks import runHook import re """ Anki maintains a cache of used tags so it can quickly present a list of tags for autocomplete and in the browser. For efficiency, deletions are not tracked, so unused tags can only be removed from the list with a DB check. This module manages the tag cache and tags for notes. """ class TagManager(object): # Registry save/load ############################################################# def __init__(self, col): self.col = col def load(self, json_): self.tags = json.loads(json_) self.changed = False def flush(self): if self.changed: self.col.db.execute("update col set tags=?", json.dumps(self.tags)) self.changed = False # Registering and fetching tags ############################################################# def register(self, tags, usn=None): "Given a list of tags, add any missing ones to tag registry." # case is stored as received, so user can create different case # versions of the same tag if they ignore the qt autocomplete. found = False for t in tags: if t not in self.tags: found = True self.tags[t] = self.col.usn() if usn is None else usn self.changed = True if found: runHook("newTag") def all(self): return self.tags.keys() def registerNotes(self, nids=None): "Add any missing tags from notes to the tags list." # when called without an argument, the old list is cleared first. if nids: lim = " where id in " + ids2str(nids) else: lim = "" self.tags = {} self.changed = True self.register(set(self.split( " ".join(self.col.db.list("select distinct tags from notes"+lim))))) def allItems(self): return self.tags.items() def save(self): self.changed = True # Bulk addition/removal from notes ############################################################# def bulkAdd(self, ids, tags, add=True): "Add tags in bulk. TAGS is space-separated." newTags = self.split(tags) if not newTags: return # cache tag names self.register(newTags) # find notes missing the tags if add: l = "tags not " fn = self.addToStr else: l = "tags " fn = self.remFromStr lim = " or ".join( [l+"like :_%d" % c for c, t in enumerate(newTags)]) res = self.col.db.all( "select id, tags from notes where id in %s and (%s)" % ( ids2str(ids), lim), **dict([("_%d" % x, '%% %s %%' % y) for x, y in enumerate(newTags)])) # update tags nids = [] def fix(row): nids.append(row[0]) return {'id': row[0], 't': fn(tags, row[1]), 'n':intTime(), 'u':self.col.usn()} self.col.db.executemany( "update notes set tags=:t,mod=:n,usn=:u where id = :id", [fix(row) for row in res]) def bulkRem(self, ids, tags): self.bulkAdd(ids, tags, False) # String-based utilities ########################################################################## def split(self, tags): "Parse a string and return a list of tags." return [t for t in tags.split(" ") if t] def join(self, tags): "Join tags into a single string, with leading and trailing spaces." if not tags: return u"" return u" %s " % u" ".join(tags) def addToStr(self, addtags, tags): "Add tags if they don't exist, and canonify." currentTags = self.split(tags) for tag in self.split(addtags): if not self.inList(tag, currentTags): currentTags.append(tag) return self.join(self.canonify(currentTags)) def remFromStr(self, deltags, tags): "Delete tags if they don't exists." currentTags = self.split(tags) for tag in self.split(deltags): # find tags, ignoring case remove = [] for tx in currentTags: if tag.lower() == tx.lower(): remove.append(tx) # remove them for r in remove: currentTags.remove(r) return self.join(currentTags) # List-based utilities ########################################################################## def canonify(self, tagList): "Strip duplicates and sort." strippedTags = [re.sub("[\"']", "", x) for x in tagList] return sorted(set(strippedTags)) def inList(self, tag, tags): "True if TAG is in TAGS. Ignore case." return tag.lower() in [t.lower() for t in tags] # Sync handling ########################################################################## def beforeUpload(self): for k in self.tags.keys(): self.tags[k] = 0 self.save() anki-2.0.20+dfsg/anki/db.py0000644000175000017500000000533212244711667015146 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import os import time try: from pysqlite2 import dbapi2 as sqlite except ImportError: from sqlite3 import dbapi2 as sqlite Error = sqlite.Error class DB(object): def __init__(self, path, text=None, timeout=0): encpath = path if isinstance(encpath, unicode): encpath = path.encode("utf-8") self._db = sqlite.connect(encpath, timeout=timeout) if text: self._db.text_factory = text self._path = path self.echo = os.environ.get("DBECHO") self.mod = False def execute(self, sql, *a, **ka): s = sql.strip().lower() # mark modified? for stmt in "insert", "update", "delete": if s.startswith(stmt): self.mod = True t = time.time() if ka: # execute("...where id = :id", id=5) res = self._db.execute(sql, ka) else: # execute("...where id = ?", 5) res = self._db.execute(sql, a) if self.echo: #print a, ka print sql, "%0.3fms" % ((time.time() - t)*1000) if self.echo == "2": print a, ka return res def executemany(self, sql, l): self.mod = True t = time.time() self._db.executemany(sql, l) if self.echo: print sql, "%0.3fms" % ((time.time() - t)*1000) if self.echo == "2": print l def commit(self): t = time.time() self._db.commit() if self.echo: print "commit %0.3fms" % ((time.time() - t)*1000) def executescript(self, sql): self.mod = True if self.echo: print sql self._db.executescript(sql) def rollback(self): self._db.rollback() def scalar(self, *a, **kw): res = self.execute(*a, **kw).fetchone() if res: return res[0] return None def all(self, *a, **kw): return self.execute(*a, **kw).fetchall() def first(self, *a, **kw): c = self.execute(*a, **kw) res = c.fetchone() c.close() return res def list(self, *a, **kw): return [x[0] for x in self.execute(*a, **kw)] def close(self): self._db.close() def set_progress_handler(self, *args): self._db.set_progress_handler(*args) def __enter__(self): self._db.execute("begin") return self def __exit__(self, exc_type, *args): self._db.close() def totalChanges(self): return self._db.total_changes def interrupt(self): self._db.interrupt() anki-2.0.20+dfsg/anki/ankiweb.certs0000644000175000017500000000642311755052155016667 0ustar andreasandreas-----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIRAP+ceCiXnKf8x8mBIBmTckswDQYJKoZIhvcNAQEFBQAw cTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ29tb2RvIENBIExpbWl0ZWQxFzAVBgNV BAMTDlBvc2l0aXZlU1NMIENBMB4XDTExMDkxNTAwMDAwMFoXDTE0MDkxNDIzNTk1 OVowTzEhMB8GA1UECxMYRG9tYWluIENvbnRyb2wgVmFsaWRhdGVkMRQwEgYDVQQL EwtQb3NpdGl2ZVNTTDEUMBIGA1UEAxMLYW5raXdlYi5uZXQwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQDEDfc2WFrF5mkg4yrrbu/bxqW5SLu1qPp3Vtlv +he8Fzkn44Zc8in7Q/t8pOxRMNq5nRjsKNUr51Zv206Z8aDzV6Mi2LtdHhADTOQW UGa2+ANcvGJg6lCJ4WvQwcDIktO9kGgmlkMvuPAskF+nhRi7TlTaU8lhHlhMV5zu G0XfXjPGitK1m5egIY78PJoVK+M/k44NMxi0sb+XgErXW0k6QdCZvba0z5Heks7+ aIFmLjx7bcEQxQS/+1nIK05nNrDPi7TymwZOM+b2T48t7+x9H9cjEeLUZsCiETja SBLyj/2WLFYfH7jZuwylwcCvJ5PlnutAk7za3iASpGpUvWdFAgMBAAGjggHKMIIB xjAfBgNVHSMEGDAWgBS4yhHpBjF528OUxugZKry7NRYxpDAdBgNVHQ4EFgQUGUTe GYqlhmH/El7O10/hoPgIdqEwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAw HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYLKwYB BAGyMQECAgcwLDAqBggrBgEFBQcCARYeaHR0cDovL3d3dy5wb3NpdGl2ZXNzbC5j b20vQ1BTMGkGA1UdHwRiMGAwL6AtoCuGKWh0dHA6Ly9jcmwuY29tb2RvY2EuY29t L1Bvc2l0aXZlU1NMQ0EuY3JsMC2gK6AphidodHRwOi8vY3JsLmNvbW9kby5uZXQv UG9zaXRpdmVTU0xDQS5jcmwwawYIKwYBBQUHAQEEXzBdMDUGCCsGAQUFBzAChilo dHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9Qb3NpdGl2ZVNTTENBLmNydDAkBggrBgEF BQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMCcGA1UdEQQgMB6CC2Fua2l3 ZWIubmV0gg93d3cuYW5raXdlYi5uZXQwDQYJKoZIhvcNAQEFBQADggEBAI6Mcuwd OQTvTkeZ45j2VcI1hR/nqSf2VnisxRQxNRr+n8grjt1ulqYJWJyOrocUINW7XyoJ jHcFpS30m/E4ZedaHXq++hJqjat140r5TRcBigAHnZj7u69hjAhwG/A6Er0JFbX+ eCwe1SCBUgDLGhcNA4o3cykmgK6qG/drj5/CVwpTVKzQ65JGxEMgWehELraPzbx9 mi3e9BMSC11eEsE6O0CpBL+ENcXngYpyi1R3GYFce9oFk+ps/1yYiUstgStq4obJ 8MdDZKB8qOLFPe097FGRcOz1JRDYDVD8JQ+d+o4T3/EHuxZ2EJXhAXJDc/FoKzru Pb1JBxNB1O0QCmE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- anki-2.0.20+dfsg/anki/sound.py0000644000175000017500000002172512244074455015712 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import re, sys, threading, time, subprocess, os, atexit import random from anki.hooks import addHook from anki.utils import tmpdir, isWin, isMac # Shared utils ########################################################################## _soundReg = "\[sound:(.*?)\]" def playFromText(text): for match in re.findall(_soundReg, text): play(match) def stripSounds(text): return re.sub(_soundReg, "", text) def hasSound(text): return re.search(_soundReg, text) is not None ########################################################################## processingSrc = u"rec.wav" processingDst = u"rec.mp3" processingChain = [] recFiles = [] processingChain = [ ["lame", "rec.wav", processingDst, "--noreplaygain", "--quiet"], ] # don't show box on windows if isWin: si = subprocess.STARTUPINFO() try: si.dwFlags |= subprocess.STARTF_USESHOWWINDOW except: # python2.7+ si.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW else: si = None if isMac: # make sure lame, which is installed in /usr/local/bin, is in the path os.environ['PATH'] += ":" + "/usr/local/bin" dir = os.path.dirname(os.path.abspath(__file__)) dir = os.path.abspath(dir + "/../../../..") os.environ['PATH'] += ":" + dir + "/audio" def retryWait(proc): # osx throws interrupted system call errors frequently while 1: try: return proc.wait() except OSError: continue # Mplayer settings ########################################################################## if isWin: mplayerCmd = ["mplayer.exe", "-ao", "win32"] dir = os.path.dirname(os.path.abspath(sys.argv[0])) os.environ['PATH'] += ";" + dir os.environ['PATH'] += ";" + dir + "\\..\\win\\top" # for testing else: mplayerCmd = ["mplayer"] mplayerCmd += ["-really-quiet", "-noautosub"] # Mplayer in slave mode ########################################################################## mplayerQueue = [] mplayerManager = None mplayerReader = None mplayerEvt = threading.Event() mplayerClear = False class MplayerMonitor(threading.Thread): def run(self): global mplayerClear self.mplayer = None self.deadPlayers = [] while 1: mplayerEvt.wait() mplayerEvt.clear() # clearing queue? if mplayerClear and self.mplayer: try: self.mplayer.stdin.write("stop\n") except: # mplayer quit by user (likely video) self.deadPlayers.append(self.mplayer) self.mplayer = None # loop through files to play while mplayerQueue: # ensure started if not self.mplayer: self.startProcess() # pop a file try: item = mplayerQueue.pop(0) except IndexError: # queue was cleared by main thread continue if mplayerClear: mplayerClear = False extra = "" else: extra = " 1" cmd = 'loadfile "%s"%s\n' % (item, extra) try: self.mplayer.stdin.write(cmd) except: # mplayer has quit and needs restarting self.deadPlayers.append(self.mplayer) self.mplayer = None self.startProcess() self.mplayer.stdin.write(cmd) # if we feed mplayer too fast it loses files time.sleep(1) # wait() on finished processes. we don't want to block on the # wait, so we keep trying each time we're reactivated def clean(pl): if pl.poll() is not None: pl.wait() return False else: return True self.deadPlayers = [pl for pl in self.deadPlayers if clean(pl)] def kill(self): if not self.mplayer: return try: self.mplayer.stdin.write("quit\n") self.deadPlayers.append(self.mplayer) except: pass self.mplayer = None def startProcess(self): try: cmd = mplayerCmd + ["-slave", "-idle"] devnull = file(os.devnull, "w") self.mplayer = subprocess.Popen( cmd, startupinfo=si, stdin=subprocess.PIPE, stdout=devnull, stderr=devnull) except OSError: mplayerEvt.clear() raise Exception("Did you install mplayer?") def queueMplayer(path): ensureMplayerThreads() if isWin and os.path.exists(path): # mplayer on windows doesn't like the encoding, so we create a # temporary file instead. oddly, foreign characters in the dirname # don't seem to matter. dir = tmpdir() name = os.path.join(dir, "audio%s%s" % ( random.randrange(0, 1000000), os.path.splitext(path)[1])) f = open(name, "wb") f.write(open(path, "rb").read()) f.close() # it wants unix paths, too! path = name.replace("\\", "/") path = path.encode(sys.getfilesystemencoding()) else: path = path.encode("utf-8") mplayerQueue.append(path) mplayerEvt.set() def clearMplayerQueue(): global mplayerClear, mplayerQueue mplayerQueue = [] mplayerClear = True mplayerEvt.set() def ensureMplayerThreads(): global mplayerManager if not mplayerManager: mplayerManager = MplayerMonitor() mplayerManager.daemon = True mplayerManager.start() # ensure the tmpdir() exit handler is registered first so it runs # after the mplayer exit tmpdir() # clean up mplayer on exit atexit.register(stopMplayer) def stopMplayer(*args): if not mplayerManager: return mplayerManager.kill() addHook("unloadProfile", stopMplayer) # PyAudio recording ########################################################################## try: import pyaudio import wave PYAU_FORMAT = pyaudio.paInt16 PYAU_CHANNELS = 1 PYAU_RATE = 44100 PYAU_INPUT_INDEX = None except: pass class _Recorder(object): def postprocess(self, encode=True): self.encode = encode for c in processingChain: #print c if not self.encode and c[0] == 'lame': continue try: ret = retryWait(subprocess.Popen(c, startupinfo=si)) except: ret = True if ret: raise Exception(_( "Error running %s") % u" ".join(c)) class PyAudioThreadedRecorder(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.finish = False def run(self): chunk = 1024 try: p = pyaudio.PyAudio() except NameError: raise Exception( "Pyaudio not installed (recording not supported on OSX10.3)") stream = p.open(format=PYAU_FORMAT, channels=PYAU_CHANNELS, rate=PYAU_RATE, input=True, input_device_index=PYAU_INPUT_INDEX, frames_per_buffer=chunk) all = [] while not self.finish: try: data = stream.read(chunk) except IOError, e: if e[1] == pyaudio.paInputOverflowed: data = None else: raise if data: all.append(data) stream.close() p.terminate() data = ''.join(all) wf = wave.open(processingSrc, 'wb') wf.setnchannels(PYAU_CHANNELS) wf.setsampwidth(p.get_sample_size(PYAU_FORMAT)) wf.setframerate(PYAU_RATE) wf.writeframes(data) wf.close() class PyAudioRecorder(_Recorder): def __init__(self): for t in recFiles + [processingSrc, processingDst]: try: os.unlink(t) except OSError: pass self.encode = False def start(self): self.thread = PyAudioThreadedRecorder() self.thread.start() def stop(self): self.thread.finish = True self.thread.join() def file(self): if self.encode: tgt = u"rec%d.mp3" % time.time() os.rename(processingDst, tgt) return tgt else: return processingSrc # Audio interface ########################################################################## _player = queueMplayer _queueEraser = clearMplayerQueue def play(path): _player(path) def clearAudioQueue(): _queueEraser() Recorder = PyAudioRecorder anki-2.0.20+dfsg/anki/__init__.py0000644000175000017500000000211312252567145016311 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import sys import os import platform if sys.version_info[0] > 2: raise Exception("Anki should be run with Python 2") elif sys.version_info[1] < 6: raise Exception("Anki requires Python 2.6+") elif sys.getfilesystemencoding().lower() in ("ascii", "ansi_x3.4-1968"): raise Exception("Anki requires a UTF-8 locale.") try: import simplejson as json except: import json as json if json.__version__ < "1.7.3": raise Exception("SimpleJSON must be 1.7.3 or later.") # add path to bundled third party libs ext = os.path.realpath(os.path.join( os.path.dirname(__file__), "../thirdparty")) sys.path.insert(0, ext) arch = platform.architecture() if arch[1] == "ELF": # add arch-dependent libs sys.path.insert(0, os.path.join(ext, "py2.%d-%s" % ( sys.version_info[1], arch[0][0:2]))) version="2.0.20" # build scripts grep this line, so preserve formatting from anki.storage import Collection __all__ = ["Collection"] anki-2.0.20+dfsg/anki/errors.py0000644000175000017500000000110612021231063016044 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html class AnkiError(Exception): def __init__(self, type, **data): self.type = type self.data = data def __str__(self): m = self.type if self.data: m += ": %s" % repr(self.data) return m class DeckRenameError(Exception): def __init__(self, description): self.description = description def __str__(self): return "Couldn't rename deck: " + self.description anki-2.0.20+dfsg/anki/upgrade.py0000644000175000017500000006746312221204444016206 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/copyleft/agpl.html import time, re, datetime, shutil from anki.utils import intTime, tmpfile, ids2str, splitFields, base91, json from anki.db import DB from anki.collection import _Collection from anki.consts import * from anki.storage import _addSchema, _getColVars, _addColVars, \ _updateIndices # # Upgrading is the first step in migrating to 2.0. # Caller should have called check() on path before calling upgrade(). # class Upgrader(object): def __init__(self): self.tmppath = None # Integrity checking & initial setup ###################################################################### def check(self, path): "Returns 'ok', 'invalid', or log of fixes applied." # copy into a temp file before we open self.tmppath = tmpfile(suffix=".anki2") shutil.copy(path, self.tmppath) # run initial check with DB(self.tmppath) as db: res = self._check(db) # needs fixing? if res not in ("ok", "invalid"): res = self._fix(self.tmppath) # don't allow .upgrade() if invalid if res == "invalid": os.unlink(self.tmppath) self.tmppath = None return res def _check(self, db): # corrupt? try: if db.scalar("pragma integrity_check") != "ok": return "invalid" except: return "invalid" # old version? if db.scalar("select version from decks") < 65: return # ensure we have indices for checks below db.executescript(""" create index if not exists ix_cards_factId on cards (factId); create index if not exists ix_fields_factId on fields (factId); analyze;""") # fields missing a field model? if db.list(""" select id from fields where fieldModelId not in ( select distinct id from fieldModels)"""): return # facts missing a field? if db.list(""" select distinct facts.id from facts, fieldModels where facts.modelId = fieldModels.modelId and fieldModels.id not in (select fieldModelId from fields where factId = facts.id)"""): return # cards missing a fact? if db.list(""" select id from cards where factId not in (select id from facts)"""): return # cards missing a card model? if db.list(""" select id from cards where cardModelId not in (select id from cardModels)"""): return # cards with a card model from the wrong model? if db.list(""" select id from cards where cardModelId not in (select cm.id from cardModels cm, facts f where cm.modelId = f.modelId and f.id = cards.factId)"""): return # facts missing a card? if db.list(""" select facts.id from facts where facts.id not in (select distinct factId from cards)"""): return # dangling fields? if db.list(""" select id from fields where factId not in (select id from facts)"""): return # incorrect types if db.list(""" select id from cards where relativeDelay != (case when successive then 1 when reps then 0 else 2 end)"""): return if db.list(""" select id from cards where type != (case when type >= 0 then relativeDelay else relativeDelay - 3 end)"""): return return "ok" def _fix(self, path): from oldanki import DeckStorage try: deck = DeckStorage.Deck(path, backup=False) except: # if we can't open the file, it's invalid return "invalid" # run a db check res = deck.fixIntegrity() if "Database file is damaged" in res: # we can't recover from a corrupt db return "invalid" # other errors are non-fatal deck.close() return res # Upgrading ###################################################################### def upgrade(self): assert self.tmppath self.db = DB(self.tmppath) self._upgradeSchema() self.col = _Collection(self.db) self._upgradeRest() self.tmppath = None return self.col # Schema upgrade ###################################################################### def _upgradeSchema(self): "Alter tables prior to ORM initialization." db = self.db # speed up the upgrade db.execute("pragma temp_store = memory") db.execute("pragma cache_size = 10000") db.execute("pragma synchronous = off") # these weren't always correctly set db.execute("pragma page_size = 4096") db.execute("pragma legacy_file_format = 0") for mid in db.list("select id from models"): # ensure the ordinals are correct for each cardModel for c, cmid in enumerate(db.list( "select id from cardModels where modelId = ? order by ordinal", mid)): db.execute("update cardModels set ordinal = ? where id = ?", c, cmid) # and fieldModel for c, fmid in enumerate(db.list( "select id from fieldModels where modelId = ? order by ordinal", mid)): db.execute("update fieldModels set ordinal = ? where id = ?", c, fmid) # then fix ordinals numbers on cards & fields db.execute("""update cards set ordinal = (select ordinal from cardModels where cardModels.id = cardModelId)""") db.execute("""update fields set ordinal = (select ordinal from fieldModels where id = fieldModelId)""") # notes ########### # tags should have a leading and trailing space if not empty, and not # use commas db.execute(""" update facts set tags = (case when trim(tags) == "" then "" else " " || replace(replace(trim(tags), ",", " "), " ", " ") || " " end) """) # pull facts into memory, so we can merge them with fields efficiently facts = db.all(""" select id, id, modelId, cast(created*1000 as int), cast(modified as int), 0, tags from facts order by created""") # build field hash fields = {} for (fid, ord, val) in db.execute( "select factId, ordinal, value from fields order by factId, ordinal"): if fid not in fields: fields[fid] = [] val = self._mungeField(val) fields[fid].append((ord, val)) # build insert data and transform ids, and minimize qt's # bold/italics/underline cruft. map = {} data = [] factidmap = {} from anki.utils import minimizeHTML highest = 0 for c, row in enumerate(facts): oldid = row[0] row = list(row) if row[3] <= highest: highest = max(highest, row[3]) + 1 row[3] = highest else: highest = row[3] factidmap[row[0]] = row[3] row[0] = row[3] del row[3] map[oldid] = row[0] # convert old 64bit id into a string, discarding sign bit row[1] = base91(abs(row[1])) row.append(minimizeHTML("\x1f".join([x[1] for x in sorted(fields[oldid])]))) data.append(row) # and put the facts into the new table db.execute("drop table facts") _addSchema(db, False) db.executemany("insert into notes values (?,?,?,?,?,?,?,'','',0,'')", data) db.execute("drop table fields") # cards ########### # we need to pull this into memory, to rewrite the creation time if # it's not unique and update the fact id rows = [] cardidmap = {} highest = 0 for row in db.execute(""" select id, cast(created*1000 as int), factId, ordinal, cast(modified as int), 0, (case relativeDelay when 0 then 1 when 1 then 2 when 2 then 0 end), (case type when 0 then 1 when 1 then 2 when 2 then 0 else type end), cast(due as int), cast(interval as int), cast(factor*1000 as int), reps, noCount from cards order by created"""): # find an unused time row = list(row) if row[1] <= highest: highest = max(highest, row[1]) + 1 row[1] = highest else: highest = row[1] # rewrite fact id row[2] = factidmap[row[2]] # note id change and save all but old id cardidmap[row[0]] = row[1] rows.append(row[1:]) # drop old table and rewrite db.execute("drop table cards") _addSchema(db, False) db.executemany(""" insert into cards values (?,?,1,?,?,?,?,?,?,?,?,?,?,0,0,0,0,"")""", rows) # reviewHistory -> revlog ########### # fetch the data so we can rewrite ids quickly r = [] for row in db.execute(""" select cast(time*1000 as int), cardId, 0, ease, cast(nextInterval as int), cast(lastInterval as int), cast(nextFactor*1000 as int), cast(min(thinkingTime, 60)*1000 as int), yesCount from reviewHistory"""): row = list(row) # new card ids try: row[1] = cardidmap[row[1]] except: # id doesn't exist continue # no ease 0 anymore row[3] = row[3] or 1 # determine type, overwriting yesCount newInt = row[4] oldInt = row[5] yesCnt = row[8] # yesCnt included the current answer if row[3] > 1: yesCnt -= 1 if oldInt < 1: # new or failed if yesCnt: # type=relrn row[8] = 2 else: # type=lrn row[8] = 0 else: # type=rev row[8] = 1 r.append(row) db.executemany( "insert or ignore into revlog values (?,?,?,?,?,?,?,?,?)", r) db.execute("drop table reviewHistory") # deck ########### self._migrateDeckTbl() # tags ########### tags = {} for t in db.list("select tag from tags"): tags[t] = intTime() db.execute("update col set tags = ?", json.dumps(tags)) db.execute("drop table tags") db.execute("drop table cardTags") # the rest ########### db.execute("drop table media") db.execute("drop table sources") self._migrateModels() _updateIndices(db) def _migrateDeckTbl(self): db = self.db db.execute("delete from col") db.execute(""" insert or replace into col select id, cast(created as int), :t, :t, 99, 0, 0, cast(lastSync as int), "", "", "", "", "" from decks""", t=intTime()) # prepare a deck to store the old deck options g, gc, conf = _getColVars(db) # delete old selective study settings, which we can't auto-upgrade easily keys = ("newActive", "newInactive", "revActive", "revInactive") for k in keys: db.execute("delete from deckVars where key=:k", k=k) # copy other settings, ignoring deck order as there's a new default gc['new']['perDay'] = db.scalar("select newCardsPerDay from decks") gc['new']['order'] = min(1, db.scalar("select newCardOrder from decks")) # these are collection level, and can't be imported on a per-deck basis # conf['newSpread'] = db.scalar("select newCardSpacing from decks") # conf['timeLim'] = db.scalar("select sessionTimeLimit from decks") # add any deck vars and save for (k, v) in db.execute("select * from deckVars").fetchall(): if k in ("hexCache", "cssCache"): # ignore pass elif k == "leechFails": gc['lapse']['leechFails'] = int(v) else: conf[k] = v # don't use a learning mode for upgrading users #gc['new']['delays'] = [10] _addColVars(db, g, gc, conf) # clean up db.execute("drop table decks") db.execute("drop table deckVars") def _migrateModels(self): import anki.models db = self.db times = {} mods = {} for row in db.all( "select id, name from models"): # use only first 31 bits if not old anki id t = abs(row[0]) if t > 4294967296: t >>= 32 assert t > 0 m = anki.models.defaultModel.copy() m['id'] = t m['name'] = row[1] m['mod'] = intTime() m['tags'] = [] m['flds'] = self._fieldsForModel(row[0]) m['tmpls'] = self._templatesForModel(row[0], m['flds']) mods[m['id']] = m db.execute("update notes set mid = ? where mid = ?", t, row[0]) # save and clean up db.execute("update col set models = ?", json.dumps(mods)) db.execute("drop table fieldModels") db.execute("drop table cardModels") db.execute("drop table models") def _fieldsForModel(self, mid): import anki.models db = self.db dconf = anki.models.defaultField flds = [] # note: qsize & qcol are used in upgrade then discarded for c, row in enumerate(db.all(""" select name, features, quizFontFamily, quizFontSize, quizFontColour, editFontSize from fieldModels where modelId = ? order by ordinal""", mid)): conf = dconf.copy() (conf['name'], conf['rtl'], conf['font'], conf['qsize'], conf['qcol'], conf['size']) = row conf['ord'] = c # ensure data is good conf['rtl'] = not not conf['rtl'] conf['font'] = conf['font'] or "Arial" conf['size'] = 12 # will be removed later in upgrade conf['qcol'] = conf['qcol'] or "#000" conf['qsize'] = conf['qsize'] or 20 flds.append(conf) return flds def _templatesForModel(self, mid, flds): import anki.models db = self.db dconf = anki.models.defaultTemplate tmpls = [] for c, row in enumerate(db.all(""" select name, active, qformat, aformat, questionInAnswer, questionAlign, lastFontColour, typeAnswer from cardModels where modelId = ? order by ordinal""", mid)): conf = dconf.copy() (conf['name'], conf['actv'], conf['qfmt'], conf['afmt'], # the following are used in upgrade then discarded hideq, conf['align'], conf['bg'], typeAns) = row conf['ord'] = c for type in ("qfmt", "afmt"): # ensure the new style field format conf[type] = re.sub("%\((.+?)\)s", "{{\\1}}", conf[type]) # some special names have changed conf[type] = re.sub( "(?i){{tags}}", "{{Tags}}", conf[type]) conf[type] = re.sub( "(?i){{cardModel}}", "{{Card}}", conf[type]) conf[type] = re.sub( "(?i){{modelTags}}", "{{Type}}", conf[type]) # type answer is now embedded in the format if typeAns: if type == "qfmt" or hideq: conf[type] += '
{{type:%s}}' % typeAns # q fields now in a if not hideq: conf['afmt'] = ( "{{FrontSide}}\n\n


\n\n" + conf['afmt']) tmpls.append(conf) return tmpls # Field munging ###################################################################### def _mungeField(self, val): # we no longer wrap fields in white-space: pre-wrap, so we need to # convert previous whitespace into non-breaking spaces def repl(match): return match.group(1).replace(" ", " ") return re.sub("( +)", repl, val) # Template upgrading ###################################################################### # - {{field}} no longer inserts an implicit span, so we make the span # explicit on upgrade. # - likewise with alignment and background color def _upgradeTemplates(self): d = self.col for m in d.models.all(): # cache field styles styles = {} for f in m['flds']: attrs = [] if f['font'].lower() != 'arial': attrs.append("font-family: %s" % f['font']) if f['qsize'] != 20: attrs.append("font-size: %spx" % f['qsize']) if f['qcol'] not in ("black", "#000"): attrs.append("color: %s" % f['qcol']) if f['rtl']: attrs.append("direction: rtl; unicode-bidi: embed") if attrs: styles[f['name']] = '{{%s}}' % ( "; ".join(attrs), f['name']) # obsolete del f['qcol'] del f['qsize'] # then for each template for t in m['tmpls']: def repl(match): field = match.group(2) if field in styles: return match.group(1) + styles[field] # special or non-existant field; leave alone return match.group(0) for k in 'qfmt', 'afmt': # replace old field references t[k] = re.sub("(^|[^{]){{([^{}]+)?}}", repl, t[k]) # then strip extra {}s from other fields t[k] = t[k].replace("{{{", "{{").replace("}}}", "}}") # remove superfluous formatting from 1.0 -> 1.2 upgrade t[k] = re.sub("font-size: ?20px;?", "", t[k]) t[k] = re.sub("(?i)font-family: ?arial;?", "", t[k]) t[k] = re.sub("color: ?#000(000)?;?", "", t[k]) t[k] = re.sub("white-space: ?pre-wrap;?", "", t[k]) # new furigana handling if "japanese" in m['name'].lower(): if k == 'qfmt': t[k] = t[k].replace( "{{Reading}}", "{{kana:Reading}}") else: t[k] = t[k].replace( "{{Reading}}", "{{furigana:Reading}}") # adjust css css = "" if t['bg'] != "white" and t['bg'].lower() != "#ffffff": css = "background-color: %s;" % t['bg'] if t['align']: css += "text-align: %s" % ("left", "right")[t['align']-1] if css: css = '\n.card%d { %s }' % (t['ord']+1, css) m['css'] += css # remove obsolete del t['bg'] del t['align'] # save model d.models.save(m) # Media references ###################################################################### # In 2.0 we drop support for media and latex references in the template, # since they require generating card templates to see what media a note # uses, and are confusing for shared deck users. To ease the upgrade # process, we automatically convert the references to new fields. def _rewriteMediaRefs(self): col = self.col def rewriteRef(key): all = match.group(0) fname = match.group("fname") if all in state['mflds']: # we've converted this field before new = state['mflds'][all] else: # get field name and any prefix/suffix m2 = re.match( "([^{]*)\{\{\{?(?:text:)?([^}]+)\}\}\}?(.*)", fname) # not a field reference? if not m2: return pre, ofld, suf = m2.groups() # get index of field name try: idx = col.models.fieldMap(m)[ofld][0] except: # invalid field or tag reference; don't rewrite return # find a free field name while 1: state['fields'] += 1 fld = "Media %d" % state['fields'] if fld not in col.models.fieldMap(m).keys(): break # add the new field f = col.models.newField(fld) f['qsize'] = 20 f['qcol'] = '#000' col.models.addField(m, f) # loop through notes and write reference into new field data = [] for id, flds in self.col.db.execute( "select id, flds from notes where id in "+ ids2str(col.models.nids(m))): sflds = splitFields(flds) ref = all.replace(fname, pre+sflds[idx]+suf) data.append((flds+ref, id)) # update notes col.db.executemany("update notes set flds=? where id=?", data) # note field for future state['mflds'][fname] = fld new = fld # rewrite reference in template t[key] = t[key].replace(all, "{{{%s}}}" % new) regexps = col.media.regexps + [ r"(\[latex\](?P.+?)\[/latex\])", r"(\[\$\](?P.+?)\[/\$\])", r"(\[\$\$\](?P.+?)\[/\$\$\])"] # process each model for m in col.models.all(): state = dict(mflds={}, fields=0) for t in m['tmpls']: for r in regexps: for match in re.finditer(r, t['qfmt']): rewriteRef('qfmt') for match in re.finditer(r, t['afmt']): rewriteRef('afmt') if state['fields']: col.models.save(m) # Inactive templates ###################################################################### # Templates can't be declared as inactive anymore. Remove any that are # marked inactive and have no dependent cards. def _removeInactive(self): d = self.col for m in d.models.all(): remove = [] for t in m['tmpls']: if not t['actv']: if not d.db.scalar(""" select 1 from cards where nid in (select id from notes where mid = ?) and ord = ? limit 1""", m['id'], t['ord']): remove.append(t) del t['actv'] for r in remove: try: d.models.remTemplate(m, r) except AssertionError: # if the model was unused this could result in all # templates being removed; ignore error pass d.models.save(m) # Conditional templates ###################################################################### # For models that don't use a given template in all cards, we'll need to # add a new field to notes to indicate if the card should be generated or not def _addFlagFields(self): for m in self.col.models.all(): nids = self.col.models.nids(m) changed = False for tmpl in m['tmpls']: if self._addFlagFieldsForTemplate(m, nids, tmpl): changed = True if changed: # save model self.col.models.save(m, templates=True) def _addFlagFieldsForTemplate(self, m, nids, tmpl): cids = self.col.db.list( "select id from cards where nid in %s and ord = ?" % ids2str(nids), tmpl['ord']) if len(cids) == len(nids): # not selectively used return # add a flag field name = tmpl['name'] have = [f['name'] for f in m['flds']] while name in have: name += "_" f = self.col.models.newField(name) self.col.models.addField(m, f) # find the notes that have that card haveNids = self.col.db.list( "select nid from cards where id in "+ids2str(cids)) # add "y" to the appended field for those notes self.col.db.execute( "update notes set flds = flds || 'y' where id in "+ids2str( haveNids)) # wrap the template in a conditional tmpl['qfmt'] = "{{#%s}}\n%s\n{{/%s}}" % ( f['name'], tmpl['qfmt'], f['name']) return True # Post-schema upgrade ###################################################################### def _upgradeRest(self): "Handle the rest of the upgrade to 2.0." col = self.col # make sure we have a current model id col.models.setCurrent(col.models.models.values()[0]) # remove unused templates that were marked inactive self._removeInactive() # rewrite media references in card template self._rewriteMediaRefs() # template handling has changed self._upgradeTemplates() # add fields for selectively used templates self._addFlagFields() # fix creation time col.sched._updateCutoff() d = datetime.datetime.today() d -= datetime.timedelta(hours=4) d = datetime.datetime(d.year, d.month, d.day) d += datetime.timedelta(hours=4) d -= datetime.timedelta(days=1+int((time.time()-col.crt)/86400)) col.crt = int(time.mktime(d.timetuple())) col.sched._updateCutoff() # update uniq cache col.updateFieldCache(col.db.list("select id from notes")) # remove old views for v in ("failedCards", "revCardsOld", "revCardsNew", "revCardsDue", "revCardsRandom", "acqCardsRandom", "acqCardsOld", "acqCardsNew"): col.db.execute("drop view if exists %s" % v) # remove stats, as it's all in the revlog now col.db.execute("drop table if exists stats") # suspended cards don't use ranges anymore col.db.execute("update cards set queue=-1 where queue between -3 and -1") col.db.execute("update cards set queue=-2 where queue between 3 and 5") col.db.execute("update cards set queue=type where queue between 6 and 8") # remove old deleted tables for t in ("cards", "notes", "models", "media"): col.db.execute("drop table if exists %sDeleted" % t) # and failed cards left = len(col.decks.confForDid(1)['lapse']['delays'])*1001 col.db.execute(""" update cards set left=?,type=1,queue=1,ivl=1 where type=1 and ivl <= 1 and queue>=0""", left) col.db.execute(""" update cards set odue=?,left=?,type=2 where type=1 and ivl > 1 and queue>=0""", col.sched.today+1, left) # and due cards col.db.execute(""" update cards set due = cast( (case when due < :stamp then 0 else 1 end) + ((due-:stamp)/86400) as int)+:today where type = 2 """, stamp=col.sched.dayCutoff, today=col.sched.today) # lapses were counted differently in 1.0, so we should have a higher # default lapse threshold for d in col.decks.allConf(): d['lapse']['leechFails'] = 16 col.decks.save(d) # possibly re-randomize conf = col.decks.allConf()[0] if not conf['new']['order']: col.sched.randomizeCards(1) else: col.sched.orderCards(1) # optimize and finish col.db.commit() col.db.execute("vacuum") col.db.execute("analyze") col.db.execute("update col set ver = ?", SCHEMA_VERSION) col.save() anki-2.0.20+dfsg/anki/exporting.py0000644000175000017500000002177412227223667016607 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import re, os, zipfile, shutil from anki.lang import _ from anki.utils import ids2str, splitFields, json from anki.hooks import runHook from anki import Collection class Exporter(object): def __init__(self, col, did=None): self.col = col self.did = did def exportInto(self, path): self._escapeCount = 0 file = open(path, "wb") self.doExport(file) file.close() def escapeText(self, text): "Escape newlines, tabs and CSS." text = text.replace("\n", "
") text = text.replace("\t", " " * 8) text = re.sub("(?i)", "", text) return text def cardIds(self): if not self.did: cids = self.col.db.list("select id from cards") else: cids = self.col.decks.cids(self.did, children=True) self.count = len(cids) return cids # Cards as TSV ###################################################################### class TextCardExporter(Exporter): key = _("Cards in Plain Text") ext = ".txt" hideTags = True def __init__(self, col): Exporter.__init__(self, col) def doExport(self, file): ids = sorted(self.cardIds()) strids = ids2str(ids) def esc(s): # strip off the repeated question in answer if exists s = re.sub("(?si)^.*
\n*", "", s) return self.escapeText(s) out = "" for cid in ids: c = self.col.getCard(cid) out += esc(c.q()) out += "\t" + esc(c.a()) + "\n" file.write(out.encode("utf-8")) # Notes as TSV ###################################################################### class TextNoteExporter(Exporter): key = _("Notes in Plain Text") ext = ".txt" def __init__(self, col): Exporter.__init__(self, col) self.includeID = False self.includeTags = True def doExport(self, file): cardIds = self.cardIds() data = [] for id, flds, tags in self.col.db.execute(""" select guid, flds, tags from notes where id in (select nid from cards where cards.id in %s)""" % ids2str(cardIds)): row = [] # note id if self.includeID: row.append(str(id)) # fields row.extend([self.escapeText(f) for f in splitFields(flds)]) # tags if self.includeTags: row.append(tags.strip()) data.append("\t".join(row)) self.count = len(data) out = "\n".join(data) file.write(out.encode("utf-8")) # Anki decks ###################################################################### # media files are stored in self.mediaFiles, but not exported. class AnkiExporter(Exporter): key = _("Anki 2.0 Deck") ext = ".anki2" def __init__(self, col): Exporter.__init__(self, col) self.includeSched = False self.includeMedia = True def exportInto(self, path): # create a new collection at the target try: os.unlink(path) except (IOError, OSError): pass self.dst = Collection(path) self.src = self.col # find cards if not self.did: cids = self.src.db.list("select id from cards") else: cids = self.src.decks.cids(self.did, children=True) # copy cards, noting used nids nids = {} data = [] for row in self.src.db.execute( "select * from cards where id in "+ids2str(cids)): nids[row[1]] = True data.append(row) self.dst.db.executemany( "insert into cards values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", data) # notes strnids = ids2str(nids.keys()) notedata = self.src.db.all("select * from notes where id in "+ strnids) self.dst.db.executemany( "insert into notes values (?,?,?,?,?,?,?,?,?,?,?)", notedata) # models used by the notes mids = self.dst.db.list("select distinct mid from notes where id in "+ strnids) # card history and revlog if self.includeSched: data = self.src.db.all( "select * from revlog where cid in "+ids2str(cids)) self.dst.db.executemany( "insert into revlog values (?,?,?,?,?,?,?,?,?)", data) else: # need to reset card state self.dst.sched.resetCards(cids) # models - start with zero self.dst.models.models = {} for m in self.src.models.all(): if int(m['id']) in mids: self.dst.models.update(m) # decks if not self.did: dids = [] else: dids = [self.did] + [ x[1] for x in self.src.decks.children(self.did)] dconfs = {} for d in self.src.decks.all(): if str(d['id']) == "1": continue if dids and d['id'] not in dids: continue if not d['dyn'] and d['conf'] != 1: if self.includeSched: dconfs[d['conf']] = True if not self.includeSched: # scheduling not included, so reset deck settings to default d = dict(d) d['conf'] = 1 self.dst.decks.update(d) # copy used deck confs for dc in self.src.decks.allConf(): if dc['id'] in dconfs: self.dst.decks.updateConf(dc) # find used media media = {} self.mediaDir = self.src.media.dir() if self.includeMedia: for row in notedata: flds = row[6] mid = row[2] for file in self.src.media.filesInStr(mid, flds): media[file] = True if self.mediaDir: for fname in os.listdir(self.mediaDir): if fname.startswith("_"): media[fname] = True self.mediaFiles = media.keys() self.dst.crt = self.src.crt # todo: tags? self.count = self.dst.cardCount() self.dst.setMod() self.postExport() self.dst.close() def postExport(self): # overwrite to apply customizations to the deck before it's closed, # such as update the deck description pass # Packaged Anki decks ###################################################################### class AnkiPackageExporter(AnkiExporter): key = _("Anki Deck Package") ext = ".apkg" def __init__(self, col): AnkiExporter.__init__(self, col) def exportInto(self, path): # open a zip file z = zipfile.ZipFile(path, "w", zipfile.ZIP_DEFLATED) # if all decks and scheduling included, full export if self.includeSched and not self.did: media = self.exportVerbatim(z) else: # otherwise, filter media = self.exportFiltered(z, path) # media map z.writestr("media", json.dumps(media)) z.close() def exportFiltered(self, z, path): # export into the anki2 file colfile = path.replace(".apkg", ".anki2") AnkiExporter.exportInto(self, colfile) z.write(colfile, "collection.anki2") # and media self.prepareMedia() media = {} for c, file in enumerate(self.mediaFiles): c = str(c) mpath = os.path.join(self.mediaDir, file) if os.path.exists(mpath): z.write(mpath, c) media[c] = file # tidy up intermediate files os.unlink(colfile) os.unlink(path.replace(".apkg", ".media.db")) shutil.rmtree(path.replace(".apkg", ".media")) return media def exportVerbatim(self, z): # close our deck & write it into the zip file, and reopen self.count = self.col.cardCount() self.col.close() z.write(self.col.path, "collection.anki2") self.col.reopen() # copy all media if not self.includeMedia: return {} media = {} mdir = self.col.media.dir() for c, file in enumerate(os.listdir(mdir)): c = str(c) mpath = os.path.join(mdir, file) if os.path.exists(mpath): z.write(mpath, c) media[c] = file return media def prepareMedia(self): # chance to move each file in self.mediaFiles into place before media # is zipped up pass # Export modules ########################################################################## def exporters(): def id(obj): return ("%s (*%s)" % (obj.key, obj.ext), obj) exps = [ id(AnkiPackageExporter), id(TextNoteExporter), id(TextCardExporter), ] runHook("exportersList", exps) return exps anki-2.0.20+dfsg/anki/find.py0000644000175000017500000004232412237474750015504 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import re import sre_constants from anki.utils import ids2str, splitFields, joinFields, intTime, fieldChecksum, stripHTMLMedia from anki.consts import * from anki.hooks import * # Find ########################################################################## class Finder(object): def __init__(self, col): self.col = col self.search = dict( added=self._findAdded, card=self._findTemplate, deck=self._findDeck, mid=self._findMid, nid=self._findNids, cid=self._findCids, note=self._findModel, prop=self._findProp, rated=self._findRated, tag=self._findTag, dupe=self._findDupes, ) self.search['is'] = self._findCardState runHook("search", self.search) def findCards(self, query, order=False): "Return a list of card ids for QUERY." tokens = self._tokenize(query) preds, args = self._where(tokens) if preds is None: return [] order, rev = self._order(order) sql = self._query(preds, order) try: res = self.col.db.list(sql, *args) except: # invalid grouping return [] if rev: res.reverse() return res def findNotes(self, query): tokens = self._tokenize(query) preds, args = self._where(tokens) if preds is None: return [] if preds: preds = "(" + preds + ")" else: preds = "1" sql = """ select distinct(n.id) from cards c, notes n where c.nid=n.id and """+preds try: res = self.col.db.list(sql, *args) except: # invalid grouping return [] return res # Tokenizing ###################################################################### def _tokenize(self, query): inQuote = False tokens = [] token = "" for c in query: # quoted text if c in ("'", '"'): if inQuote: if c == inQuote: inQuote = False else: token += c elif token: # quotes are allowed to start directly after a : if token[-1] == ":": inQuote = c else: token += c else: inQuote = c # separator elif c == " ": if inQuote: token += c elif token: # space marks token finished tokens.append(token) token = "" # nesting elif c in ("(", ")"): if inQuote: token += c else: if c == ")" and token: tokens.append(token) token = "" tokens.append(c) # negation elif c == "-": if token: token += c elif not tokens or tokens[-1] != "-": tokens.append("-") # normal character else: token += c # if we finished in a token, add it if token: tokens.append(token) return tokens # Query building ###################################################################### def _where(self, tokens): # state and query s = dict(isnot=False, isor=False, join=False, q="", bad=False) args = [] def add(txt, wrap=True): # failed command? if not txt: # if it was to be negated then we can just ignore it if s['isnot']: s['isnot'] = False return else: s['bad'] = True return elif txt == "skip": return # do we need a conjunction? if s['join']: if s['isor']: s['q'] += " or " s['isor'] = False else: s['q'] += " and " if s['isnot']: s['q'] += " not " s['isnot'] = False if wrap: txt = "(" + txt + ")" s['q'] += txt s['join'] = True for token in tokens: if s['bad']: return None, None # special tokens if token == "-": s['isnot'] = True elif token.lower() == "or": s['isor'] = True elif token == "(": add(token, wrap=False) s['join'] = False elif token == ")": s['q'] += ")" # commands elif ":" in token: cmd, val = token.split(":", 1) cmd = cmd.lower() if cmd in self.search: add(self.search[cmd]((val, args))) else: add(self._findField(cmd, val)) # normal text search else: add(self._findText(token, args)) if s['bad']: return None, None return s['q'], args def _query(self, preds, order): # can we skip the note table? if "n." not in preds and "n." not in order: sql = "select c.id from cards c where " else: sql = "select c.id from cards c, notes n where c.nid=n.id and " # combine with preds if preds: sql += "(" + preds + ")" else: sql += "1" # order if order: sql += " " + order return sql # Ordering ###################################################################### def _order(self, order): if not order: return "", False elif order is not True: # custom order string provided return " order by " + order, False # use deck default type = self.col.conf['sortType'] sort = None if type.startswith("note"): if type == "noteCrt": sort = "n.id, c.ord" elif type == "noteMod": sort = "n.mod, c.ord" elif type == "noteFld": sort = "n.sfld collate nocase, c.ord" elif type.startswith("card"): if type == "cardMod": sort = "c.mod" elif type == "cardReps": sort = "c.reps" elif type == "cardDue": sort = "c.type, c.due" elif type == "cardEase": sort = "c.factor" elif type == "cardLapses": sort = "c.lapses" elif type == "cardIvl": sort = "c.ivl" if not sort: # deck has invalid sort order; revert to noteCrt sort = "n.id, c.ord" return " order by " + sort, self.col.conf['sortBackwards'] # Commands ###################################################################### def _findTag(self, (val, args)): if val == "none": return 'n.tags = ""' val = val.replace("*", "%") if not val.startswith("%"): val = "% " + val if not val.endswith("%"): val += " %" args.append(val) return "n.tags like ?" def _findCardState(self, (val, args)): if val in ("review", "new", "learn"): if val == "review": n = 2 elif val == "new": n = 0 else: return "queue in (1, 3)" return "type = %d" % n elif val == "suspended": return "c.queue = -1" elif val == "buried": return "c.queue = -2" elif val == "due": return """ (c.queue in (2,3) and c.due <= %d) or (c.queue = 1 and c.due <= %d)""" % ( self.col.sched.today, self.col.sched.dayCutoff) def _findRated(self, (val, args)): # days(:optional_ease) r = val.split(":") try: days = int(r[0]) except ValueError: return days = min(days, 31) # ease ease = "" if len(r) > 1: if r[1] not in ("1", "2", "3", "4"): return ease = "and ease=%s" % r[1] cutoff = (self.col.sched.dayCutoff - 86400*days)*1000 return ("c.id in (select cid from revlog where id>%d %s)" % (cutoff, ease)) def _findAdded(self, (val, args)): try: days = int(val) except ValueError: return cutoff = (self.col.sched.dayCutoff - 86400*days)*1000 return "c.id > %d" % cutoff def _findProp(self, (val, args)): # extract m = re.match("(^.+?)(<=|>=|!=|=|<|>)(.+?$)", val) if not m: return prop, cmp, val = m.groups() prop = prop.lower() # is val valid? try: if prop == "ease": val = float(val) else: val = int(val) except ValueError: return # is prop valid? if prop not in ("due", "ivl", "reps", "lapses", "ease"): return # query q = [] if prop == "due": val += self.col.sched.today # only valid for review/daily learning q.append("(c.queue in (2,3))") elif prop == "ease": prop = "factor" val = int(val*1000) q.append("(%s %s %s)" % (prop, cmp, val)) return " and ".join(q) def _findText(self, val, args): val = val.replace("*", "%") args.append("%"+val+"%") args.append("%"+val+"%") return "(n.sfld like ? escape '\\' or n.flds like ? escape '\\')" def _findNids(self, (val, args)): if re.search("[^0-9,]", val): return return "n.id in (%s)" % val def _findCids(self, (val, args)): if re.search("[^0-9,]", val): return return "c.id in (%s)" % val def _findMid(self, (val, args)): if re.search("[^0-9]", val): return return "n.mid = %s" % val def _findModel(self, (val, args)): ids = [] val = val.lower() for m in self.col.models.all(): if m['name'].lower() == val: ids.append(m['id']) return "n.mid in %s" % ids2str(ids) def _findDeck(self, (val, args)): # if searching for all decks, skip if val == "*": return "skip" # deck types elif val == "filtered": return "c.odid" def dids(did): if not did: return None return [did] + [a[1] for a in self.col.decks.children(did)] # current deck? ids = None if val.lower() == "current": ids = dids(self.col.decks.current()['id']) elif "*" not in val: # single deck ids = dids(self.col.decks.id(val, create=False)) else: # wildcard ids = set() # should use re.escape in the future val = val.replace("*", ".*") val = val.replace("+", "\\+") for d in self.col.decks.all(): if re.match("(?i)"+val, d['name']): ids.update(dids(d['id'])) if not ids: return sids = ids2str(ids) return "c.did in %s or c.odid in %s" % (sids, sids) def _findTemplate(self, (val, args)): # were we given an ordinal number? try: num = int(val) - 1 except: num = None if num is not None: return "c.ord = %d" % num # search for template names lims = [] for m in self.col.models.all(): for t in m['tmpls']: if t['name'].lower() == val.lower(): if m['type'] == MODEL_CLOZE: # if the user has asked for a cloze card, we want # to give all ordinals, so we just limit to the # model instead lims.append("(n.mid = %s)" % m['id']) else: lims.append("(n.mid = %s and c.ord = %s)" % ( m['id'], t['ord'])) return " or ".join(lims) def _findField(self, field, val): field = field.lower() val = val.replace("*", "%") # find models that have that field mods = {} for m in self.col.models.all(): for f in m['flds']: if f['name'].lower() == field: mods[str(m['id'])] = (m, f['ord']) if not mods: # nothing has that field return # gather nids regex = re.escape(val).replace("\\_", ".").replace("\\%", ".*") nids = [] for (id,mid,flds) in self.col.db.execute(""" select id, mid, flds from notes where mid in %s and flds like ? escape '\\'""" % ( ids2str(mods.keys())), "%"+val+"%"): flds = splitFields(flds) ord = mods[str(mid)][1] strg = flds[ord] try: if re.search("(?i)^"+regex+"$", strg): nids.append(id) except sre_constants.error: return if not nids: return "0" return "n.id in %s" % ids2str(nids) def _findDupes(self, (val, args)): # caller must call stripHTMLMedia on passed val try: mid, val = val.split(",", 1) except OSError: return csum = fieldChecksum(val) nids = [] for nid, flds in self.col.db.execute( "select id, flds from notes where mid=? and csum=?", mid, csum): if stripHTMLMedia(splitFields(flds)[0]) == val: nids.append(nid) return "n.id in %s" % ids2str(nids) # Find and replace ########################################################################## def findReplace(col, nids, src, dst, regex=False, field=None, fold=True): "Find and replace fields in a note." mmap = {} if field: for m in col.models.all(): for f in m['flds']: if f['name'] == field: mmap[str(m['id'])] = f['ord'] if not mmap: return 0 # find and gather replacements if not regex: src = re.escape(src) if fold: src = "(?i)"+src regex = re.compile(src) def repl(str): return re.sub(regex, dst, str) d = [] snids = ids2str(nids) nids = [] for nid, mid, flds in col.db.execute( "select id, mid, flds from notes where id in "+snids): origFlds = flds # does it match? sflds = splitFields(flds) if field: try: ord = mmap[str(mid)] sflds[ord] = repl(sflds[ord]) except KeyError: # note doesn't have that field continue else: for c in range(len(sflds)): sflds[c] = repl(sflds[c]) flds = joinFields(sflds) if flds != origFlds: nids.append(nid) d.append(dict(nid=nid,flds=flds,u=col.usn(),m=intTime())) if not d: return 0 # replace col.db.executemany( "update notes set flds=:flds,mod=:m,usn=:u where id=:nid", d) col.updateFieldCache(nids) col.genCards(nids) return len(d) def fieldNames(col, downcase=True): fields = set() names = [] for m in col.models.all(): for f in m['flds']: if f['name'].lower() not in fields: names.append(f['name']) fields.add(f['name'].lower()) if downcase: return list(fields) return names # Find duplicates ########################################################################## # returns array of ("dupestr", [nids]) def findDupes(col, fieldName, search=""): # limit search to notes with applicable field name if search: search = "("+search+") " search += "'%s:*'" % fieldName # go through notes vals = {} dupes = [] fields = {} def ordForMid(mid): if mid not in fields: model = col.models.get(mid) for c, f in enumerate(model['flds']): if f['name'].lower() == fieldName.lower(): fields[mid] = c break return fields[mid] for nid, mid, flds in col.db.all( "select id, mid, flds from notes where id in "+ids2str( col.findNotes(search))): flds = splitFields(flds) ord = ordForMid(mid) if ord is None: continue val = flds[ord] val = stripHTMLMedia(val) # empty does not count as duplicate if not val: continue if val not in vals: vals[val] = [] vals[val].append(nid) if len(vals[val]) == 2: dupes.append((val, vals[val])) return dupes anki-2.0.20+dfsg/anki/hooks.py0000644000175000017500000000343312041466362015676 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html """\ Hooks - hook management and tools for extending Anki ============================================================================== To find available hooks, grep for runHook and runFilter in the source code. Instrumenting allows you to modify functions that don't have hooks available. If you call wrap() with pos='around', the original function will not be called automatically but can be called with _old(). """ # Hooks ############################################################################## _hooks = {} def runHook(hook, *args): "Run all functions on hook." hook = _hooks.get(hook, None) if hook: for func in hook: func(*args) def runFilter(hook, arg, *args): hook = _hooks.get(hook, None) if hook: for func in hook: arg = func(arg, *args) return arg def addHook(hook, func): "Add a function to hook. Ignore if already on hook." if not _hooks.get(hook, None): _hooks[hook] = [] if func not in _hooks[hook]: _hooks[hook].append(func) def remHook(hook, func): "Remove a function if is on hook." hook = _hooks.get(hook, []) if func in hook: hook.remove(func) # Instrumenting ############################################################################## def wrap(old, new, pos="after"): "Override an existing function." def repl(*args, **kwargs): if pos == "after": old(*args, **kwargs) return new(*args, **kwargs) elif pos == "before": new(*args, **kwargs) return old(*args, **kwargs) else: return new(_old=old, *args, **kwargs) return repl anki-2.0.20+dfsg/anki/collection.py0000644000175000017500000007031712247117733016716 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import pprint import re import time import os import random import stat import datetime import copy import traceback from anki.lang import _, ngettext from anki.utils import ids2str, fieldChecksum, stripHTML, \ intTime, splitFields, joinFields, maxID, json from anki.hooks import runFilter, runHook from anki.sched import Scheduler from anki.models import ModelManager from anki.media import MediaManager from anki.decks import DeckManager from anki.tags import TagManager from anki.consts import * from anki.errors import AnkiError from anki.sound import stripSounds import anki.latex # sets up hook import anki.cards import anki.notes import anki.template import anki.find defaultConf = { # review options 'activeDecks': [1], 'curDeck': 1, 'newSpread': NEW_CARDS_DISTRIBUTE, 'collapseTime': 1200, 'timeLim': 0, 'estTimes': True, 'dueCounts': True, # other config 'curModel': None, 'nextPos': 1, 'sortType': "noteFld", 'sortBackwards': False, 'addToCur': True, # add new to currently selected deck? } # this is initialized by storage.Collection class _Collection(object): def __init__(self, db, server=False, log=False): self._debugLog = log self.db = db self.path = db._path self._openLog() self.log(self.path, anki.version) self.server = server self._lastSave = time.time() self.clearUndo() self.media = MediaManager(self, server) self.models = ModelManager(self) self.decks = DeckManager(self) self.tags = TagManager(self) self.load() if not self.crt: d = datetime.datetime.today() d -= datetime.timedelta(hours=4) d = datetime.datetime(d.year, d.month, d.day) d += datetime.timedelta(hours=4) self.crt = int(time.mktime(d.timetuple())) self.sched = Scheduler(self) if not self.conf.get("newBury", False): mod = self.db.mod self.sched.unburyCards() self.db.mod = mod def name(self): n = os.path.splitext(os.path.basename(self.path))[0] return n # DB-related ########################################################################## def load(self): (self.crt, self.mod, self.scm, self.dty, # no longer used self._usn, self.ls, self.conf, models, decks, dconf, tags) = self.db.first(""" select crt, mod, scm, dty, usn, ls, conf, models, decks, dconf, tags from col""") self.conf = json.loads(self.conf) self.models.load(models) self.decks.load(decks, dconf) self.tags.load(tags) def setMod(self): """Mark DB modified. DB operations and the deck/tag/model managers do this automatically, so this is only necessary if you modify properties of this object or the conf dict.""" self.db.mod = True def flush(self, mod=None): "Flush state to DB, updating mod time." self.mod = intTime(1000) if mod is None else mod self.db.execute( """update col set crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""", self.crt, self.mod, self.scm, self.dty, self._usn, self.ls, json.dumps(self.conf)) def save(self, name=None, mod=None): "Flush, commit DB, and take out another write lock." # let the managers conditionally flush self.models.flush() self.decks.flush() self.tags.flush() # and flush deck + bump mod if db has been changed if self.db.mod: self.flush(mod=mod) self.db.commit() self.lock() self.db.mod = False self._markOp(name) self._lastSave = time.time() def autosave(self): "Save if 5 minutes has passed since last save." if time.time() - self._lastSave > 300: self.save() def lock(self): # make sure we don't accidentally bump mod time mod = self.db.mod self.db.execute("update col set mod=mod") self.db.mod = mod def close(self, save=True): "Disconnect from DB." if self.db: if not self.conf.get("newBury", False): mod = self.db.mod self.sched.unburyCards() self.db.mod = mod if save: self.save() else: self.rollback() if not self.server: self.db.execute("pragma journal_mode = delete") self.db.close() self.db = None self.media.close() self._closeLog() def reopen(self): "Reconnect to DB (after changing threads, etc)." import anki.db if not self.db: self.db = anki.db.DB(self.path) self.media.connect() self._openLog() def rollback(self): self.db.rollback() self.load() self.lock() def modSchema(self, check=True): "Mark schema modified. Call this first so user can abort if necessary." if not self.schemaChanged(): if check and not runFilter("modSchema", True): raise AnkiError("abortSchemaMod") self.scm = intTime(1000) self.setMod() def schemaChanged(self): "True if schema changed since last sync." return self.scm > self.ls def usn(self): return self._usn if self.server else -1 def beforeUpload(self): "Called before a full upload." tbls = "notes", "cards", "revlog" for t in tbls: self.db.execute("update %s set usn=0 where usn=-1" % t) # we can save space by removing the log of deletions self.db.execute("delete from graves") self._usn += 1 self.models.beforeUpload() self.tags.beforeUpload() self.decks.beforeUpload() self.modSchema() self.ls = self.scm # ensure db is compacted before upload self.db.execute("vacuum") self.db.execute("analyze") self.close() # Object creation helpers ########################################################################## def getCard(self, id): return anki.cards.Card(self, id) def getNote(self, id): return anki.notes.Note(self, id=id) # Utils ########################################################################## def nextID(self, type, inc=True): type = "next"+type.capitalize() id = self.conf.get(type, 1) if inc: self.conf[type] = id+1 return id def reset(self): "Rebuild the queue and reload data after DB modified." self.sched.reset() # Deletion logging ########################################################################## def _logRem(self, ids, type): self.db.executemany("insert into graves values (%d, ?, %d)" % ( self.usn(), type), ([x] for x in ids)) # Notes ########################################################################## def noteCount(self): return self.db.scalar("select count() from notes") def newNote(self, forDeck=True): "Return a new note with the current model." return anki.notes.Note(self, self.models.current(forDeck)) def addNote(self, note): "Add a note to the collection. Return number of new cards." # check we have card models available, then save cms = self.findTemplates(note) if not cms: return 0 note.flush() # deck conf governs which of these are used due = self.nextID("pos") # add cards ncards = 0 for template in cms: self._newCard(note, template, due) ncards += 1 return ncards def remNotes(self, ids): self.remCards(self.db.list("select id from cards where nid in "+ ids2str(ids))) def _remNotes(self, ids): "Bulk delete notes by ID. Don't call this directly." if not ids: return strids = ids2str(ids) # we need to log these independently of cards, as one side may have # more card templates runHook("remNotes", self, ids) self._logRem(ids, REM_NOTE) self.db.execute("delete from notes where id in %s" % strids) # Card creation ########################################################################## def findTemplates(self, note): "Return (active), non-empty templates." model = note.model() avail = self.models.availOrds(model, joinFields(note.fields)) return self._tmplsFromOrds(model, avail) def _tmplsFromOrds(self, model, avail): ok = [] if model['type'] == MODEL_STD: for t in model['tmpls']: if t['ord'] in avail: ok.append(t) else: # cloze - generate temporary templates from first for ord in avail: t = copy.copy(model['tmpls'][0]) t['ord'] = ord ok.append(t) return ok def genCards(self, nids): "Generate cards for non-empty templates, return ids to remove." # build map of (nid,ord) so we don't create dupes snids = ids2str(nids) have = {} dids = {} for id, nid, ord, did in self.db.execute( "select id, nid, ord, did from cards where nid in "+snids): # existing cards if nid not in have: have[nid] = {} have[nid][ord] = id # and their dids if nid in dids: if dids[nid] and dids[nid] != did: # cards are in two or more different decks; revert to # model default dids[nid] = None else: # first card or multiple cards in same deck dids[nid] = did # build cards for each note data = [] ts = maxID(self.db) now = intTime() rem = [] usn = self.usn() for nid, mid, flds in self.db.execute( "select id, mid, flds from notes where id in "+snids): model = self.models.get(mid) avail = self.models.availOrds(model, flds) did = dids.get(nid) or model['did'] # add any missing cards for t in self._tmplsFromOrds(model, avail): doHave = nid in have and t['ord'] in have[nid] if not doHave: # check deck is not a cram deck did = t['did'] or did if self.decks.isDyn(did): did = 1 # if the deck doesn't exist, use default instead did = self.decks.get(did)['id'] # we'd like to use the same due# as sibling cards, but we # can't retrieve that quickly, so we give it a new id # instead data.append((ts, nid, did, t['ord'], now, usn, self.nextID("pos"))) ts += 1 # note any cards that need removing if nid in have: for ord, id in have[nid].items(): if ord not in avail: rem.append(id) # bulk update self.db.executemany(""" insert into cards values (?,?,?,?,?,?,0,0,?,0,0,0,0,0,0,0,0,"")""", data) return rem # type 0 - when previewing in add dialog, only non-empty # type 1 - when previewing edit, only existing # type 2 - when previewing in models dialog, all templates def previewCards(self, note, type=0): if type == 0: cms = self.findTemplates(note) elif type == 1: cms = [c.template() for c in note.cards()] else: cms = note.model()['tmpls'] if not cms: return [] cards = [] for template in cms: cards.append(self._newCard(note, template, 1, flush=False)) return cards def _newCard(self, note, template, due, flush=True): "Create a new card." card = anki.cards.Card(self) card.nid = note.id card.ord = template['ord'] card.did = template['did'] or note.model()['did'] # if invalid did, use default instead deck = self.decks.get(card.did) if deck['dyn']: # must not be a filtered deck card.did = 1 else: card.did = deck['id'] card.due = self._dueForDid(card.did, due) if flush: card.flush() return card def _dueForDid(self, did, due): conf = self.decks.confForDid(did) # in order due? if conf['new']['order'] == NEW_CARDS_DUE: return due else: # random mode; seed with note ts so all cards of this note get the # same random number r = random.Random() r.seed(due) return r.randrange(1, max(due, 1000)) # Cards ########################################################################## def isEmpty(self): return not self.db.scalar("select 1 from cards limit 1") def cardCount(self): return self.db.scalar("select count() from cards") def remCards(self, ids, notes=True): "Bulk delete cards by ID." if not ids: return sids = ids2str(ids) nids = self.db.list("select nid from cards where id in "+sids) # remove cards self._logRem(ids, REM_CARD) self.db.execute("delete from cards where id in "+sids) # then notes if not notes: return nids = self.db.list(""" select id from notes where id in %s and id not in (select nid from cards)""" % ids2str(nids)) self._remNotes(nids) def emptyCids(self): rem = [] for m in self.models.all(): rem += self.genCards(self.models.nids(m)) return rem def emptyCardReport(self, cids): rep = "" for ords, cnt, flds in self.db.all(""" select group_concat(ord+1), count(), flds from cards c, notes n where c.nid = n.id and c.id in %s group by nid""" % ids2str(cids)): rep += _("Empty card numbers: %(c)s\nFields: %(f)s\n\n") % dict( c=ords, f=flds.replace("\x1f", " / ")) return rep # Field checksums and sorting fields ########################################################################## def _fieldData(self, snids): return self.db.execute( "select id, mid, flds from notes where id in "+snids) def updateFieldCache(self, nids): "Update field checksums and sort cache, after find&replace, etc." snids = ids2str(nids) r = [] for (nid, mid, flds) in self._fieldData(snids): fields = splitFields(flds) model = self.models.get(mid) if not model: # note points to invalid model continue r.append((stripHTML(fields[self.models.sortIdx(model)]), fieldChecksum(fields[0]), nid)) # apply, relying on calling code to bump usn+mod self.db.executemany("update notes set sfld=?, csum=? where id=?", r) # Q/A generation ########################################################################## def renderQA(self, ids=None, type="card"): # gather metadata if type == "card": where = "and c.id in " + ids2str(ids) elif type == "note": where = "and f.id in " + ids2str(ids) elif type == "model": where = "and m.id in " + ids2str(ids) elif type == "all": where = "" else: raise Exception() return [self._renderQA(row) for row in self._qaData(where)] def _renderQA(self, data, qfmt=None, afmt=None): "Returns hash of id, question, answer." # data is [cid, nid, mid, did, ord, tags, flds] # unpack fields and create dict flist = splitFields(data[6]) fields = {} model = self.models.get(data[2]) for (name, (idx, conf)) in self.models.fieldMap(model).items(): fields[name] = flist[idx] fields['Tags'] = data[5].strip() fields['Type'] = model['name'] fields['Deck'] = self.decks.name(data[3]) if model['type'] == MODEL_STD: template = model['tmpls'][data[4]] else: template = model['tmpls'][0] fields['Card'] = template['name'] fields['c%d' % (data[4]+1)] = "1" # render q & a d = dict(id=data[0]) qfmt = qfmt or template['qfmt'] afmt = afmt or template['afmt'] for (type, format) in (("q", qfmt), ("a", afmt)): if type == "q": format = format.replace("{{cloze:", "{{cq:%d:" % ( data[4]+1)) format = format.replace("<%cloze:", "<%%cq:%d:" % ( data[4]+1)) else: format = format.replace("{{cloze:", "{{ca:%d:" % ( data[4]+1)) format = format.replace("<%cloze:", "<%%ca:%d:" % ( data[4]+1)) fields['FrontSide'] = stripSounds(d['q']) fields = runFilter("mungeFields", fields, model, data, self) html = anki.template.render(format, fields) d[type] = runFilter( "mungeQA", html, type, fields, model, data, self) # empty cloze? if type == 'q' and model['type'] == MODEL_CLOZE: if not self.models._availClozeOrds(model, data[6], False): d['q'] += ("

" + _( "Please edit this note and add some cloze deletions. (%s)") % ( "%s" % (HELP_SITE, _("help")))) return d def _qaData(self, where=""): "Return [cid, nid, mid, did, ord, tags, flds] db query" return self.db.execute(""" select c.id, f.id, f.mid, c.did, c.ord, f.tags, f.flds from cards c, notes f where c.nid == f.id %s""" % where) # Finding cards ########################################################################## def findCards(self, query, order=False): return anki.find.Finder(self).findCards(query, order) def findNotes(self, query): return anki.find.Finder(self).findNotes(query) def findReplace(self, nids, src, dst, regex=None, field=None, fold=True): return anki.find.findReplace(self, nids, src, dst, regex, field, fold) def findDupes(self, fieldName, search=""): return anki.find.findDupes(self, fieldName, search) # Stats ########################################################################## def cardStats(self, card): from anki.stats import CardStats return CardStats(self, card).report() def stats(self): from anki.stats import CollectionStats return CollectionStats(self) # Timeboxing ########################################################################## def startTimebox(self): self._startTime = time.time() self._startReps = self.sched.reps def timeboxReached(self): "Return (elapsedTime, reps) if timebox reached, or False." if not self.conf['timeLim']: # timeboxing disabled return False elapsed = time.time() - self._startTime if elapsed > self.conf['timeLim']: return (self.conf['timeLim'], self.sched.reps - self._startReps) # Undo ########################################################################## def clearUndo(self): # [type, undoName, data] # type 1 = review; type 2 = checkpoint self._undo = None def undoName(self): "Undo menu item name, or None if undo unavailable." if not self._undo: return None return self._undo[1] def undo(self): if self._undo[0] == 1: return self._undoReview() else: self._undoOp() def markReview(self, card): old = [] if self._undo: if self._undo[0] == 1: old = self._undo[2] self.clearUndo() self._undo = [1, _("Review"), old + [copy.copy(card)]] def _undoReview(self): data = self._undo[2] c = data.pop() if not data: self.clearUndo() # write old data c.flush() # and delete revlog entry last = self.db.scalar( "select id from revlog where cid = ? " "order by id desc limit 1", c.id) self.db.execute("delete from revlog where id = ?", last) # restore any siblings self.db.execute( "update cards set queue=type,mod=?,usn=? where queue=-2 and nid=?", intTime(), self.usn(), c.nid) # and finally, update daily counts n = 1 if c.queue == 3 else c.queue type = ("new", "lrn", "rev")[n] self.sched._updateStats(c, type, -1) self.sched.reps -= 1 return c.id def _markOp(self, name): "Call via .save()" if name: self._undo = [2, name] else: # saving disables old checkpoint, but not review undo if self._undo and self._undo[0] == 2: self.clearUndo() def _undoOp(self): self.rollback() self.clearUndo() # DB maintenance ########################################################################## def basicCheck(self): "Basic integrity check for syncing. True if ok." # cards without notes if self.db.scalar(""" select 1 from cards where nid not in (select id from notes) limit 1"""): return # notes without cards or models if self.db.scalar(""" select 1 from notes where id not in (select distinct nid from cards) or mid not in %s limit 1""" % ids2str(self.models.ids())): return # invalid ords for m in self.models.all(): # ignore clozes if m['type'] != MODEL_STD: continue if self.db.scalar(""" select 1 from cards where ord not in %s and nid in ( select id from notes where mid = ?) limit 1""" % ids2str([t['ord'] for t in m['tmpls']]), m['id']): return return True def fixIntegrity(self): "Fix possible problems and rebuild caches." problems = [] self.save() oldSize = os.stat(self.path)[stat.ST_SIZE] if self.db.scalar("pragma integrity_check") != "ok": return (_("Collection is corrupt. Please see the manual."), False) # note types with a missing model ids = self.db.list(""" select id from notes where mid not in """ + ids2str(self.models.ids())) if ids: problems.append( ngettext("Deleted %d note with missing note type.", "Deleted %d notes with missing note type.", len(ids)) % len(ids)) self.remNotes(ids) # for each model for m in self.models.all(): if m['type'] == MODEL_STD: # model with missing req specification if 'req' not in m: self.models._updateRequired(m) problems.append(_("Fixed note type: %s") % m['name']) # cards with invalid ordinal ids = self.db.list(""" select id from cards where ord not in %s and nid in ( select id from notes where mid = ?)""" % ids2str([t['ord'] for t in m['tmpls']]), m['id']) if ids: problems.append( ngettext("Deleted %d card with missing template.", "Deleted %d cards with missing template.", len(ids)) % len(ids)) self.remCards(ids) # notes with invalid field count ids = [] for id, flds in self.db.execute( "select id, flds from notes where mid = ?", m['id']): if (flds.count("\x1f") + 1) != len(m['flds']): ids.append(id) if ids: problems.append( ngettext("Deleted %d note with wrong field count.", "Deleted %d notes with wrong field count.", len(ids)) % len(ids)) self.remNotes(ids) # delete any notes with missing cards ids = self.db.list(""" select id from notes where id not in (select distinct nid from cards)""") if ids: cnt = len(ids) problems.append( ngettext("Deleted %d note with no cards.", "Deleted %d notes with no cards.", cnt) % cnt) self._remNotes(ids) # cards with missing notes ids = self.db.list(""" select id from cards where nid not in (select id from notes)""") if ids: cnt = len(ids) problems.append( ngettext("Deleted %d card with missing note.", "Deleted %d cards with missing note.", cnt) % cnt) self.remCards(ids) # cards with odue set when it shouldn't be ids = self.db.list(""" select id from cards where odue > 0 and (type=1 or queue=2) and not odid""") if ids: cnt = len(ids) problems.append( ngettext("Fixed %d card with invalid properties.", "Fixed %d cards with invalid properties.", cnt) % cnt) self.db.execute("update cards set odue=0 where id in "+ ids2str(ids)) # tags self.tags.registerNotes() # field cache for m in self.models.all(): self.updateFieldCache(self.models.nids(m)) # new cards can't have a due position > 32 bits self.db.execute(""" update cards set due = 1000000, mod = ?, usn = ? where due > 1000000 and queue = 0""", intTime(), self.usn()) # new card position self.conf['nextPos'] = self.db.scalar( "select max(due)+1 from cards where type = 0") or 0 # reviews should have a reasonable due # ids = self.db.list( "select id from cards where queue = 2 and due > 10000") if ids: problems.append("Reviews had incorrect due date.") self.db.execute( "update cards set due = 0, mod = ?, usn = ? where id in %s" % ids2str(ids), intTime(), self.usn()) # and finally, optimize self.optimize() newSize = os.stat(self.path)[stat.ST_SIZE] txt = _("Database rebuilt and optimized.") ok = not problems problems.append(txt) # if any problems were found, force a full sync if not ok: self.modSchema(check=False) self.save() return ("\n".join(problems), ok) def optimize(self): self.db.execute("vacuum") self.db.execute("analyze") self.lock() # Logging ########################################################################## def log(self, *args, **kwargs): if not self._debugLog: return def customRepr(x): if isinstance(x, basestring): return x return pprint.pformat(x) path, num, fn, y = traceback.extract_stack( limit=2+kwargs.get("stack", 0))[0] buf = u"[%s] %s:%s(): %s" % (intTime(), os.path.basename(path), fn, ", ".join([customRepr(x) for x in args])) self._logHnd.write(buf.encode("utf8") + "\n") if os.environ.get("ANKIDEV"): print buf def _openLog(self): if not self._debugLog: return lpath = re.sub("\.anki2$", ".log", self.path) if os.path.exists(lpath) and os.path.getsize(lpath) > 10*1024*1024: lpath2 = lpath + ".old" if os.path.exists(lpath2): os.unlink(lpath2) os.rename(lpath, lpath2) self._logHnd = open(lpath, "ab") def _closeLog(self): self._logHnd = None anki-2.0.20+dfsg/anki/statsbg.py0000644000175000017500000000061512042551172016214 0ustar andreasandreas# from subtlepatterns.com bg = """\ iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAM1BMVEXy8vLz8/P5+fn19fXt7e329vb4+Pj09PTv7+/u7u739/fw8PD7+/vx8fHr6+v6+vrs7Oz2LjW2AAAAkUlEQVR42g3KyXHAQAwDQYAQj12ItvOP1qqZZwMMPVnd06XToQvz4L2HDQ2iRgkvA7yPPB+JD+OUPnfzZ0JNZh6kkQus5NUmR7g4Jpxv5XN6nYWNmtlq9o3zuK6w3XRsE1pQIEGPIsdtTP3m2cYwlPv6MbL8/QASsKppZefyDmJPbxvxa/NrX1TJ1yp20fhj9D+SiAWWLU8myQAAAABJRU5ErkJggg== """ anki-2.0.20+dfsg/anki/notes.py0000644000175000017500000001217412234206041015673 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from anki.utils import fieldChecksum, intTime, \ joinFields, splitFields, stripHTMLMedia, timestampID, guid64 class Note(object): def __init__(self, col, model=None, id=None): assert not (model and id) self.col = col if id: self.id = id self.load() else: self.id = timestampID(col.db, "notes") self.guid = guid64() self._model = model self.mid = model['id'] self.tags = [] self.fields = [""] * len(self._model['flds']) self.flags = 0 self.data = "" self._fmap = self.col.models.fieldMap(self._model) self.scm = self.col.scm def load(self): (self.guid, self.mid, self.mod, self.usn, self.tags, self.fields, self.flags, self.data) = self.col.db.first(""" select guid, mid, mod, usn, tags, flds, flags, data from notes where id = ?""", self.id) self.fields = splitFields(self.fields) self.tags = self.col.tags.split(self.tags) self._model = self.col.models.get(self.mid) self._fmap = self.col.models.fieldMap(self._model) self.scm = self.col.scm def flush(self, mod=None): "If fields or tags have changed, write changes to disk." assert self.scm == self.col.scm self._preFlush() sfld = stripHTMLMedia(self.fields[self.col.models.sortIdx(self._model)]) tags = self.stringTags() fields = self.joinedFields() if not mod and self.col.db.scalar( "select 1 from notes where id = ? and tags = ? and flds = ?", self.id, tags, fields): return csum = fieldChecksum(self.fields[0]) self.mod = mod if mod else intTime() self.usn = self.col.usn() res = self.col.db.execute(""" insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)""", self.id, self.guid, self.mid, self.mod, self.usn, tags, fields, sfld, csum, self.flags, self.data) self.col.tags.register(self.tags) self._postFlush() def joinedFields(self): return joinFields(self.fields) def cards(self): return [self.col.getCard(id) for id in self.col.db.list( "select id from cards where nid = ? order by ord", self.id)] def model(self): return self._model # Dict interface ################################################## def keys(self): return self._fmap.keys() def values(self): return self.fields def items(self): return [(f['name'], self.fields[ord]) for ord, f in sorted(self._fmap.values())] def _fieldOrd(self, key): try: return self._fmap[key][0] except: raise KeyError(key) def __getitem__(self, key): return self.fields[self._fieldOrd(key)] def __setitem__(self, key, value): self.fields[self._fieldOrd(key)] = value def __contains__(self, key): return key in self._fmap.keys() # Tags ################################################## def hasTag(self, tag): return self.col.tags.inList(tag, self.tags) def stringTags(self): return self.col.tags.join(self.col.tags.canonify(self.tags)) def setTagsFromStr(self, str): self.tags = self.col.tags.split(str) def delTag(self, tag): rem = [] for t in self.tags: if t.lower() == tag.lower(): rem.append(t) for r in rem: self.tags.remove(r) def addTag(self, tag): # duplicates will be stripped on save self.tags.append(tag) # Unique/duplicate check ################################################## def dupeOrEmpty(self): "1 if first is empty; 2 if first is a duplicate, False otherwise." val = self.fields[0] if not val.strip(): return 1 csum = fieldChecksum(val) # find any matching csums and compare for flds in self.col.db.list( "select flds from notes where csum = ? and id != ? and mid = ?", csum, self.id or 0, self.mid): if stripHTMLMedia( splitFields(flds)[0]) == stripHTMLMedia(self.fields[0]): return 2 return False # Flushing cloze notes ################################################## def _preFlush(self): # have we been added yet? self.newlyAdded = not self.col.db.scalar( "select 1 from cards where nid = ?", self.id) def _postFlush(self): # generate missing cards if not self.newlyAdded: rem = self.col.genCards([self.id]) # popping up a dialog while editing is confusing; instead we can # document that the user should open the templates window to # garbage collect empty cards #self.col.remEmptyCards(ids) anki-2.0.20+dfsg/anki/latex.py0000644000175000017500000001044712234172511015665 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import re, os, shutil, cgi from anki.utils import checksum, call, namedtmp, tmpdir, isMac, stripHTML from anki.hooks import addHook from anki.lang import _ latexCmd = ["latex", "-interaction=nonstopmode"] latexDviPngCmd = ["dvipng", "-D", "200", "-T", "tight"] build = True # if off, use existing media but don't create new regexps = { "standard": re.compile(r"\[latex\](.+?)\[/latex\]", re.DOTALL | re.IGNORECASE), "expression": re.compile(r"\[\$\](.+?)\[/\$\]", re.DOTALL | re.IGNORECASE), "math": re.compile(r"\[\$\$\](.+?)\[/\$\$\]", re.DOTALL | re.IGNORECASE), } # add standard tex install location to osx if isMac: os.environ['PATH'] += ":/usr/texbin" def stripLatex(text): for match in regexps['standard'].finditer(text): text = text.replace(match.group(), "") for match in regexps['expression'].finditer(text): text = text.replace(match.group(), "") for match in regexps['math'].finditer(text): text = text.replace(match.group(), "") return text def mungeQA(html, type, fields, model, data, col): "Convert TEXT with embedded latex tags to image links." for match in regexps['standard'].finditer(html): html = html.replace(match.group(), _imgLink(col, match.group(1), model)) for match in regexps['expression'].finditer(html): html = html.replace(match.group(), _imgLink( col, "$" + match.group(1) + "$", model)) for match in regexps['math'].finditer(html): html = html.replace(match.group(), _imgLink( col, "\\begin{displaymath}" + match.group(1) + "\\end{displaymath}", model)) return html def _imgLink(col, latex, model): "Return an img link for LATEX, creating if necesssary." txt = _latexFromHtml(col, latex) fname = "latex-%s.png" % checksum(txt.encode("utf8")) link = '' % fname if os.path.exists(fname): return link elif not build: return u"[latex]%s[/latex]" % latex else: err = _buildImg(col, txt, fname, model) if err: return err else: return link def _latexFromHtml(col, latex): "Convert entities and fix newlines." latex = re.sub("|

", "\n", latex) latex = stripHTML(latex) return latex def _buildImg(col, latex, fname, model): # add header/footer & convert to utf8 latex = (model["latexPre"] + "\n" + latex + "\n" + model["latexPost"]) latex = latex.encode("utf8") # it's only really secure if run in a jail, but these are the most common tmplatex = latex.replace("\\includegraphics", "") for bad in ("write18", "\\readline", "\\input", "\\include", "\\catcode", "\\openout", "\\write", "\\loop", "\\def", "\\shipout"): if bad in tmplatex: return _("""\ For security reasons, '%s' is not allowed on cards. You can still use \ it by placing the command in a different package, and importing that \ package in the LaTeX header instead.""") % bad # write into a temp file log = open(namedtmp("latex_log.txt"), "w") texpath = namedtmp("tmp.tex") texfile = file(texpath, "w") texfile.write(latex) texfile.close() mdir = col.media.dir() oldcwd = os.getcwd() png = namedtmp("tmp.png") try: # generate dvi os.chdir(tmpdir()) if call(latexCmd + ["tmp.tex"], stdout=log, stderr=log): return _errMsg("latex", texpath) # and png if call(latexDviPngCmd + ["tmp.dvi", "-o", "tmp.png"], stdout=log, stderr=log): return _errMsg("dvipng", texpath) # add to media shutil.copyfile(png, os.path.join(mdir, fname)) return finally: os.chdir(oldcwd) def _errMsg(type, texpath): msg = (_("Error executing %s.") % type) + "
" msg += (_("Generated file: %s") % texpath) + "
" try: log = open(namedtmp("latex_log.txt", rm=False)).read() if not log: raise Exception() msg += "
" + cgi.escape(log) + "
" except: msg += _("Have you installed latex and dvipng?") pass return msg # setup q/a filter addHook("mungeQA", mungeQA) anki-2.0.20+dfsg/anki/decks.py0000644000175000017500000003513312230110006015623 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import copy from anki.utils import intTime, ids2str, json from anki.hooks import runHook from anki.consts import * from anki.lang import _ from anki.errors import DeckRenameError # fixmes: # - make sure users can't set grad interval < 1 defaultDeck = { 'newToday': [0, 0], # currentDay, count 'revToday': [0, 0], 'lrnToday': [0, 0], 'timeToday': [0, 0], # time in ms 'conf': 1, 'usn': 0, 'desc': "", 'dyn': 0, # anki uses int/bool interchangably here 'collapsed': False, # added in beta11 'extendNew': 10, 'extendRev': 50, } defaultDynamicDeck = { 'newToday': [0, 0], 'revToday': [0, 0], 'lrnToday': [0, 0], 'timeToday': [0, 0], 'collapsed': False, 'dyn': 1, 'desc': "", 'usn': 0, 'delays': None, 'separate': True, # list of (search, limit, order); we only use first element for now 'terms': [["", 100, 0]], 'resched': True, 'return': True, # currently unused } defaultConf = { 'name': _("Default"), 'new': { 'delays': [1, 10], 'ints': [1, 4, 7], # 7 is not currently used 'initialFactor': 2500, 'separate': True, 'order': NEW_CARDS_DUE, 'perDay': 20, # may not be set on old decks 'bury': True, }, 'lapse': { 'delays': [10], 'mult': 0, 'minInt': 1, 'leechFails': 8, # type 0=suspend, 1=tagonly 'leechAction': 0, }, 'rev': { 'perDay': 100, 'ease4': 1.3, 'fuzz': 0.05, 'minSpace': 1, # not currently used 'ivlFct': 1, 'maxIvl': 36500, # may not be set on old decks 'bury': True, }, 'maxTaken': 60, 'timer': 0, 'autoplay': True, 'replayq': True, 'mod': 0, 'usn': 0, } class DeckManager(object): # Registry save/load ############################################################# def __init__(self, col): self.col = col def load(self, decks, dconf): self.decks = json.loads(decks) self.dconf = json.loads(dconf) self.changed = False def save(self, g=None): "Can be called with either a deck or a deck configuration." if g: g['mod'] = intTime() g['usn'] = self.col.usn() self.changed = True def flush(self): if self.changed: self.col.db.execute("update col set decks=?, dconf=?", json.dumps(self.decks), json.dumps(self.dconf)) self.changed = False # Deck save/load ############################################################# def id(self, name, create=True, type=defaultDeck): "Add a deck with NAME. Reuse deck if already exists. Return id as int." name = name.replace('"', '') for id, g in self.decks.items(): if g['name'].lower() == name.lower(): return int(id) if not create: return None g = copy.deepcopy(type) if "::" in name: # not top level; ensure all parents exist name = self._ensureParents(name) g['name'] = name while 1: id = intTime(1000) if str(id) not in self.decks: break g['id'] = id self.decks[str(id)] = g self.save(g) self.maybeAddToActive() runHook("newDeck") return int(id) def rem(self, did, cardsToo=False, childrenToo=True): "Remove the deck. If cardsToo, delete any cards inside." if str(did) == '1': # we won't allow the default deck to be deleted, but if it's a # child of an existing deck then it needs to be renamed deck = self.get(did) if '::' in deck['name']: deck['name'] = _("Default") self.save(deck) return # log the removal regardless of whether we have the deck or not self.col._logRem([did], REM_DECK) # do nothing else if doesn't exist if not str(did) in self.decks: return deck = self.get(did) if deck['dyn']: # deleting a cramming deck returns cards to their previous deck # rather than deleting the cards self.col.sched.emptyDyn(did) if childrenToo: for name, id in self.children(did): self.rem(id, cardsToo) else: # delete children first if childrenToo: # we don't want to delete children when syncing for name, id in self.children(did): self.rem(id, cardsToo) # delete cards too? if cardsToo: # don't use cids(), as we want cards in cram decks too cids = self.col.db.list( "select id from cards where did=? or odid=?", did, did) self.col.remCards(cids) # delete the deck and add a grave del self.decks[str(did)] # ensure we have an active deck if did in self.active(): self.select(int(self.decks.keys()[0])) self.save() def allNames(self, dyn=True): "An unsorted list of all deck names." if dyn: return [x['name'] for x in self.decks.values()] else: return [x['name'] for x in self.decks.values() if not x['dyn']] def all(self): "A list of all decks." return self.decks.values() def allIds(self): return self.decks.keys() def collapse(self, did): deck = self.get(did) deck['collapsed'] = not deck['collapsed'] self.save(deck) def count(self): return len(self.decks) def get(self, did, default=True): id = str(did) if id in self.decks: return self.decks[id] elif default: return self.decks['1'] def byName(self, name): "Get deck with NAME." for m in self.decks.values(): if m['name'] == name: return m def update(self, g): "Add or update an existing deck. Used for syncing and merging." self.decks[str(g['id'])] = g self.maybeAddToActive() # mark registry changed, but don't bump mod time self.save() def rename(self, g, newName): "Rename deck prefix to NAME if not exists. Updates children." # make sure target node doesn't already exist if newName in self.allNames(): raise DeckRenameError(_("That deck already exists.")) # ensure we have parents newName = self._ensureParents(newName) # rename children for grp in self.all(): if grp['name'].startswith(g['name'] + "::"): grp['name'] = grp['name'].replace(g['name']+ "::", newName + "::", 1) self.save(grp) # adjust name g['name'] = newName # ensure we have parents again, as we may have renamed parent->child newName = self._ensureParents(newName) self.save(g) # renaming may have altered active did order self.maybeAddToActive() def renameForDragAndDrop(self, draggedDeckDid, ontoDeckDid): draggedDeck = self.get(draggedDeckDid) draggedDeckName = draggedDeck['name'] ontoDeckName = self.get(ontoDeckDid)['name'] if ontoDeckDid == None or ontoDeckDid == '': if len(self._path(draggedDeckName)) > 1: self.rename(draggedDeck, self._basename(draggedDeckName)) elif self._canDragAndDrop(draggedDeckName, ontoDeckName): draggedDeck = self.get(draggedDeckDid) draggedDeckName = draggedDeck['name'] ontoDeckName = self.get(ontoDeckDid)['name'] self.rename(draggedDeck, ontoDeckName + "::" + self._basename(draggedDeckName)) def _canDragAndDrop(self, draggedDeckName, ontoDeckName): return draggedDeckName <> ontoDeckName \ and not self._isParent(ontoDeckName, draggedDeckName) \ and not self._isAncestor(draggedDeckName, ontoDeckName) def _isParent(self, parentDeckName, childDeckName): return self._path(childDeckName) == self._path(parentDeckName) + [ self._basename(childDeckName) ] def _isAncestor(self, ancestorDeckName, descendantDeckName): ancestorPath = self._path(ancestorDeckName) return ancestorPath == self._path(descendantDeckName)[0:len(ancestorPath)] def _path(self, name): return name.split("::") def _basename(self, name): return self._path(name)[-1] def _ensureParents(self, name): "Ensure parents exist, and return name with case matching parents." s = "" path = self._path(name) if len(path) < 2: return name for p in path[:-1]: if not s: s += p else: s += "::" + p # fetch or create did = self.id(s) # get original case s = self.name(did) name = s + "::" + path[-1] return name # Deck configurations ############################################################# def allConf(self): "A list of all deck config." return self.dconf.values() def confForDid(self, did): deck = self.get(did, default=False) assert deck if 'conf' in deck: conf = self.getConf(deck['conf']) conf['dyn'] = False return conf # dynamic decks have embedded conf return deck def getConf(self, confId): return self.dconf[str(confId)] def updateConf(self, g): self.dconf[str(g['id'])] = g self.save() def confId(self, name, cloneFrom=defaultConf): "Create a new configuration and return id." c = copy.deepcopy(cloneFrom) while 1: id = intTime(1000) if str(id) not in self.dconf: break c['id'] = id c['name'] = name self.dconf[str(id)] = c self.save(c) return id def remConf(self, id): "Remove a configuration and update all decks using it." assert int(id) != 1 self.col.modSchema() del self.dconf[str(id)] for g in self.all(): # ignore cram decks if 'conf' not in g: continue if str(g['conf']) == str(id): g['conf'] = 1 self.save(g) def setConf(self, grp, id): grp['conf'] = id self.save(grp) def didsForConf(self, conf): dids = [] for deck in self.decks.values(): if 'conf' in deck and deck['conf'] == conf['id']: dids.append(deck['id']) return dids def restoreToDefault(self, conf): oldOrder = conf['new']['order'] new = copy.deepcopy(defaultConf) new['id'] = conf['id'] new['name'] = conf['name'] self.dconf[str(conf['id'])] = new self.save(new) # if it was previously randomized, resort if not oldOrder: self.col.sched.resortConf(new) # Deck utils ############################################################# def name(self, did, default=False): deck = self.get(did, default=default) if deck: return deck['name'] return _("[no deck]") def nameOrNone(self, did): deck = self.get(did, default=False) if deck: return deck['name'] return None def setDeck(self, cids, did): self.col.db.execute( "update cards set did=?,usn=?,mod=? where id in "+ ids2str(cids), did, self.col.usn(), intTime()) def maybeAddToActive(self): # reselect current deck, or default if current has disappeared c = self.current() self.select(c['id']) def cids(self, did, children=False): if not children: return self.col.db.list("select id from cards where did=?", did) dids = [did] for name, id in self.children(did): dids.append(id) return self.col.db.list("select id from cards where did in "+ ids2str(dids)) def recoverOrphans(self): dids = self.decks.keys() mod = self.col.db.mod self.col.db.execute("update cards set did = 1 where did not in "+ ids2str(dids)) self.col.db.mod = mod # Deck selection ############################################################# def active(self): "The currrently active dids. Make sure to copy before modifying." return self.col.conf['activeDecks'] def selected(self): "The currently selected did." return self.col.conf['curDeck'] def current(self): return self.get(self.selected()) def select(self, did): "Select a new branch." # make sure arg is an int did = int(did) # current deck self.col.conf['curDeck'] = did # and active decks (current + all children) actv = self.children(did) actv.sort() self.col.conf['activeDecks'] = [did] + [a[1] for a in actv] self.changed = True def children(self, did): "All children of did, as (name, id)." name = self.get(did)['name'] actv = [] for g in self.all(): if g['name'].startswith(name + "::"): actv.append((g['name'], g['id'])) return actv def parents(self, did): "All parents of did." # get parent and grandparent names parents = [] for part in self.get(did)['name'].split("::")[:-1]: if not parents: parents.append(part) else: parents.append(parents[-1] + "::" + part) # convert to objects for c, p in enumerate(parents): parents[c] = self.get(self.id(p)) return parents # Sync handling ########################################################################## def beforeUpload(self): for d in self.all(): d['usn'] = 0 for c in self.allConf(): c['usn'] = 0 self.save() # Dynamic decks ########################################################################## def newDyn(self, name): "Return a new dynamic deck and set it as the current deck." did = self.id(name, type=defaultDynamicDeck) self.select(did) return did def isDyn(self, did): return self.get(did)['dyn'] anki-2.0.20+dfsg/anki/stats.py0000644000175000017500000007240112234516200015701 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from __future__ import division import time import datetime import json import anki.js from anki.utils import fmtTimeSpan, ids2str from anki.lang import _, ngettext # Card stats ########################################################################## class CardStats(object): def __init__(self, col, card): self.col = col self.card = card def report(self): c = self.card fmt = lambda x, **kwargs: fmtTimeSpan(x, short=True, **kwargs) self.txt = "" self.addLine(_("Added"), self.date(c.id/1000)) first = self.col.db.scalar( "select min(id) from revlog where cid = ?", c.id) last = self.col.db.scalar( "select max(id) from revlog where cid = ?", c.id) if first: self.addLine(_("First Review"), self.date(first/1000)) self.addLine(_("Latest Review"), self.date(last/1000)) if c.type in (1,2): if c.odid or c.queue < 0: next = None else: if c.queue in (2,3): next = time.time()+((c.due - self.col.sched.today)*86400) else: next = c.due next = self.date(next) if next: self.addLine(_("Due"), next) if c.queue == 2: self.addLine(_("Interval"), fmt(c.ivl * 86400)) self.addLine(_("Ease"), "%d%%" % (c.factor/10.0)) self.addLine(_("Reviews"), "%d" % c.reps) self.addLine(_("Lapses"), "%d" % c.lapses) (cnt, total) = self.col.db.first( "select count(), sum(time)/1000 from revlog where cid = :id", id=c.id) if cnt: self.addLine(_("Average Time"), self.time(total / float(cnt))) self.addLine(_("Total Time"), self.time(total)) elif c.queue == 0: self.addLine(_("Position"), c.due) self.addLine(_("Card Type"), c.template()['name']) self.addLine(_("Note Type"), c.model()['name']) self.addLine(_("Deck"), self.col.decks.name(c.did)) self.addLine(_("Note ID"), c.nid) self.addLine(_("Card ID"), c.id) self.txt += "
" return self.txt def addLine(self, k, v): self.txt += self.makeLine(k, v) def makeLine(self, k, v): txt = "" txt += "%s%s" % (k, v) return txt def date(self, tm): return time.strftime("%Y-%m-%d", time.localtime(tm)) def time(self, tm): str = "" if tm >= 60: str = fmtTimeSpan((tm/60)*60, short=True, point=-1, unit=1) if tm%60 != 0 or not str: str += fmtTimeSpan(tm%60, point=2 if not str else -1, short=True) return str # Collection stats ########################################################################## colYoung = "#7c7" colMature = "#070" colCum = "rgba(0,0,0,0.9)" colLearn = "#00F" colRelearn = "#c00" colCram = "#ff0" colIvl = "#077" colHour = "#ccc" colTime = "#770" colUnseen = "#000" colSusp = "#ff0" class CollectionStats(object): def __init__(self, col): self.col = col self._stats = None self.type = 0 self.width = 600 self.height = 200 self.wholeCollection = False def report(self, type=0): # 0=days, 1=weeks, 2=months self.type = type from statsbg import bg txt = self.css % bg txt += self.todayStats() txt += self.dueGraph() txt += self.repsGraph() txt += self.ivlGraph() txt += self.hourGraph() txt += self.easeGraph() txt += self.cardGraph() txt += self.footer() return "
%s
" % ( anki.js.jquery+anki.js.plot, txt) css = """ """ # Today stats ###################################################################### def todayStats(self): b = self._title(_("Today")) # studied today lim = self._revlogLimit() if lim: lim = " and " + lim cards, thetime, failed, lrn, rev, relrn, filt = self.col.db.first(""" select count(), sum(time)/1000, sum(case when ease = 1 then 1 else 0 end), /* failed */ sum(case when type = 0 then 1 else 0 end), /* learning */ sum(case when type = 1 then 1 else 0 end), /* review */ sum(case when type = 2 then 1 else 0 end), /* relearn */ sum(case when type = 3 then 1 else 0 end) /* filter */ from revlog where id > ? """+lim, (self.col.sched.dayCutoff-86400)*1000) cards = cards or 0 thetime = thetime or 0 failed = failed or 0 lrn = lrn or 0 rev = rev or 0 relrn = relrn or 0 filt = filt or 0 # studied def bold(s): return ""+unicode(s)+"" msgp1 = ngettext("%d card", "%d cards", cards) % cards b += _("Studied %(a)s in %(b)s today.") % dict( a=bold(msgp1), b=bold(fmtTimeSpan(thetime, unit=1))) # again/pass count b += "
" + _("Again count: %s") % bold(failed) if cards: b += " " + _("(%s correct)") % bold( "%0.1f%%" %((1-failed/float(cards))*100)) # type breakdown b += "
" b += (_("Learn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)s") % dict(a=bold(lrn), b=bold(rev), c=bold(relrn), d=bold(filt))) # mature today mcnt, msum = self.col.db.first(""" select count(), sum(case when ease = 1 then 0 else 1 end) from revlog where lastIvl >= 21 and id > ?"""+lim, (self.col.sched.dayCutoff-86400)*1000) b += "
" if mcnt: b += _("Correct answers on mature cards: %(a)d/%(b)d (%(c).1f%%)") % dict( a=msum, b=mcnt, c=(msum / float(mcnt) * 100)) else: b += _("No mature cards were studied today.") return b # Due and cumulative due ###################################################################### def dueGraph(self): if self.type == 0: start = 0; end = 31; chunk = 1; elif self.type == 1: start = 0; end = 52; chunk = 7 elif self.type == 2: start = 0; end = None; chunk = 30 d = self._due(start, end, chunk) yng = [] mtr = [] tot = 0 totd = [] for day in d: yng.append((day[0], day[1])) mtr.append((day[0], day[2])) tot += day[1]+day[2] totd.append((day[0], tot)) data = [ dict(data=mtr, color=colMature, label=_("Mature")), dict(data=yng, color=colYoung, label=_("Young")), ] if len(totd) > 1: data.append( dict(data=totd, color=colCum, label=_("Cumulative"), yaxis=2, bars={'show': False}, lines=dict(show=True), stack=False)) txt = self._title( _("Forecast"), _("The number of reviews due in the future.")) xaxis = dict(tickDecimals=0, min=-0.5) if end is not None: xaxis['max'] = end-0.5 txt += self._graph(id="due", data=data, ylabel2=_("Cumulative Cards"), conf=dict( xaxis=xaxis, yaxes=[dict(min=0), dict( min=0, tickDecimals=0, position="right")])) txt += self._dueInfo(tot, len(totd)*chunk) return txt def _dueInfo(self, tot, num): i = [] self._line(i, _("Total"), ngettext("%d review", "%d reviews", tot) % tot) self._line(i, _("Average"), self._avgDay( tot, num, _("reviews"))) tomorrow = self.col.db.scalar(""" select count() from cards where did in %s and queue in (2,3) and due = ?""" % self._limit(), self.col.sched.today+1) tomorrow = ngettext("%d card", "%d cards", tomorrow) % tomorrow self._line(i, _("Due tomorrow"), tomorrow) return self._lineTbl(i) def _due(self, start=None, end=None, chunk=1): lim = "" if start is not None: lim += " and due-:today >= %d" % start if end is not None: lim += " and day < %d" % end return self.col.db.all(""" select (due-:today)/:chunk as day, sum(case when ivl < 21 then 1 else 0 end), -- yng sum(case when ivl >= 21 then 1 else 0 end) -- mtr from cards where did in %s and queue in (2,3) %s group by day order by day""" % (self._limit(), lim), today=self.col.sched.today, chunk=chunk) # Reps and time spent ###################################################################### def repsGraph(self): if self.type == 0: days = 30; chunk = 1 elif self.type == 1: days = 52; chunk = 7 else: days = None; chunk = 30 return self._repsGraph(self._done(days, chunk), days, _("Review Count"), _("Review Time")) def _repsGraph(self, data, days, reptitle, timetitle): if not data: return "" d = data conf = dict( xaxis=dict(tickDecimals=0, max=0.5), yaxes=[dict(min=0), dict(position="right",min=0)]) if days is not None: conf['xaxis']['min'] = -days+0.5 def plot(id, data, ylabel, ylabel2): return self._graph( id, data=data, conf=conf, ylabel=ylabel, ylabel2=ylabel2) # reps (repdata, repsum) = self._splitRepData(d, ( (3, colMature, _("Mature")), (2, colYoung, _("Young")), (4, colRelearn, _("Relearn")), (1, colLearn, _("Learn")), (5, colCram, _("Cram")))) txt = self._title( reptitle, _("The number of questions you have answered.")) txt += plot("reps", repdata, ylabel=_("Answers"), ylabel2=_( "Cumulative Answers")) (daysStud, fstDay) = self._daysStudied() rep, tot = self._ansInfo(repsum, daysStud, fstDay, _("reviews")) txt += rep # time (timdata, timsum) = self._splitRepData(d, ( (8, colMature, _("Mature")), (7, colYoung, _("Young")), (9, colRelearn, _("Relearn")), (6, colLearn, _("Learn")), (10, colCram, _("Cram")))) if self.type == 0: t = _("Minutes") convHours = False else: t = _("Hours") convHours = True txt += self._title(timetitle, _("The time taken to answer the questions.")) txt += plot("time", timdata, ylabel=t, ylabel2=_("Cumulative %s") % t) rep, tot2 = self._ansInfo( timsum, daysStud, fstDay, _("minutes"), convHours, total=tot) txt += rep return txt def _ansInfo(self, totd, studied, first, unit, convHours=False, total=None): if not totd: return tot = totd[-1][1] period = self._periodDays() if not period: # base off earliest repetition date lim = self._revlogLimit() if lim: lim = " where " + lim t = self.col.db.scalar("select id from revlog %s order by id limit 1" % lim) if not t: period = 1 else: period = max( 1, int(1+((self.col.sched.dayCutoff - (t/1000)) / 86400))) i = [] self._line(i, _("Days studied"), _("%(pct)d%% (%(x)s of %(y)s)") % dict( x=studied, y=period, pct=studied/float(period)*100), bold=False) if convHours: tunit = _("hours") else: tunit = unit self._line(i, _("Total"), _("%(tot)s %(unit)s") % dict( unit=tunit, tot=int(tot))) if convHours: # convert to minutes tot *= 60 self._line(i, _("Average for days studied"), self._avgDay( tot, studied, unit)) if studied != period: # don't display if you did study every day self._line(i, _("If you studied every day"), self._avgDay( tot, period, unit)) if total and tot: perMin = total / float(tot) perMin = ngettext("%d card/minute", "%d cards/minute", perMin) % perMin self._line( i, _("Average answer time"), _("%(a)0.1fs (%(b)s)") % dict(a=(tot*60)/total, b=perMin)) return self._lineTbl(i), int(tot) def _splitRepData(self, data, spec): sep = {} totcnt = {} totd = {} alltot = [] allcnt = 0 for (n, col, lab) in spec: totcnt[n] = 0 totd[n] = [] sum = [] for row in data: for (n, col, lab) in spec: if n not in sep: sep[n] = [] sep[n].append((row[0], row[n])) totcnt[n] += row[n] allcnt += row[n] totd[n].append((row[0], totcnt[n])) alltot.append((row[0], allcnt)) ret = [] for (n, col, lab) in spec: if len(totd[n]) and totcnt[n]: # bars ret.append(dict(data=sep[n], color=col, label=lab)) # lines ret.append(dict( data=totd[n], color=col, label=None, yaxis=2, bars={'show': False}, lines=dict(show=True), stack=-n)) return (ret, alltot) def _done(self, num=7, chunk=1): lims = [] if num is not None: lims.append("id > %d" % ( (self.col.sched.dayCutoff-(num*chunk*86400))*1000)) lim = self._revlogLimit() if lim: lims.append(lim) if lims: lim = "where " + " and ".join(lims) else: lim = "" if self.type == 0: tf = 60.0 # minutes else: tf = 3600.0 # hours return self.col.db.all(""" select (cast((id/1000.0 - :cut) / 86400.0 as int))/:chunk as day, sum(case when type = 0 then 1 else 0 end), -- lrn count sum(case when type = 1 and lastIvl < 21 then 1 else 0 end), -- yng count sum(case when type = 1 and lastIvl >= 21 then 1 else 0 end), -- mtr count sum(case when type = 2 then 1 else 0 end), -- lapse count sum(case when type = 3 then 1 else 0 end), -- cram count sum(case when type = 0 then time/1000.0 else 0 end)/:tf, -- lrn time -- yng + mtr time sum(case when type = 1 and lastIvl < 21 then time/1000.0 else 0 end)/:tf, sum(case when type = 1 and lastIvl >= 21 then time/1000.0 else 0 end)/:tf, sum(case when type = 2 then time/1000.0 else 0 end)/:tf, -- lapse time sum(case when type = 3 then time/1000.0 else 0 end)/:tf -- cram time from revlog %s group by day order by day""" % lim, cut=self.col.sched.dayCutoff, tf=tf, chunk=chunk) def _daysStudied(self): lims = [] num = self._periodDays() if num: lims.append( "id > %d" % ((self.col.sched.dayCutoff-(num*86400))*1000)) rlim = self._revlogLimit() if rlim: lims.append(rlim) if lims: lim = "where " + " and ".join(lims) else: lim = "" return self.col.db.first(""" select count(), abs(min(day)) from (select (cast((id/1000 - :cut) / 86400.0 as int)+1) as day from revlog %s group by day order by day)""" % lim, cut=self.col.sched.dayCutoff) # Intervals ###################################################################### def ivlGraph(self): (ivls, all, avg, max_) = self._ivls() tot = 0 totd = [] if not ivls or not all: return "" for (grp, cnt) in ivls: tot += cnt totd.append((grp, tot/float(all)*100)) if self.type == 0: ivlmax = 31 elif self.type == 1: ivlmax = 52 else: ivlmax = max(5, ivls[-1][0]) txt = self._title(_("Intervals"), _("Delays until reviews are shown again.")) txt += self._graph(id="ivl", ylabel2=_("Percentage"), data=[ dict(data=ivls, color=colIvl), dict(data=totd, color=colCum, yaxis=2, bars={'show': False}, lines=dict(show=True), stack=False) ], conf=dict( xaxis=dict(min=-0.5, max=ivlmax+0.5), yaxes=[dict(), dict(position="right", max=105)])) i = [] self._line(i, _("Average interval"), fmtTimeSpan(avg*86400)) self._line(i, _("Longest interval"), fmtTimeSpan(max_*86400)) return txt + self._lineTbl(i) def _ivls(self): if self.type == 0: chunk = 1; lim = " and grp <= 30" elif self.type == 1: chunk = 7; lim = " and grp <= 52" else: chunk = 30; lim = "" data = [self.col.db.all(""" select ivl / :chunk as grp, count() from cards where did in %s and queue = 2 %s group by grp order by grp""" % (self._limit(), lim), chunk=chunk)] return data + list(self.col.db.first(""" select count(), avg(ivl), max(ivl) from cards where did in %s and queue = 2""" % self._limit())) # Eases ###################################################################### def easeGraph(self): # 3 + 4 + 4 + spaces on sides and middle = 15 # yng starts at 1+3+1 = 5 # mtr starts at 5+4+1 = 10 d = {'lrn':[], 'yng':[], 'mtr':[]} types = ("lrn", "yng", "mtr") eases = self._eases() for (type, ease, cnt) in eases: if type == 1: ease += 5 elif type == 2: ease += 10 n = types[type] d[n].append((ease, cnt)) ticks = [[1,1],[2,2],[3,3], [6,1],[7,2],[8,3],[9,4], [11, 1],[12,2],[13,3],[14,4]] txt = self._title(_("Answer Buttons"), _("The number of times you have pressed each button.")) txt += self._graph(id="ease", data=[ dict(data=d['lrn'], color=colLearn, label=_("Learning")), dict(data=d['yng'], color=colYoung, label=_("Young")), dict(data=d['mtr'], color=colMature, label=_("Mature")), ], type="barsLine", conf=dict( xaxis=dict(ticks=ticks, min=0, max=15)), ylabel=_("Answers")) txt += self._easeInfo(eases) return txt def _easeInfo(self, eases): types = {0: [0, 0], 1: [0, 0], 2: [0,0]} for (type, ease, cnt) in eases: if ease == 1: types[type][0] += cnt else: types[type][1] += cnt i = [] for type in range(3): (bad, good) = types[type] tot = bad + good try: pct = good / float(tot) * 100 except: pct = 0 i.append(_( "Correct: %(pct)0.2f%%
(%(good)d of %(tot)d)") % dict( pct=pct, good=good, tot=tot)) return ("""
""" % self.width + "".join(i) + "
") def _eases(self): lims = [] lim = self._revlogLimit() if lim: lims.append(lim) if self.type == 0: days = 30 elif self.type == 1: days = 365 else: days = None if days is not None: lims.append("id > %d" % ( (self.col.sched.dayCutoff-(days*86400))*1000)) if lims: lim = "where " + " and ".join(lims) else: lim = "" return self.col.db.all(""" select (case when type in (0,2) then 0 when lastIvl < 21 then 1 else 2 end) as thetype, (case when type in (0,2) and ease = 4 then 3 else ease end), count() from revlog %s group by thetype, ease order by thetype, ease""" % lim) # Hourly retention ###################################################################### def hourGraph(self): data = self._hourRet() if not data: return "" shifted = [] counts = [] mcount = 0 trend = [] peak = 0 for d in data: hour = (d[0] - 4) % 24 pct = d[1] if pct > peak: peak = pct shifted.append((hour, pct)) counts.append((hour, d[2])) if d[2] > mcount: mcount = d[2] shifted.sort() counts.sort() if len(counts) < 4: return "" for d in shifted: hour = d[0] pct = d[1] if not trend: trend.append((hour, pct)) else: prev = trend[-1][1] diff = pct-prev diff /= 3.0 diff = round(diff, 1) trend.append((hour, prev+diff)) txt = self._title(_("Hourly Breakdown"), _("Review success rate for each hour of the day.")) txt += self._graph(id="hour", data=[ dict(data=shifted, color=colCum, label=_("% Correct")), dict(data=counts, color=colHour, label=_("Answers"), yaxis=2, bars=dict(barWidth=0.2), stack=False) ], conf=dict( xaxis=dict(ticks=[[0, _("4AM")], [6, _("10AM")], [12, _("4PM")], [18, _("10PM")], [23, _("3AM")]]), yaxes=[dict(max=peak), dict(position="right", max=mcount)]), ylabel=_("% Correct"), ylabel2=_("Reviews")) txt += _("Hours with less than 30 reviews are not shown.") return txt def _hourRet(self): lim = self._revlogLimit() if lim: lim = " and " + lim sd = datetime.datetime.fromtimestamp(self.col.crt) pd = self._periodDays() if pd: lim += " and id > %d" % ((self.col.sched.dayCutoff-(86400*pd))*1000) return self.col.db.all(""" select 23 - ((cast((:cut - id/1000) / 3600.0 as int)) %% 24) as hour, sum(case when ease = 1 then 0 else 1 end) / cast(count() as float) * 100, count() from revlog where type in (0,1,2) %s group by hour having count() > 30 order by hour""" % lim, cut=self.col.sched.dayCutoff-(sd.hour*3600)) # Cards ###################################################################### def cardGraph(self): # graph data div = self._cards() d = [] for c, (t, col) in enumerate(( (_("Mature"), colMature), (_("Young+Learn"), colYoung), (_("Unseen"), colUnseen), (_("Suspended"), colSusp))): d.append(dict(data=div[c], label="%s: %s" % (t, div[c]), color=col)) # text data i = [] (c, f) = self.col.db.first(""" select count(id), count(distinct nid) from cards where did in %s """ % self._limit()) self._line(i, _("Total cards"), c) self._line(i, _("Total notes"), f) (low, avg, high) = self._factors() if low: self._line(i, _("Lowest ease"), "%d%%" % low) self._line(i, _("Average ease"), "%d%%" % avg) self._line(i, _("Highest ease"), "%d%%" % high) info = "" + "".join(i) + "

" info += _('''\ A card's ease is the size of the next interval \ when you answer "good" on a review.''') txt = self._title(_("Cards Types"), _("The division of cards in your deck(s).")) txt += "
%s%s
" % ( self.width, self._graph(id="cards", data=d, type="pie"), info) return txt def _line(self, i, a, b, bold=True): colon = _(":") if bold: i.append(("%s%s%s") % (a,colon,b)) else: i.append(("%s%s%s") % (a,colon,b)) def _lineTbl(self, i): return "" + "".join(i) + "
" def _factors(self): return self.col.db.first(""" select min(factor) / 10.0, avg(factor) / 10.0, max(factor) / 10.0 from cards where did in %s and queue = 2""" % self._limit()) def _cards(self): return self.col.db.first(""" select sum(case when queue=2 and ivl >= 21 then 1 else 0 end), -- mtr sum(case when queue in (1,3) or (queue=2 and ivl < 21) then 1 else 0 end), -- yng/lrn sum(case when queue=0 then 1 else 0 end), -- new sum(case when queue=-1 then 1 else 0 end) -- susp from cards where did in %s""" % self._limit()) # Footer ###################################################################### def footer(self): b = "

" b += _("Generated on %s") % time.asctime(time.localtime(time.time())) b += "
" if self.wholeCollection: deck = _("whole collection") else: deck = self.col.decks.current()['name'] b += _("Scope: %s") % deck b += "
" b += _("Period: %s") % [ _("1 month"), _("1 year"), _("deck life") ][self.type] return b # Tools ###################################################################### def _graph(self, id, data, conf={}, type="bars", ylabel=_("Cards"), timeTicks=True, ylabel2=""): # display settings if type == "pie": conf['legend'] = {'container': "#%sLegend" % id, 'noColumns':2} else: conf['legend'] = {'container': "#%sLegend" % id, 'noColumns':10} conf['series'] = dict(stack=True) if not 'yaxis' in conf: conf['yaxis'] = {} conf['yaxis']['labelWidth'] = 40 if 'xaxis' not in conf: conf['xaxis'] = {} if timeTicks: conf['timeTicks'] = (_("d"), _("w"), _("mo"))[self.type] # types width = self.width height = self.height if type == "bars": conf['series']['bars'] = dict( show=True, barWidth=0.8, align="center", fill=0.7, lineWidth=0) elif type == "barsLine": conf['series']['bars'] = dict( show=True, barWidth=0.8, align="center", fill=0.7, lineWidth=3) elif type == "fill": conf['series']['lines'] = dict(show=True, fill=True) elif type == "pie": width /= 2.3 height *= 1.5 ylabel = "" conf['series']['pie'] = dict( show=True, radius=1, stroke=dict(color="#fff", width=5), label=dict( show=True, radius=0.8, threshold=0.01, background=dict( opacity=0.5, color="#000" ))) #conf['legend'] = dict(show=False) return ( """
%(ylab)s
%(ylab2)s
""" % dict( id=id, w=width, h=height, ylab=ylabel, ylab2=ylabel2, data=json.dumps(data), conf=json.dumps(conf))) def _limit(self): if self.wholeCollection: return ids2str([d['id'] for d in self.col.decks.all()]) return self.col.sched._deckLimit() def _revlogLimit(self): if self.wholeCollection: return "" return ("cid in (select id from cards where did in %s)" % ids2str(self.col.decks.active())) def _title(self, title, subtitle=""): return '

%s

%s' % (title, subtitle) def _periodDays(self): if self.type == 0: return 30 elif self.type == 1: return 365 else: return None def _avgDay(self, tot, num, unit): vals = [] try: vals.append(_("%(a)0.1f %(b)s/day") % dict(a=tot/float(num), b=unit)) return ", ".join(vals) except ZeroDivisionError: return "" anki-2.0.20+dfsg/anki/template/0000755000175000017500000000000012256137063016012 5ustar andreasandreasanki-2.0.20+dfsg/anki/template/README.anki0000644000175000017500000000055012031052264017601 0ustar andreasandreasAnki uses a modified version of Pystache to provide Mustache-like syntax. Behaviour is a little different from standard Mustache: - {{text}} returns text verbatim with no HTML escaping - {{{text}}} does the same and exists for backwards compatibility - partial rendering is disabled for security reasons - certain keywords like 'cloze' are treated specially anki-2.0.20+dfsg/anki/template/template.py0000644000175000017500000001603212225675305020203 0ustar andreasandreasimport re from anki.utils import stripHTML, stripHTMLMedia from anki.hooks import runFilter from anki.template import furigana; furigana.install() from anki.template import hint; hint.install() clozeReg = r"\{\{c%s::(.*?)(::(.*?))?\}\}" modifiers = {} def modifier(symbol): """Decorator for associating a function with a Mustache tag modifier. @modifier('P') def render_tongue(self, tag_name=None, context=None): return ":P %s" % tag_name {{P yo }} => :P yo """ def set_modifier(func): modifiers[symbol] = func return func return set_modifier def get_or_attr(obj, name, default=None): try: return obj[name] except KeyError: return default except: try: return getattr(obj, name) except AttributeError: return default class Template(object): # The regular expression used to find a #section section_re = None # The regular expression used to find a tag. tag_re = None # Opening tag delimiter otag = '{{' # Closing tag delimiter ctag = '}}' def __init__(self, template, context=None): self.template = template self.context = context or {} self.compile_regexps() def render(self, template=None, context=None, encoding=None): """Turns a Mustache template into something wonderful.""" template = template or self.template context = context or self.context template = self.render_sections(template, context) result = self.render_tags(template, context) if encoding is not None: result = result.encode(encoding) return result def compile_regexps(self): """Compiles our section and tag regular expressions.""" tags = { 'otag': re.escape(self.otag), 'ctag': re.escape(self.ctag) } section = r"%(otag)s[\#|^]([^\}]*)%(ctag)s(.+?)%(otag)s/\1%(ctag)s" self.section_re = re.compile(section % tags, re.M|re.S) tag = r"%(otag)s(#|=|&|!|>|\{)?(.+?)\1?%(ctag)s+" self.tag_re = re.compile(tag % tags) def render_sections(self, template, context): """Expands sections.""" while 1: match = self.section_re.search(template) if match is None: break section, section_name, inner = match.group(0, 1, 2) section_name = section_name.strip() # check for cloze m = re.match("c[qa]:(\d+):(.+)", section_name) if m: # get full field text txt = get_or_attr(context, m.group(2), None) m = re.search(clozeReg%m.group(1), txt) if m: it = m.group(1) else: it = None else: it = get_or_attr(context, section_name, None) replacer = '' # if it and isinstance(it, collections.Callable): # replacer = it(inner) if isinstance(it, basestring): it = stripHTMLMedia(it).strip() if it and not hasattr(it, '__iter__'): if section[2] != '^': replacer = inner elif it and hasattr(it, 'keys') and hasattr(it, '__getitem__'): if section[2] != '^': replacer = self.render(inner, it) elif it: insides = [] for item in it: insides.append(self.render(inner, item)) replacer = ''.join(insides) elif not it and section[2] == '^': replacer = inner template = template.replace(section, replacer) return template def render_tags(self, template, context): """Renders all the tags in a template for a context.""" while 1: match = self.tag_re.search(template) if match is None: break tag, tag_type, tag_name = match.group(0, 1, 2) tag_name = tag_name.strip() try: func = modifiers[tag_type] replacement = func(self, tag_name, context) template = template.replace(tag, replacement) except (SyntaxError, KeyError): return u"{{invalid template}}" return template # {{{ functions just like {{ in anki @modifier('{') def render_tag(self, tag_name, context): return self.render_unescaped(tag_name, context) @modifier('!') def render_comment(self, tag_name=None, context=None): """Rendering a comment always returns nothing.""" return '' @modifier(None) def render_unescaped(self, tag_name=None, context=None): """Render a tag without escaping it.""" txt = get_or_attr(context, tag_name) if txt is not None: # some field names could have colons in them # avoid interpreting these as field modifiers # better would probably be to put some restrictions on field names return txt # field modifiers parts = tag_name.split(':',2) extra = None if len(parts) == 1 or parts[0] == '': return '{unknown field %s}' % tag_name elif len(parts) == 2: (mod, tag) = parts elif len(parts) == 3: (mod, extra, tag) = parts txt = get_or_attr(context, tag) # built-in modifiers if mod == 'text': # strip html if txt: return stripHTML(txt) return "" elif mod == 'type': # type answer field; convert it to [[type:...]] for the gui code # to process return "[[%s]]" % tag_name elif mod == 'cq' or mod == 'ca': # cloze deletion if txt and extra: return self.clozeText(txt, extra, mod[1]) else: return "" else: # hook-based field modifier txt = runFilter('fmod_' + mod, txt or '', extra, context, tag, tag_name); if txt is None: return '{unknown field %s}' % tag_name return txt def clozeText(self, txt, ord, type): reg = clozeReg if not re.search(reg%ord, txt): return "" def repl(m): # replace chosen cloze with type if type == "q": if m.group(3): return "[%s]" % m.group(3) else: return "[...]" else: return "%s" % m.group(1) txt = re.sub(reg%ord, repl, txt) # and display other clozes normally return re.sub(reg%"\d+", "\\1", txt) @modifier('=') def render_delimiter(self, tag_name=None, context=None): """Changes the Mustache delimiter.""" try: self.otag, self.ctag = tag_name.split(' ') except ValueError: # invalid return self.compile_regexps() return '' anki-2.0.20+dfsg/anki/template/hint.py0000644000175000017500000000117112065175361017327 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from anki.hooks import addHook from anki.lang import _ def hint(txt, extra, context, tag, fullname): if not txt.strip(): return "" # random id domid = "hint%d" % id(txt) return """ %s """ % (domid, _("Show %s") % tag, domid, txt) def install(): addHook('fmod_hint', hint) anki-2.0.20+dfsg/anki/template/view.py0000644000175000017500000000651711745402715017350 0ustar andreasandreasfrom anki.template import Template import os.path import re class View(object): # Path where this view's template(s) live template_path = '.' # Extension for templates template_extension = 'mustache' # The name of this template. If none is given the View will try # to infer it based on the class name. template_name = None # Absolute path to the template itself. Pystache will try to guess # if it's not provided. template_file = None # Contents of the template. template = None # Character encoding of the template file. If None, Pystache will not # do any decoding of the template. template_encoding = None def __init__(self, template=None, context=None, **kwargs): self.template = template self.context = context or {} # If the context we're handed is a View, we want to inherit # its settings. if isinstance(context, View): self.inherit_settings(context) if kwargs: self.context.update(kwargs) def inherit_settings(self, view): """Given another View, copies its settings.""" if view.template_path: self.template_path = view.template_path if view.template_name: self.template_name = view.template_name def load_template(self): if self.template: return self.template if self.template_file: return self._load_template() name = self.get_template_name() + '.' + self.template_extension if isinstance(self.template_path, basestring): self.template_file = os.path.join(self.template_path, name) return self._load_template() for path in self.template_path: self.template_file = os.path.join(path, name) if os.path.exists(self.template_file): return self._load_template() raise IOError('"%s" not found in "%s"' % (name, ':'.join(self.template_path),)) def _load_template(self): f = open(self.template_file, 'r') try: template = f.read() if self.template_encoding: template = unicode(template, self.template_encoding) finally: f.close() return template def get_template_name(self, name=None): """TemplatePartial => template_partial Takes a string but defaults to using the current class' name or the `template_name` attribute """ if self.template_name: return self.template_name if not name: name = self.__class__.__name__ def repl(match): return '_' + match.group(0).lower() return re.sub('[A-Z]', repl, name)[1:] def __contains__(self, needle): return needle in self.context or hasattr(self, needle) def __getitem__(self, attr): val = self.get(attr, None) if not val: raise KeyError("No such key.") return val def get(self, attr, default): attr = self.context.get(attr, getattr(self, attr, default)) if hasattr(attr, '__call__'): return attr() else: return attr def render(self, encoding=None): template = self.load_template() return Template(template, self).render(encoding=encoding) def __str__(self): return self.render() anki-2.0.20+dfsg/anki/template/__init__.py0000644000175000017500000000037112055445073020124 0ustar andreasandreasfrom anki.template.template import Template from anki.template.view import View def render(template, context=None, **kwargs): context = context and context.copy() or {} context.update(kwargs) return Template(template, context).render() anki-2.0.20+dfsg/anki/template/furigana.py0000644000175000017500000000167312221204444020155 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # Based off Kieran Clancy's initial implementation. import re from anki.hooks import addHook r = r' ?([^ >]+?)\[(.+?)\]' ruby = r'\1\2' def noSound(repl): def func(match): if match.group(2).startswith("sound:"): # return without modification return match.group(0) else: return re.sub(r, repl, match.group(0)) return func def _munge(s): return s.replace(" ", " ") def kanji(txt, *args): return re.sub(r, noSound(r'\1'), _munge(txt)) def kana(txt, *args): return re.sub(r, noSound(r'\2'), _munge(txt)) def furigana(txt, *args): return re.sub(r, noSound(ruby), _munge(txt)) def install(): addHook('fmod_kanji', kanji) addHook('fmod_kana', kana) addHook('fmod_furigana', furigana) anki-2.0.20+dfsg/anki/template/LICENSE0000644000175000017500000000204311745402715017017 0ustar andreasandreasCopyright (c) 2009 Chris Wanstrath Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. anki-2.0.20+dfsg/anki/template/README.rst0000644000175000017500000000276011745402715017507 0ustar andreasandreas======== Pystache ======== Inspired by ctemplate_ and et_, Mustache_ is a framework-agnostic way to render logic-free views. As ctemplates says, "It emphasizes separating logic from presentation: it is impossible to embed application logic in this template language." Pystache is a Python implementation of Mustache. Pystache requires Python 2.6. Documentation ============= The different Mustache tags are documented at `mustache(5)`_. Install It ========== :: pip install pystache Use It ====== :: >>> import pystache >>> pystache.render('Hi {{person}}!', {'person': 'Mom'}) 'Hi Mom!' You can also create dedicated view classes to hold your view logic. Here's your simple.py:: import pystache class Simple(pystache.View): def thing(self): return "pizza" Then your template, simple.mustache:: Hi {{thing}}! Pull it together:: >>> Simple().render() 'Hi pizza!' Test It ======= nose_ works great! :: pip install nose cd pystache nosetests Author ====== :: context = { 'author': 'Chris Wanstrath', 'email': 'chris@ozmm.org' } pystache.render("{{author}} :: {{email}}", context) .. _ctemplate: http://code.google.com/p/google-ctemplate/ .. _et: http://www.ivan.fomichev.name/2008/05/erlang-template-engine-prototype.html .. _Mustache: http://defunkt.github.com/mustache/ .. _mustache(5): http://defunkt.github.com/mustache/mustache.5.html .. _nose: http://somethingaboutorange.com/mrl/projects/nose/0.11.1/testing.htmlanki-2.0.20+dfsg/anki/consts.py0000644000175000017500000000350312251263400016051 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import os from anki.lang import _ # whether new cards should be mixed with reviews, or shown first or last NEW_CARDS_DISTRIBUTE = 0 NEW_CARDS_LAST = 1 NEW_CARDS_FIRST = 2 # new card insertion order NEW_CARDS_RANDOM = 0 NEW_CARDS_DUE = 1 # removal types REM_CARD = 0 REM_NOTE = 1 REM_DECK = 2 # count display COUNT_ANSWERED = 0 COUNT_REMAINING = 1 # media log MEDIA_ADD = 0 MEDIA_REM = 1 # dynamic deck order DYN_OLDEST = 0 DYN_RANDOM = 1 DYN_SMALLINT = 2 DYN_BIGINT = 3 DYN_LAPSES = 4 DYN_ADDED = 5 DYN_DUE = 6 DYN_REVADDED = 7 DYN_DUEPRIORITY = 8 # model types MODEL_STD = 0 MODEL_CLOZE = 1 # deck schema & syncing vars SCHEMA_VERSION = 11 SYNC_ZIP_SIZE = int(2.5*1024*1024) SYNC_ZIP_COUNT = 100 SYNC_URL = os.environ.get("SYNC_URL") or "https://ankiweb.net/sync/" SYNC_VER = 8 HELP_SITE="http://ankisrs.net/docs/manual.html" # Labels ########################################################################## def newCardOrderLabels(): return { 0: _("Show new cards in random order"), 1: _("Show new cards in order added") } def newCardSchedulingLabels(): return { 0: _("Mix new cards and reviews"), 1: _("Show new cards after reviews"), 2: _("Show new cards before reviews"), } def alignmentLabels(): return { 0: _("Center"), 1: _("Left"), 2: _("Right"), } def dynOrderLabels(): return { 0: _("Oldest seen first"), 1: _("Random"), 2: _("Increasing intervals"), 3: _("Decreasing intervals"), 4: _("Most lapses"), 5: _("Order added"), 6: _("Order due"), 7: _("Latest added first"), 8: _("Relative overdueness"), } anki-2.0.20+dfsg/anki/lang.py0000644000175000017500000000554412225675305015504 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import os, sys, re import gettext import threading langs = [ (u"Afrikaans", "af"), (u"Bahasa Melayu", "ms"), (u"Dansk", "da"), (u"Deutsch", "de"), (u"Eesti", "et"), (u"English", "en"), (u"Español", "es"), (u"Esperanto", "eo"), (u"Français", "fr"), (u"Galego", "gl"), (u"Italiano", "it"), (u"Lenga d'òc", "oc"), (u"Magyar", "hu"), (u"Nederlands","nl"), (u"Norsk","nb"), (u"Occitan","oc"), (u"Plattdüütsch", "nds"), (u"Polski", "pl"), (u"Português Brasileiro", "pt_BR"), (u"Português", "pt"), (u"Româneşte", "ro"), (u"Slovenščina", "sl"), (u"Suomi", "fi"), (u"Svenska", "sv"), (u"Tiếng Việt", "vi"), (u"Türkçe", "tr"), (u"Čeština", "cs"), (u"Ελληνικά", "el"), (u"босански", "bs"), (u"Български", "bg"), (u"Монгол хэл","mn"), (u"русский язык", "ru"), (u"Српски", "sr"), (u"українська мова", "uk"), (u"עִבְרִית", "he"), (u"العربية", "ar"), (u"فارسی", "fa"), (u"ภาษาไทย", "th"), (u"日本語", "ja"), (u"简体中文", "zh_CN"), (u"繁體中文", "zh_TW"), (u"한국어", "ko"), ] threadLocal = threading.local() # global defaults currentLang = None currentTranslation = None def localTranslation(): "Return the translation local to this thread, or the default." if getattr(threadLocal, 'currentTranslation', None): return threadLocal.currentTranslation else: return currentTranslation def _(str): return localTranslation().ugettext(str) def ngettext(single, plural, n): return localTranslation().ungettext(single, plural, n) def langDir(): dir = os.path.join(os.path.dirname( os.path.abspath(__file__)), "locale") if not os.path.isdir(dir): dir = os.path.join(os.path.dirname(sys.argv[0]), "locale") if not os.path.isdir(dir): dir = "/usr/share/anki/locale" return dir def setLang(lang, local=True): trans = gettext.translation( 'anki', langDir(), languages=[lang], fallback=True) if local: threadLocal.currentLang = lang threadLocal.currentTranslation = trans else: global currentLang, currentTranslation currentLang = lang currentTranslation = trans def getLang(): "Return the language local to this thread, or the default." if getattr(threadLocal, 'currentLang', None): return threadLocal.currentLang else: return currentLang def noHint(str): "Remove translation hint from end of string." return re.sub("(^.*?)( ?\(.+?\))?$", "\\1", str) if not currentTranslation: setLang("en_US", local=False) anki-2.0.20+dfsg/anki/anki0000755000175000017500000000061512065175361015052 0ustar andreasandreas#!/usr/bin/env python import os, sys # system-wide install sys.path.insert(0, "/usr/share/anki") sys.path.insert(0, "/usr/share/anki/libanki") # running from extracted folder base = os.path.dirname(os.path.realpath(__file__)) sys.path.insert(0, base) sys.path.insert(0, os.path.join(base, "libanki")) # or git sys.path.insert(0, os.path.join(base, "..", "libanki")) # start import aqt aqt.run() anki-2.0.20+dfsg/anki/media.py0000644000175000017500000004446512252566751015653 0ustar andreasandreas# -*- coding: utf-8 -*- # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import re import urllib import unicodedata import sys import zipfile from cStringIO import StringIO import send2trash from anki.utils import checksum, isWin, isMac, json from anki.db import DB from anki.consts import * from anki.latex import mungeQA class MediaManager(object): soundRegexps = ["(?i)(\[sound:(?P[^]]+)\])"] imgRegexps = [ # src element quoted case "(?i)(]* src=(?P[\"'])(?P[^>]+?)(?P=str)[^>]*>)", # unquoted case "(?i)(]* src=(?!['\"])(?P[^ >]+)[^>]*?>)", ] regexps = soundRegexps + imgRegexps def __init__(self, col, server): self.col = col if server: self._dir = None return # media directory self._dir = re.sub("(?i)\.(anki2)$", ".media", self.col.path) # convert dir to unicode if it's not already if isinstance(self._dir, str): self._dir = unicode(self._dir, sys.getfilesystemencoding()) if not os.path.exists(self._dir): os.makedirs(self._dir) try: self._oldcwd = os.getcwd() except OSError: # cwd doesn't exist self._oldcwd = None try: os.chdir(self._dir) except OSError: raise Exception("invalidTempFolder") # change database self.connect() def connect(self): if self.col.server: return path = self.dir()+".db" create = not os.path.exists(path) os.chdir(self._dir) self.db = DB(path) if create: self._initDB() def close(self): if self.col.server: return self.db.close() self.db = None # change cwd back to old location if self._oldcwd: try: os.chdir(self._oldcwd) except: # may have been deleted pass def dir(self): return self._dir def _isFAT32(self): if not isWin: return import win32api, win32file try: name = win32file.GetVolumeNameForVolumeMountPoint(self._dir[:3]) except: # mapped & unmapped network drive; pray that it's not vfat return if win32api.GetVolumeInformation(name)[4].lower().startswith("fat"): return True # Adding media ########################################################################## # opath must be in unicode def addFile(self, opath): return self.writeData(opath, open(opath, "rb").read()) def writeData(self, opath, data): # if fname is a full path, use only the basename fname = os.path.basename(opath) # make sure we write it in NFC form (on mac will autoconvert to NFD), # and return an NFC-encoded reference fname = unicodedata.normalize("NFC", fname) # remove any dangerous characters base = self.stripIllegal(fname) (root, ext) = os.path.splitext(base) def repl(match): n = int(match.group(1)) return " (%d)" % (n+1) # find the first available name csum = checksum(data) while True: fname = root + ext path = os.path.join(self.dir(), fname) # if it doesn't exist, copy it directly if not os.path.exists(path): open(path, "wb").write(data) return fname # if it's identical, reuse if checksum(open(path, "rb").read()) == csum: return fname # otherwise, increment the index in the filename reg = " \((\d+)\)$" if not re.search(reg, root): root = root + " (1)" else: root = re.sub(reg, repl, root) # String manipulation ########################################################################## def filesInStr(self, mid, string, includeRemote=False): l = [] model = self.col.models.get(mid) strings = [] if model['type'] == MODEL_CLOZE and "{{c" in string: # if the field has clozes in it, we'll need to expand the # possibilities so we can render latex strings = self._expandClozes(string) else: strings = [string] for string in strings: # handle latex string = mungeQA(string, None, None, model, None, self.col) # extract filenames for reg in self.regexps: for match in re.finditer(reg, string): fname = match.group("fname") isLocal = not re.match("(https?|ftp)://", fname.lower()) if isLocal or includeRemote: l.append(fname) return l def _expandClozes(self, string): ords = set(re.findall("{{c(\d+)::.+?}}", string)) strings = [] from anki.template.template import clozeReg def qrepl(m): if m.group(3): return "[%s]" % m.group(3) else: return "[...]" def arepl(m): return m.group(1) for ord in ords: s = re.sub(clozeReg%ord, qrepl, string) s = re.sub(clozeReg%".+?", "\\1", s) strings.append(s) strings.append(re.sub(clozeReg%".+?", arepl, string)) return strings def transformNames(self, txt, func): for reg in self.regexps: txt = re.sub(reg, func, txt) return txt def strip(self, txt): for reg in self.regexps: txt = re.sub(reg, "", txt) return txt def escapeImages(self, string): def repl(match): tag = match.group(0) fname = match.group("fname") if re.match("(https?|ftp)://", fname): return tag return tag.replace( fname, urllib.quote(fname.encode("utf-8"))) for reg in self.imgRegexps: string = re.sub(reg, repl, string) return string # Rebuilding DB ########################################################################## def check(self, local=None): "Return (missingFiles, unusedFiles)." mdir = self.dir() # gather all media references in NFC form allRefs = set() for nid, mid, flds in self.col.db.execute("select id, mid, flds from notes"): noteRefs = self.filesInStr(mid, flds) # check the refs are in NFC for f in noteRefs: # if they're not, we'll need to fix them first if f != unicodedata.normalize("NFC", f): self._normalizeNoteRefs(nid) noteRefs = self.filesInStr(mid, flds) break allRefs.update(noteRefs) # loop through media folder unused = [] invalid = [] if local is None: files = os.listdir(mdir) else: files = local renamedFiles = False for file in files: if not local: if not os.path.isfile(file): # ignore directories continue if file.startswith("_"): # leading _ says to ignore file continue if not isinstance(file, unicode): invalid.append(unicode(file, sys.getfilesystemencoding(), "replace")) continue nfcFile = unicodedata.normalize("NFC", file) # we enforce NFC fs encoding on non-macs; on macs we'll have gotten # NFD so we use the above variable for comparing references if not isMac and not local: if file != nfcFile: # delete if we already have the NFC form, otherwise rename if os.path.exists(nfcFile): os.unlink(file) renamedFiles = True else: os.rename(file, nfcFile) renamedFiles = True file = nfcFile # compare if nfcFile not in allRefs: unused.append(file) else: allRefs.discard(nfcFile) # if we renamed any files to nfc format, we must rerun the check # to make sure the renamed files are not marked as unused if renamedFiles: return self.check(local=local) nohave = [x for x in allRefs if not x.startswith("_")] return (nohave, unused, invalid) def _normalizeNoteRefs(self, nid): note = self.col.getNote(nid) for c, fld in enumerate(note.fields): nfc = unicodedata.normalize("NFC", fld) if nfc != fld: note.fields[c] = nfc note.flush() # Copying on import ########################################################################## def have(self, fname): return os.path.exists(os.path.join(self.dir(), fname)) # Media syncing - changes and removal ########################################################################## def hasChanged(self): return self.db.scalar("select 1 from log limit 1") def removed(self): return self.db.list("select * from log where type = ?", MEDIA_REM) def syncRemove(self, fnames): # remove provided deletions for f in fnames: if os.path.exists(f): send2trash.send2trash(f) self.db.execute("delete from log where fname = ?", f) self.db.execute("delete from media where fname = ?", f) # and all locally-logged deletions, as server has acked them self.db.execute("delete from log where type = ?", MEDIA_REM) self.db.commit() # Media syncing - unbundling zip files from server ########################################################################## def syncAdd(self, zipData): "Extract zip data; true if finished." f = StringIO(zipData) z = zipfile.ZipFile(f, "r") finished = False meta = None media = [] # get meta info first meta = json.loads(z.read("_meta")) nextUsn = int(z.read("_usn")) # then loop through all files for i in z.infolist(): if i.filename == "_meta" or i.filename == "_usn": # ignore previously-retrieved meta continue elif i.filename == "_finished": # last zip in set finished = True else: data = z.read(i) csum = checksum(data) name = meta[i.filename] if not isinstance(name, unicode): name = unicode(name, "utf8") # normalize name for platform if isMac: name = unicodedata.normalize("NFD", name) else: name = unicodedata.normalize("NFC", name) # save file open(name, "wb").write(data) # update db media.append((name, csum, self._mtime(name))) # remove entries from local log self.db.execute("delete from log where fname = ?", name) # update media db and note new starting usn if media: self.db.executemany( "insert or replace into media values (?,?,?)", media) self.setUsn(nextUsn) # commits # if we have finished adding, we need to record the new folder mtime # so that we don't trigger a needless scan if finished: self.syncMod() return finished # Illegal characters ########################################################################## _illegalCharReg = re.compile(r'[][><:"/?*^\\|\0]') def stripIllegal(self, str): return re.sub(self._illegalCharReg, "", str) def hasIllegal(self, str): # a file that couldn't be decoded to unicode is considered invalid if not isinstance(str, unicode): return True return not not re.search(self._illegalCharReg, str) # Media syncing - bundling zip files to send to server ########################################################################## # Because there's no standard filename encoding for zips, and because not # all zip clients support retrieving mtime, we store the files as ascii # and place a json file in the zip with the necessary information. def zipAdded(self): "Add files to a zip until over SYNC_ZIP_SIZE/COUNT. Return zip data." f = StringIO() z = zipfile.ZipFile(f, "w", compression=zipfile.ZIP_DEFLATED) sz = 0 cnt = 0 files = {} cur = self.db.execute( "select fname from log where type = ?", MEDIA_ADD) fnames = [] while 1: fname = cur.fetchone() if not fname: # add a flag so the server knows it can clean up z.writestr("_finished", "") break fname = fname[0] # we add it as a one-element array simply to make # the later forgetAdded() call easier fnames.append([fname]) z.write(fname, str(cnt)) files[str(cnt)] = unicodedata.normalize("NFC", fname) sz += os.path.getsize(fname) if sz >= SYNC_ZIP_SIZE or cnt >= SYNC_ZIP_COUNT: break cnt += 1 z.writestr("_meta", json.dumps(files)) z.close() return f.getvalue(), fnames def forgetAdded(self, fnames): if not fnames: return self.db.executemany("delete from log where fname = ?", fnames) self.db.commit() # Tracking changes (private) ########################################################################## def _initDB(self): self.db.executescript(""" create table media (fname text primary key, csum text, mod int); create table meta (dirMod int, usn int); insert into meta values (0, 0); create table log (fname text primary key, type int); """) def _mtime(self, path): return int(os.stat(path).st_mtime) def _checksum(self, path): return checksum(open(path, "rb").read()) def usn(self): return self.db.scalar("select usn from meta") def setUsn(self, usn): self.db.execute("update meta set usn = ?", usn) self.db.commit() def syncMod(self): self.db.execute("update meta set dirMod = ?", self._mtime(self.dir())) self.db.commit() def _changed(self): "Return dir mtime if it has changed since the last findChanges()" # doesn't track edits, but user can add or remove a file to update mod = self.db.scalar("select dirMod from meta") mtime = self._mtime(self.dir()) if not self._isFAT32() and mod and mod == mtime: return False return mtime def findChanges(self): "Scan the media folder if it's changed, and note any changes." if self._changed(): self._logChanges() def _logChanges(self): (added, removed) = self._changes() log = [] media = [] mediaRem = [] for f in added: mt = self._mtime(f) media.append((f, self._checksum(f), mt)) log.append((f, MEDIA_ADD)) for f in removed: mediaRem.append((f,)) log.append((f, MEDIA_REM)) # update media db self.db.executemany("insert or replace into media values (?,?,?)", media) if mediaRem: self.db.executemany("delete from media where fname = ?", mediaRem) self.db.execute("update meta set dirMod = ?", self._mtime(self.dir())) # and logs self.db.executemany("insert or replace into log values (?,?)", log) self.db.commit() def _changes(self): self.cache = {} for (name, csum, mod) in self.db.execute( "select * from media"): self.cache[name] = [csum, mod, False] added = [] removed = [] # loop through on-disk files for f in os.listdir(self.dir()): # ignore folders and thumbs.db if os.path.isdir(f): continue if f.lower() == "thumbs.db": continue # and files with invalid chars if self.hasIllegal(f): continue # empty files are invalid; clean them up and continue if not os.path.getsize(f): os.unlink(f) continue # newly added? if f not in self.cache: added.append(f) else: # modified since last time? if self._mtime(f) != self.cache[f][1]: # and has different checksum? if self._checksum(f) != self.cache[f][0]: added.append(f) # mark as used self.cache[f][2] = True # look for any entries in the cache that no longer exist on disk for (k, v) in self.cache.items(): if not v[2]: removed.append(k) return added, removed def sanityCheck(self): assert not self.db.scalar("select count() from log") cnt = self.db.scalar("select count() from media") return cnt def forceResync(self): self.db.execute("delete from media") self.db.execute("delete from log") self.db.execute("update meta set usn = 0, dirMod = 0") self.db.commit() def removeExisting(self, files): "Remove files from list of files to sync, and return missing files." need = [] remove = [] for f in files: if isMac: name = unicodedata.normalize("NFD", f) else: name = f if self.db.scalar("select 1 from log where fname=?", name): remove.append((name,)) else: need.append(f) self.db.executemany("delete from log where fname=?", remove) self.db.commit() # if we need all the server files, it's faster to pass None than # the full list if need and len(files) == len(need): return None return need anki-2.0.20+dfsg/LICENSE.logo0000644000175000017500000000205211755052304015215 0ustar andreasandreasAnki's logo is copyright Alex Fraser, and is licensed under the AGPL3 like the rest of Anki's code, but with extra provisions to allow more liberal use of the logo under limited conditions. Under the following conditions, Anki's logo may be included in blogs, newspaper articles, books, videos and other such material about Anki. * The logo must be used to refer to Anki, AnkiMobile or AnkiDroid, and a link to http://ankisrs.net must be provided. When your content is focused specifically on AnkiDroid, a link to http://code.google.com/p/ankidroid/wiki/Index may be provided instead of the first link. * The branding of your website or publication must be more prominent than the Anki logo, to make it clear that the text/video/etc you are publishing is your own content and not something originating from the Anki project. * The logo must be used unmodified - no cropping, changing of colours or adding or deleting content is allowed. You may resize the image provided the horizontal and vertical dimensions are resized equally.